protected Node processAttributeDeclaration( XSDAttributeDeclaration decl, Node parentNode, boolean isUse) throws RepositoryException { if (decl == null) { return null; } logger.debug( "Attribute declaration: '{0}' in ns '{1}' ", decl.getName(), decl.getTargetNamespace()); Node attributeDeclarationNode = parentNode.addNode(decl.getName(), XsdLexicon.ATTRIBUTE_DECLARATION); attributeDeclarationNode.setProperty(XsdLexicon.NC_NAME, decl.getName()); attributeDeclarationNode.setProperty(XsdLexicon.NAMESPACE, decl.getTargetNamespace()); if (decl.isGlobal() && !isUse) { registerForSymbolSpace( ATTRIBUTE_DECLARATIONS, decl.getTargetNamespace(), decl.getName(), attributeDeclarationNode.getIdentifier()); } XSDTypeDefinition type = decl.getType(); if (type != null) { attributeDeclarationNode.setProperty(XsdLexicon.TYPE_NAME, type.getName()); attributeDeclarationNode.setProperty(XsdLexicon.TYPE_NAMESPACE, type.getTargetNamespace()); } processAnnotation(decl.getAnnotation(), attributeDeclarationNode); processNonSchemaAttributes(type, attributeDeclarationNode); return attributeDeclarationNode; }
@Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof BPELVariableTreeNode) { Variable var = (Variable) ((BPELVariableTreeNode) element).getModelObject(); if (var.getName().indexOf(theFilter) > -1) return true; } else if (element instanceof XSDElementDeclarationTreeNode) { XSDElementDeclaration xsdelem = ((XSDElementDeclarationTreeNode) element).getResolvedModelObject(); if (xsdelem.getName().indexOf(theFilter) > -1) return true; } else if (element instanceof XSDAttributeDeclarationTreeNode) { XSDAttributeDeclaration xsdattribute = ((XSDAttributeDeclarationTreeNode) element).getResolvedModelObject(); if (xsdattribute.getName().indexOf(theFilter) > -1) return true; } else if (element instanceof PartTreeNode) { Part part = (Part) ((PartTreeNode) element).getModelObject(); if (part.getName().indexOf(theFilter) > -1) return true; } // determine if node has child nodes and see if they would // pass the filter test if (((TreeNode) element).hasChildren()) { Object[] children = ((TreeNode) element).getChildren(); for (int i = 0; i < children.length; i++) { if (select(viewer, element, children[i])) return true; } } return false; }
private XSDTypeDefinition getXSDTypeDefinition(XSDAttributeDeclaration attribute) { // port to org.eclipse.xsd if (attribute.getTypeDefinition() != null) return attribute.getTypeDefinition(); // port to org.eclipse.xsd else if (attribute.getAnonymousTypeDefinition() != null) return attribute.getAnonymousTypeDefinition(); else return null; }
private XSDAttributeDeclaration resolveXSDAttributeDeclaration( XSDAttributeDeclaration attribute) { // port to org.eclipse.xsd if (attribute.getResolvedAttributeDeclaration() != null) { XSDAttributeDeclaration resolvedAttribute = attribute.getResolvedAttributeDeclaration(); if (!isComponentResolvable(resolvedAttribute)) { XSDComponent resolvedComponent = getWSDLPartsToXSDTypeMapper().resolveXSDNamedComponent(resolvedAttribute); if (resolvedComponent != null && (resolvedComponent instanceof XSDAttributeDeclaration)) resolvedAttribute = (XSDAttributeDeclaration) resolvedComponent; } return resolvedAttribute; } else return attribute; }
public static void visit(XSDComplexTypeDefinition complexType) { List<String> attributeNames = new ArrayList<String>(); for (XSDAttributeGroupContent attribute : complexType.getAttributeContents()) { if (attribute instanceof XSDAttributeUse) { XSDAttributeDeclaration attr = ((XSDAttributeUse) attribute).getContent(); String name = attr.getName(); if (name != null) { if (attributeNames.contains(name)) { messages.add( MessageFormat.format( Structured_Messages.ComplexTypePropertyPage_DuplicateFieldErrorMessage, new Object[] {name})); } attributeNames.add(name); } } } List<String> names = new ArrayList<String>(); XSDComplexTypeContent content = complexType.getContent(); if (content instanceof XSDParticle) { visit((XSDParticle) content); XSDParticleContent particleContent = ((XSDParticle) content).getContent(); if (particleContent instanceof XSDModelGroup) { for (XSDParticle xsdParticle : ((XSDModelGroup) particleContent).getContents()) { XSDParticleContent xsdParticleContent = xsdParticle.getContent(); if (xsdParticleContent instanceof XSDElementDeclaration) { String name = ((XSDElementDeclaration) xsdParticleContent).getName(); if (name != null) { if (names.contains(name)) { messages.add( MessageFormat.format( Structured_Messages.ComplexTypePropertyPage_DuplicateFieldErrorMessage, new Object[] {name})); } names.add(name); } } } } } }
public IXSDFragment getFragment(XSDToFragmentConfiguration config, String id, String name) { XSDAttributeUse attribute = (XSDAttributeUse) config.getXSDComponent(); if (attribute != null && attribute.getAttributeDeclaration() != null) { XSDAttributeDeclaration resolvedAttribute = resolveXSDAttributeDeclaration(attribute.getAttributeDeclaration()); XSDTypeDefinition typeDef = getXSDTypeDefinition(resolvedAttribute); IXSDAttributeFragment attributeFrag = new XSDAttributeFragment(id, resolvedAttribute.getName(), config); attributeFrag.setXSDTypeDefinition(typeDef); XSDToFragmentConfiguration attributeTypeConfig = new XSDToFragmentConfiguration(); attributeTypeConfig.setXSDComponent(typeDef); attributeTypeConfig.setStyle(config.getStyle()); attributeTypeConfig.setPartEncoding(config.getPartEncoding()); attributeTypeConfig.setWSDLPartName(config.getWSDLPartName()); IXSDFragment xsdFragment = getController() .getFragment(attributeTypeConfig, attributeFrag.genID(), resolvedAttribute.getName()); attributeFrag.setXSDDelegationFragment(xsdFragment); return attributeFrag; } return getXSDDefaultFragment(config, id, name); }
/** * Creates an {@link AttributeType} that matches the xsd type definition as much as possible. * * <p>The original type definition given by the {@link XSDTypeDefinition} is kept as * AttributeType's metadata stored as a "user data" property using <code>XSDTypeDefinition.class * </code> as key. * * <p>If it is a complex attribute, it will contain all the properties declared in the <code> * typeDefinition</code>, as well as all the properties declared in its super types. TODO: handle * the case where the extension mechanism is restriction. * * @param assignedName * @param typeDefinition * @return */ private AttributeType createType( final Name assignedName, final XSDTypeDefinition typeDefinition, CoordinateReferenceSystem crs, boolean anonymous) { AttributeType attType; // ///////// if (processingTypes.contains(assignedName)) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Recursion found for type " + assignedName + ". Proxying it."); } attType = createProxiedType( assignedName, typeDefinition, anonymous ? anonTypeRegistry : typeRegistry); return attType; } processingTypes.push(assignedName); // ////////// final XSDTypeDefinition baseType = typeDefinition.getBaseType(); AttributeType superType = null; if (baseType != null) { String targetNamespace = baseType.getTargetNamespace(); String name = baseType.getName(); if (name != null) { Name baseTypeName = new NameImpl(targetNamespace, name); superType = getAttributeType(baseTypeName, baseType, crs); } } else { LOGGER.warning(assignedName + " has no super type"); } if (typeDefinition instanceof XSDComplexTypeDefinition) { XSDComplexTypeDefinition complexTypeDef; complexTypeDef = (XSDComplexTypeDefinition) typeDefinition; boolean includeParents = true; List<XSDElementDeclaration> children = Schemas.getChildElementDeclarations(typeDefinition, includeParents); final Collection<PropertyDescriptor> schema = new ArrayList<PropertyDescriptor>(children.size()); XSDElementDeclaration childDecl; AttributeDescriptor descriptor; for (Iterator it = children.iterator(); it.hasNext(); ) { childDecl = (XSDElementDeclaration) it.next(); try { descriptor = createAttributeDescriptor(complexTypeDef, childDecl, crs); } catch (NoSuchElementException e) { String msg = "Failed to create descriptor for '" + childDecl.getTargetNamespace() + "#" + childDecl.getName() + " from container '" + typeDefinition.getTargetNamespace() + "#" + typeDefinition.getName() + "'"; NoSuchElementException nse = new NoSuchElementException(msg); nse.initCause(e); throw nse; } schema.add(descriptor); } if (includeAttributes) { for (XSDAttributeUse attgcontent : complexTypeDef.getAttributeUses()) { XSDAttributeDeclaration att = attgcontent.getContent(); descriptor = createAttributeDescriptor( getXmlAttributeType(), null, new NameImpl(null, "@" + att.getName()), 0, 1, false, null); schema.add(descriptor); } } // set substitution group for descriptors here for (XSDElementDeclaration elemDecl : children) { if (elemDecl.isElementDeclarationReference()) { elemDecl = elemDecl.getResolvedElementDeclaration(); } PropertyDescriptor att = null; for (PropertyDescriptor desc : schema) { if (desc.getName().getLocalPart().equals(elemDecl.getName()) && desc.getName().getNamespaceURI().equals(elemDecl.getTargetNamespace())) { att = desc; break; } } setSubstitutionGroup(complexTypeDef, elemDecl, att, crs); } attType = createComplexAttributeType(assignedName, schema, complexTypeDef, superType); } else { Class<?> binding = String.class; boolean isIdentifiable = false; boolean isAbstract = false; List<Filter> restrictions = Collections.emptyList(); InternationalString description = null; attType = typeFactory.createAttributeType( assignedName, binding, isIdentifiable, isAbstract, restrictions, superType, description); } attType.getUserData().put(XSDTypeDefinition.class, typeDefinition); processingTypes.pop(); // even if the type is anonymous, it still has to be registered somewhere because // it's needed for the proxied types to find them. That's why we have 2 registries, // typeRegistry // and anonTypeRegistry. TypeRegistry is the global one, since anonymous types are meant to // be // local and shouldn't be searchable. register(attType, anonymous); return attType; }
public void encode(Object object, QName name, ContentHandler handler) throws IOException, SAXException { // maintain a stack of (encoding,element declaration pairs) Stack encoded = null; try { serializer = handler; if (!inline) { serializer.startDocument(); } if (namespaceAware) { // write out all the namespace prefix value mappings for (Enumeration e = namespaces.getPrefixes(); e.hasMoreElements(); ) { String prefix = (String) e.nextElement(); String uri = namespaces.getURI(prefix); if ("xml".equals(prefix)) { continue; } serializer.startPrefixMapping(prefix, uri); } for (Iterator itr = schema.getQNamePrefixToNamespaceMap().entrySet().iterator(); itr.hasNext(); ) { Map.Entry entry = (Map.Entry) itr.next(); String pre = (String) entry.getKey(); String ns = (String) entry.getValue(); if (XSDUtil.SCHEMA_FOR_SCHEMA_URI_2001.equals(ns)) { continue; } serializer.startPrefixMapping(pre, ns); serializer.endPrefixMapping(pre); namespaces.declarePrefix((pre != null) ? pre : "", ns); } // ensure a default namespace prefix set if (namespaces.getURI("") == null) { namespaces.declarePrefix("", schema.getTargetNamespace()); } } // create the document DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); try { doc = docFactory.newDocumentBuilder().newDocument(); } catch (ParserConfigurationException e) { new IOException().initCause(e); } encoded = new Stack(); // add the first entry XSDElementDeclaration root = index.getElementDeclaration(name); if (root == null) { // check for context hint, this is only used when running the encoder // in test mode QName typeDefintion = (QName) context.getComponentInstance("http://geotools.org/typeDefinition"); if (typeDefintion != null) { XSDTypeDefinition type = index.getTypeDefinition(typeDefintion); if (type == null) { throw new NullPointerException(); } // create a mock element declaration root = XSDFactory.eINSTANCE.createXSDElementDeclaration(); root.setName(name.getLocalPart()); root.setTargetNamespace(name.getNamespaceURI()); root.setTypeDefinition(type); } } if (root == null) { String msg = "Could not find element declaration for:" + name; throw new IllegalArgumentException(msg); } encoded.add(new EncodingEntry(object, root, null)); while (!encoded.isEmpty()) { EncodingEntry entry = (EncodingEntry) encoded.peek(); if (entry.encoding != null) { // element has been started, get the next child if (!entry.children.isEmpty()) { Object[] child = (Object[]) entry.children.get(0); XSDElementDeclaration element = (XSDElementDeclaration) child[0]; Iterator itr = (Iterator) child[1]; if (itr.hasNext()) { Object next = itr.next(); if (next == null) { logger.warning("Iterator returned null for " + element.getName()); } // here we check for instanceof EncoderDelegate if (next instanceof EncoderDelegate) { // do not add entry to the stack, just delegate to encode try { ((EncoderDelegate) next).encode(handler); } catch (Exception e) { throw new RuntimeException(e); } } else { // add the next object to be encoded to the stack encoded.push(new EncodingEntry(next, element, entry)); } } else { // iterator done, close it Object source = child[2]; closeIterator(itr, source); // this child is done, remove from child list entry.children.remove(0); } } else { // no more children, finish the element end(entry.encoding); encoded.pop(); // clean up the entry entry.object = null; entry.element = null; entry.encoding = null; entry.children = null; entry.parent = null; } } else { // start the encoding of the entry // first make sure the element is not abstract if (entry.element.isAbstract()) { // look for a non abstract substitute - substitution groups are subject to // changes over time, so we make a copy to avoid being hit with a // ConcurrentModificationException List sub = safeCopy(entry.element.getSubstitutionGroup()); if (sub.size() > 0) { // match up by type List matches = new ArrayList(); for (Iterator s = sub.iterator(); s.hasNext(); ) { XSDElementDeclaration e = (XSDElementDeclaration) s.next(); if (e == null || e.equals(entry.element)) { continue; } if (e.getName() == null) { continue; } // look up hte binding Binding binding = bindingLoader.loadBinding( new QName(e.getTargetNamespace(), e.getName()), context); if (binding == null) { // try the type XSDTypeDefinition type = e.getType(); if (type == null || type.getName() == null) { continue; } binding = bindingLoader.loadBinding( new QName(type.getTargetNamespace(), type.getName()), context); } if (binding == null) { continue; } if (binding.getType() == null) { logger.warning("Binding: " + binding.getTarget() + " returns null type."); continue; } // match up the type if (binding.getType().isAssignableFrom(entry.object.getClass())) { // we have a match, store as an (element,binding) tuple matches.add(new Object[] {e, binding}); } } // if one, we are gold if (matches.size() == 1) { entry.element = (XSDElementDeclaration) ((Object[]) matches.get(0))[0]; } // if multiple we have a problem else if (matches.size() > 0) { if (logger.isLoggable(Level.FINE)) { StringBuffer msg = new StringBuffer("Found multiple non-abstract bindings for "); msg.append(entry.element.getName()).append(": "); for (Iterator m = matches.iterator(); m.hasNext(); ) { msg.append(m.next().getClass().getName()); msg.append(", "); } logger.fine(msg.toString()); } // try sorting by the type of the binding Collections.sort( matches, new Comparator() { public int compare(Object o1, Object o2) { Object[] match1 = (Object[]) o1; Object[] match2 = (Object[]) o2; Binding b1 = (Binding) match1[1]; Binding b2 = (Binding) match2[1]; if (b1.getType() != b2.getType()) { if (b2.getType().isAssignableFrom(b1.getType())) { return -1; } if (b1.getType().isAssignableFrom(b2.getType())) { return 1; } } // use binding comparability if (b1 instanceof Comparable) { return ((Comparable) b1).compareTo(b2); } if (b2 instanceof Comparable) { return -1 * ((Comparable) b2).compareTo(b1); } return 0; } }); } if (matches.size() > 0) { entry.element = (XSDElementDeclaration) ((Object[]) matches.get(0))[0]; } // if zero, just use the abstract element } } if (entry.element.isAbstract()) { logger.fine(entry.element.getName() + " is abstract"); } entry.encoding = entry.parent != null ? (Element) encode(entry.object, entry.element, entry.parent.element.getType()) : (Element) encode(entry.object, entry.element); // add any more attributes List attributes = index.getAttributes(entry.element); for (Iterator itr = attributes.iterator(); itr.hasNext(); ) { XSDAttributeDeclaration attribute = (XSDAttributeDeclaration) itr.next(); // do not encode the attribute if it has already been // encoded by the parent String ns = attribute.getTargetNamespace(); String local = attribute.getName(); if ((entry.encoding.getAttributeNS(ns, local) != null) && !"".equals(entry.encoding.getAttributeNS(ns, local))) { continue; } // get the object(s) for this attribute GetPropertyExecutor executor = new GetPropertyExecutor(entry.object, attribute); BindingVisitorDispatch.walk(object, bindingWalker, entry.element, executor, context); if (executor.getChildObject() != null) { // encode the attribute Attr attr = (Attr) encode(executor.getChildObject(), attribute); if (attr != null) { entry.encoding.setAttributeNodeNS(attr); } } } // write out the leading edge of the element if (schemaLocations != null) { // root element, add schema locations if set if (!schemaLocations.isEmpty()) { // declare the schema instance mapping serializer.startPrefixMapping("xsi", XSDUtil.SCHEMA_INSTANCE_URI_2001); serializer.endPrefixMapping("xsi"); namespaces.declarePrefix("xsi", XSDUtil.SCHEMA_INSTANCE_URI_2001); StringBuffer schemaLocation = new StringBuffer(); for (Iterator e = schemaLocations.entrySet().iterator(); e.hasNext(); ) { Map.Entry tuple = (Map.Entry) e.next(); String namespaceURI = (String) tuple.getKey(); String location = (String) tuple.getValue(); schemaLocation.append(namespaceURI + " " + location); if (e.hasNext()) { schemaLocation.append(" "); } } entry.encoding.setAttributeNS( XSDUtil.SCHEMA_INSTANCE_URI_2001, "xsi:schemaLocation", schemaLocation.toString()); } schemaLocations = null; } start(entry.encoding, entry.element); // TODO: this method of getting at properties wont maintain order very well, need // to come up with a better system that is capable of hanlding feature types for (Iterator pe = propertyExtractors.iterator(); pe.hasNext(); ) { PropertyExtractor propertyExtractor = (PropertyExtractor) pe.next(); if (propertyExtractor.canHandle(entry.object)) { List extracted = propertyExtractor.properties(entry.object, entry.element); O: for (Iterator e = extracted.iterator(); e.hasNext(); ) { Object[] tuple = (Object[]) e.next(); XSDParticle particle = (XSDParticle) tuple[0]; XSDElementDeclaration child = (XSDElementDeclaration) particle.getContent(); // check for a comment if ((child != null) && (COMMENT.getNamespaceURI().equals(child.getTargetNamespace())) && COMMENT.getLocalPart().equals(child.getName())) { comment(child.getElement()); continue; } if (child.isElementDeclarationReference()) { child = child.getResolvedElementDeclaration(); } // do not encode the element if the parent has already // been encoded by the parent String ns = child.getTargetNamespace(); String local = child.getName(); for (int i = 0; i < entry.encoding.getChildNodes().getLength(); i++) { Node node = entry.encoding.getChildNodes().item(i); if (node instanceof Element) { if (ns != null) { if (ns.equals(node.getNamespaceURI()) && local.equals(node.getLocalName())) { continue O; } } else { if (local.equals(node.getLocalName())) { continue O; } } } } Object obj = tuple[1]; if (obj == null) { if (particle.getMinOccurs() == 0) { // cool } else { // log an error logger.fine("Property " + ns + ":" + local + " not found but minoccurs > 0 "); } // skip this regardless continue; } // figure out the maximum number of occurences int maxOccurs = 1; if (particle.isSetMaxOccurs()) { maxOccurs = particle.getMaxOccurs(); } else { // look the containing group if (particle.eContainer() instanceof XSDModelGroup) { XSDModelGroup group = (XSDModelGroup) particle.eContainer(); if (group.eContainer() instanceof XSDParticle) { XSDParticle cParticle = (XSDParticle) group.eContainer(); if (cParticle.isSetMaxOccurs()) { maxOccurs = cParticle.getMaxOccurs(); } } } } if ((maxOccurs == -1) || (maxOccurs > 1)) { // may have a collection or array, unwrap it Iterator iterator = null; if (obj instanceof Iterator) { iterator = (Iterator) obj; } else if (obj.getClass().isArray()) { Object[] array = (Object[]) obj; iterator = Arrays.asList(array).iterator(); } else if (obj instanceof Collection) { Collection collection = (Collection) obj; iterator = collection.iterator(); } else if (obj instanceof FeatureCollection) { FeatureCollection collection = (FeatureCollection) obj; iterator = collection.iterator(); } else { iterator = new SingleIterator(obj); } entry.children.add(new Object[] {child, iterator, obj}); } else { // only one, just add the object entry.children.add(new Object[] {child, new SingleIterator(obj), obj}); } } } } } } if (!inline) { serializer.endDocument(); } } finally { // cleanup index.destroy(); // close any iterators still present in the stack, this will only occur in an exception // case if (encoded != null) { while (!encoded.isEmpty()) { EncodingEntry entry = (EncodingEntry) encoded.pop(); if (!entry.children.isEmpty()) { Object[] child = (Object[]) entry.children.get(0); Iterator itr = (Iterator) child[1]; try { closeIterator(itr, child[2]); } catch (Exception e) { // ignore, we are already in an error case. } } } } // TODO: there are probably other refences to elements of XSDScheam objects, we should // kill them too } }
protected void updatePreviewText(IStructuredSelection selection) { if (previewText == null) return; VariableTreeContentProvider contentProvider = (VariableTreeContentProvider) super.getTreeViewer().getContentProvider(); Object[] path = contentProvider.getPathToRoot(selection.getFirstElement()); String preview = "$"; // $NON-NLS-1$ if (path != null) { Variable var = null; for (int i = path.length - 1; i >= 0; i--) { String targetNamespace = null; String namespacePrefix = null; String segment = null; Object modelObject = BPELUtil.resolveXSDObject(((ITreeNode) path[i]).getModelObject()); ; if (modelObject instanceof Variable) { var = (Variable) modelObject; segment = var.getName(); } else if (modelObject instanceof XSDAttributeDeclaration) { XSDAttributeDeclaration att = (XSDAttributeDeclaration) modelObject; targetNamespace = att.getTargetNamespace(); if (targetNamespace != null) { namespacePrefix = BPELUtils.getNamespacePrefix(var, targetNamespace); Assert.isNotNull(namespacePrefix, XPathExpressionUtil.MSG_NS_PREFIX_NULL); segment = "/@" + namespacePrefix + ":" + att.getName(); // $NON-NLS-1$ //$NON-NLS-2$ } else { segment = "/@" + att.getName(); // $NON-NLS-1$ } } else if (modelObject instanceof XSDElementDeclaration) { XSDElementDeclaration elm = (XSDElementDeclaration) modelObject; targetNamespace = elm.getTargetNamespace(); XSDTypeDefinition typeDef = elm.getType(); XSDParticle particle = typeDef.getComplexType(); boolean isArray = particle != null && (particle.getMaxOccurs() == XSDParticle.UNBOUNDED || particle.getMaxOccurs() > 1); if (targetNamespace != null) { namespacePrefix = BPELUtils.getNamespacePrefix(var, targetNamespace); Assert.isNotNull(namespacePrefix, XPathExpressionUtil.MSG_NS_PREFIX_NULL); segment = "/" + namespacePrefix + ":" + elm.getName(); // $NON-NLS-1$ //$NON-NLS-2$ } else { segment = "/" + elm.getName(); // $NON-NLS-1$ } if (isArray) { segment += "[1]"; // $NON-NLS-1$ } } else if (modelObject instanceof Part) { Part part = (Part) modelObject; segment = "." + part.getName(); // $NON-NLS-1$ } if (segment != null) preview += segment; } // store away value previewText.setText(preview); thePreviewText = preview; } }