| /******************************************************************************* |
| * 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.nsedit; |
| |
| 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())) |
| 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)); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |