blob: 050ac4cabc11a37f717ce6a8ad32ca64cd261163 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.acceleo.module.ecore2python;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.acceleo.engine.service.AcceleoService;
import org.eclipse.acceleo.model.mtl.Module;
import org.eclipse.acceleo.model.mtl.MtlPackage;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.emf.common.EMFPlugin;
import org.eclipse.emf.common.util.Monitor;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.ocl.ecore.EcoreEnvironment;
import org.eclipse.ocl.ecore.EcoreEnvironmentFactory;
/**
* Entry point of the 'Init' generation module.
*
* @author <a href="mailto:jonathan.musset@obeo.fr">Jonathan Musset</a>
*/
public class Init {
/**
* The name of the module.
*
* @generated
*/
public static final String MODULE_FILE_NAME = "init";
/**
* The name of the templates that are to be generated.
*
* @generated
*/
public static final String[] TEMPLATE_NAMES = { "toModuleInit", };
/**
* The root element of the module.
*/
private Module module;
/**
* The model.
*/
private EObject model;
/**
* The output folder.
*/
private File targetFolder;
/**
* The other arguments.
*/
List<? extends Object> arguments;
/**
* Constructor.
*
* @param modelURI
* is the URI of the model.
* @param targetFolder
* is the output folder
* @param arguments
* are the other arguments
* @throws IOException
* Thrown when the output cannot be saved.
* @generated
*/
public Init(URI modelURI, File targetFolder, List<? extends Object> arguments) throws IOException {
ResourceSet resourceSet = new ResourceSetImpl();
registerResourceFactories(resourceSet);
registerPackages(resourceSet);
final URL templateURL;
if (EMFPlugin.IS_ECLIPSE_RUNNING) {
templateURL = FileLocator.toFileURL(Init.class.getResource(MODULE_FILE_NAME + ".emtl"));
} else {
templateURL = Init.class.getResource(MODULE_FILE_NAME + ".emtl");
}
if (templateURL == null) {
throw new IOException("'" + MODULE_FILE_NAME + ".emtl' not found");
} else {
URI templateURI = createTemplateURI(templateURL.getPath());
module = (Module)load(templateURI, resourceSet);
model = load(modelURI, resourceSet);
this.targetFolder = targetFolder;
this.arguments = arguments;
}
}
/**
* Constructor.
*
* @param model
* is the root element of the model.
* @param targetFolder
* is the output folder
* @param arguments
* are the other arguments
* @throws IOException
* Thrown when the output cannot be saved.
* @generated
*/
public Init(EObject model, File targetFolder, List<? extends Object> arguments) throws IOException {
ResourceSet resourceSet = model.eResource().getResourceSet();
registerResourceFactories(resourceSet);
registerPackages(resourceSet);
final URL templateURL;
if (EMFPlugin.IS_ECLIPSE_RUNNING) {
templateURL = FileLocator.toFileURL(Init.class.getResource(MODULE_FILE_NAME + ".emtl"));
} else {
templateURL = Init.class.getResource(MODULE_FILE_NAME + ".emtl");
}
if (templateURL == null) {
throw new IOException("'" + MODULE_FILE_NAME + ".emtl' not found");
} else {
URI templateURI = createTemplateURI(templateURL.getPath());
module = (Module)load(templateURI, resourceSet);
this.model = model;
this.targetFolder = targetFolder;
this.arguments = arguments;
}
}
/**
* Creates the template URI.
*
* @param entry
* is the local path of the EMTL file
* @generated NOT
*/
protected URI createTemplateURI(String entry) {
return URI.createFileURI(entry);
}
/**
* Gets the model.
*
* @return the model root element
*/
public EObject getModel() {
return model;
}
/**
* Updates the registry used for looking up a package based namespace, in the resource set.
*
* @param resourceSet
* is the resource set
* @generated
*/
private void registerPackages(ResourceSet resourceSet) {
resourceSet.getPackageRegistry().put(org.eclipse.emf.ecore.EcorePackage.eINSTANCE.getNsURI(), org.eclipse.emf.ecore.EcorePackage.eINSTANCE);
resourceSet.getPackageRegistry().put(org.eclipse.ocl.ecore.EcorePackage.eINSTANCE.getNsURI(), org.eclipse.ocl.ecore.EcorePackage.eINSTANCE);
resourceSet.getPackageRegistry().put(org.eclipse.ocl.expressions.ExpressionsPackage.eINSTANCE.getNsURI(), org.eclipse.ocl.expressions.ExpressionsPackage.eINSTANCE);
resourceSet.getPackageRegistry().put(MtlPackage.eINSTANCE.getNsURI(), MtlPackage.eINSTANCE);
resourceSet.getPackageRegistry().put("http://www.eclipse.org/ocl/1.1.0/oclstdlib.ecore", getOCLStdLibPackage());
}
/**
* Returns the package containing the OCL standard library.
*
* @return The package containing the OCL standard library.
* @generated
*/
private EPackage getOCLStdLibPackage() {
EcoreEnvironmentFactory factory = new EcoreEnvironmentFactory();
EcoreEnvironment environment = (EcoreEnvironment)factory.createEnvironment();
return (EPackage)EcoreUtil.getRootContainer(environment.getOCLStandardLibrary().getBag());
}
/**
* Updates the registry used for looking up resources factory in the given resource set.
*
* @param resourceSet
* The resource set that is to be updated.
* @generated
*/
private void registerResourceFactories(ResourceSet resourceSet) {
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", new EcoreResourceFactoryImpl());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("emtl", new org.eclipse.acceleo.model.mtl.resource.EMtlResourceFactoryImpl());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl());
}
/**
* The main method.
*
* @param args
* are the arguments
* @generated
*/
public static void main(String[] args) {
try {
if (args.length < 2) {
System.out.println("Arguments not valid : {model, folder}.");
} else {
URI modelURI = URI.createFileURI(args[0]);
File folder = new File(args[1]);
List<String> arguments = new ArrayList<String>();
for (int i = 2; i < args.length; i++) {
arguments.add(args[i]);
}
Init generator = new Init(modelURI, folder, arguments);
generator.doGenerate(new BasicMonitor());
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Launches the generation.
*
* @param monitor
* This will be used to display progress information to the user.
* @throws IOException
* Thrown when the output cannot be saved.
* @generated
*/
public void doGenerate(Monitor monitor) throws IOException {
if (!targetFolder.exists()) {
targetFolder.mkdirs();
}
for (int i = 0; i < TEMPLATE_NAMES.length; i++) {
AcceleoService.doGenerate(module, TEMPLATE_NAMES[i], model, arguments, targetFolder, false, monitor);
}
}
/**
* Loads a model from an {@link org.eclipse.emf.common.util.URI URI} in a given {@link ResourceSet}.
* <p>
* This will return the first root of the loaded model, other roots can be accessed via the resource's
* content.
* </p>
*
* @param modelURI
* {@link org.eclipse.emf.common.util.URI URI} where the model is stored.
* @param resourceSet
* The {@link ResourceSet} to load the model in.
* @return The model loaded from the URI.
* @throws IOException
* If the given file does not exist.
* @generated
*/
private EObject load(URI modelURI, ResourceSet resourceSet) throws IOException {
EObject result = null;
final Resource modelResource = createResource(modelURI, resourceSet);
final Map<String, String> options = new HashMap<String, String>();
options.put(XMLResource.OPTION_ENCODING, System.getProperty("file.encoding"));
modelResource.load(options);
if (modelResource.getContents().size() > 0) {
result = modelResource.getContents().get(0);
}
return result;
}
/**
* This will create a {@link Resource} given the model extension it is intended for and a ResourceSet.
*
* @param modelURI
* {@link org.eclipse.emf.common.util.URI URI} where the model is stored.
* @param resourceSet
* The {@link ResourceSet} to load the model in.
* @return The {@link Resource} given the model extension it is intended for.
* @generated
*/
private Resource createResource(URI modelURI, ResourceSet resourceSet) {
String fileExtension = modelURI.fileExtension();
if (fileExtension == null || fileExtension.length() == 0) {
fileExtension = Resource.Factory.Registry.DEFAULT_EXTENSION;
}
final Resource.Factory.Registry registry = Resource.Factory.Registry.INSTANCE;
final Object resourceFactory = registry.getExtensionToFactoryMap().get(fileExtension);
if (resourceFactory != null) {
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(fileExtension,
resourceFactory);
} else {
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(fileExtension,
new XMIResourceFactoryImpl());
}
return resourceSet.createResource(modelURI);
}
}