blob: 3fb488a4712823adc9bd1bb434c120adfe068ce8 [file] [log] [blame]
/**
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* 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:
* Thales Corporate Services S.A.S - initial API and implementation
*/
package org.eclipse.egf.emf.wrapper;
import java.io.IOException;
import java.util.Collections;
import org.eclipse.core.resources.IFile;
import org.eclipse.egf.core.EGFCorePlugin;
import org.eclipse.egf.model.domain.DomainFactory;
import org.eclipse.egf.model.domain.DomainURI;
import org.eclipse.egf.model.domain.DomainViewpoint;
import org.eclipse.egf.model.domain.TypeDomainURI;
import org.eclipse.egf.model.fcore.Contract;
import org.eclipse.egf.model.fcore.FactoryComponent;
import org.eclipse.egf.model.fcore.FactoryComponentContract;
import org.eclipse.egf.model.fcore.FcoreFactory;
import org.eclipse.egf.model.fcore.InvocationContract;
import org.eclipse.egf.model.fcore.InvocationContractContainer;
import org.eclipse.egf.model.fcore.ViewpointContainer;
import org.eclipse.egf.model.fprod.FprodFactory;
import org.eclipse.egf.model.fprod.ProductionPlan;
import org.eclipse.egf.model.fprod.ProductionPlanInvocation;
import org.eclipse.egf.model.ftask.Task;
import org.eclipse.egf.model.types.TypeString;
import org.eclipse.egf.model.types.TypesFactory;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
public class CreateFcoreUtil {
public void createFcoreFile(IFile genModelFile, IFile fcore) throws IOException {
final IOException[] ioExceptions = new IOException[1];
// Retrieve our editing domain
final TransactionalEditingDomain editingDomain = TransactionalEditingDomain.Registry.INSTANCE.getEditingDomain(EGFCorePlugin.EDITING_DOMAIN_ID);
// Feed our URIConverter
URI platformPluginURI = URI.createPlatformPluginURI(fcore.getFullPath().toString(), false);
URI platformResourceURI = URI.createPlatformResourceURI(fcore.getFullPath().toString(), true);
editingDomain.getResourceSet().getURIConverter().getURIMap().put(platformPluginURI, platformResourceURI);
URI genModelURI = URI.createPlatformResourceURI(genModelFile.getFullPath().toString(), true);
// Create a resource for this file.
final Resource fcoreResource = editingDomain.getResourceSet().createResource(platformPluginURI);
// Load target fcores
URI emfWrapperResourceURI = URI.createPlatformPluginURI("/org.eclipse.egf.emf.wrapper/fcs/EMF_Wrapper.fcore", true); //$NON-NLS-1$
Resource emfWrapperResource = editingDomain.getResourceSet().getResource(emfWrapperResourceURI, true);
URI emfDocGenHtmlResourceURI = URI.createPlatformPluginURI("/org.eclipse.egf.emf.docgen.html/egf/EmfDocGenHtml.fcore", true); //$NON-NLS-1$
Resource emfDocGenHtmlResource = editingDomain.getResourceSet().getResource(emfDocGenHtmlResourceURI, true);
// Create Factory Component
final FactoryComponent factoryComponent = FcoreFactory.eINSTANCE.createFactoryComponent();
factoryComponent.setName(genModelFile.getName() + " EMF Wrapper"); //$NON-NLS-1$
// Create viewpoint container
ViewpointContainer viewpointContainer = FcoreFactory.eINSTANCE.createViewpointContainer();
factoryComponent.setViewpointContainer(viewpointContainer);
// Create domainviewpoint
DomainViewpoint domainViewpoint = DomainFactory.eINSTANCE.createDomainViewpoint();
viewpointContainer.getViewpoints().add(domainViewpoint);
// Create Genmodel domain
DomainURI genModelDomainURI = DomainFactory.eINSTANCE.createDomainURI();
genModelDomainURI.setUri(genModelURI);
domainViewpoint.getDomains().add(genModelDomainURI);
// Create production plan
ProductionPlan productionPlan = FprodFactory.eINSTANCE.createProductionPlan();
factoryComponent.setOrchestration(productionPlan);
// Use independant tasks or the complete factory component
boolean splitted = true;
if (splitted) {
// Create Emf Wrapper tasks invocations
createTaskInvocation("_E0utcP-KEd6BleG0RKg98A", "_GjcSAP-KEd6BleG0RKg98A", emfWrapperResource, productionPlan, genModelDomainURI); //$NON-NLS-1$ //$NON-NLS-2$
createTaskInvocation("_o5wBQADyEd-IF6GN14qe5g", "_x4zwsAEjEd-sEofCqqFtwA", emfWrapperResource, productionPlan, genModelDomainURI); //$NON-NLS-1$ //$NON-NLS-2$
createTaskInvocation("_tWWIYADyEd-IF6GN14qe5g", "_xzsdcQDyEd-IF6GN14qe5g", emfWrapperResource, productionPlan, genModelDomainURI); //$NON-NLS-1$ //$NON-NLS-2$
createTaskInvocation("_tv0_YADyEd-IF6GN14qe5g", "_x7JJQQDyEd-IF6GN14qe5g", emfWrapperResource, productionPlan, genModelDomainURI); //$NON-NLS-1$ //$NON-NLS-2$
} else {
FactoryComponent targetFactoryComponent = (FactoryComponent) emfWrapperResource.getEObject("_9LH9AAEkEd-sEofCqqFtwA"); //$NON-NLS-1$
ProductionPlanInvocation productionPlanInvocation = FprodFactory.eINSTANCE.createProductionPlanInvocation();
productionPlan.getInvocations().add(productionPlanInvocation);
productionPlanInvocation.setInvokedActivity(targetFactoryComponent);
InvocationContractContainer invocationContractContainer = FcoreFactory.eINSTANCE.createInvocationContractContainer();
productionPlanInvocation.setInvocationContractContainer(invocationContractContainer);
FactoryComponentContract targetFactoryComponentContract = (FactoryComponentContract) emfWrapperResource.getEObject("_1Cin4AQ7Ed-C2pVDwEnEWQ"); //$NON-NLS-1$
InvocationContract invocationContract = FcoreFactory.eINSTANCE.createInvocationContract();
invocationContractContainer.getInvocationContracts().add(invocationContract);
invocationContract.setInvokedContract(targetFactoryComponentContract);
TypeDomainURI typeDomainURI = DomainFactory.eINSTANCE.createTypeDomainURI();
typeDomainURI.setDomain(genModelDomainURI);
invocationContract.setType(typeDomainURI);
}
// Create emf doc html generation
createEmfDocGenHtmlInvocation(emfWrapperResource, emfDocGenHtmlResource, productionPlan, genModelDomainURI);
// Add factory component to the contents.
editingDomain.getCommandStack().execute(new RecordingCommand(editingDomain) {
@Override
protected void doExecute() {
fcoreResource.getContents().add(factoryComponent);
}
});
// save fcore
try {
editingDomain.runExclusive(new Runnable() {
public void run() {
try {
fcoreResource.save(Collections.EMPTY_MAP);
} catch (IOException ioe) {
ioExceptions[0] = ioe;
}
}
});
} catch (InterruptedException ie) {
return;
}
// Rethrow exception if any
if (ioExceptions[0] != null) {
throw ioExceptions[0];
}
return;
}
private void createEmfDocGenHtmlInvocation(Resource emfWrapperResource, Resource emfDocGenHtmlResource, ProductionPlan productionPlan, DomainURI genModelDomainURI) {
// Task EmfDocProductionContextFromGenModel
Task task = (Task) emfDocGenHtmlResource.getEObject("_yw92cBurEd-jaIqWGhF8eQ"); //$NON-NLS-1$
ProductionPlanInvocation taskProductionPlanInvocation = FprodFactory.eINSTANCE.createProductionPlanInvocation();
productionPlan.getInvocations().add(taskProductionPlanInvocation);
taskProductionPlanInvocation.setInvokedActivity(task);
InvocationContractContainer taskInvocationContractContainer = FcoreFactory.eINSTANCE.createInvocationContractContainer();
taskProductionPlanInvocation.setInvocationContractContainer(taskInvocationContractContainer);
Contract taskContract1 = (Contract) emfDocGenHtmlResource.getEObject("_A4ZrMBusEd-jaIqWGhF8eQ"); //$NON-NLS-1$
InvocationContract taskInvocationContract1 = FcoreFactory.eINSTANCE.createInvocationContract();
taskInvocationContractContainer.getInvocationContracts().add(taskInvocationContract1);
taskInvocationContract1.setInvokedContract(taskContract1);
TypeDomainURI typeDomainURI = DomainFactory.eINSTANCE.createTypeDomainURI();
typeDomainURI.setDomain(genModelDomainURI);
taskInvocationContract1.setType(typeDomainURI);
Contract taskContract2 = (Contract) emfDocGenHtmlResource.getEObject("_Do1LcBusEd-jaIqWGhF8eQ"); //$NON-NLS-1$
InvocationContract taskInvocationContract2 = FcoreFactory.eINSTANCE.createInvocationContract();
taskInvocationContractContainer.getInvocationContracts().add(taskInvocationContract2);
taskInvocationContract2.setInvokedContract(taskContract2);
Contract taskContract3 = (Contract) emfDocGenHtmlResource.getEObject("_EAYIwBusEd-jaIqWGhF8eQ"); //$NON-NLS-1$
InvocationContract taskInvocationContract3 = FcoreFactory.eINSTANCE.createInvocationContract();
taskInvocationContractContainer.getInvocationContracts().add(taskInvocationContract3);
taskInvocationContract3.setInvokedContract(taskContract3);
// FC EmfDocGenHtml
FactoryComponent fc = (FactoryComponent) emfDocGenHtmlResource.getEObject("_BxjIkAG0Ed-7fNNmMjB2jQ"); //$NON-NLS-1$
ProductionPlanInvocation fcProductionPlanInvocation = FprodFactory.eINSTANCE.createProductionPlanInvocation();
productionPlan.getInvocations().add(fcProductionPlanInvocation);
fcProductionPlanInvocation.setInvokedActivity(fc);
InvocationContractContainer invocationContractContainer = FcoreFactory.eINSTANCE.createInvocationContractContainer();
fcProductionPlanInvocation.setInvocationContractContainer(invocationContractContainer);
FactoryComponentContract fcContract1 = (FactoryComponentContract) emfDocGenHtmlResource.getEObject("_Yp4VcAprEd-7fqY_JLtg2w"); //$NON-NLS-1$
InvocationContract fcInvocationContract1 = FcoreFactory.eINSTANCE.createInvocationContract();
invocationContractContainer.getInvocationContracts().add(fcInvocationContract1);
fcInvocationContract1.setInvokedContract(fcContract1);
FactoryComponentContract fcContract2 = (FactoryComponentContract) emfDocGenHtmlResource.getEObject("_7NKWkApbEd-pyqf4uNW3tw"); //$NON-NLS-1$
InvocationContract fcInvocationContract2 = FcoreFactory.eINSTANCE.createInvocationContract();
invocationContractContainer.getInvocationContracts().add(fcInvocationContract2);
fcInvocationContract2.setInvokedContract(fcContract2);
FactoryComponentContract fcContract3 = (FactoryComponentContract) emfDocGenHtmlResource.getEObject("_AvXa4ApcEd-pyqf4uNW3tw"); //$NON-NLS-1$
InvocationContract fcInvocationContract3 = FcoreFactory.eINSTANCE.createInvocationContract();
invocationContractContainer.getInvocationContracts().add(fcInvocationContract3);
fcInvocationContract3.setInvokedContract(fcContract3);
TypeString typeString = TypesFactory.eINSTANCE.createTypeString();
typeString.setValue("html"); //$NON-NLS-1$
fcInvocationContract3.setType(typeString);
// Assign source
fcInvocationContract1.setSourceInvocationContract(taskInvocationContract2);
fcInvocationContract2.setSourceInvocationContract(taskInvocationContract3);
}
private void createTaskInvocation(String targetTaskId, String targetTaskContract, Resource targetActivityResource, ProductionPlan productionPlan, DomainURI genModelDomainURI) {
Task modelTask = (Task) targetActivityResource.getEObject(targetTaskId);
ProductionPlanInvocation productionPlanInvocation = FprodFactory.eINSTANCE.createProductionPlanInvocation();
productionPlan.getInvocations().add(productionPlanInvocation);
productionPlanInvocation.setInvokedActivity(modelTask);
InvocationContractContainer invocationContractContainer = FcoreFactory.eINSTANCE.createInvocationContractContainer();
productionPlanInvocation.setInvocationContractContainer(invocationContractContainer);
Contract targetContract = (Contract) targetActivityResource.getEObject(targetTaskContract);
InvocationContract invocationContract = FcoreFactory.eINSTANCE.createInvocationContract();
invocationContractContainer.getInvocationContracts().add(invocationContract);
invocationContract.setInvokedContract(targetContract);
TypeDomainURI typeDomainURI = DomainFactory.eINSTANCE.createTypeDomainURI();
typeDomainURI.setDomain(genModelDomainURI);
invocationContract.setType(typeDomainURI);
}
}