1
2
3
4
5
6 package net.kwfgrid.gworkflowdl.protocol.structure;
7
8 import net.kwfgrid.gworkflowdl.protocol.IMethodCallStrategy;
9 import net.kwfgrid.gworkflowdl.protocol.util.UnmodifieableListDecorator;
10
11 import java.util.List;
12 import java.util.LinkedList;
13
14 /***
15 Abstract implementation of <code>IRootObject</code>.
16 */
17 public abstract class AbstractRootObject extends AbstractStructureObject implements IRootObject {
18 private IStructureListener[] _listeners;
19 private int _listenernum;
20 private String _id;
21 private List _objectlist;
22 private UnmodifieableListDecorator _listprotector;
23 private int _version;
24 private List _taskqueue;
25
26 public AbstractRootObject(String id) {
27 super();
28 _listeners = new IStructureListener[2];
29 _id = id;
30 _objectlist = new LinkedList();
31 _listprotector = new UnmodifieableListDecorator(_objectlist);
32 _version = 0;
33 _taskqueue = new LinkedList();
34 }
35
36 private void fireObjectsAdded(IStructureObject parent, String namespace, String name, List objects) {
37 for (int i=0; i<_listeners.length; i++)
38 if (_listeners[i] != null) _listeners[i].objectsAdded(parent, namespace, name, objects);
39 else break;
40 }
41
42 private void fireObjectsRemoved(IStructureObject parent, String namespace, String name, List objects) {
43 for (int i=0; i<_listeners.length; i++)
44 if (_listeners[i] != null) _listeners[i].objectsRemoved(parent, namespace, name, objects);
45 else break;
46 }
47
48 /***
49 Fire an OBJECTS_ADDED event to the array of listeners.
50 @param parent The parent of the added object.
51 @param namespace The namespace of the added object
52 @param name The name of the added object.
53 @param added The added object.
54 */
55 protected final void fireObjectAdded(IStructureObject parent, String namespace, String name, Object added) {
56 _objectlist.clear();
57 _objectlist.add(added);
58 fireObjectsAdded(parent, namespace, name, _listprotector);
59 }
60
61 /***
62 Fire an OBJECTS_ADDED event to the array of listeners.
63 @param parent The parent of the added objects.
64 @param namespace The namespace of the added objects.
65 @param name The name of the added objects.
66 @param added The added objects.
67 */
68 protected final void fireObjectsAdded(IStructureObject parent, String namespace, String name, Object[] added) {
69 _objectlist.clear();
70 for (int i=0; i<added.length; i++) _objectlist.add(added[i]);
71 fireObjectsAdded(parent, namespace, name, _listprotector);
72 }
73
74 /***
75 Fire an OBJECTS_REMOVED event to the array of listeners.
76 @param oldparent The former parent of the removed object.
77 @param namespace The namespace of the removed object
78 @param name The name of the removed object.
79 @param removed The removed object.
80 */
81 protected void fireObjectRemoved(IStructureObject oldparent, String namespace, String name, Object removed) {
82 _objectlist.clear();
83 _objectlist.add(removed);
84 fireObjectsRemoved(oldparent, namespace, name, _listprotector);
85 }
86
87 /***
88 Fire an OBJECTS_REMOVED event to the array of listeners.
89 @param oldparent The former parent of the removed object.
90 @param namespace The namespace of the removed object
91 @param name The name of the removed object.
92 @param removed The removed object.
93 */
94 protected void fireObjectsRemoved(IStructureObject oldparent, String namespace, String name, Object[] removed) {
95 _objectlist.clear();
96 for (int i=0; i<removed.length; i++) _objectlist.add(removed[i]);
97 fireObjectsRemoved(oldparent, namespace, name, _listprotector);
98 }
99
100 /***
101 Fire a PROPERTY_CHANGED event to the array of listeners.
102 @param listeners The listeners to notify.
103 @param parent The parent of the changed property.
104 @param namespace The namespace of the changed property.
105 @param name The name of the changed property.
106 @param newvalule The new value of the property.
107 */
108 protected void firePropertyChanged(IStructureObject parent, String namespace, String name, Object newvalue) {
109 for (int i=0; i<_listeners.length; i++)
110 if (_listeners[i] != null) _listeners[i].propertyChanged(parent, namespace, name, newvalue);
111 else break;
112 }
113
114 public int incrementVersionNumber() {
115 _version++;
116 return _version;
117 }
118
119 public int getVersionNumber() {
120 return _version;
121 }
122
123 /***
124 Get the array of structure-listeners. <br>
125 <b>Note:</b> The array may be greater than the actual number of listeners and may therefore contain
126 <code>null</code> values. Either check for <code>null</code> values or use the
127 <code>AbstractStructureObject.fire*</code> methods to fire events which does this for you.
128 @return The array of structure-listeners registered with the structure of which this object is the root.
129 */
130 public IStructureListener[] getStructureListeners() {
131 return _listeners;
132 }
133
134 public void addStructureListener(IStructureListener listener) {
135 if (_listenernum == _listeners.length-1) {
136 IStructureListener[] dummy = new IStructureListener[_listeners.length*2+1];
137 System.arraycopy(_listeners, 0, dummy, 0, _listeners.length);
138 _listeners = dummy;
139 }
140 _listeners[_listenernum] = listener;
141 _listenernum++;
142 }
143
144 public void removeStructureListener(IStructureListener listener) {
145 IStructureListener[] dummy = new IStructureListener[_listeners.length];
146 int to = 0;
147 for (int from=0; from<_listeners.length; from++) {
148 if (_listeners[from] != listener) {
149 dummy[to] = _listeners[from];
150 to++;
151 } else {
152 _listenernum--;
153 }
154 }
155 _listeners = dummy;
156 }
157
158 public String getID() {
159 return _id;
160 }
161
162 public IRootObject getRoot() {
163 return this;
164 }
165
166 public List getTaskQueue() {
167 return _taskqueue;
168 }
169
170 public abstract IMethodCallStrategy getMethodCallStrategy();
171 }