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

DocumentImpl.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.Iterator;
00070 
00071 import org.w3c.dom.NodeList;
00072 import org.w3c.dom.Node;
00073 import org.w3c.dom.Element;
00074 import org.w3c.dom.DOMException;
00075 
00076 import com.arcle.rmt.rqml.*;
00077 import com.arcle.rmt.j2se.model.RQMLDocument;
00078 import com.arcle.rmt.j2se.model.RQMLDocumentUpdateEvent;
00079 import com.arcle.rmt.j2se.model.RQMLDocumentUpdateConstants;
00080 
00086 public class DocumentImpl extends RQMLDocument implements Observer,
00087         RQMLDocumentUpdateConstants {
00093     public DocumentImpl(org.w3c.dom.Element elem) {
00094         _elem = elem;
00095     }
00096 
00097     //-----------------------------------------------------------------------
00098     // Observer Implementation
00099 
00105     public void update(Observable o, Object arg) {
00106         if(o instanceof RQMLFirstClass) {
00107             setChanged();
00111             notifyObservers(o);
00112         }
00113     }
00114 
00115     //-----------------------------------------------------------------------
00116     // RQMLDocument Implementation
00117 
00121     public Requirement createRequirement() {
00122         return (Requirement) doCreateFirstClass("requirement");
00123     }
00124 
00128     public Stakeholder createStakeholder() {
00129         return (Stakeholder) doCreateFirstClass("stakeholder");
00130     }
00131 
00135     public Assumption createAssumption() {
00136         return (Assumption) doCreateFirstClass("assumption");
00137     }
00138 
00139     /*
00140     Creates a new Issue element.
00141     */
00142     public Issue createIssue() {
00143         return (Issue) doCreateFirstClass("issue");
00144     }
00145 
00149     public Taxonomy createTaxonomy() {
00150         return (Taxonomy) doCreateFirstClass("taxonomy");
00151     }
00152 
00156     public Context createContext() {
00157         return (Context) doCreateFirstClass("context");
00158     }
00159 
00163     public Lexicon createLexicon() {
00164         return (Lexicon) doCreateFirstClass("lexicon");
00165     }
00166 
00170     public Project createProject() {
00171         return (Project) doCreateFirstClass("project");
00172     }
00173 
00177     public Usecase createUsecase() {
00178         return (Usecase) doCreateFirstClass("use-case");
00179     }
00180 
00181 
00186     public Iterator getElements() {
00187         return new ElementIterator();
00188     }
00189 
00193     public void deleteElement(RQMLFirstClass elem) {
00194         notifyUpdate(ET_DELETING_ELEMENT, elem);
00195         ElementAdapter ea = (ElementAdapter) elem;
00196         deleteElement(ea.deleteElement());
00197         notifyUpdate(ET_ELEMENT_DELETED, null);
00198     }
00199 
00200     //-----------------------------------------------------------------------
00201     // Protected
00202 
00209     protected RQMLFirstClass doCreateFirstClass(String name) {
00210         RQMLFirstClass elem = (RQMLFirstClass) createElement(name);
00211         notifyUpdate(ET_NEW_ELEMENT, elem);
00212         return elem;
00213     }
00214 
00215     protected void deleteElement(Element elem) {
00216         if (elem == null) {
00217             return;
00218         }
00219 
00220         // remove from DOM
00221         try {
00222             Node parent = elem.getParentNode();
00223             if (parent != null) {
00224                 parent.removeChild(elem);
00225             }
00226         } catch(DOMException e) {
00227             e.printStackTrace();
00228             // ignore
00229         }
00230 
00231         setChanged();
00232         _wrapperCache.remove(elem);
00233     }
00234 
00238     protected void notifyUpdate(int type, RQMLSecondClass elem) {
00239         setChanged();
00240         notifyObservers(createRQMLDocumentUpdateEvent(type, elem));
00241     }
00242 
00243     //-----------------------------------------------------------------------
00244     // Accessor Methods
00245 
00252     protected RQMLSecondClassFactory getElementFactory() {
00253         if (_wrapperCache == null) {
00254             _wrapperCache = createAdapterCacheFlyweight();
00255         }
00256         return _wrapperCache;
00257     }
00258 
00263     public org.w3c.dom.Element getRootElement() {
00264         return _elem;
00265     }
00266 
00267     //-----------------------------------------------------------------------
00268     // Factory Methods
00269 
00280     protected RQMLSecondClass createElement(String elementName) {
00281         org.w3c.dom.Document doc = getRootElement().getOwnerDocument();
00282         Element elem = doc.createElement(elementName);
00283         getRootElement().appendChild(elem);
00284         setChanged();
00285         return getElementFactory().createRQMLSecondClass(elem);
00286     }
00287 
00293     protected AdapterCacheFlyweight createAdapterCacheFlyweight() {
00294         return new AdapterCacheFlyweight(this);
00295     }
00296 
00304     protected RQMLDocumentUpdateEvent createRQMLDocumentUpdateEvent(
00305             int type, RQMLSecondClass elem) {
00306         return new RQMLDocumentUpdateEvent(this, type, elem);
00307     }
00308 
00309     //-----------------------------------------------------------------------
00310     // Member variables.
00311 
00316     private org.w3c.dom.Element _elem;
00317 
00321     private AdapterCacheFlyweight _wrapperCache;
00322 
00323     //-----------------------------------------------------------------------
00324     // Inner Classes
00325 
00333     protected class ElementIterator implements Iterator {
00338         public ElementIterator() {
00339             currentElement = (Element) getRootElement().getFirstChild();
00340         }
00341 
00346         public boolean hasNext() {
00347             return currentElement != null;
00348         }
00349 
00355         public Object next() {
00356             if (currentElement != null) {
00357                 RQMLFirstClass elem = (RQMLFirstClass) getElementFactory()
00358                     .createRQMLSecondClass(currentElement);
00359                 currentElement = (Element) currentElement.getNextSibling();
00360                 return elem;
00361             }
00362             return null;
00363         }
00364 
00378         public void remove() {
00379             Element dead = currentElement;
00380             currentElement = (Element)dead.getPreviousSibling();
00381             deleteElement(dead);
00382         }
00383 
00390         protected Element currentElement = null;
00391     }
00392 }
00393 

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