blob: 3ecd3a34de9a4c4f36761c0c9378b6ca99c1edc0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 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.refactor.rename;
import java.util.Iterator;
import java.util.List;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
import org.eclipse.xsd.XSDAttributeDeclaration;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.XSDSimpleTypeDefinition;
import org.eclipse.xsd.XSDTypeDefinition;
import org.eclipse.xsd.util.XSDConstants;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class SchemaPrefixChangeHandler
{
String newPrefix;
XSDSchema xsdSchema;
public SchemaPrefixChangeHandler(XSDSchema xsdSchema, String newPrefix)
{
this.xsdSchema = xsdSchema;
this.newPrefix= newPrefix;
}
public void resolve()
{
XSDSchemaPrefixRenamer xsdSchemaPrefixRenamer = new XSDSchemaPrefixRenamer();
xsdSchemaPrefixRenamer.visitSchema(xsdSchema);
}
public String getNewQName(XSDTypeDefinition comp, String value, String newXSDPrefix)
{
String qName = null;
if (value != null)
{
qName = newXSDPrefix;
if (qName != null && qName.length() > 0)
{
qName += ":" + value;
}
else
{
qName = value;
}
}
else
{
qName = value;
}
return qName;
}
class XSDSchemaPrefixRenamer extends XSDVisitor
{
public XSDSchemaPrefixRenamer()
{
super();
}
public void visitElementDeclaration(XSDElementDeclaration element)
{
super.visitElementDeclaration(element);
XSDTypeDefinition type = element.getType();
if (type != null)
{
String ns = type.getTargetNamespace();
if (ns == null) ns = "";
// if (ns.equals(xsdSchema.getSchemaForSchemaNamespace()))
if (ns.equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001))
{
Element domElement = element.getElement();
if (domElement != null && domElement instanceof IDOMNode)
{
Attr typeAttr = domElement.getAttributeNode(XSDConstants.TYPE_ATTRIBUTE);
if (typeAttr != null)
{
element.getElement().setAttribute(XSDConstants.TYPE_ATTRIBUTE, getNewQName(type, type.getName(), newPrefix));
}
}
}
}
}
public void visitSimpleTypeDefinition(XSDSimpleTypeDefinition simpleType)
{
super.visitSimpleTypeDefinition(simpleType);
XSDTypeDefinition baseType = simpleType.getBaseTypeDefinition();
if (baseType != null)
{
String ns = baseType.getTargetNamespace();
if (ns == null) ns = "";
// if (ns.equals(xsdSchema.getSchemaForSchemaNamespace()))
// System.out.println(xsdSchema.getSchemaForSchemaNamespace());
if (ns.equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001))
{
XSDDOMHelper domHelper = new XSDDOMHelper();
Element derivedBy = domHelper.getDerivedByElement(simpleType.getElement());
if (derivedBy != null && derivedBy instanceof IDOMNode)
{
Attr typeAttr = derivedBy.getAttributeNode(XSDConstants.BASE_ATTRIBUTE);
if (typeAttr != null)
{
derivedBy.setAttribute(XSDConstants.BASE_ATTRIBUTE, getNewQName(baseType, baseType.getName(), newPrefix));
}
}
}
}
XSDSimpleTypeDefinition itemType = simpleType.getItemTypeDefinition();
if (itemType != null)
{
String ns = itemType.getTargetNamespace();
if (ns == null) ns = "";
if (ns.equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001))
{
XSDDOMHelper domHelper = new XSDDOMHelper();
Node listNode = domHelper.getChildNode(simpleType.getElement(), XSDConstants.LIST_ELEMENT_TAG);
if (listNode != null && listNode instanceof Element)
{
Element listElement = (Element)listNode;
if (listElement instanceof IDOMNode)
{
Attr typeAttr = listElement.getAttributeNode(XSDConstants.ITEMTYPE_ATTRIBUTE);
if (typeAttr != null)
{
listElement.setAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE, getNewQName(itemType, itemType.getName(), newPrefix));
}
}
}
}
}
List memberTypes = simpleType.getMemberTypeDefinitions();
if (memberTypes.size() > 0)
{
XSDDOMHelper domHelper = new XSDDOMHelper();
Node unionNode = domHelper.getChildNode(simpleType.getElement(), XSDConstants.UNION_ELEMENT_TAG);
if (unionNode != null && unionNode instanceof Element)
{
Element unionElement = (Element)unionNode;
if (unionElement instanceof IDOMNode)
{
StringBuffer sb = new StringBuffer("");
for (Iterator i = memberTypes.iterator(); i.hasNext(); )
{
XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)i.next();
String ns = st.getTargetNamespace();
if (ns == null) ns = "";
if (ns.equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001))
{
sb.append(getNewQName(st, st.getName(), newPrefix));
}
else
{
sb.append(st.getQName(xsdSchema));
}
if (i.hasNext())
{
sb.append(" ");
}
}
unionElement.setAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE, sb.toString());
}
}
}
}
public void visitAttributeDeclaration(XSDAttributeDeclaration attr)
{
super.visitAttributeDeclaration(attr);
XSDTypeDefinition type = attr.getType();
if (type != null)
{
String ns = type.getTargetNamespace();
if (ns == null) ns = "";
// if (ns.equals(xsdSchema.getSchemaForSchemaNamespace()))
if (ns.equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001))
{
Element domElement = attr.getElement();
if (domElement != null && domElement instanceof IDOMNode)
{
Attr typeAttr = domElement.getAttributeNode(XSDConstants.TYPE_ATTRIBUTE);
if (typeAttr != null)
{
attr.getElement().setAttribute(XSDConstants.TYPE_ATTRIBUTE, getNewQName(type, type.getName(), newPrefix));
}
}
}
}
}
}
}