| /******************************************************************************* |
| * 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.wsdl.ui.internal.commands; |
| |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import javax.xml.namespace.QName; |
| |
| import org.eclipse.wst.wsdl.Definition; |
| import org.eclipse.wst.wsdl.Message; |
| import org.eclipse.wst.wsdl.Part; |
| import org.eclipse.wst.wsdl.WSDLElement; |
| import org.eclipse.wst.wsdl.WSDLFactory; |
| import org.eclipse.wst.wsdl.XSDSchemaExtensibilityElement; |
| import org.eclipse.wst.wsdl.internal.impl.PartImpl; |
| import org.eclipse.wst.wsdl.internal.impl.WSDLElementImpl; |
| import org.eclipse.wst.wsdl.util.WSDLConstants; |
| import org.eclipse.wst.xml.core.document.IDOMNode; |
| import org.eclipse.xsd.XSDElementDeclaration; |
| import org.eclipse.xsd.XSDSchema; |
| |
| |
| public final class AddPartCommand extends WSDLElementCommand |
| { |
| private Message message; |
| private String name; |
| private Part part; |
| private Part originalPart; |
| |
| private QName typeOrElementName; |
| private boolean useType = true; |
| |
| public AddPartCommand |
| (Message message, |
| String name) |
| { |
| this.message = message; |
| this.name = name; |
| } |
| |
| public AddPartCommand |
| (Message message, |
| String name, |
| String namespace, |
| String localName, |
| boolean useType) |
| { |
| this.message = message; |
| this.name = name; |
| this.useType = useType; |
| typeOrElementName = new QName(namespace,localName); |
| } |
| |
| /* |
| * Constructor used to create a Part based on the given Part. In essence, this will |
| * create a copy of the given Part. |
| */ |
| public AddPartCommand |
| (Message message, |
| Part originalPart, |
| String name) |
| { |
| this.message = message; |
| this.name = name; |
| this.originalPart = originalPart; |
| } |
| |
| /** |
| * @deprecated |
| */ |
| public AddPartCommand |
| (Message message, |
| String name, |
| String namespace, |
| String localName) |
| { |
| this.message = message; |
| this.name = name; |
| typeOrElementName = new QName(namespace,localName); |
| } |
| |
| public void setName(String name) |
| { |
| this.name = name; |
| } |
| |
| public WSDLElement getWSDLElement() |
| { |
| return part; |
| } |
| |
| public void run() |
| { |
| if (typeOrElementName == null) |
| typeOrElementName = createDefaultTypeName(); |
| |
| // Add namespace to the Definitions if it is not there yet. |
| addNamespaceDeclaration(); |
| |
| part = WSDLFactory.eINSTANCE.createPart(); |
| part.setName(name); |
| |
| if (originalPart == null) { |
| if (useType) |
| part.setTypeName(typeOrElementName); |
| else |
| part.setElementName(typeOrElementName); |
| } |
| else { |
| if (originalPart.getTypeName() != null) |
| part.setTypeName(originalPart.getTypeName()); |
| |
| String newElementName = null; |
| if (originalPart.getElementName() != null) { |
| |
| boolean createNewElement = true; |
| if (originalPart.getElementDeclaration() != null && originalPart.getElementDeclaration().getElement() != null) { |
| if (!(originalPart.getElementDeclaration().getElement() instanceof IDOMNode)) { |
| createNewElement = false; |
| } |
| } |
| |
| if (createNewElement) { |
| newElementName = getNewNameHelper(name, originalPart.getEnclosingDefinition(), false); |
| part.setElementName(new QName(originalPart.getElementName().getNamespaceURI(), newElementName)); |
| |
| if (originalPart.getEnclosingDefinition() != null) { |
| if (newElementName == null) { |
| newElementName = getNewNameHelper(name, originalPart.getEnclosingDefinition(), false); |
| } |
| |
| AddXSDElementDeclarationCommand elementAction = new AddXSDElementDeclarationCommand(originalPart.getEnclosingDefinition(), newElementName); |
| elementAction.run(); |
| } |
| } |
| else { |
| part.setElementName(new QName(originalPart.getElementName().getNamespaceURI(), originalPart.getElementName().getLocalPart())); |
| } |
| } |
| } |
| |
| part.setEnclosingDefinition(message.getEnclosingDefinition()); |
| ((PartImpl)part).reconcileReferences(false); |
| message.addPart(part); |
| } |
| |
| private void addNamespaceDeclaration() |
| { |
| Definition definition = message.getEnclosingDefinition(); |
| if (!definition.getNamespaces().containsValue(typeOrElementName.getNamespaceURI())) |
| { |
| definition.addNamespace("p",typeOrElementName.getNamespaceURI()); |
| ((WSDLElementImpl)definition).updateElement(false); |
| } |
| } |
| |
| private QName createDefaultTypeName() |
| { |
| QName qname = new QName(WSDLConstants.SCHEMA_FOR_SCHEMA_URI_2001,"string"); |
| return qname; |
| } |
| |
| private String getNewNameHelper(String base, Definition def, boolean isType) |
| { |
| String name = base; |
| int count = 0; |
| |
| // Ugly.... Redo this... |
| // Get a list of Elements... |
| List elementList = null; |
| if (def.getETypes() != null) { |
| List xsdsList = def.getETypes().getEExtensibilityElements(); |
| if (xsdsList != null) { |
| Iterator xsdsIterator = xsdsList.iterator(); |
| XSDSchemaExtensibilityElement xsdElement = (XSDSchemaExtensibilityElement) xsdsIterator.next(); |
| XSDSchema schema = xsdElement.getSchema(); |
| if (schema != null) { |
| elementList = schema.getElementDeclarations(); |
| } |
| } |
| } |
| |
| if (elementList != null) { |
| int index = 0; |
| while (index < elementList.size()) { |
| XSDElementDeclaration elementDeclaration = (XSDElementDeclaration) elementList.get(index); |
| |
| if (name.equals(elementDeclaration.getName())) { |
| count++; |
| name = name + count; |
| index = 0; |
| } |
| else { |
| index++; |
| } |
| } |
| } |
| |
| return name; |
| } |
| } |