    001    // Copyright 2011 The Apache Software Foundation
    002    //
    003    // Licensed under the Apache License, Version 2.0 (the "License");
    004    // you may not use this file except in compliance with the License.
    005    // You may obtain a copy of the License at
    006    //
    007    // http://www.apache.org/licenses/LICENSE-2.0
    008    //
    009    // Unless required by applicable law or agreed to in writing, software
    010    // distributed under the License is distributed on an "AS IS" BASIS,
    011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    012    // See the License for the specific language governing permissions and
    013    // limitations under the License.
    014
    015    package org.apache.tapestry5.internal.plastic;
    016
    017    import org.apache.tapestry5.internal.plastic.asm.Label;
    018    import org.apache.tapestry5.plastic.InstructionBuilder;
    019    import org.apache.tapestry5.plastic.InstructionBuilderCallback;
    020    import org.apache.tapestry5.plastic.TryCatchBlock;
    021    import org.apache.tapestry5.plastic.TryCatchCallback;
    022
    023    public class TryCatchBlockImpl extends Lockable implements TryCatchBlock
    024    {
    025        private final InstructionBuilder builder;
    026
    027        private final InstructionBuilderState state;
    028
    029        private final Label startLabel, endLabel;
    030
    031        TryCatchBlockImpl(InstructionBuilder builder, InstructionBuilderState state)
    032        {
    033            this.builder = builder;
    034            this.state = state;
    035
    036            this.startLabel = new Label();
    037            this.endLabel = new Label();
    038        }
    039
    040        public void addTry(InstructionBuilderCallback callback)
    041        {
    042            state.visitor.visitLabel(startLabel);
    043
    044            callback.doBuild(builder);
    045
    046            state.visitor.visitLabel(endLabel);
    047        }
    048
    049        public void addCatch(String exceptionClassName, InstructionBuilderCallback callback)
    050        {
    051            assert exceptionClassName != null;
    052
    053            doCatch(state.nameCache.toInternalName(exceptionClassName), callback);
    054        }
    055
    056        private void doCatch(String exceptionInternalName, InstructionBuilderCallback callback)
    057        {
    058            check();
    059
    060            Label handler = state.newLabel();
    061
    062            callback.doBuild(builder);
    063
    064            state.visitor.visitTryCatchBlock(startLabel, endLabel, handler, exceptionInternalName);
    065        }
    066
    067        public void addFinally(InstructionBuilderCallback callback)
    068        {
    069            doCatch(null, callback);
    070        }
    071
    072        void doCallback(TryCatchCallback callback)
    073        {
    074            assert callback != null;
    075
    076            callback.doBlock(this);
    077
    078            lock();
    079        }
    080
    081    }