Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||||||
SimpleContext |
|
| 1.8571428571428572;1.857 |
1 | /* |
|
2 | * |
|
3 | * Copyright 2005-2006 The Apache Software Foundation. |
|
4 | * |
|
5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
|
6 | * you may not use this file except in compliance with the License. |
|
7 | * You may obtain a copy of the License at |
|
8 | * |
|
9 | * http://www.apache.org/licenses/LICENSE-2.0 |
|
10 | * |
|
11 | * Unless required by applicable law or agreed to in writing, software |
|
12 | * distributed under the License is distributed on an "AS IS" BASIS, |
|
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
14 | * See the License for the specific language governing permissions and |
|
15 | * limitations under the License. |
|
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 | 308 | 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 | 54 | this(null, null); |
46 | 54 | } |
47 | ||
48 | /** |
|
49 | * Constructor. |
|
50 | * |
|
51 | * @param parent A parent Context, can be null |
|
52 | */ |
|
53 | public SimpleContext(final Context parent) { |
|
54 | 152 | this(parent, null); |
55 | 152 | } |
56 | /** |
|
57 | * Constructor. |
|
58 | * |
|
59 | * @param initialVars A pre-populated initial variables map |
|
60 | */ |
|
61 | public SimpleContext(final Map initialVars) { |
|
62 | 90 | this(null, initialVars); |
63 | 90 | } |
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 | 301 | public SimpleContext(final Context parent, final Map initialVars) { |
72 | 301 | this.parent = parent; |
73 | 301 | if (initialVars == null) { |
74 | 206 | this.vars = new HashMap(); |
75 | } else { |
|
76 | 95 | this.vars = initialVars; |
77 | } |
|
78 | 301 | } |
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 | 46 | if (vars.containsKey(name)) { //first try to override local |
91 | 21 | setLocal(name, value); |
92 | 25 | } else if (parent != null && parent.has(name)) { //then check for global |
93 | 19 | parent.set(name, value); |
94 | } else { //otherwise create a new local variable |
|
95 | 6 | setLocal(name, value); |
96 | } |
|
97 | 46 | } |
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 | 366 | if (vars.containsKey(name)) { |
108 | 225 | return vars.get(name); |
109 | 141 | } else if (parent != null) { |
110 | 59 | return parent.get(name); |
111 | } else { |
|
112 | 82 | 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 | 63 | if (vars.containsKey(name)) { |
125 | 39 | return true; |
126 | 24 | } else if (parent != null && parent.has(name)) { |
127 | 19 | return true; |
128 | } |
|
129 | 5 | return false; |
130 | } |
|
131 | ||
132 | /** |
|
133 | * Clear this Context. |
|
134 | * |
|
135 | * @see org.apache.commons.scxml.Context#reset() |
|
136 | */ |
|
137 | public void reset() { |
|
138 | 11 | vars.clear(); |
139 | 11 | } |
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 | 233 | 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 | 779 | vars.put(name, value); |
162 | 779 | if (log.isDebugEnabled() && !name.equals("_ALL_STATES")) { |
163 | 0 | log.debug(name + " = " + String.valueOf(value)); |
164 | } |
|
165 | 779 | } |
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 | 12 | this.vars = vars; |
174 | 12 | } |
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 | 547 | 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 | 0 | this.log = log; |
192 | 0 | } |
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 | 0 | return log; |
201 | } |
|
202 | ||
203 | } |
|
204 |