blob: 2ed9d68c2c88f78fef1ab72422f045ca9077d9d7 [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.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.internal.provisional.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;
}
}