blob: f7ccbd1834500ccb5832792df23850c3f9081acf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 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.util;
import java.util.Collections;
import java.util.Iterator;
import org.eclipse.bpel.common.extension.model.ExtensionMap;
import org.eclipse.bpel.common.extension.model.ExtensionmodelFactory;
import org.eclipse.bpel.model.BPELFactory;
import org.eclipse.bpel.model.Process;
import org.eclipse.bpel.model.Scope;
import org.eclipse.bpel.ui.BPELUIPlugin;
import org.eclipse.bpel.ui.IBPELUIConstants;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
/**
* Reads a BPEL file and makes it compatible with the BPEL tooling.
*/
public class BPELReader {
protected Resource processResource;
protected Resource extensionsResource;
protected Process process;
protected ExtensionMap extensionMap;
/**
* Reads the given BPEL file.
*/
public void read(IFile modelFile, ResourceSet resourceSet) {
// TODO: These two lines are a workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=72565
EcorePackage instance = EcorePackage.eINSTANCE;
instance.eAdapters();
URI uri = URI.createPlatformResourceURI(modelFile.getFullPath().toString());
processResource = resourceSet.getResource(uri, true);
read(processResource, modelFile, resourceSet);
}
/**
* Another public method for those who want to get the process resource
* by their own means (such as the editor).
*/
public void read(Resource processResource, IFile modelFile, ResourceSet resourceSet) {
// TODO: These two lines are a workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=72565
EcorePackage instance = EcorePackage.eINSTANCE;
instance.eAdapters();
this.processResource = processResource;
IPath extensionsPath = modelFile.getFullPath().removeFileExtension().addFileExtension(IBPELUIConstants.EXTENSION_MODEL_EXTENSIONS);
URI extensionsUri = URI.createPlatformResourceURI(extensionsPath.toString());
IFile extensionsFile = ResourcesPlugin.getWorkspace().getRoot().getFile(extensionsPath);
try {
processResource.load(Collections.EMPTY_MAP);
EList<EObject> contents = processResource.getContents();
if (!contents.isEmpty())
process = (Process) contents.get(0);
} catch (Exception e) {
// TODO: If a file is empty Resource.load(Map) throws a java.lang.NegativeArraySizeException
// We should investigate EMF to see if we are supposed to handle this case or if this
// is a bug in EMF.
BPELUIPlugin.log(e);
}
try {
extensionsResource = resourceSet.getResource(extensionsUri, extensionsFile.exists());
if (extensionsResource != null) {
extensionMap = ExtensionmodelFactory.eINSTANCE.findExtensionMap(
IBPELUIConstants.MODEL_EXTENSIONS_NAMESPACE, extensionsResource.getContents());
}
// Bugzilla 330513
if (extensionMap != null)
extensionMap.initializeAdapter();
} catch (Exception e) {
BPELUIPlugin.log(e);
}
if (process == null) {
process = BPELFactory.eINSTANCE.createProcess();
processResource.getContents().add(process);
}
if (extensionMap == null) {
extensionMap = ExtensionmodelFactory.eINSTANCE.createExtensionMap(IBPELUIConstants.MODEL_EXTENSIONS_NAMESPACE);
if (extensionsResource == null) {
extensionsResource = resourceSet.createResource(extensionsUri);
}
extensionsResource.getContents().clear();
extensionsResource.getContents().add(extensionMap);
}
// Make sure the Process has Variables, PartnerLinks, CorrelationSets and MessageExchanges objects.
// They aren't strictly necessary according to the spec but make we need those in
// order for the editor tray to work.
if (process.getVariables() == null) {
process.setVariables(BPELFactory.eINSTANCE.createVariables());
}
if (process.getPartnerLinks() == null) {
process.setPartnerLinks(BPELFactory.eINSTANCE.createPartnerLinks());
}
if (process.getCorrelationSets() == null) {
process.setCorrelationSets(BPELFactory.eINSTANCE.createCorrelationSets());
}
if (process.getMessageExchanges() == null) {
process.setMessageExchanges(BPELFactory.eINSTANCE.createMessageExchanges());
}
// Make sure scopes have Variables.
// They aren't strictly necessary according to the spec but make we need those in
// order for the editor tray to work.
for (Iterator<EObject> iter = process.eAllContents(); iter.hasNext();) {
EObject object = iter.next();
if (object instanceof Scope) {
Scope scope = (Scope)object;
if (scope.getVariables() == null) {
scope.setVariables(BPELFactory.eINSTANCE.createVariables());
}
if (scope.getPartnerLinks() == null) {
scope.setPartnerLinks(BPELFactory.eINSTANCE.createPartnerLinks());
}
if (scope.getCorrelationSets() == null) {
scope.setCorrelationSets(BPELFactory.eINSTANCE.createCorrelationSets());
}
if (scope.getMessageExchanges() == null) {
scope.setMessageExchanges(BPELFactory.eINSTANCE.createMessageExchanges());
}
}
}
// Make sure each model object has the necessary extensions!
TreeIterator<EObject> it = process.eAllContents();
while (it.hasNext()) {
ModelHelper.createExtensionIfNecessary(extensionMap, it.next());
}
if (extensionMap.get(process) == null) {
ModelHelper.createExtensionIfNecessary(extensionMap, process);
}
}
/**
* Another public method for those who want to get the process resource
* by their own means (such as the editor).
*/
public void read(Resource processResource, IDOMModel domModel, ResourceSet resourceSet) {
// TODO: These two lines are a workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=72565
EcorePackage instance = EcorePackage.eINSTANCE;
instance.eAdapters();
this.processResource = processResource;
//IPath extensionsPath = modelFile.getFullPath().removeFileExtension().addFileExtension(IBPELUIConstants.EXTENSION_MODEL_EXTENSIONS);
org.eclipse.core.runtime.IPath extensionsPath
= (new org.eclipse.core.runtime.Path(domModel.getBaseLocation())).removeFileExtension().addFileExtension(IBPELUIConstants.EXTENSION_MODEL_EXTENSIONS);
URI extensionsUri = URI.createPlatformResourceURI(extensionsPath.toString());
IFile extensionsFile = ResourcesPlugin.getWorkspace().getRoot().getFile(extensionsPath);
try {
processResource.load(Collections.EMPTY_MAP);
EList<EObject> contents = processResource.getContents();
if (!contents.isEmpty())
process = (Process) contents.get(0);
} catch (Exception e) {
// TODO: If a file is empty Resource.load(Map) throws a java.lang.NegativeArraySizeException
// We should investigate EMF to see if we are supposed to handle this case or if this
// is a bug in EMF.
BPELUIPlugin.log(e);
}
try {
extensionsResource = resourceSet.getResource(extensionsUri, extensionsFile.exists());
if (extensionsResource != null) {
extensionMap = ExtensionmodelFactory.eINSTANCE.findExtensionMap(
IBPELUIConstants.MODEL_EXTENSIONS_NAMESPACE, extensionsResource.getContents());
}
} catch (Exception e) {
BPELUIPlugin.log(e);
}
if (extensionMap != null) extensionMap.initializeAdapter();
if (process == null) {
process = BPELFactory.eINSTANCE.createProcess();
processResource.getContents().add(process);
}
if (extensionMap == null) {
extensionMap = ExtensionmodelFactory.eINSTANCE.createExtensionMap(IBPELUIConstants.MODEL_EXTENSIONS_NAMESPACE);
if (extensionsResource == null) {
extensionsResource = resourceSet.createResource(extensionsUri);
}
extensionsResource.getContents().clear();
extensionsResource.getContents().add(extensionMap);
}
// Make sure the Process has Variables, PartnerLinks and CorrelationSets objects.
// They aren't strictly necessary according to the spec but make we need those in
// order for the editor tray to work.
if (process.getVariables() == null) {
process.setVariables(BPELFactory.eINSTANCE.createVariables());
}
if (process.getPartnerLinks() == null) {
process.setPartnerLinks(BPELFactory.eINSTANCE.createPartnerLinks());
}
if (process.getCorrelationSets() == null) {
process.setCorrelationSets(BPELFactory.eINSTANCE.createCorrelationSets());
}
if (process.getMessageExchanges() == null) {
process.setMessageExchanges(BPELFactory.eINSTANCE.createMessageExchanges());
}
// Make sure scopes have Variables.
// They aren't strictly necessary according to the spec but make we need those in
// order for the editor tray to work.
for (Iterator<EObject> iter = process.eAllContents(); iter.hasNext();) {
EObject object = iter.next();
if (object instanceof Scope) {
Scope scope = (Scope)object;
if (scope.getVariables() == null) {
scope.setVariables(BPELFactory.eINSTANCE.createVariables());
}
if (scope.getPartnerLinks() == null) {
scope.setPartnerLinks(BPELFactory.eINSTANCE.createPartnerLinks());
}
if (scope.getCorrelationSets() == null) {
scope.setCorrelationSets(BPELFactory.eINSTANCE.createCorrelationSets());
}
if (scope.getMessageExchanges() == null) {
scope.setMessageExchanges(BPELFactory.eINSTANCE.createMessageExchanges());
}
}
}
// Make sure each model object has the necessary extensions!
TreeIterator<EObject> it = process.eAllContents();
while (it.hasNext()) {
ModelHelper.createExtensionIfNecessary(extensionMap, it.next());
}
if (extensionMap.get(process) == null) {
ModelHelper.createExtensionIfNecessary(extensionMap, process);
}
}
public ExtensionMap getExtensionMap() {
return extensionMap;
}
public Resource getExtensionsResource() {
return extensionsResource;
}
public Process getProcess() {
return process;
}
public Resource getProcessResource() {
return processResource;
}
}