1 /**
2 * Logback: the reliable, generic, fast and flexible logging framework.
3 * Copyright (C) 1999-2011, QOS.ch. All rights reserved.
4 *
5 * This program and the accompanying materials are dual-licensed under
6 * either the terms of the Eclipse Public License v1.0 as published by
7 * the Eclipse Foundation
8 *
9 * or (per the licensee's choosing)
10 *
11 * under the terms of the GNU Lesser General Public License version 2.1
12 * as published by the Free Software Foundation.
13 */
14 package chapters.onJoran.calculator;
15
16 import java.util.EmptyStackException;
17
18 import org.xml.sax.Attributes;
19
20 import ch.qos.logback.core.joran.action.Action;
21 import ch.qos.logback.core.joran.spi.InterpretationContext;
22
23
24 /**
25 * This action adds the two integers at the top of the stack (they are removed)
26 * and pushes the result to the top the stack.
27 *
28 * @author Ceki Gülcü
29 */
30 public class AddAction extends Action {
31
32 public void begin(InterpretationContext ic, String name, Attributes attributes) {
33 int first = fetchInteger(ic);
34 int second = fetchInteger(ic);
35 // Push the result of the addition for the following actions.
36 ic.pushObject(new Integer(first + second));
37 }
38
39 /**
40 * Pop the Integer object at the top of the stack.
41 * This code also illustrates usage of Joran's error handling paradigm.
42 */
43 int fetchInteger(InterpretationContext ic) {
44 int result = 0;
45
46 try {
47 // Pop the object at the top of the interpretation context's stack.
48 Object o1 = ic.popObject();
49
50 if (o1 instanceof Integer) {
51 result = ((Integer) o1).intValue();
52 } else {
53 String errMsg =
54 "Object [" + o1
55 + "] currently at the top of the stack is not an integer.";
56 ic.addError(errMsg);
57 throw new IllegalArgumentException(errMsg);
58 }
59 } catch (EmptyStackException ese) {
60 ic.addError(("Expecting an integer on the execution stack."));
61 throw ese;
62 }
63 return result;
64 }
65
66 public void end(InterpretationContext ic, String name) {
67 // Nothing to do here.
68 }
69 }