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
00099
00105 public void update(Observable o, Object arg) {
00106 if(o instanceof RQMLFirstClass) {
00107 setChanged();
00111 notifyObservers(o);
00112 }
00113 }
00114
00115
00116
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
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
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
00221 try {
00222 Node parent = elem.getParentNode();
00223 if (parent != null) {
00224 parent.removeChild(elem);
00225 }
00226 } catch(DOMException e) {
00227 e.printStackTrace();
00228
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
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
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
00311
00316 private org.w3c.dom.Element _elem;
00317
00321 private AdapterCacheFlyweight _wrapperCache;
00322
00323
00324
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