/******************************************************************************* * 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.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; /** * 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; /** * 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()) this.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 { this.extensionsResource = resourceSet.getResource(extensionsUri, extensionsFile.exists()); if (this.extensionsResource != null) { this.extensionMap = ExtensionmodelFactory.eINSTANCE.findExtensionMap( IBPELUIConstants.MODEL_EXTENSIONS_NAMESPACE, this.extensionsResource.getContents()); } // Bugzilla 330513 if (this.extensionMap != null) this.extensionMap.initializeAdapter(); } catch (Exception e) { BPELUIPlugin.log(e); } if (this.process == null) { this.process = BPELFactory.eINSTANCE.createProcess(); processResource.getContents().add(this.process); } if (this.extensionMap == null) { this.extensionMap = ExtensionmodelFactory.eINSTANCE.createExtensionMap(IBPELUIConstants.MODEL_EXTENSIONS_NAMESPACE); if (this.extensionsResource == null) { this.extensionsResource = resourceSet.createResource(extensionsUri); } this.extensionsResource.getContents().clear(); this.extensionsResource.getContents().add(this.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 (this.process.getVariables() == null) { this.process.setVariables(BPELFactory.eINSTANCE.createVariables()); } if (this.process.getPartnerLinks() == null) { this.process.setPartnerLinks(BPELFactory.eINSTANCE.createPartnerLinks()); } if (this.process.getCorrelationSets() == null) { this.process.setCorrelationSets(BPELFactory.eINSTANCE.createCorrelationSets()); } if (this.process.getMessageExchanges() == null) { this.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 = this.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 = this.process.eAllContents(); while (it.hasNext()) { ModelHelper.createExtensionIfNecessary(this.extensionMap, it.next()); } if (this.extensionMap.get(this.process) == null) { ModelHelper.createExtensionIfNecessary(this.extensionMap, this.process); } } public ExtensionMap getExtensionMap() { return this.extensionMap; } public Resource getExtensionsResource() { return this.extensionsResource; } public Process getProcess() { return this.process; } }