Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

ElementAdapter.java

Go to the documentation of this file.
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         // call child nodes.
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                 // don't assume Observable instance
00129                 // When the child is not a subclass of ElementAdapter,
00130                 // the following will also work.
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     // Observer implementation
00151 
00158     public void update(Observable child, Object param) {
00159         if (!broadcasting) {
00160             // propagate only when the child update is not a result
00161             // of a broadcast by this' notifyObservers()
00162             setChanged();
00163             notifyObservers(param);
00164         }
00165     }
00166 
00167     //-----------------------------------------------------------------------
00168     // Observable implementation
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     // Overridden from Object
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         // child not found
00251         if (forceCreate) {
00252             return createChild(name);
00253         }
00254         return null;
00255     }
00256 
00257     //-----------------------------------------------------------------------
00258     // Factory Methods
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     // Member Variables
00320 
00324     private RQMLSecondClassFactory _factory;
00325 
00332     private WeakReference _elem;
00333 
00337     private Set _children = null;
00338 
00342     private boolean broadcasting = false;
00343 }

Generated on Fri Jun 18 19:51:20 2004 for Arcle Rambutan by doxygen 1.3.5