1 19 20 28 29 package org.netbeans.modules.xml.wsdl.ui.actions.schema; 30 31 import java.io.IOException ; 32 import java.util.Collection ; 33 import java.util.Iterator ; 34 import java.util.List ; 35 import java.util.Stack ; 36 37 import javax.xml.namespace.QName ; 38 39 import org.netbeans.modules.xml.schema.model.All; 40 import org.netbeans.modules.xml.schema.model.AnyAttribute; 41 import org.netbeans.modules.xml.schema.model.AnyElement; 42 import org.netbeans.modules.xml.schema.model.Attribute; 43 import org.netbeans.modules.xml.schema.model.AttributeGroupReference; 44 import org.netbeans.modules.xml.schema.model.AttributeReference; 45 import org.netbeans.modules.xml.schema.model.Choice; 46 import org.netbeans.modules.xml.schema.model.ElementReference; 47 import org.netbeans.modules.xml.schema.model.Enumeration; 48 import org.netbeans.modules.xml.schema.model.GlobalAttribute; 49 import org.netbeans.modules.xml.schema.model.GlobalAttributeGroup; 50 import org.netbeans.modules.xml.schema.model.GlobalElement; 51 import org.netbeans.modules.xml.schema.model.GlobalGroup; 52 import org.netbeans.modules.xml.schema.model.GlobalSimpleType; 53 import org.netbeans.modules.xml.schema.model.GlobalType; 54 import org.netbeans.modules.xml.schema.model.GroupReference; 55 import org.netbeans.modules.xml.schema.model.LocalAttribute; 56 import org.netbeans.modules.xml.schema.model.LocalElement; 57 import org.netbeans.modules.xml.schema.model.LocalType; 58 import org.netbeans.modules.xml.schema.model.SchemaComponent; 59 import org.netbeans.modules.xml.schema.model.SchemaModel; 60 import org.netbeans.modules.xml.schema.model.SchemaModelFactory; 61 import org.netbeans.modules.xml.schema.model.Sequence; 62 import org.netbeans.modules.xml.schema.model.SimpleContent; 63 import org.netbeans.modules.xml.schema.model.SimpleContentRestriction; 64 import org.netbeans.modules.xml.schema.model.SimpleExtension; 65 import org.netbeans.modules.xml.schema.model.SimpleType; 66 import org.netbeans.modules.xml.schema.model.SimpleTypeRestriction; 67 import org.netbeans.modules.xml.schema.model.TypeContainer; 68 import org.netbeans.modules.xml.wsdl.model.Definitions; 69 import org.netbeans.modules.xml.wsdl.model.ExtensibilityElement; 70 import org.netbeans.modules.xml.wsdl.model.WSDLComponent; 71 import org.netbeans.modules.xml.wsdl.model.WSDLModel; 72 import org.netbeans.modules.xml.wsdl.ui.actions.NameGenerator; 73 import org.netbeans.modules.xml.wsdl.ui.netbeans.module.Utility; 74 import org.netbeans.modules.xml.wsdl.ui.schema.visitor.AbstractXSDVisitor; 75 import org.netbeans.modules.xml.wsdl.ui.spi.ExtensibilityElementConfigurator; 76 import org.netbeans.modules.xml.wsdl.ui.spi.ExtensibilityElementConfiguratorFactory; 77 import org.netbeans.modules.xml.xam.dom.AbstractDocumentComponent; 78 import org.netbeans.modules.xml.xam.dom.NamedComponentReference; 79 import org.openide.ErrorManager; 80 import org.openide.util.NbBundle; 81 82 86 public class ExtensibilityElementCreatorVisitor extends AbstractXSDVisitor { 87 88 private WSDLComponent mComponent; 89 90 private WSDLModel mModel; 91 92 private Definitions mDefinitions; 93 94 private Stack <WSDLComponent> mStack = new Stack <WSDLComponent>(); 95 96 private ExtensibilityElement mRootExtensibilityElement; 97 98 99 100 public ExtensibilityElementCreatorVisitor(WSDLComponent component) { 101 this.mComponent = component; 102 push(this.mComponent); 106 107 this.mModel = component.getModel(); 108 this.mDefinitions = this.mModel.getDefinitions(); 109 110 } 111 112 public ExtensibilityElement getRootExtensibilittElement() { 113 return this.mRootExtensibilityElement; 114 } 115 116 @Override 117 public void visit(LocalAttribute la) { 118 Attribute.Use use = la.getUseEffective(); 119 if(use.equals(Attribute.Use.REQUIRED)) { 120 NamedComponentReference<GlobalSimpleType> lstRef = la.getType(); 121 if(lstRef != null) { 122 visitAttribute(la, la.getName(), lstRef.get()); 123 } else { 124 visitAttribute(la, la.getName(), la.getInlineType()); 125 } 126 } 127 } 128 129 @Override 130 public void visit(AttributeReference reference) { 131 Attribute.Use use = reference.getUseEffective(); 132 if(use.equals(Attribute.Use.REQUIRED)) { 133 NamedComponentReference<GlobalAttribute> ga = reference.getRef(); 134 if(ga != null) { 135 visit(ga.get()); 136 } 137 } 138 } 139 140 @Override 141 public void visit(GlobalAttribute ga) { 142 NamedComponentReference<GlobalSimpleType> gstRef = ga.getType(); 143 if(gstRef != null) { 144 visitAttribute(ga, ga.getName(), gstRef.get()); 145 } else { 146 visitAttribute(ga, ga.getName(), ga.getInlineType()); 147 } 148 } 149 150 @Override 151 public void visit(AttributeGroupReference agr) { 152 NamedComponentReference<GlobalAttributeGroup> aGroup = agr.getGroup(); 153 if(aGroup != null) { 154 visit(aGroup.get()); 155 } 156 } 157 158 159 @Override 160 public void visit(GlobalAttributeGroup gag) { 161 List <SchemaComponent> children = gag.getChildren(); 162 Iterator <SchemaComponent> it = children.iterator(); 163 164 while(it.hasNext()) { 165 SchemaComponent sc = it.next(); 166 if(sc instanceof LocalAttribute) { 167 visit((LocalAttribute) sc); 168 } else if(sc instanceof AttributeReference) { 169 visit((AttributeReference) sc ); 170 } else if(sc instanceof AttributeGroupReference) { 171 visit((AttributeGroupReference) sc); 172 } 173 } 174 175 } 176 177 195 @Override 196 public void visit(ElementReference er) { 197 int minOccurs = er.getMinOccursEffective(); 198 if(mStack.size() == 1 || minOccurs > 0) { 203 NamedComponentReference<GlobalElement> geRef = er.getRef(); 204 if(geRef != null && geRef.get() != null) { 205 visit(geRef.get()); 206 } 207 } 208 } 209 210 @Override 211 public void visit(LocalElement le) { 212 int minOccurs = le.getMinOccursEffective(); 213 if(mStack.size() == 1 || minOccurs > 0) { 215 String namespace = le.getModel().getSchema().getTargetNamespace(); 216 visit(le, le.getName(), namespace); 217 } 218 } 219 220 @Override 221 public void visit(GlobalElement ge) { 222 String namespace = ge.getModel().getSchema().getTargetNamespace(); 223 visit(ge, ge.getName(), namespace); 224 } 225 226 @Override 227 public void visit(All all) { 228 Collection <LocalElement> allElements = all.getElements(); 229 Iterator <LocalElement> it = allElements.iterator(); 230 while(it.hasNext()) { 231 LocalElement element = it.next(); 232 visit(element); 233 } 234 235 Collection <ElementReference> elementRefs = all.getElementReferences(); 236 Iterator <ElementReference> itER = elementRefs.iterator(); 237 while(itER.hasNext()) { 238 ElementReference element = itER.next(); 239 visit(element); 240 } 241 } 242 243 @Override 244 public void visit(AnyAttribute anyAttr) { 245 } 250 251 @Override 252 public void visit(AnyElement any) { 253 } 258 259 260 261 @Override 262 public void visit(Choice choice) { 263 List <SchemaComponent> children = choice.getChildren(); 264 Iterator <SchemaComponent> it = children.iterator(); 265 266 while(it.hasNext()) { 267 SchemaComponent comp = it.next(); 268 if(comp instanceof AnyElement) { 269 visit((AnyElement) comp); 270 } else if(comp instanceof Choice) { 271 visit((Choice) comp); 272 } else if(comp instanceof ElementReference) { 273 visit((ElementReference) comp); 274 } else if(comp instanceof GroupReference) { 275 visit((GroupReference) comp); 276 } else if(comp instanceof LocalElement) { 277 visit((LocalElement) comp); 278 } else if(comp instanceof Sequence) { 279 visit((Sequence) comp); 280 } 281 } 282 } 283 284 285 322 @Override 323 public void visit(GroupReference gr) { 324 NamedComponentReference<GlobalGroup> gg = gr.getRef(); 325 if(gg != null) { 326 visit(gg.get()); 327 } 328 } 329 330 334 335 @Override 336 public void visit(SimpleContent sc) { 337 338 } 339 340 @Override 341 public void visit(SimpleContentRestriction scr) { 342 343 } 344 345 @Override 346 public void visit(SimpleExtension se) { 347 348 } 349 350 @Override 351 public void visit(SimpleTypeRestriction str) { 352 353 } 354 355 private void visit(TypeContainer ge, String elementName, String namespace) { 356 String prefix = createNamespacePrefix(namespace); 357 358 ExtensibilityElement element = createExtensibilityElement(elementName, prefix, namespace, peek()); 359 addExtensibilityElement(peek(), element); 360 ExtensibilityElementConfigurator configurator = new ExtensibilityElementConfiguratorFactory().getExtensibilityElementConfigurator(new QName (namespace, elementName)); 361 if (configurator != null) { 362 String attributeName = configurator.getDisplayAttributeName(element, element.getQName()); 363 if (attributeName != null && element.getAttribute(attributeName) == null) { 364 String keyValuePrefix = null; 365 if ((keyValuePrefix = configurator.getAttributeUniqueValuePrefix(element, element.getQName(), attributeName)) != null) { 366 367 boolean isInTransaction = Utility.startTransaction(element.getModel()); 368 element.setAttribute(attributeName, 369 NameGenerator.generateUniqueValueForKeyAttribute(element, attributeName, element.getQName(), keyValuePrefix)); 370 Utility.endTransaction(element.getModel(), isInTransaction); 371 } 372 } 373 } 374 if(mRootExtensibilityElement == null) { 375 mRootExtensibilityElement = element; 376 } 377 push(element); 378 if(ge.getType() != null) { 379 GlobalType gt = ge.getType().get(); 380 if(gt != null) { 381 visit(gt); 382 } 383 } else { 384 LocalType lt = ge.getInlineType(); 385 visit(lt); 386 } 387 388 pop(); 389 } 390 391 private void visitAttribute(Attribute attr, String attrName, SimpleType simpleType) { 392 String defaultValue = attr.getDefault(); 393 String fixedValue = attr.getFixed(); 394 ExtensibilityElement exElement = (ExtensibilityElement) peek(); 395 String attrVal = null; 396 397 if (exElement.getAttribute(attrName) != null) 399 return; 400 401 if(defaultValue != null) { 402 attrVal = defaultValue; 403 } else if(fixedValue != null) { 404 attrVal = fixedValue; 405 } else { 406 QName elementQName = new QName (attr.getModel().getSchema().getTargetNamespace(), exElement.getQName().getLocalPart()); 407 ExtensibilityElementConfigurator configurator = 408 new ExtensibilityElementConfiguratorFactory().getExtensibilityElementConfigurator(elementQName); 409 if(simpleType != null) { 410 String simpleTypeName = null; 412 if (simpleType instanceof GlobalSimpleType) { 413 simpleTypeName = ((GlobalSimpleType) simpleType).getName(); 414 } 415 416 String namesapce = simpleType.getModel().getSchema().getTargetNamespace(); 417 SchemaModel primitiveTypesModel = SchemaModelFactory.getDefault().getPrimitiveTypesModel(); 418 String primitiveTypeNamesapce = primitiveTypesModel.getSchema().getTargetNamespace(); 419 if(namesapce != null 420 && namesapce.equals(primitiveTypeNamesapce) 421 && simpleTypeName != null && simpleTypeName.equals("boolean")) { if (configurator != null) { 423 attrVal = configurator.getDefaultValue(exElement, exElement.getQName(), attrName); 424 } 425 if (attrVal == null) { 426 attrVal = "true"; addAttributeToExtensibilityElement(exElement, attrName, attrVal); 428 return; 429 } 430 } else if(simpleType.getDefinition() instanceof SimpleTypeRestriction) { 431 SimpleTypeRestriction sr = (SimpleTypeRestriction) simpleType.getDefinition(); 434 Collection enumerations = sr.getEnumerations(); 435 if(enumerations != null && enumerations != null) { 436 if (configurator != null) { 437 attrVal = configurator.getDefaultValue(exElement, exElement.getQName(), attrName); 438 } 439 if (attrVal == null) { 440 Iterator enuIter = enumerations.iterator(); 441 if(enuIter.hasNext()) { 442 Enumeration facet = (Enumeration) enuIter.next(); 443 attrVal = facet.getValue(); 444 addAttributeToExtensibilityElement(exElement, attrName, attrVal); 445 return; 446 } 447 } 448 } 449 450 } 451 } 452 453 if(attrVal == null) { 454 if (configurator == null || (attrVal = configurator.getDefaultValue(exElement, exElement.getQName(), attrName)) == null) { 455 attrVal = NbBundle.getMessage(ExtensibilityElementCreatorVisitor.class, "REQUIRED_PROPERTY_DEFAULT_VALUE"); 456 } 457 } 458 459 460 } 461 addAttributeToExtensibilityElement(exElement, attrName, attrVal); 462 463 464 } 465 466 private String createNamespacePrefix(String targetNamespace) { 467 String prefix = Utility.getNamespacePrefix(targetNamespace, this.mModel); 470 if(prefix == null) { 471 prefix = NameGenerator.getInstance().generateNamespacePrefix(null, this.mDefinitions); 472 473 boolean inTransaction = Utility.startTransaction(mModel); 474 ((AbstractDocumentComponent)this.mDefinitions).addPrefix(prefix, targetNamespace); 475 Utility.endTransaction(mModel, inTransaction); 476 } 477 478 return prefix; 479 } 480 481 private ExtensibilityElement createExtensibilityElement(String elementName, 482 String prefix, 483 String targetNamespace, 484 WSDLComponent parent) { 485 QName qName = null; 486 487 if(prefix != null) { 488 qName = new QName (targetNamespace, elementName, prefix); 489 } else { 490 qName = new QName (targetNamespace, elementName); 491 } 492 493 ExtensibilityElement exElement = (ExtensibilityElement) this.mModel.getFactory().create(parent, qName); 496 497 return exElement; 498 499 } 500 501 private void addExtensibilityElement(WSDLComponent parent, ExtensibilityElement child) { 502 boolean inTransaction = Utility.startTransaction(mModel); 503 504 parent.addExtensibilityElement(child); 505 506 Utility.endTransaction(mModel, inTransaction); 507 } 508 509 private void addAttributeToExtensibilityElement(ExtensibilityElement exElement, String attrName, String attrVal) { 510 boolean inTransaction = Utility.startTransaction(mModel); 511 exElement.setAttribute(attrName, attrVal); 512 Utility.endTransaction(mModel, inTransaction); 513 } 514 515 private void push(WSDLComponent currentComponent) { 516 mStack.push(currentComponent); 517 } 518 519 private void pop() { 520 if(!this.mStack.empty()) { 521 this.mStack.pop(); 522 } 523 } 524 525 private WSDLComponent peek() { 526 if(!this.mStack.empty()) { 527 return this.mStack.peek(); 528 } 529 530 return null; 531 } 532 } 533 | Popular Tags |