/******************************************************************************* | |
* 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 org.eclipse.bpel.common.ui.editmodel.ResourceInfo; | |
import org.eclipse.bpel.model.BPELFactory; | |
import org.eclipse.bpel.model.Import; | |
import org.eclipse.bpel.model.Process; | |
import org.eclipse.bpel.ui.IBPELUIConstants; | |
import org.eclipse.bpel.ui.commands.util.AutoUndoCommand; | |
import org.eclipse.bpel.ui.util.ModelHelper; | |
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.util.WSDLConstants; | |
import org.eclipse.xsd.XSDNamedComponent; | |
import org.eclipse.xsd.XSDSchema; | |
import org.eclipse.xsd.util.XSDConstants; | |
/** | |
* 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 AddImportCommand extends AutoUndoCommand { | |
Process fProcess; | |
Import fImport; | |
boolean bNoop = false; | |
ResourceInfo fResourceInfo; | |
/** | |
* Create a new instance of the AddImportCommand | |
* @param process | |
* @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 AddImportCommand ( Process process , Object object, ResourceInfo info ) { | |
super(IBPELUIConstants.CMD_ADD_IMPORT,process); | |
fProcess = process; | |
fResourceInfo = info; | |
fImport = createImport( object ); | |
if (fImport != null) { | |
bNoop = ModelHelper.containsImport( fProcess, fImport ); | |
} | |
} | |
public AddImportCommand ( Process process, Object object) { | |
this(process,object,null); | |
} | |
protected EList<Import> getList() { | |
return fProcess.getImports(); | |
} | |
@Override | |
public void doExecute() { | |
if (bNoop) { | |
return ; | |
} | |
fProcess.getImports().add(0, fImport ); | |
} | |
public boolean wouldCreateDuplicateImport () { | |
return bNoop; | |
} | |
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 = BPELFactory.eINSTANCE.createImport(); | |
// namespace | |
String t = schema.getTargetNamespace(); | |
if (t != null) { | |
imp.setNamespace( t ); | |
} | |
// location | |
Resource resource = fProcess.eResource(); | |
URI schemaURI = URI.createURI(schema.getSchemaLocation()); | |
imp.setLocation( schemaURI.deresolve(resource.getURI()).toString() ); | |
// importType (the XSD kind) | |
imp.setImportType( XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001); | |
return imp; | |
} | |
Import createImportFrom (Definition defn) { | |
Import imp = BPELFactory.eINSTANCE.createImport(); | |
// namespace | |
String t = defn.getTargetNamespace(); | |
if (t != null) { | |
imp.setNamespace( t ); | |
} | |
// location | |
Resource resource = fProcess.eResource(); | |
URI schemaURI = null; | |
if (defn.getLocation() == null) { | |
if (fResourceInfo != null) { | |
imp.setLocation ( fResourceInfo.getFile().toString() ); | |
} | |
} else { | |
schemaURI = URI.createURI( defn.getLocation() ); | |
imp.setLocation( schemaURI.deresolve(resource.getURI(),true,true,true).toString() ); | |
} | |
// importType (the WSDL kind) | |
imp.setImportType( WSDLConstants.WSDL_NAMESPACE_URI ); | |
return imp; | |
} | |
} |