blob: 48a0f343968a17c041727080ca556cf2c8cc1cfb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2008 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.xsd.XSDAttributeDeclaration;
import org.eclipse.xsd.XSDAttributeGroupContent;
import org.eclipse.xsd.XSDAttributeGroupDefinition;
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.XSDSimpleTypeDefinition;
import org.eclipse.xsd.XSDWildcard;
public class XSDVisitorForFields extends XSDVisitor
{
public XSDVisitorForFields()
{
super();
}
public List concreteComponentList = new ArrayList();
public List thingsWeNeedToListenTo = new ArrayList();
public void visitComplexTypeDefinition(XSDComplexTypeDefinition type)
{
if (type.getAttributeContents() != null)
{
for (Iterator iter = type.getAttributeContents().iterator(); iter.hasNext(); )
{
XSDAttributeGroupContent attrGroupContent = (XSDAttributeGroupContent)iter.next();
if (attrGroupContent instanceof XSDAttributeUse)
{
XSDAttributeUse attrUse = (XSDAttributeUse)attrGroupContent;
visitAttributeDeclaration(attrUse.getContent());
// if (attrUse.getAttributeDeclaration() != attrUse.getContent())
// {
// visitAttributeDeclaration(attrUse.getContent());
// }
// else
// {
// thingsWeNeedToListenTo.add(attrUse.getAttributeDeclaration());
// concreteComponentList.add(attrUse.getAttributeDeclaration());
// }
}
else if (attrGroupContent instanceof XSDAttributeGroupDefinition)
{
XSDAttributeGroupDefinition attrGroup = (XSDAttributeGroupDefinition)attrGroupContent;
thingsWeNeedToListenTo.add(attrGroup);
if (attrGroup.isAttributeGroupDefinitionReference())
{
attrGroup = attrGroup.getResolvedAttributeGroupDefinition();
visitAttributeGroupDefinition(attrGroup);
}
}
}
}
if (type.getAttributeWildcard() != null)
{
thingsWeNeedToListenTo.add(type.getAttributeWildcard());
concreteComponentList.add(type.getAttributeWildcard());
}
super.visitComplexTypeDefinition(type);
}
public void visitComplexTypeContent(XSDSimpleTypeDefinition content)
{
thingsWeNeedToListenTo.add(content);
super.visitComplexTypeContent(content);
}
public void visitModelGroupDefinition(XSDModelGroupDefinition modelGroupDef)
{
// listen to definition in case it changes
XSDModelGroupDefinition resolvedModelGroupDef = modelGroupDef.getResolvedModelGroupDefinition();
if (visitedGroups.contains(resolvedModelGroupDef.getModelGroup())) return;
if (modelGroupDef.isModelGroupDefinitionReference())
{
// if it's a reference we need to listen to the reference incase it changes
if (!thingsWeNeedToListenTo.contains(modelGroupDef))
thingsWeNeedToListenTo.add(modelGroupDef);
}
super.visitModelGroupDefinition(modelGroupDef);
}
public void visitModelGroup(XSDModelGroup modelGroup)
{
super.visitModelGroup(modelGroup);
thingsWeNeedToListenTo.add(modelGroup);
}
public void visitAttributeGroupDefinition(XSDAttributeGroupDefinition attributeGroup)
{
for (Iterator it = attributeGroup.getContents().iterator(); it.hasNext(); )
{
Object o = it.next();
if (o instanceof XSDAttributeUse)
{
XSDAttributeUse attributeUse = (XSDAttributeUse)o;
concreteComponentList.add(attributeUse.getAttributeDeclaration());
thingsWeNeedToListenTo.add(attributeUse.getAttributeDeclaration());
}
else if (o instanceof XSDAttributeGroupDefinition)
{
XSDAttributeGroupDefinition attrGroup = (XSDAttributeGroupDefinition)o;
thingsWeNeedToListenTo.add(attrGroup);
if (attrGroup.isAttributeGroupDefinitionReference())
{
attrGroup = attrGroup.getResolvedAttributeGroupDefinition();
visitAttributeGroupDefinition(attrGroup);
}
}
}
XSDWildcard anyAttribute = attributeGroup.getAttributeWildcardContent();
if (anyAttribute != null)
{
concreteComponentList.add(anyAttribute);
thingsWeNeedToListenTo.add(anyAttribute);
}
}
public void visitParticle(XSDParticle particle)
{
thingsWeNeedToListenTo.add(particle);
super.visitParticle(particle);
}
public void visitWildcard(XSDWildcard wildcard)
{
concreteComponentList.add(wildcard);
}
public void visitElementDeclaration(XSDElementDeclaration element)
{
if (element.isElementDeclarationReference())
{
thingsWeNeedToListenTo.add(element);
thingsWeNeedToListenTo.add(element.getResolvedElementDeclaration());
// now, add the reference as a field
concreteComponentList.add(element);
}
else
{
concreteComponentList.add(element.getResolvedElementDeclaration());
// note... we intentionally ommit the call to super.visitElementDeclaration()
// since we don't want to delve down deeper than the element
}
}
public void visitAttributeDeclaration(XSDAttributeDeclaration attr)
{
if (attr.isAttributeDeclarationReference())
{
thingsWeNeedToListenTo.add(attr);
thingsWeNeedToListenTo.add(attr.getResolvedAttributeDeclaration());
concreteComponentList.add(attr);
}
else
{
concreteComponentList.add(attr.getResolvedAttributeDeclaration());
thingsWeNeedToListenTo.add(attr.getResolvedAttributeDeclaration());
}
}
}