blob: 5b989b26a03e23d77c40884682f5f7554883d4a5 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}