View Javadoc

1   /*
2    * Copyright (c) 2005, The K-Wf Grid Consortium
3    * Fraunhofer Institute for Computer Architecture and Software Technology
4    * See http://www.kwfgrid.eu and http://www.first.fraunhofer.de for more details.
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 }