/******************************************************************************* * Copyright (c) 2005, 2012 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.bpel.ui.commands; import java.util.Iterator; import org.eclipse.bpel.ui.IBPELUIConstants; import org.eclipse.bpel.ui.commands.util.AutoUndoCommand; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.wst.wsdl.Definition; import org.eclipse.wst.wsdl.Import; import org.eclipse.wst.wsdl.WSDLFactory; import org.eclipse.xsd.XSDNamedComponent; import org.eclipse.xsd.XSDSchema; /** * Adds an Import to the Imports contained in the Process. * * This command object can also be used to determine if an import * can be added or if it would create a duplicate. * * @author Michal Chmielewski (michal.chmielewski@oracle.com) * */ public class AddWSDLImportCommand extends AutoUndoCommand { /* Definition into which the import will be placed. */ Definition fDefinition; /* The WSDL import to create. * Note this is the WSDL import, not the BPEL import */ Import fImport; /** * Create a new instance of the AddImportCommand * @param defn the WSDL definition to add import to * @param object either an Import, XSDSchema, Definition, or any element * belonging to schema or definition (that is, whose parent is either a schema * or a definition). */ public AddWSDLImportCommand ( Definition defn , Object object ) { super (defn); setLabel(IBPELUIConstants.CMD_ADD_IMPORT); fDefinition = defn; fImport = createImport( object ); } @Override public void doExecute() { if (fImport == null) { return ; } /* Add the WSDL imports */ if (containsImport(fDefinition,fImport) == false) { fImport.setEnclosingDefinition( fDefinition ); fDefinition.addImport( fImport ); } } Import createImport ( Object obj ) { if (obj instanceof Import) { return (Import) obj; } Import imp = null; EObject eObj = findImportableEntity ( (EObject) obj ); if (eObj instanceof XSDSchema) { imp = createImportFrom((XSDSchema)eObj); } else if (eObj instanceof Definition) { imp = createImportFrom((Definition)eObj); } return imp; } /** * Try to establish the importable entity from the object passed. * It is either a schema or a definition. Hence, any descendant may be * passed and the import command would correctly figure out which * object to import. * * @param eObj the "reference" to base the import on * @return the importable entity */ EObject findImportableEntity ( EObject eObj ) { // Figure my schema ... if any if (eObj instanceof XSDNamedComponent) { XSDNamedComponent xsdObj = (XSDNamedComponent) eObj; eObj = xsdObj.getSchema(); } // find the importable entity. while (eObj != null) { if (eObj instanceof Definition) { return eObj; } if (eObj instanceof XSDSchema) { // Hack ? if (eObj.eContainer() == null) { return eObj; } } eObj = eObj.eContainer(); } return eObj; } Import createImportFrom (XSDSchema schema) { Import imp = WSDLFactory.eINSTANCE.createImport(); // namespace String t = schema.getTargetNamespace(); if (t != null) { imp.setNamespaceURI( t ); } // location Resource resource = fDefinition.eResource(); URI schemaURI = URI.createURI(schema.getSchemaLocation()); imp.setLocationURI( schemaURI.deresolve(resource.getURI()).toString() ); imp.setDefinition( fDefinition ); // imp.setImportType( XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001); return imp; } Import createImportFrom (Definition defn) { Import imp = WSDLFactory.eINSTANCE.createImport(); // namespace String t = defn.getTargetNamespace(); if (t != null) { imp.setNamespaceURI( t ); } // location of our the definition into which we are adding the import Resource resource = fDefinition.eResource(); URI defnURI = defn.eResource().getURI(); String importURI = defnURI.deresolve(resource.getURI()).toString(); if (importURI == null) { importURI = defnURI.toString(); } imp.setLocationURI( importURI ); return imp; } boolean containsImport ( Definition defn, Import imp) { EList imports = defn.getEImports(); // this checks for identity if (imports.contains( imp )) { return true; } // Don't add the import if it already exists ... Iterator i = imports.iterator(); boolean bExists = false; while (i.hasNext() && !bExists) { Import n = (Import) i.next(); bExists = isEqual ( n.getLocationURI(), imp.getLocationURI() ) && isEqual ( n.getNamespaceURI(), imp.getNamespaceURI() ) ; } return bExists; } boolean isEqual ( String s1, String s2 ) { return s1 != null ? s1.equals( s2 ) : s2 == null; } }