blob: 191110cd66cc4fe441a9d46126d12452df0ea7e0 [file] [log] [blame]
/*******************************************************************************
* 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 += " ";
//}
}
}
}