Пример #1
0
  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;
 }
Пример #5
0
  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);
 }
Пример #7
0
  /**
   * 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;
  }
Пример #8
0
  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;
    }
  }