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