| /******************************************************************************* |
| * Copyright (c) 2001, 2006 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.wst.xsd.ui.internal.adapters; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.xsd.XSDAttributeUse; |
| import org.eclipse.xsd.XSDComplexTypeDefinition; |
| import org.eclipse.xsd.XSDElementDeclaration; |
| import org.eclipse.xsd.XSDModelGroup; |
| import org.eclipse.xsd.XSDModelGroupDefinition; |
| import org.eclipse.xsd.XSDParticle; |
| import org.eclipse.xsd.XSDSchema; |
| import org.eclipse.xsd.XSDTypeDefinition; |
| import org.eclipse.xsd.XSDWildcard; |
| import org.eclipse.xsd.util.XSDSwitch; |
| |
| |
| public class XSDChildUtility |
| { |
| static public List getModelChildren(Object model) |
| { |
| XSDChildVisitor visitor = new XSDChildVisitor(model); |
| visitor.visitXSDObject(model); |
| return visitor.list; |
| } |
| |
| static public List getImmediateDerivedTypes(XSDComplexTypeDefinition complexType) |
| { |
| ArrayList typesDerivedFrom = new ArrayList(); |
| |
| // A handy convenience method quickly gets all |
| // typeDefinitions within our schema; note that |
| // whether or not this returns types in included, |
| // imported, or redefined schemas is subject to change |
| List typedefs = complexType.getSchema().getTypeDefinitions(); |
| |
| for (Iterator iter = typedefs.iterator(); iter.hasNext(); ) |
| { |
| XSDTypeDefinition typedef = (XSDTypeDefinition)iter.next(); |
| // Walk the baseTypes from this typedef seeing if any |
| // of them match the requested one |
| if (complexType.equals(typedef.getBaseType())) |
| { |
| // We found it, return the original one and continue |
| typesDerivedFrom.add(typedef); |
| } |
| } |
| return typesDerivedFrom; |
| } |
| // TODO... use the XSDVisitor defined in xsdeditor.util instead |
| // |
| public static class XSDChildVisitor extends XSDVisitor |
| { |
| Object root; |
| List list = new ArrayList(); |
| |
| public XSDChildVisitor(Object root) |
| { |
| this.root = root; |
| } |
| |
| public void visitXSDModelGroup(XSDModelGroup xsdModelGroup) |
| { |
| if (xsdModelGroup != root) |
| { |
| list.add(xsdModelGroup); |
| } |
| else |
| { |
| super.visitXSDModelGroup(xsdModelGroup); |
| } |
| } |
| |
| public void visitXSDModelGroupDefinition(XSDModelGroupDefinition xsdModelGroupDefinition) |
| { |
| if (xsdModelGroupDefinition != root) |
| { |
| list.add(xsdModelGroupDefinition); |
| } |
| else |
| { |
| super.visitXSDModelGroupDefinition(xsdModelGroupDefinition); |
| } |
| } |
| |
| public void visitXSDElementDeclaration(XSDElementDeclaration xsdElementDeclaration) |
| { |
| if (xsdElementDeclaration != root) |
| { |
| list.add(xsdElementDeclaration); |
| |
| } |
| else |
| { |
| super.visitXSDElementDeclaration(xsdElementDeclaration); |
| } |
| } |
| |
| public void visitXSDComplexTypeDefinition(XSDComplexTypeDefinition xsdComplexTypeDefinition) |
| { |
| if (xsdComplexTypeDefinition != root) |
| { |
| if (xsdComplexTypeDefinition.getName() != null || getModelChildren(xsdComplexTypeDefinition).size() > 0) |
| { |
| list.add(xsdComplexTypeDefinition); |
| } |
| } |
| else |
| { |
| super.visitXSDComplexTypeDefinition(xsdComplexTypeDefinition); |
| } |
| } |
| |
| public void visitXSDWildcard(XSDWildcard xsdWildCard) |
| { |
| if (xsdWildCard != root) |
| { |
| list.add(xsdWildCard); |
| } |
| else |
| { |
| super.visitXSDWildcard(xsdWildCard); |
| } |
| } |
| } |
| |
| |
| public static class XSDVisitor |
| { |
| int indent = 0; |
| |
| public void visitXSDObject(Object object) |
| { |
| if (object == null) |
| return; |
| |
| XSDSwitch theSwitch = new XSDSwitch() |
| { |
| public Object caseXSDComplexTypeDefinition(XSDComplexTypeDefinition object) |
| { |
| visitXSDComplexTypeDefinition(object); |
| return null; |
| } |
| |
| public Object caseXSDAttributeUse(XSDAttributeUse object) |
| { |
| visitXSDAttributeUse(object); |
| return null; |
| } |
| |
| public Object caseXSDElementDeclaration(XSDElementDeclaration object) |
| { |
| visitXSDElementDeclaration(object); |
| return null; |
| } |
| |
| public Object caseXSDModelGroupDefinition(XSDModelGroupDefinition object) |
| { |
| visitXSDModelGroupDefinition(object); |
| return super.caseXSDModelGroupDefinition(object); |
| } |
| |
| public Object caseXSDModelGroup(XSDModelGroup object) |
| { |
| visitXSDModelGroup(object); |
| return super.caseXSDModelGroup(object); |
| } |
| |
| public Object caseXSDParticle(XSDParticle object) |
| { |
| visitXSDParticle(object); |
| return null; |
| } |
| |
| public Object caseXSDSchema(XSDSchema object) |
| { |
| visitXSDSchema(object); |
| return null; |
| } |
| |
| public Object caseXSDWildcard(XSDWildcard object) |
| { |
| visitXSDWildcard(object); |
| return null; |
| } |
| }; |
| theSwitch.doSwitch((EObject)object); |
| } |
| |
| public void visitXSDAttributeUse(XSDAttributeUse xsdAttributeUse) |
| { |
| // printIndented("@" + xsdAttributeUse.getAttributeDeclaration().getName()); |
| } |
| |
| public void visitXSDSchema(XSDSchema xsdSchema) |
| { |
| indent += 2; |
| for (Iterator iterator = xsdSchema.getElementDeclarations().iterator(); iterator.hasNext(); ) |
| { |
| visitXSDObject(iterator.next()); |
| } |
| indent -= 2; |
| } |
| |
| public void visitXSDElementDeclaration(XSDElementDeclaration xsdElementDeclaration) |
| { |
| indent += 2; |
| XSDTypeDefinition td = xsdElementDeclaration.getTypeDefinition(); |
| if (td == null) |
| { |
| td = xsdElementDeclaration.getAnonymousTypeDefinition(); |
| } |
| visitXSDObject(td); |
| indent -= 2; |
| } |
| |
| public void visitXSDComplexTypeDefinition(XSDComplexTypeDefinition xsdComplexTypeDefinition) |
| { |
| indent += 2; |
| for (Iterator i = xsdComplexTypeDefinition.getAttributeUses().iterator(); i.hasNext(); ) |
| { |
| visitXSDObject(i.next()); |
| } |
| visitXSDObject(xsdComplexTypeDefinition.getContent()); |
| indent -= 2; |
| } |
| |
| public void visitXSDModelGroup(XSDModelGroup xsdModelGroup) |
| { |
| indent += 2; |
| for (Iterator iterator = xsdModelGroup.getContents().iterator(); iterator.hasNext(); ) |
| { |
| visitXSDObject(iterator.next()); |
| } |
| indent -= 2; |
| } |
| |
| public void visitXSDModelGroupDefinition(XSDModelGroupDefinition xsdModelGroupDefinition) |
| { |
| indent += 2; |
| visitXSDObject(xsdModelGroupDefinition.getResolvedModelGroupDefinition().getModelGroup()); |
| indent -= 2; |
| } |
| |
| public void visitXSDParticle(XSDParticle xsdParticle) |
| { |
| indent += 2; |
| if (xsdParticle.getContent() != null) |
| visitXSDObject(xsdParticle.getContent()); |
| indent -= 2; |
| } |
| |
| public void visitXSDWildcard(XSDWildcard object) |
| { |
| |
| } |
| |
| public void printIndented(String string) |
| { |
| //String spaces = ""; |
| //for (int i = 0; i < indent; i++) |
| //{ |
| // spaces += " "; |
| //} |
| |
| } |
| } |
| } |