/* * Copyright (C) 2011 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.errai.codegen.control; import java.util.LinkedHashMap; import java.util.Map; import org.jboss.errai.codegen.AbstractStatement; import org.jboss.errai.codegen.BlockStatement; import org.jboss.errai.codegen.Context; import org.jboss.errai.codegen.Variable; /** * @author Christian Sadilek <csadilek@redhat.com> */ public class TryBlock extends AbstractStatement { private final BlockStatement block = new BlockStatement(); private final Map<Variable, BlockStatement> catchBlocks = new LinkedHashMap<Variable, BlockStatement>(); private BlockStatement finallyBlock = null; public BlockStatement getBlock() { return block; } public void addCatchBlock(Variable exception) { catchBlocks.put(exception, new BlockStatement()); } public BlockStatement getCatchBlock(Variable exceptionVar) { return catchBlocks.get(exceptionVar); } public BlockStatement getFinallyBlock() { if (finallyBlock == null) finallyBlock = new BlockStatement(); return finallyBlock; } String generatedCache; @Override public String generate(Context context) { if (generatedCache != null) return generatedCache; final StringBuilder buf = new StringBuilder("try {\n"); buf.append(block.generate(context)).append("\n} "); if (!catchBlocks.isEmpty()) { for (final Variable exception : catchBlocks.keySet()) { final Context ctx = Context.create(context).addVariable(exception); buf.append("catch (").append(exception.generate(ctx)).append(") ") .append("{\n") .append(catchBlocks.get(exception).generate(ctx)) .append("\n} "); } } else if (finallyBlock == null) { finallyBlock = new BlockStatement(); } if (finallyBlock != null) { final Context ctx = Context.create(context); buf.append(" finally {\n").append(finallyBlock.generate(ctx)).append("\n}\n"); } return generatedCache = buf.toString(); } }