KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > sapia > soto > state > config > Globals


1 package org.sapia.soto.state.config;
2
3 import org.sapia.soto.state.State;
4
5 import java.util.ArrayList JavaDoc;
6 import java.util.List JavaDoc;
7
8
9 /**
10  * Applies global behavior modifications/variations to states according to a pattern
11  * matching notation.
12  *
13  * @author Yanick Duchesne
14  * <dl>
15  * <dt><b>Copyright:</b><dd>Copyright &#169; 2002-2003 <a HREF="http://www.sapia-oss.org">Sapia Open Source Software</a>. All Rights Reserved.</dd></dt>
16  * <dt><b>License:</b><dd>Read the license.txt file of the jar or visit the
17  * <a HREF="http://www.sapia-oss.org/license.html">license page</a> at the Sapia OSS web site</dd></dt>
18  * </dl>
19  */

20 public class Globals {
21   private List JavaDoc _preExecs = new ArrayList JavaDoc();
22   private List JavaDoc _postExecs = new ArrayList JavaDoc();
23   private List JavaDoc _privates = new ArrayList JavaDoc();
24   private Globals _parent;
25
26   public Globals() {
27   }
28
29   public void setParent(Globals parent) {
30     _parent = parent;
31   }
32
33   public StateSet createPreExec() {
34     StateSet preExec = new StateSet();
35     _preExecs.add(preExec);
36
37     return preExec;
38   }
39
40   public StateSet createPrivate() {
41     StateSet priv = new StateSet();
42     _privates.add(priv);
43
44     return priv;
45   }
46
47   public StateSet createPostExec() {
48     StateSet postExec = new StateSet();
49     _postExecs.add(postExec);
50
51     return postExec;
52   }
53
54   /**
55    * Merges the content of the given instance with this
56    * instance.
57    *
58    * @param gb other <code>Globals</code>.
59    */

60   public void merge(Globals gb) {
61     _preExecs.addAll(gb._preExecs);
62     _postExecs.addAll(gb._postExecs);
63     _privates.addAll(gb._privates);
64   }
65
66   /**
67    * Applies the visibility restriction corresponding to the given pattern.
68    *
69    * @param state a <code>State</code>
70    * @return <code>true</code> if the given state is public.
71    */

72   public boolean applyRestriction(State state) {
73     StateSet current;
74     boolean pub = true;
75
76     for (int i = 0; i < _privates.size(); i++) {
77       current = (StateSet) _privates.get(i);
78
79       if (current.matches(state)) {
80         pub = false;
81       }
82     }
83
84     if (pub && (_parent != null)) {
85       pub = _parent.applyRestriction(state);
86
87       return pub;
88     } else {
89       return pub;
90     }
91   }
92
93   /**
94    * Applies the pre-executed and post-executed steps to the given
95    * state.
96    *
97    * @param state a <code>State</code>.
98    * @return the resulting <code>State</code> (might be the original one or
99    * a proxy).
100    */

101   public State applySteps(State state) {
102     GlobalWrapper wrapper = null;
103     StateSet current;
104
105     for (int i = 0; i < _preExecs.size(); i++) {
106       current = (StateSet) _preExecs.get(i);
107
108       if (current.matches(state)) {
109         wrapper = wrapper(wrapper, state);
110         wrapper.addPre(current.getSteps());
111       }
112     }
113
114     for (int i = 0; i < _postExecs.size(); i++) {
115       current = (StateSet) _postExecs.get(i);
116
117       if (current.matches(state)) {
118         wrapper = wrapper(wrapper, state);
119         wrapper.addPost(current.getSteps());
120       }
121     }
122
123     if (_parent != null) {
124       if (wrapper != null) {
125         return _parent.applySteps(wrapper);
126       } else {
127         return _parent.applySteps(state);
128       }
129     }
130
131     if (wrapper == null) {
132       return state;
133     } else {
134       return wrapper;
135     }
136   }
137
138   private GlobalWrapper wrapper(GlobalWrapper w, State state) {
139     if (w == null) {
140       return new GlobalWrapper(state);
141     }
142
143     return w;
144   }
145 }
146
Popular Tags