/******************************************************************************* * 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; } }