1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.scxml.env;
19
20 import java.util.HashMap;
21 import java.util.Map;
22
23 import org.apache.commons.logging.Log;
24 import org.apache.commons.logging.LogFactory;
25 import org.apache.commons.scxml.Context;
26
27 /***
28 * Simple Context wrapping a map of variables.
29 *
30 */
31 public class SimpleContext implements Context {
32
33 /*** Implementation independent log category. */
34 private Log log = LogFactory.getLog(Context.class);
35 /*** The parent Context to this Context. */
36 private Context parent;
37 /*** The Map of variables and their values in this Context. */
38 private Map vars;
39
40 /***
41 * Constructor.
42 *
43 */
44 public SimpleContext() {
45 this(null, null);
46 }
47
48 /***
49 * Constructor.
50 *
51 * @param parent A parent Context, can be null
52 */
53 public SimpleContext(final Context parent) {
54 this(parent, null);
55 }
56 /***
57 * Constructor.
58 *
59 * @param initialVars A pre-populated initial variables map
60 */
61 public SimpleContext(final Map initialVars) {
62 this(null, initialVars);
63 }
64
65 /***
66 * Constructor.
67 *
68 * @param parent A parent Context, can be null
69 * @param initialVars A pre-populated initial variables map
70 */
71 public SimpleContext(final Context parent, final Map initialVars) {
72 this.parent = parent;
73 if (initialVars == null) {
74 this.vars = new HashMap();
75 } else {
76 this.vars = initialVars;
77 }
78 }
79
80 /***
81 * Assigns a new value to an existing variable or creates a new one.
82 * The method searches the chain of parent Contexts for variable
83 * existence.
84 *
85 * @param name The variable name
86 * @param value The variable value
87 * @see org.apache.commons.scxml.Context#set(String, Object)
88 */
89 public void set(final String name, final Object value) {
90 if (vars.containsKey(name)) {
91 setLocal(name, value);
92 } else if (parent != null && parent.has(name)) {
93 parent.set(name, value);
94 } else {
95 setLocal(name, value);
96 }
97 }
98
99 /***
100 * Get the value of this variable; delegating to parent.
101 *
102 * @param name The variable name
103 * @return Object The variable value
104 * @see org.apache.commons.scxml.Context#get(java.lang.String)
105 */
106 public Object get(final String name) {
107 if (vars.containsKey(name)) {
108 return vars.get(name);
109 } else if (parent != null) {
110 return parent.get(name);
111 } else {
112 return null;
113 }
114 }
115
116 /***
117 * Check if this variable exists, delegating to parent.
118 *
119 * @param name The variable name
120 * @return boolean true if this variable exists
121 * @see org.apache.commons.scxml.Context#has(java.lang.String)
122 */
123 public boolean has(final String name) {
124 if (vars.containsKey(name)) {
125 return true;
126 } else if (parent != null && parent.has(name)) {
127 return true;
128 }
129 return false;
130 }
131
132 /***
133 * Clear this Context.
134 *
135 * @see org.apache.commons.scxml.Context#reset()
136 */
137 public void reset() {
138 vars.clear();
139 }
140
141 /***
142 * Get the parent Context, may be null.
143 *
144 * @return Context The parent Context
145 * @see org.apache.commons.scxml.Context#getParent()
146 */
147 public Context getParent() {
148 return parent;
149 }
150
151 /***
152 * Assigns a new value to an existing variable or creates a new one.
153 * The method allows to shaddow a variable of the same name up the
154 * Context chain.
155 *
156 * @param name The variable name
157 * @param value The variable value
158 * @see org.apache.commons.scxml.Context#setLocal(String, Object)
159 */
160 public void setLocal(final String name, final Object value) {
161 vars.put(name, value);
162 if (log.isDebugEnabled() && !name.equals("_ALL_STATES")) {
163 log.debug(name + " = " + String.valueOf(value));
164 }
165 }
166
167 /***
168 * Set the variables map.
169 *
170 * @param vars The new Map of variables.
171 */
172 protected void setVars(final Map vars) {
173 this.vars = vars;
174 }
175
176 /***
177 * Get the Map of all local variables in this Context.
178 *
179 * @return Returns the vars.
180 */
181 public Map getVars() {
182 return vars;
183 }
184
185 /***
186 * Set the log used by this <code>Context</code> instance.
187 *
188 * @param log The new log.
189 */
190 protected void setLog(final Log log) {
191 this.log = log;
192 }
193
194 /***
195 * Get the log used by this <code>Context</code> instance.
196 *
197 * @return Log The log being used.
198 */
199 protected Log getLog() {
200 return log;
201 }
202
203 }
204