00001
00065 package com.arcle.rmt.j2se.model.domimpl;
00066
00067 import java.util.Observable;
00068 import java.util.Observer;
00069 import java.util.Set;
00070 import java.util.HashSet;
00071 import java.util.Iterator;
00072 import java.lang.ref.WeakReference;
00073
00074 import org.w3c.dom.Element;
00075 import org.w3c.dom.Document;
00076 import org.w3c.dom.Node;
00077 import org.w3c.dom.NodeList;
00078 import org.w3c.dom.DOMException;
00079
00080 import com.arcle.rmt.rqml.*;
00081
00096 public class ElementAdapter extends Observable implements Observer {
00097
00105 public ElementAdapter(Element elem, RQMLSecondClassFactory factory) {
00106 _elem = new WeakReference(elem);
00107 _factory = factory;
00108 }
00109
00118 public Element deleteElement() {
00119
00120 if (hasChildren()) {
00121 Iterator iter = getChildren().iterator();
00122 while (iter.hasNext()) {
00123 Object child = iter.next();
00124 if (child instanceof ElementAdapter) {
00125 ElementAdapter ea = (ElementAdapter) child;
00126 ea.deleteElement();
00127 }
00128
00129
00130
00131 if (child instanceof Observable) {
00132 Observable obs = (Observable) child;
00133 obs.deleteObserver(this);
00134 }
00135 }
00136 }
00137 deleteObservers();
00138 return getElement();
00139 }
00140
00144 public String getElementName() {
00145 return getElement().getTagName();
00146 }
00147
00148
00149
00150
00151
00158 public void update(Observable child, Object param) {
00159 if (!broadcasting) {
00160
00161
00162 setChanged();
00163 notifyObservers(param);
00164 }
00165 }
00166
00167
00168
00169
00170 public void notifyObservers(Object arg) {
00171 super.notifyObservers(arg);
00172 broadcasting = true;
00173 try {
00174 Iterator iter = getChildren().iterator();
00175 while (iter.hasNext()) {
00176 Object child = iter.next();
00177 if (child instanceof Observable) {
00178 Observable obs = (Observable) child;
00179 obs.notifyObservers(arg);
00180 }
00181 }
00182 } finally {
00183 broadcasting = false;
00184 }
00185 }
00186
00187
00188
00189
00193 public int hashCode() {
00194 return getElement().hashCode();
00195 }
00196
00200 public boolean equals(Object other) {
00201 if (other instanceof ElementAdapter) {
00202 ElementAdapter ea = (ElementAdapter) other;
00203 return getElement().equals(ea.getElement());
00204 }
00205 return false;
00206 }
00207
00208
00209
00213 protected Element getElement() {
00214 return (Element) _elem.get();
00215 }
00216
00221 protected RQMLSecondClassFactory getFactory() {
00222 return _factory;
00223 }
00224
00225
00226
00232 protected RQMLSecondClass getFirstChild(String name) {
00233 return getFirstChild(name, true);
00234 }
00235
00242 protected RQMLSecondClass getFirstChild(String name, boolean forceCreate) {
00243 NodeList children = getElement().getChildNodes();
00244 for (int i=0; i<children.getLength(); i++) {
00245 Node child = children.item(i);
00246 if (child instanceof Element && name.equals(child.getNodeName())) {
00247 return getFactory().createRQMLSecondClass((Element) child);
00248 }
00249 }
00250
00251 if (forceCreate) {
00252 return createChild(name);
00253 }
00254 return null;
00255 }
00256
00257
00258
00259
00265 protected RQMLSecondClass createChild(String name) {
00266 Element elem = getElement();
00267 org.w3c.dom.Document doc = elem.getOwnerDocument();
00268 Element child = doc.createElement(name);
00269 RQMLSecondClass rqml;
00270 elem.appendChild(child);
00271 rqml = getFactory().createRQMLSecondClass(child);
00272 if (rqml instanceof Observable) {
00273 Observable obs = (Observable) rqml;
00274 obs.addObserver(this);
00275 }
00276 getChildren().add(rqml);
00277 setChanged();
00278 return rqml;
00279 }
00280
00285 protected String getAttribute(String name) {
00286 String attr = getElement().getAttribute(name);
00287 return (attr != null) ? attr : "";
00288 }
00289
00295 protected void setAttribute(String name, String value) {
00296 getElement().setAttribute(name, value);
00297 setChanged();
00298 }
00299
00303 protected boolean hasChildren() {
00304 return _children != null && !_children.isEmpty();
00305 }
00306
00311 protected Set getChildren() {
00312 if (_children == null) {
00313 _children = new HashSet();
00314 }
00315 return _children;
00316 }
00317
00318
00319
00320
00324 private RQMLSecondClassFactory _factory;
00325
00332 private WeakReference _elem;
00333
00337 private Set _children = null;
00338
00342 private boolean broadcasting = false;
00343 }