1 19 package org.netbeans.modules.xml.axi.impl; 20 21 import java.io.IOException ; 22 import java.util.ArrayList ; 23 import java.util.Collection ; 24 import java.util.Collections ; 25 import java.util.HashMap ; 26 import java.util.Iterator ; 27 import java.util.List ; 28 import java.util.WeakHashMap ; 29 import org.netbeans.modules.xml.axi.AXIComponent; 30 import org.netbeans.modules.xml.axi.AXIDocument; 31 import org.netbeans.modules.xml.axi.AXIModel; 32 import org.netbeans.modules.xml.axi.AXIModelFactory; 33 import org.netbeans.modules.xml.axi.SchemaGenerator; 34 import org.netbeans.modules.xml.schema.model.Schema; 35 import org.netbeans.modules.xml.schema.model.SchemaComponent; 36 import org.netbeans.modules.xml.schema.model.SchemaModel; 37 import org.netbeans.modules.xml.schema.model.SchemaModelReference; 38 import org.netbeans.modules.xml.xam.ComponentListener; 39 import org.netbeans.modules.xml.xam.Model; 40 import org.netbeans.modules.xml.xam.ModelSource; 41 import org.netbeans.modules.xml.xam.NamedReferenceable; 42 import org.netbeans.modules.xml.xam.dom.NamedComponentReference; 43 import org.netbeans.modules.xml.xam.locator.CatalogModelException; 44 import org.netbeans.modules.xml.xam.spi.Validation; 45 import org.netbeans.modules.xml.xam.spi.Validator.ResultItem; 46 import org.netbeans.modules.xml.xam.spi.Validator.ResultType; 47 import org.openide.util.WeakListeners; 48 49 50 56 public class AXIModelImpl extends AXIModel { 57 58 61 public AXIModelImpl(ModelSource modelSource) { 62 super(modelSource); 63 64 this.propertyListener = new AXIModelListener(); 66 addPropertyChangeListener(propertyListener); 67 68 this.schemaModelListener = new SchemaModelListener(this); 70 this.getSchemaModel().addPropertyChangeListener(schemaModelListener); 71 } 72 73 76 boolean isAXIDocumentInitialized() { 77 return isAXIDocumentInitialized; 78 } 79 80 83 void initializeAXIDocument() { 84 AXIDocument doc = getRoot(); 85 Schema schema = (Schema)doc.getPeer(); 86 if(schema == null) { 87 doc.setPeer(getSchemaModel().getSchema()); 88 } 89 Util.updateAXIDocument(doc); 90 isAXIDocumentInitialized = true; 91 92 SchemaGenerator.Pattern dp = null; 94 if(dp != null) 95 setSchemaDesignPattern(dp); 96 else 97 setSchemaDesignPattern(SchemaGenerator.DEFAULT_DESIGN_PATTERN); 98 } 99 100 104 public boolean fromSameSchemaModel(SchemaComponent schemaComponent) { 105 return (getSchemaModel() == schemaComponent.getModel()); 106 } 107 108 111 public AXIComponent lookupFromOtherModel(SchemaComponent schemaComponent) { 112 if(!schemaComponent.isInDocumentModel()) 113 return null; 114 AXIModelFactory factory = AXIModelFactory.getDefault(); 115 AXIModelImpl model = (AXIModelImpl)factory.getModel(schemaComponent.getModel()); 116 return model!=null?model.lookup(schemaComponent):null; 117 } 118 119 122 public AXIComponent lookup(SchemaComponent schemaComponent) { 123 return ((AXIDocumentImpl)getRoot()).findChild(schemaComponent); 124 } 125 126 132 protected boolean needsSync() { 133 if(isForceSync) 134 return true; 135 if(!isAXIDocumentInitialized()) 136 return true; 137 138 if(designPatternMode || isIntransaction()) { 139 return false; 140 } 141 142 if(axiModelListener != null) 143 return axiModelListener.needsSync() || schemaModelListener.needsSync(); 144 145 return schemaModelListener.needsSync(); 146 } 147 148 void disableAutoSync() { 149 designPatternMode = true; 150 super.getAccess().setAutoSync(false); 151 } 152 153 void enableAutoSync() { 154 designPatternMode = false; 155 super.getAccess().setAutoSync(true); 156 } 157 158 161 protected void syncStarted() { 162 try { 163 getSchemaModel().sync(); 164 } catch(IOException ex) { 165 setState(Model.State.NOT_SYNCED); 166 } 167 } 168 169 172 protected void syncCompleted() { 173 schemaModelListener.syncCompleted(); 174 if(axiModelListener != null) 175 axiModelListener.syncCompleted(); 176 propertyListener.clearEvents(); 177 } 178 179 182 public void sync() { 183 try { 184 synchronized(getSchemaModel()) { 185 super.sync(); 186 } 187 } catch(IOException ex) { 188 setState(Model.State.NOT_SYNCED); 189 } finally { 190 setForceSync(false); 191 } 192 } 193 194 198 public synchronized boolean doSync() { 199 AXIModelUpdater updater = new AXIModelUpdater(this); 201 return updater.doSync(); 202 } 203 204 public SchemaGenerator.Pattern getSchemaDesignPattern() { 205 return schemaDesignPattern; 206 } 207 208 public void setSchemaDesignPattern(SchemaGenerator.Pattern schemaDesignPattern) { 209 this.schemaDesignPattern = schemaDesignPattern; 210 } 211 212 215 public AXIModelListener getPropertyChangeListener() { 216 return propertyListener; 217 } 218 219 223 public boolean validate() { 224 Model.State state = getSchemaModel().getState(); 225 if(state != SchemaModel.State.VALID) { 226 return false; 227 } 228 229 return true; 230 } 231 232 public List <AXIModel> getReferencedModels() { 233 List <AXIModel> models = Collections.emptyList(); 234 Schema schema = getSchemaModel().getSchema(); 235 if(schema == null) 236 return models; 237 Collection <SchemaModelReference> refs = schema.getSchemaReferences(); 238 if(refs == null || refs.size() == 0) { 239 return models; 240 } 241 models = new ArrayList <AXIModel>(); 242 Iterator <SchemaModelReference> iter = refs.iterator(); 243 while(iter.hasNext()) { 244 try { 245 SchemaModelReference ref = iter.next(); 246 Schema s = ref.resolveReferencedModel().getSchema(); 247 AXIModel m = AXIModelFactory.getDefault(). 248 getModel(ref.resolveReferencedModel()); 249 models.add(m); 250 } catch (CatalogModelException ex) { 251 } 253 } 254 255 return Collections.unmodifiableList(models); 256 } 257 258 262 void buildReferenceableCache() { 263 listenerMap.clear(); 264 Schema schema = getSchemaModel().getSchema(); 265 if(schema == null) 266 return; 267 buildCache(schema); 268 Collection <SchemaModelReference> refs = schema.getSchemaReferences(); 269 if(refs == null || refs.size() == 0) 270 return; 271 Iterator <SchemaModelReference> iter = refs.iterator(); 272 while(iter.hasNext()) { 273 try { 274 SchemaModelReference ref = iter.next(); 275 Schema s = ref.resolveReferencedModel().getSchema(); 276 buildCache(s); 277 if(getRoot().canVisitChildren()) { 278 AXIModel m = AXIModelFactory.getDefault(). 279 getModel(ref.resolveReferencedModel()); 280 listenToReferencedModel(m); 283 } 284 } catch (Exception ex) { 285 continue; 286 } 287 } 288 } 289 290 public void listenToReferencedModel(AXIModel model) { 291 if(listenerMap.get(model) == null) { 292 ComponentListener listener = (ComponentListener)WeakListeners. 293 create(ComponentListener.class, axiModelListener, model); 294 model.addComponentListener(listener); 295 listenerMap.put(model, listener); 296 } 297 } 298 299 303 private void buildCache(Schema schema) { 304 for(SchemaComponent child : schema.getChildren()) { 305 if(child instanceof NamedReferenceable) { 306 NamedReferenceable ref = (NamedReferenceable)child; 307 mapReferenceable.put(schema.getTargetNamespace() + ":" + ref.getName(), ref); 308 } 309 } 310 } 311 312 316 public SchemaComponent getReferenceableSchemaComponent(NamedComponentReference ncr) { 317 String name = ncr.getQName().getNamespaceURI() + ":" + ncr.getQName().getLocalPart(); 318 Class <? extends NamedReferenceable> elementType = ncr.getType(); 319 NamedReferenceable ref = mapReferenceable.get(name); 320 if(ref != null && elementType.isAssignableFrom(ref.getClass())) { 321 return (SchemaComponent)ref; 322 } 323 324 return (SchemaComponent)ncr.get(); 325 } 326 327 public String toString() { 328 if(getRoot() == null) 329 return null; 330 331 return getRoot().getTargetNamespace(); 332 } 333 334 public void setForceSync(boolean b) { 335 isForceSync = b; 336 } 337 338 341 private AXIModelListener propertyListener; 342 343 346 private SchemaModelListener schemaModelListener; 347 348 351 private OtherAXIModelListener axiModelListener = new OtherAXIModelListener(this); 352 private WeakHashMap <AXIModel, ComponentListener> listenerMap = 353 new WeakHashMap <AXIModel, ComponentListener>(); 354 355 358 private boolean designPatternMode = false; 359 360 363 private boolean isAXIDocumentInitialized = false; 364 365 private SchemaGenerator.Pattern schemaDesignPattern; 366 private HashMap <String , NamedReferenceable> mapReferenceable = 367 new HashMap <String , NamedReferenceable>(); 368 369 private boolean isForceSync = false; 370 } 371 | Popular Tags |