ATL 4.0 compatibility
diff --git a/plugins/org.eclipse.gmt.tcs.builder/META-INF/MANIFEST.MF b/plugins/org.eclipse.gmt.tcs.builder/META-INF/MANIFEST.MF
index eabf0b6..56efa56 100644
--- a/plugins/org.eclipse.gmt.tcs.builder/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.gmt.tcs.builder/META-INF/MANIFEST.MF
@@ -1,23 +1,26 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.gmt.tcs.builder;singleton:=true
-Bundle-Version: 0.8.0
-Bundle-Activator: org.eclipse.gmt.tcs.builder.Activator
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.m2m.atl.engine,
- org.eclipse.core.resources,
- org.eclipse.jdt.core,
- org.eclipse.jdt.core.manipulation,
- org.eclipse.emf.common,
- org.eclipse.ui,
- org.eclipse.gmt.tcs.dsls,
- org.eclipse.gmt.tcs.metadata
-Export-Package: org.eclipse.gmt.tcs.builder,
- org.eclipse.gmt.tcs.builder.ct,
- org.eclipse.gmt.tcs.builder.ct.definition,
- org.eclipse.gmt.tcs.builder.ct.usage
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.gmt.tcs.builder;singleton:=true
+Bundle-Version: 0.8.0
+Bundle-Activator: org.eclipse.gmt.tcs.builder.Activator
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.m2m.atl.engine,
+ org.eclipse.core.resources,
+ org.eclipse.jdt.core,
+ org.eclipse.jdt.core.manipulation,
+ org.eclipse.emf.common,
+ org.eclipse.ui,
+ org.eclipse.gmt.tcs.dsls,
+ org.eclipse.gmt.tcs.metadata,
+ org.eclipse.m2m.atl.engine.vm,
+ org.eclipse.m2m.atl.drivers.emf4atl,
+ org.eclipse.m2m.atl.core.ui.vm
+Export-Package: org.eclipse.gmt.tcs.builder,
+ org.eclipse.gmt.tcs.builder.ct,
+ org.eclipse.gmt.tcs.builder.ct.definition,
+ org.eclipse.gmt.tcs.builder.ct.usage
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ProblemReporter.java b/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ProblemReporter.java
index 8280cb3..434cf69 100644
--- a/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ProblemReporter.java
+++ b/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ProblemReporter.java
@@ -1,26 +1,27 @@
-/**
- * Copyright (c) 2007, 2008 INRIA.
- * 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:
- * INRIA - initial API and implementation
- *
- * $Id: ProblemReporter.java,v 1.3 2008/06/25 13:03:20 fjouault Exp $
- */
-package org.eclipse.gmt.tcs.builder;
-
-import org.eclipse.m2m.atl.dsls.textsource.TextSource;
-import org.eclipse.m2m.atl.engine.vm.nativelib.ASMModel;
-
-/**
- *
- * @author Frédéric Jouault
- *
- */
-public interface ProblemReporter {
-
- public boolean reportProblem(TextSource textSource, ASMModel problemModel);
-}
+/**
+ * Copyright (c) 2007, 2008 INRIA.
+ * 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:
+ * INRIA - initial API and implementation
+ *
+ * $Id: ProblemReporter.java,v 1.3 2008/06/25 13:03:20 fjouault Exp $
+ */
+package org.eclipse.gmt.tcs.builder;
+
+import org.eclipse.m2m.atl.core.IModel;
+import org.eclipse.m2m.atl.dsls.textsource.TextSource;
+import org.eclipse.m2m.atl.engine.vm.nativelib.ASMModel;
+
+/**
+ *
+ * @author Fr�d�ric Jouault
+ *
+ */
+public interface ProblemReporter {
+
+ public boolean reportProblem(TextSource textSource, IModel problemModel);
+}
diff --git a/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/TCSBuilder.java b/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/TCSBuilder.java
index eebc4f5..25c0851 100644
--- a/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/TCSBuilder.java
+++ b/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/TCSBuilder.java
@@ -1,556 +1,574 @@
-/**
- * Copyright (c) 2008 INRIA.
- * 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:
- * INRIA - initial API and implementation
- *
- * $Id: TCSBuilder.java,v 1.17 2008/07/03 14:38:28 fjouault Exp $
- */
-package org.eclipse.gmt.tcs.builder;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.lang.ref.SoftReference;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import java.util.zip.ZipEntry;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.gmt.tcs.builder.ct.ResourceLocator;
-import org.eclipse.gmt.tcs.metadata.Language;
-import org.eclipse.gmt.tcs.metadata.LanguageRegistry;
-import org.eclipse.gmt.tcs.metadata.LanguageSource;
-import org.eclipse.jdt.core.compiler.CategorizedProblem;
-import org.eclipse.jdt.internal.compiler.ClassFile;
-import org.eclipse.jdt.internal.compiler.CompilationResult;
-import org.eclipse.jdt.internal.compiler.Compiler;
-import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies;
-import org.eclipse.jdt.internal.compiler.ICompilerRequestor;
-import org.eclipse.jdt.internal.compiler.batch.FileSystem;
-import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
-import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
-import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
-import org.eclipse.jdt.internal.core.builder.ProblemFactory;
-import org.eclipse.jdt.internal.core.util.ResourceCompilationUnit;
-import org.eclipse.m2m.atl.dsls.DSLResourceProvider;
-import org.eclipse.m2m.atl.dsls.Resource;
-import org.eclipse.m2m.atl.dsls.textsource.IFileTextSource;
-import org.eclipse.m2m.atl.dsls.textsource.TextSource;
-import org.eclipse.m2m.atl.engine.AtlModelHandler;
-import org.eclipse.m2m.atl.engine.MarkerMaker;
-import org.eclipse.m2m.atl.engine.vm.nativelib.ASMModel;
-import org.osgi.framework.Bundle;
-
-/**
- *
- * @author Frédéric Jouault
- *
- */
-public class TCSBuilder extends IncrementalProjectBuilder {
-
- public static final String ID = "org.eclipse.gmt.tcs.builder.Builder";
-
- private Map parserGenerators = new HashMap();;
-
- public TCSBuilder() throws Exception {
- }
-
- private ResourceLocator rl;
- // soft reference: to prevent from being retained, which causes a leak
- // TODO: is the SoftReference itself leaked now?
- private SoftReference ct = null;
-
- private TCSBuilderCT getTCSBuilderCT() throws CoreException {
- TCSBuilderCT ret = (ct == null) ? null : (TCSBuilderCT)ct.get();
- final IProject ammaCore = ResourcesPlugin.getWorkspace().getRoot().getProject("AMMACore");
- if((ret != null) && (ammaCore.exists())) {
- IFile noChangeFile = ammaCore.getFile("NO_CHANGE.txt");
- if(!noChangeFile.exists()) {
- ret = null; // force reload of all models
- noChangeFile.create(new ByteArrayInputStream("Remove this file to force the TCS builder to purge its cache and reload the AMMACore models (e.g., after updating from CVS, or changing a model).".getBytes()), true, null);
- noChangeFile.setDerived(true);
- }
- }
- if(ret == null) {
- boolean canUseAMMACore = false;
- if(ammaCore.exists()) {
- IFile doNotUseFile = ammaCore.getFile("DO_NOT_USE.txt");
- if(!doNotUseFile.exists()) {
- canUseAMMACore = true;
- }
- }
- final boolean useAMMACore = canUseAMMACore;
- rl = new ResourceLocator() {
- public Resource getResource(final String id) throws IOException {
- if(useAMMACore) {
- // Get resources from AMMACore project in workspace
- return new Resource() {
- public TextSource asTextSource() {
- return new IFileTextSource(ammaCore.getFile(id));
- }
-
- public URI asEMFURI() {
- return URI.createPlatformResourceURI(ammaCore.getFile(id).getFullPath().toString(), true);
- }
- public URL asURL() {
- throw new RuntimeException("Conversion to URL unsupported");
- }
- };
- } else {
- return DSLResourceProvider.getDefault().getResource(id);
- }
- }
- };
- try {
- ret = new TCSBuilderCT(rl);
- ct = new SoftReference(ret);
- } catch(IOException ioe) {
- // setting exception (ie., last argument) to non-null value (i.e., ioe) prevents the error pop-up from opening
- throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.OK, "error loading resources from AMMACore project", ioe));
- }
- }
- return ret;
- }
-
-
- // TODO: add 'if(monitor.isCanceled()) return null;' where appropriate
- protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
- TCSBuilderCT ct = getTCSBuilderCT();
- final IProject p = getProject();
- Language ts = LanguageRegistry.getDefault().getLanguageFromSource(p);
- if(ts == null) {
- return null; // not a valid TCS project
- }
- LanguageSource tss = ts.getSource();
- final String name = ts.getName();
- IFile km3File = tss.getKM3SourceFile();
- IFile tcsFile = tss.getTCSSourceFile();
- IFile outlineFile = tss.getOutlineFile();
- IFile editorFile = tss.getEditorFile();
- IFile ecoreFile = tss.getMetamodelFile();
- final IFile grammarFile = tss.getGrammarFile();
- final IFile jarFile = tss.getParserFile();
- IFile compilerSourceFile = tss.getACGSourceFile();
- IFile compilerBinaryFile = tss.getCompilerFile();
- try {
- String ext = ts.getExtension();
- boolean removeParserJavaSource = !"false".equals(tss.getProperty("syntax.jar.source.remove"));
- boolean rebuildPlugin = false;
- boolean isJavaProject = false;
-
- AtlModelHandler amh = AtlModelHandler.getDefault(AtlModelHandler.AMH_EMF);
- Map models = new HashMap();
- models.put(ct.srckm3, new IFileTextSource(km3File));
- models.put(ct.srctcs, new IFileTextSource(tcsFile));
- models.put("problemReporter", new ProblemReporter() {
- public boolean reportProblem(TextSource textSource, ASMModel problemModel) {
- int nbErrors = 0;
- try {
- IFile file = ((IFileTextSource)textSource).file;
- nbErrors = new MarkerMaker().applyMarkers(file, problemModel);
- } catch (CoreException e) {
- e.printStackTrace();
- }
- return nbErrors == 0;
- }
- });
-
- if(tcsFile.getLocalTimeStamp() > editorFile.getLocalTimeStamp()) {
- monitor.subTask("creating Editor model " + editorFile.getName());
- ASMModel editorModel = (ASMModel)ct.getTarget(ct.tgteditor, models);
- amh.saveModel(editorModel, editorFile.getProjectRelativePath().toString(), p);
- p.getFolder("TGE").setDerived(true);
- rebuildPlugin = true;
- }
-
- if(km3File.getLocalTimeStamp() > outlineFile.getLocalTimeStamp()) {
- monitor.subTask("creating Outline model " + outlineFile.getName());
- ASMModel outlineModel = (ASMModel)ct.getTarget(ct.tgtoutline, models);
- amh.saveModel(outlineModel, outlineFile.getProjectRelativePath().toString(), p);
- p.getFolder("TGE").setDerived(true);
- rebuildPlugin = true;
- }
-
- if(km3File.getLocalTimeStamp() > ecoreFile.getLocalTimeStamp()) {
- monitor.subTask("creating Ecore metamodel " + ecoreFile.getName());
- ASMModel ecoreModel = (ASMModel)ct.getTarget(ct.tgtecore, models);
-
- IFile annotationFile = tss.getAnnotationSourceFile();
- if(annotationFile.exists()) {
- models.put(ct.srcannotation, new IFileTextSource(annotationFile));
- ecoreModel = (ASMModel)ct.getTarget(ct.tgtecorePlusAnnotations, models);
- }
-
- amh.saveModel(ecoreModel, ecoreFile.getProjectRelativePath().toString(), p);
- rebuildPlugin = true;
- }
-
- if(compilerSourceFile.exists()) {
- if(compilerSourceFile.getLocalTimeStamp() > compilerBinaryFile.getLocalTimeStamp()) {
- monitor.subTask("compiling compiler to " + compilerBinaryFile.getName());
- models.put(ct.srcacg, new IFileTextSource(compilerSourceFile));
-// ASMModel acgProblemModel = (ASMModel)ct.getTarget(ct.tgtacgproblem, models);
-// int nbACGErrors = new MarkerMaker().applyMarkers(compilerSourceFile, acgProblemModel);
- int nbACGErrors = 0;
- if(nbACGErrors == 0) {
- TextSource asmFile = (TextSource)ct.getTarget(ct.tgtasm, models);
- if (compilerBinaryFile.exists()) {
- compilerBinaryFile.setContents(asmFile.openStream(), IFile.DERIVED, monitor);
- } else {
- compilerBinaryFile.create(asmFile.openStream(), IFile.DERIVED, monitor);
- }
- }
- }
- }
-
- // TODO: improve TCS2Problem so that it is automatically invoked after injection (e.g., for TCS2Editor too)
- // TODO: keep injection errors as well
- // => possible solution to both problems: add a problem model to each getTarget request
- // (possibly using a special id in the models Map)
- if(
- (km3File.getLocalTimeStamp() > grammarFile.getLocalTimeStamp()) ||
- (tcsFile.getLocalTimeStamp() > grammarFile.getLocalTimeStamp())) {
- monitor.subTask("creating grammar " + grammarFile.getName());
- ASMModel tcsProblemModel = (ASMModel)ct.getTarget(ct.tgttcsproblem, models);
- int nbTCSErrors = new MarkerMaker().applyMarkers(tcsFile, tcsProblemModel);
- ASMModel km3ProblemModel = (ASMModel)ct.getTarget(ct.tgtkm3problem, models);
- int nbKM3Errors = new MarkerMaker().applyMarkers(km3File, km3ProblemModel);
- if((nbTCSErrors == 0) && (nbKM3Errors == 0)) {
- TextSource grammarModel = (TextSource)ct.getTarget(ct.tgtgrammar, models);
- if (grammarFile.exists()) {
- grammarFile.setContents(grammarModel.openStream(), IFile.DERIVED, monitor);
- } else {
- grammarFile.create(grammarModel.openStream(), IFile.DERIVED, monitor);
- }
- }
- }
-
- String parserSourceFolderPathName = "Syntax/parser_src/";
- if(grammarFile.getLocalTimeStamp() > jarFile.getLocalTimeStamp()) {
- monitor.subTask("compiling grammar to jar " + jarFile.getName());
- IFolder javaFilesPath = p.getFolder(parserSourceFolderPathName + "org/eclipse/gmt/tcs/injector/");
- grammarFile.deleteMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
- ParserGenerator parserGenerator = getParserGenerator(tss);
- if(parserGenerator == null) {
- throw new RuntimeException("Missing parser generator: " + tss.getParserGenerator() + " see http://wiki.eclipse.org/TCS/Language_Project#Installing_the_Required_Features");
- }
- parserGenerator.generate(
- grammarFile.getRawLocation().toOSString(),
- javaFilesPath.getRawLocation().toOSString(),
- new ParserGeneratorErrorListener() {
- public void addError(String message, int lineNumber,
- int charStart, int charEnd) {
- addMarker(grammarFile, IMarker.SEVERITY_ERROR, message, lineNumber, charStart, charEnd);
- }
-
- public void addInfo(String message, int lineNumber,
- int charStart, int charEnd) {
- addMarker(grammarFile, IMarker.SEVERITY_INFO, message, lineNumber, charStart, charEnd);
- }
-
- public void addWarning(String message, int lineNumber,
- int charStart, int charEnd) {
- addMarker(grammarFile, IMarker.SEVERITY_WARNING, message, lineNumber, charStart, charEnd);
- }
- });
- IFolder syntaxFolder = p.getFolder("Syntax/");
- syntaxFolder.refreshLocal(IFolder.DEPTH_INFINITE, null);
-
- if(!isJavaProject) {
- monitor.subTask("compiling parser and lexer to jar " + jarFile.getName());
- try {
- if(jarFile.exists())
- jarFile.delete(true, monitor);
- } catch(CoreException ce) {
- // We tried to delete the jarFile, but it may be in use (e.g., by TGE).
- // In this case, we can still overwrite it.
- }
- Manifest man = new Manifest();
- man.getMainAttributes().putValue("Manifest-Version", "1.0");
- final JarOutputStream out = new JarOutputStream(new FileOutputStream(jarFile.getLocation().toFile()), man);
- final List errors = new ArrayList();
-
-
- List classpath = new ArrayList();
- populateClassPath(p, classpath);
- INameEnvironment ne = new FileSystem((String[])classpath.toArray(new String[] {}), new String[0], "UTF-8");
- CompilerOptions co = new CompilerOptions();
- Map options = new HashMap();
- options.put(CompilerOptions.OPTION_LocalVariableAttribute, CompilerOptions.GENERATE);
- // Java code generated by the parser generator may contain unused imports that are not worth reporting
- options.put(CompilerOptions.OPTION_ReportUnusedImport, CompilerOptions.IGNORE);
- co.set(options);
- ICompilerRequestor cr = new ICompilerRequestor() {
- public void acceptResult(CompilationResult result) {
- try {
- // TODO: report errors
- CategorizedProblem pbs[] = result.getProblems();
- boolean hasError = false;
- IFile javaFile = p.getParent().getFile(new Path(new String(result.getFileName())));
- javaFile.deleteMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
- if(pbs != null) {
- for(int i = 0 ; i < pbs.length ; i++) {
- CategorizedProblem pb = pbs[i];
- System.out.println(pb);
- if(pb.isError()) {
- hasError |= true;
- errors.add(pb);
- addMarker(javaFile, IMarker.SEVERITY_ERROR, pb.getMessage(), pb.getSourceLineNumber(), pb.getSourceStart(), pb.getSourceEnd() + 1);
- } else if(pb.isWarning()) {
- addMarker(javaFile, IMarker.SEVERITY_WARNING, pb.getMessage(), pb.getSourceLineNumber(), pb.getSourceStart(), pb.getSourceEnd() + 1);
- }
- }
- }
- if(!hasError) {
- ClassFile cfs[] = result.getClassFiles();
- for(int i = 0 ; i < cfs.length ; i++) {
- out.putNextEntry(new ZipEntry(new String(cfs[i].fileName()) + ".class"));
- out.write(cfs[i].getBytes());
- out.closeEntry();
- }
- }
- } catch(IOException ioe) {
- ioe.printStackTrace(System.out);
- } catch (CoreException e) {
- e.printStackTrace(System.out);
- }
- }
- };
- Compiler compiler = new Compiler(ne, DefaultErrorHandlingPolicies.proceedWithAllProblems(), co, cr, ProblemFactory.getProblemFactory(Locale.getDefault()));
- syntaxFolder.refreshLocal(IFolder.DEPTH_INFINITE, null);
- compiler.compile(new ICompilationUnit[] {
- new ResourceCompilationUnit(javaFilesPath.getFile(name + "_ANTLR3Lexer.java"), null),
- new ResourceCompilationUnit(javaFilesPath.getFile(name + "_ANTLR3Parser.java"), null),
- });
- syntaxFolder.refreshLocal(IFolder.DEPTH_INFINITE, null);
- out.close();
-
- IFolder parserSourceFolder = p.getFolder(parserSourceFolderPathName);
- if(parserSourceFolder.exists()) {
- parserSourceFolder.setDerived(true);
- }
- if(errors.isEmpty()) {
- if(removeParserJavaSource) {
- parserSourceFolder.delete(false, null);
- }
- } else {
- jarFile.delete(true, null);
- }
- if(jarFile.exists()) {
- jarFile.refreshLocal(IResource.DEPTH_ZERO, monitor);
- jarFile.setDerived(true);
- rebuildPlugin = true;
- }
- }
- }
-
- Map subst = new HashMap();
-// subst.put("ammacore.path", "/AMMACore");
-// subst.put("ammacore.metamodel.dir.name", "Metamodel");
- subst.put("dsl.name", name);
- subst.put("syntax.path", "/" + name + "/Syntax");
- subst.put("syntax.tcs.filename", name + ".tcs");
- subst.put("syntax.jar.filename", name + "-parser.jar");
- subst.put("dsl.ext", ext);
-// subst.put("tge.path", "/" + name + "/TGE");
- subst.put("mm.location", "/" + name + "/Metamodel/" + name + ".ecore");
-// subst.put("injector.path", "/" + name + "/injector.xml");
-// subst.put("extractor.path", "/" + name + "/extractor.xml");
-
- if("true".equals(tss.getProperty("scripts.ant.create"))) {
- IFile injectorFile = p.getFile("injector.xml");
- if(!injectorFile.exists()) {
- injectorFile.create(new ByteArrayInputStream(getTemplate("templates/injector.xml", subst).getBytes()), true, null);
- injectorFile.setDerived(true);
- }
- IFile extractorFile = p.getFile("extractor.xml");
- if(!extractorFile.exists()) {
- extractorFile.create(new ByteArrayInputStream(getTemplate("templates/extractor.xml", subst).getBytes()), true, null);
- extractorFile.setDerived(true);
- }
- }
-
-
- if(!isJavaProject) {
- IFile pluginFile = p.getFile("plugin/org.eclipse.gmt.tcs.language." + name + ".jar");
- if(!pluginFile.exists()) {
- rebuildPlugin = true;
- }
- if("true".equals(tss.getProperty("plugin.create")) && rebuildPlugin) {
- IFolder pluginFolder = p.getFolder("plugin");
- if(!pluginFolder.exists()) {
- pluginFolder.create(IFolder.DERIVED + IFolder.FORCE, true, monitor);
- }
- BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(pluginFile.getRawLocation().toString()));
- JarOutputStream jout = new JarOutputStream(out);
-
- jout.putNextEntry(new ZipEntry("plugin.xml"));
- jout.write(getTemplate("templates/plugin.xml", subst).getBytes());
-
- jout.putNextEntry(new ZipEntry("META-INF/MANIFEST.MF"));
- jout.write(getTemplate("templates/MANIFEST.MF", subst).getBytes());
-
- jout.putNextEntry(new ZipEntry("resources/" + name + ".ecore"));
- ASMModel ecoreModel = (ASMModel)ct.getTarget(ct.tgtecore, models);
- amh.saveModel(ecoreModel, jout);
-
- jout.putNextEntry(new ZipEntry("resources/" + name + "-Editor.xmi"));
- ASMModel editorModel = (ASMModel)ct.getTarget(ct.tgteditor, models);
- amh.saveModel(editorModel, jout);
-
- jout.putNextEntry(new ZipEntry("resources/" + name + "-Outline.xmi"));
- ASMModel outlineModel = (ASMModel)ct.getTarget(ct.tgtoutline, models);
- amh.saveModel(outlineModel, jout);
-
- jout.putNextEntry(new ZipEntry("resources/" + name + "-TCS.xmi"));
- ASMModel tcsModel = (ASMModel)ct.getTarget(ct.tgttcs, models);
- amh.saveModel(tcsModel, jout);
-
- jout.putNextEntry(new ZipEntry("resources/" + name + "-parser.jar"));
- BufferedInputStream in = new BufferedInputStream(jarFile.getContents());
- int size;
- byte buffer[] = new byte[1024];
- while((size = in.read(buffer)) > 0) {
- jout.write(buffer, 0, size);
- }
- in.close();
-
- jout.close();
- if(!pluginFile.exists()) {
- pluginFile.refreshLocal(IResource.DEPTH_ZERO, monitor);
- pluginFile.setDerived(true);
- }
- }
- }
- } catch(IOException ioe) {
- ioe.printStackTrace(System.out);
- }
- rl=null;ct=null;
- return null;
- }
-
- private ParserGenerator getParserGenerator(LanguageSource tss) {
- String parserGeneratorName = tss.getParserGenerator();
- ParserGenerator ret = (ParserGenerator)parserGenerators.get(parserGeneratorName);
-
- if(ret == null) {
- IExtensionRegistry registry = Platform.getExtensionRegistry();
- if (registry == null) {
- throw new RuntimeException("Extension registry not found");
- }
-
- IExtensionPoint point = registry.getExtensionPoint("org.eclipse.gmt.tcs.builder.parserGenerator");//$NON-NLS-1$
-
- IExtension[] extensions = point.getExtensions();
- extensions: for(int i = 0 ; i < extensions.length ; i++) {
- IConfigurationElement[] elements = extensions[i].getConfigurationElements();
- for(int j = 0 ; j < elements.length ; j++) {
- try {
- if(elements[j].getAttribute("name").equals(parserGeneratorName)) {//$NON-NLS-1$
- ret = (ParserGenerator)elements[j].createExecutableExtension("class");
- break extensions;
- }
- } catch (CoreException e){
- throw new RuntimeException(e);
- }
- }
- }
- synchronized(parserGenerators) {
- parserGenerators.put(parserGeneratorName, ret);
- }
- }
-
- return ret;
- }
-
- private static void addMarker(IResource res, int severity, String description, int lineNumber, int charStart, int charEnd) {
- try {
- IMarker pbmMarker = res.createMarker(IMarker.PROBLEM);
- pbmMarker.setAttribute(IMarker.SEVERITY, severity);
- pbmMarker.setAttribute(IMarker.MESSAGE, description);
- pbmMarker.setAttribute(IMarker.LINE_NUMBER, (lineNumber == -1) ? 1 : lineNumber);
- pbmMarker.setAttribute(IMarker.CHAR_START, charStart);
- pbmMarker.setAttribute(IMarker.CHAR_END, charEnd);
- } catch(CoreException ce) {
- ce.printStackTrace(System.err);
- }
- }
-
- public static String getTemplate(String path, Map substitutions) throws IOException {
- Bundle bundle = Activator.getDefault().getBundle();
- URL templateURL = bundle.getResource("resources/" + path); //FileLocator.find(bundle, new Path("resources/" + path), Collections.EMPTY_MAP);
- BufferedInputStream in = new BufferedInputStream(templateURL.openStream());
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- int size;
- byte buffer[] = new byte[1000];
- while((size = in.read(buffer)) > 0) {
- out.write(buffer, 0, size);
- }
- String ret = out.toString();
- for(Iterator i = substitutions.keySet().iterator() ; i.hasNext() ; ) {
- String key = (String)i.next();
- String value = (String)substitutions.get(key);
- ret = ret.replaceAll("\\$\\{" + key + "}", value);
- }
- return ret;
- }
-
-// private void createIfMissing(IFolder f, IProgressMonitor monitor) throws CoreException {
-// if(!f.exists()) {
-// createIfMissing((IFolder)f.getParent(), monitor);
-// f.create(0,false, monitor);
-// }
-// }
-
- private void populateClassPath(IProject project, List classpath) throws IOException {
- // property: sun.boot.class.path
- // According to JDT help: If no bootclasspath is specified, the compiler will infer it using the following system properties sun.boot.class.path, vm.boot.class.path or org.apache.harmony.boot.class.path in this order respectively.
- // see example in org.eclipse.jdt.internal.compiler.batch.Main.handleBootclasspath([...])
- classpath.add(System.getProperty("java.home") + "/lib/rt.jar");
-
- Bundle bundle = org.eclipse.m2m.atl.dsls.Activator.getDefault().getBundle();
- URL urlPlatform = bundle.getEntry("/");
- URL localFileInPluginURL;
- localFileInPluginURL = FileLocator.toFileURL(urlPlatform);
- String atlEnginePath = localFileInPluginURL.getPath().toString();
-
- classpath.add(atlEnginePath + "libraries/org.eclipse.gmt.tcs.injector.jar");
-
- urlPlatform = Platform.getBundle("org.antlr.runtime").getEntry("/");
- localFileInPluginURL = FileLocator.toFileURL(urlPlatform);
- classpath.add(localFileInPluginURL.getPath().toString());
- }
-}
+/**
+ * Copyright (c) 2008 INRIA.
+ * 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:
+ * INRIA - initial API and implementation
+ *
+ * $Id: TCSBuilder.java,v 1.17 2008/07/03 14:38:28 fjouault Exp $
+ */
+package org.eclipse.gmt.tcs.builder;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.ref.SoftReference;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import java.util.zip.ZipEntry;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.gmt.tcs.builder.ct.ResourceLocator;
+import org.eclipse.gmt.tcs.metadata.Language;
+import org.eclipse.gmt.tcs.metadata.LanguageRegistry;
+import org.eclipse.gmt.tcs.metadata.LanguageSource;
+import org.eclipse.jdt.core.compiler.CategorizedProblem;
+import org.eclipse.jdt.internal.compiler.ClassFile;
+import org.eclipse.jdt.internal.compiler.CompilationResult;
+import org.eclipse.jdt.internal.compiler.Compiler;
+import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies;
+import org.eclipse.jdt.internal.compiler.ICompilerRequestor;
+import org.eclipse.jdt.internal.compiler.batch.FileSystem;
+import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
+import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.eclipse.jdt.internal.core.builder.ProblemFactory;
+import org.eclipse.jdt.internal.core.util.ResourceCompilationUnit;
+import org.eclipse.m2m.atl.core.ATLCoreException;
+import org.eclipse.m2m.atl.core.IExtractor;
+import org.eclipse.m2m.atl.core.IModel;
+import org.eclipse.m2m.atl.core.ModelFactory;
+import org.eclipse.m2m.atl.core.emf.EMFModelFactory;
+import org.eclipse.m2m.atl.core.service.CoreService;
+import org.eclipse.m2m.atl.dsls.DSLResourceProvider;
+import org.eclipse.m2m.atl.dsls.Resource;
+import org.eclipse.m2m.atl.dsls.textsource.IFileTextSource;
+import org.eclipse.m2m.atl.dsls.textsource.TextSource;
+import org.eclipse.m2m.atl.engine.MarkerMaker;
+import org.osgi.framework.Bundle;
+
+/**
+ *
+ * @author Fr�d�ric Jouault
+ *
+ */
+public class TCSBuilder extends IncrementalProjectBuilder {
+
+ public static final String ID = "org.eclipse.gmt.tcs.builder.Builder";
+
+ private Map parserGenerators = new HashMap();;
+
+ public TCSBuilder() throws Exception {
+ }
+
+ private ResourceLocator rl;
+ // soft reference: to prevent from being retained, which causes a leak
+ // TODO: is the SoftReference itself leaked now?
+ private SoftReference ct = null;
+
+ private TCSBuilderCT getTCSBuilderCT() throws CoreException {
+ TCSBuilderCT ret = (ct == null) ? null : (TCSBuilderCT)ct.get();
+ final IProject ammaCore = ResourcesPlugin.getWorkspace().getRoot().getProject("AMMACore");
+ if((ret != null) && (ammaCore.exists())) {
+ IFile noChangeFile = ammaCore.getFile("NO_CHANGE.txt");
+ if(!noChangeFile.exists()) {
+ ret = null; // force reload of all models
+ noChangeFile.create(new ByteArrayInputStream("Remove this file to force the TCS builder to purge its cache and reload the AMMACore models (e.g., after updating from CVS, or changing a model).".getBytes()), true, null);
+ noChangeFile.setDerived(true);
+ }
+ }
+ if(ret == null) {
+ boolean canUseAMMACore = false;
+ if(ammaCore.exists()) {
+ IFile doNotUseFile = ammaCore.getFile("DO_NOT_USE.txt");
+ if(!doNotUseFile.exists()) {
+ canUseAMMACore = true;
+ }
+ }
+ final boolean useAMMACore = canUseAMMACore;
+ rl = new ResourceLocator() {
+ public Resource getResource(final String id) throws IOException {
+ if(useAMMACore) {
+ // Get resources from AMMACore project in workspace
+ return new Resource() {
+ public TextSource asTextSource() {
+ return new IFileTextSource(ammaCore.getFile(id));
+ }
+
+ public URI asEMFURI() {
+ return URI.createPlatformResourceURI(ammaCore.getFile(id).getFullPath().toString(), true);
+ }
+ public URL asURL() {
+ throw new RuntimeException("Conversion to URL unsupported");
+ }
+ };
+ } else {
+ return DSLResourceProvider.getDefault().getResource(id);
+ }
+ }
+ };
+ try {
+ ret = new TCSBuilderCT(rl);
+ ct = new SoftReference(ret);
+ } catch(IOException ioe) {
+ // setting exception (ie., last argument) to non-null value (i.e., ioe) prevents the error pop-up from opening
+ throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.OK, "error loading resources from AMMACore project", ioe));
+ } catch (ATLCoreException ace) {
+ // setting exception (ie., last argument) to non-null value (i.e., ace) prevents the error pop-up from opening
+ throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.OK, "error loading resources from AMMACore project", ace));
+ }
+ }
+ return ret;
+ }
+
+
+ // TODO: add 'if(monitor.isCanceled()) return null;' where appropriate
+ protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
+ TCSBuilderCT ct = getTCSBuilderCT();
+ final IProject p = getProject();
+ Language ts = LanguageRegistry.getDefault().getLanguageFromSource(p);
+ if(ts == null) {
+ return null; // not a valid TCS project
+ }
+ LanguageSource tss = ts.getSource();
+ final String name = ts.getName();
+ IFile km3File = tss.getKM3SourceFile();
+ IFile tcsFile = tss.getTCSSourceFile();
+ IFile outlineFile = tss.getOutlineFile();
+ IFile editorFile = tss.getEditorFile();
+ IFile ecoreFile = tss.getMetamodelFile();
+ final IFile grammarFile = tss.getGrammarFile();
+ final IFile jarFile = tss.getParserFile();
+ IFile compilerSourceFile = tss.getACGSourceFile();
+ IFile compilerBinaryFile = tss.getCompilerFile();
+ try {
+ String ext = ts.getExtension();
+ boolean removeParserJavaSource = !"false".equals(tss.getProperty("syntax.jar.source.remove"));
+ boolean rebuildPlugin = false;
+ boolean isJavaProject = false;
+
+ ModelFactory mf = CoreService.getModelFactory(EMFModelFactory.MODEL_FACTORY_NAME);
+ IExtractor extractor = CoreService.getExtractor(mf.getDefaultExtractorName());
+ Map models = new HashMap();
+ models.put(ct.srckm3, new IFileTextSource(km3File));
+ models.put(ct.srctcs, new IFileTextSource(tcsFile));
+ models.put("problemReporter", new ProblemReporter() {
+ public boolean reportProblem(TextSource textSource, IModel problemModel) {
+ int nbErrors = 0;
+ try {
+ IFile file = ((IFileTextSource)textSource).getFile();
+ nbErrors = new MarkerMaker().applyMarkers(file, problemModel);
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ return nbErrors == 0;
+ }
+ });
+
+ if(tcsFile.getLocalTimeStamp() > editorFile.getLocalTimeStamp()) {
+ monitor.subTask("creating Editor model " + editorFile.getName());
+ IModel editorModel = (IModel)ct.getTarget(ct.tgteditor, models);
+ extractor.extract(editorModel,
+ URI.createPlatformResourceURI(
+ "/" + p.getName() + "/" + editorFile.getProjectRelativePath().toString(), true)
+ .toString());
+ p.getFolder("TGE").setDerived(true);
+ rebuildPlugin = true;
+ }
+
+ if(km3File.getLocalTimeStamp() > outlineFile.getLocalTimeStamp()) {
+ monitor.subTask("creating Outline model " + outlineFile.getName());
+ IModel outlineModel = (IModel)ct.getTarget(ct.tgtoutline, models);
+ extractor.extract(outlineModel,
+ URI.createPlatformResourceURI(
+ "/" + p.getName() + "/" + outlineFile.getProjectRelativePath().toString(), true)
+ .toString());
+ p.getFolder("TGE").setDerived(true);
+ rebuildPlugin = true;
+ }
+
+ if(km3File.getLocalTimeStamp() > ecoreFile.getLocalTimeStamp()) {
+ monitor.subTask("creating Ecore metamodel " + ecoreFile.getName());
+ IModel ecoreModel = (IModel)ct.getTarget(ct.tgtecore, models);
+
+ IFile annotationFile = tss.getAnnotationSourceFile();
+ if(annotationFile.exists()) {
+ models.put(ct.srcannotation, new IFileTextSource(annotationFile));
+ ecoreModel = (IModel)ct.getTarget(ct.tgtecorePlusAnnotations, models);
+ }
+
+ extractor.extract(ecoreModel,
+ URI.createPlatformResourceURI(
+ "/" + p.getName() + "/" + ecoreFile.getProjectRelativePath().toString(), true)
+ .toString());
+ rebuildPlugin = true;
+ }
+
+ if(compilerSourceFile.exists()) {
+ if(compilerSourceFile.getLocalTimeStamp() > compilerBinaryFile.getLocalTimeStamp()) {
+ monitor.subTask("compiling compiler to " + compilerBinaryFile.getName());
+ models.put(ct.srcacg, new IFileTextSource(compilerSourceFile));
+ int nbACGErrors = 0;
+ if(nbACGErrors == 0) {
+ TextSource asmFile = (TextSource)ct.getTarget(ct.tgtasm, models);
+ if (compilerBinaryFile.exists()) {
+ compilerBinaryFile.setContents(asmFile.openStream(), IFile.DERIVED, monitor);
+ } else {
+ compilerBinaryFile.create(asmFile.openStream(), IFile.DERIVED, monitor);
+ }
+ }
+ }
+ }
+
+ // TODO: improve TCS2Problem so that it is automatically invoked after injection (e.g., for TCS2Editor too)
+ // TODO: keep injection errors as well
+ // => possible solution to both problems: add a problem model to each getTarget request
+ // (possibly using a special id in the models Map)
+ if(
+ (km3File.getLocalTimeStamp() > grammarFile.getLocalTimeStamp()) ||
+ (tcsFile.getLocalTimeStamp() > grammarFile.getLocalTimeStamp())) {
+ monitor.subTask("creating grammar " + grammarFile.getName());
+ IModel tcsProblemModel = (IModel)ct.getTarget(ct.tgttcsproblem, models);
+ int nbTCSErrors = new MarkerMaker().applyMarkers(tcsFile, tcsProblemModel);
+ IModel km3ProblemModel = (IModel)ct.getTarget(ct.tgtkm3problem, models);
+ int nbKM3Errors = new MarkerMaker().applyMarkers(km3File, km3ProblemModel);
+ if((nbTCSErrors == 0) && (nbKM3Errors == 0)) {
+ TextSource grammarModel = (TextSource)ct.getTarget(ct.tgtgrammar, models);
+ if (grammarFile.exists()) {
+ grammarFile.setContents(grammarModel.openStream(), IFile.DERIVED, monitor);
+ } else {
+ grammarFile.create(grammarModel.openStream(), IFile.DERIVED, monitor);
+ }
+ }
+ }
+
+ String parserSourceFolderPathName = "Syntax/parser_src/";
+ if(grammarFile.getLocalTimeStamp() > jarFile.getLocalTimeStamp()) {
+ monitor.subTask("compiling grammar to jar " + jarFile.getName());
+ IFolder javaFilesPath = p.getFolder(parserSourceFolderPathName + "org/eclipse/gmt/tcs/injector/");
+ grammarFile.deleteMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
+ ParserGenerator parserGenerator = getParserGenerator(tss);
+ if(parserGenerator == null) {
+ throw new RuntimeException("Missing parser generator: " + tss.getParserGenerator() + " see http://wiki.eclipse.org/TCS/Language_Project#Installing_the_Required_Features");
+ }
+ parserGenerator.generate(
+ grammarFile.getRawLocation().toOSString(),
+ javaFilesPath.getRawLocation().toOSString(),
+ new ParserGeneratorErrorListener() {
+ public void addError(String message, int lineNumber,
+ int charStart, int charEnd) {
+ addMarker(grammarFile, IMarker.SEVERITY_ERROR, message, lineNumber, charStart, charEnd);
+ }
+
+ public void addInfo(String message, int lineNumber,
+ int charStart, int charEnd) {
+ addMarker(grammarFile, IMarker.SEVERITY_INFO, message, lineNumber, charStart, charEnd);
+ }
+
+ public void addWarning(String message, int lineNumber,
+ int charStart, int charEnd) {
+ addMarker(grammarFile, IMarker.SEVERITY_WARNING, message, lineNumber, charStart, charEnd);
+ }
+ });
+ IFolder syntaxFolder = p.getFolder("Syntax/");
+ syntaxFolder.refreshLocal(IFolder.DEPTH_INFINITE, null);
+
+ if(!isJavaProject) {
+ monitor.subTask("compiling parser and lexer to jar " + jarFile.getName());
+ try {
+ if(jarFile.exists())
+ jarFile.delete(true, monitor);
+ } catch(CoreException ce) {
+ // We tried to delete the jarFile, but it may be in use (e.g., by TGE).
+ // In this case, we can still overwrite it.
+ }
+ Manifest man = new Manifest();
+ man.getMainAttributes().putValue("Manifest-Version", "1.0");
+ final JarOutputStream out = new JarOutputStream(new FileOutputStream(jarFile.getLocation().toFile()), man);
+ final List errors = new ArrayList();
+
+
+ List classpath = new ArrayList();
+ populateClassPath(p, classpath);
+ INameEnvironment ne = new FileSystem((String[])classpath.toArray(new String[] {}), new String[0], "UTF-8");
+ CompilerOptions co = new CompilerOptions();
+ Map options = new HashMap();
+ options.put(CompilerOptions.OPTION_LocalVariableAttribute, CompilerOptions.GENERATE);
+ // Java code generated by the parser generator may contain unused imports that are not worth reporting
+ options.put(CompilerOptions.OPTION_ReportUnusedImport, CompilerOptions.IGNORE);
+ co.set(options);
+ ICompilerRequestor cr = new ICompilerRequestor() {
+ public void acceptResult(CompilationResult result) {
+ try {
+ // TODO: report errors
+ CategorizedProblem pbs[] = result.getProblems();
+ boolean hasError = false;
+ IFile javaFile = p.getParent().getFile(new Path(new String(result.getFileName())));
+ javaFile.deleteMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
+ if(pbs != null) {
+ for(int i = 0 ; i < pbs.length ; i++) {
+ CategorizedProblem pb = pbs[i];
+ System.out.println(pb);
+ if(pb.isError()) {
+ hasError |= true;
+ errors.add(pb);
+ addMarker(javaFile, IMarker.SEVERITY_ERROR, pb.getMessage(), pb.getSourceLineNumber(), pb.getSourceStart(), pb.getSourceEnd() + 1);
+ } else if(pb.isWarning()) {
+ addMarker(javaFile, IMarker.SEVERITY_WARNING, pb.getMessage(), pb.getSourceLineNumber(), pb.getSourceStart(), pb.getSourceEnd() + 1);
+ }
+ }
+ }
+ if(!hasError) {
+ ClassFile cfs[] = result.getClassFiles();
+ for(int i = 0 ; i < cfs.length ; i++) {
+ out.putNextEntry(new ZipEntry(new String(cfs[i].fileName()) + ".class"));
+ out.write(cfs[i].getBytes());
+ out.closeEntry();
+ }
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace(System.out);
+ } catch (CoreException e) {
+ e.printStackTrace(System.out);
+ }
+ }
+ };
+ Compiler compiler = new Compiler(ne, DefaultErrorHandlingPolicies.proceedWithAllProblems(), co, cr, ProblemFactory.getProblemFactory(Locale.getDefault()));
+ syntaxFolder.refreshLocal(IFolder.DEPTH_INFINITE, null);
+ compiler.compile(new ICompilationUnit[] {
+ new ResourceCompilationUnit(javaFilesPath.getFile(name + "_ANTLR3Lexer.java")),
+ new ResourceCompilationUnit(javaFilesPath.getFile(name + "_ANTLR3Parser.java")),
+ });
+ syntaxFolder.refreshLocal(IFolder.DEPTH_INFINITE, null);
+ out.close();
+
+ IFolder parserSourceFolder = p.getFolder(parserSourceFolderPathName);
+ if(parserSourceFolder.exists()) {
+ parserSourceFolder.setDerived(true);
+ }
+ if(errors.isEmpty()) {
+ if(removeParserJavaSource) {
+ parserSourceFolder.delete(false, null);
+ }
+ } else {
+ jarFile.delete(true, null);
+ }
+ if(jarFile.exists()) {
+ jarFile.refreshLocal(IResource.DEPTH_ZERO, monitor);
+ jarFile.setDerived(true);
+ rebuildPlugin = true;
+ }
+ }
+ }
+
+ Map subst = new HashMap();
+// subst.put("ammacore.path", "/AMMACore");
+// subst.put("ammacore.metamodel.dir.name", "Metamodel");
+ subst.put("dsl.name", name);
+ subst.put("syntax.path", "/" + name + "/Syntax");
+ subst.put("syntax.tcs.filename", name + ".tcs");
+ subst.put("syntax.jar.filename", name + "-parser.jar");
+ subst.put("dsl.ext", ext);
+// subst.put("tge.path", "/" + name + "/TGE");
+ subst.put("mm.location", "/" + name + "/Metamodel/" + name + ".ecore");
+// subst.put("injector.path", "/" + name + "/injector.xml");
+// subst.put("extractor.path", "/" + name + "/extractor.xml");
+
+ if("true".equals(tss.getProperty("scripts.ant.create"))) {
+ IFile injectorFile = p.getFile("injector.xml");
+ if(!injectorFile.exists()) {
+ injectorFile.create(new ByteArrayInputStream(getTemplate("templates/injector.xml", subst).getBytes()), true, null);
+ injectorFile.setDerived(true);
+ }
+ IFile extractorFile = p.getFile("extractor.xml");
+ if(!extractorFile.exists()) {
+ extractorFile.create(new ByteArrayInputStream(getTemplate("templates/extractor.xml", subst).getBytes()), true, null);
+ extractorFile.setDerived(true);
+ }
+ }
+
+
+ if(!isJavaProject) {
+ IFile pluginFile = p.getFile("plugin/org.eclipse.gmt.tcs.language." + name + ".jar");
+ if(!pluginFile.exists()) {
+ rebuildPlugin = true;
+ }
+ if("true".equals(tss.getProperty("plugin.create")) && rebuildPlugin) {
+ IFolder pluginFolder = p.getFolder("plugin");
+ if(!pluginFolder.exists()) {
+ pluginFolder.create(IFolder.DERIVED + IFolder.FORCE, true, monitor);
+ }
+ BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(pluginFile.getRawLocation().toString()));
+ JarOutputStream jout = new JarOutputStream(out);
+
+ jout.putNextEntry(new ZipEntry("plugin.xml"));
+ jout.write(getTemplate("templates/plugin.xml", subst).getBytes());
+
+ jout.putNextEntry(new ZipEntry("META-INF/MANIFEST.MF"));
+ jout.write(getTemplate("templates/MANIFEST.MF", subst).getBytes());
+
+ jout.putNextEntry(new ZipEntry("resources/" + name + ".ecore"));
+ IModel ecoreModel = (IModel)ct.getTarget(ct.tgtecore, models);
+ extractor.extract(ecoreModel, jout, Collections.emptyMap());
+
+ jout.putNextEntry(new ZipEntry("resources/" + name + "-Editor.xmi"));
+ IModel editorModel = (IModel)ct.getTarget(ct.tgteditor, models);
+ extractor.extract(editorModel, jout, Collections.emptyMap());
+
+ jout.putNextEntry(new ZipEntry("resources/" + name + "-Outline.xmi"));
+ IModel outlineModel = (IModel)ct.getTarget(ct.tgtoutline, models);
+ extractor.extract(outlineModel, jout, Collections.emptyMap());
+
+ jout.putNextEntry(new ZipEntry("resources/" + name + "-TCS.xmi"));
+ IModel tcsModel = (IModel)ct.getTarget(ct.tgttcs, models);
+ extractor.extract(tcsModel, jout, Collections.emptyMap());
+
+ jout.putNextEntry(new ZipEntry("resources/" + name + "-parser.jar"));
+ BufferedInputStream in = new BufferedInputStream(jarFile.getContents());
+ int size;
+ byte buffer[] = new byte[1024];
+ while((size = in.read(buffer)) > 0) {
+ jout.write(buffer, 0, size);
+ }
+ in.close();
+
+ jout.close();
+ if(!pluginFile.exists()) {
+ pluginFile.refreshLocal(IResource.DEPTH_ZERO, monitor);
+ pluginFile.setDerived(true);
+ }
+ }
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace(System.out);
+ } catch (ATLCoreException e) {
+ e.printStackTrace(System.out);
+ }
+ rl=null;ct=null;
+ return null;
+ }
+
+ private ParserGenerator getParserGenerator(LanguageSource tss) {
+ String parserGeneratorName = tss.getParserGenerator();
+ ParserGenerator ret = (ParserGenerator)parserGenerators.get(parserGeneratorName);
+
+ if(ret == null) {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ if (registry == null) {
+ throw new RuntimeException("Extension registry not found");
+ }
+
+ IExtensionPoint point = registry.getExtensionPoint("org.eclipse.gmt.tcs.builder.parserGenerator");//$NON-NLS-1$
+
+ IExtension[] extensions = point.getExtensions();
+ extensions: for(int i = 0 ; i < extensions.length ; i++) {
+ IConfigurationElement[] elements = extensions[i].getConfigurationElements();
+ for(int j = 0 ; j < elements.length ; j++) {
+ try {
+ if(elements[j].getAttribute("name").equals(parserGeneratorName)) {//$NON-NLS-1$
+ ret = (ParserGenerator)elements[j].createExecutableExtension("class");
+ break extensions;
+ }
+ } catch (CoreException e){
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ synchronized(parserGenerators) {
+ parserGenerators.put(parserGeneratorName, ret);
+ }
+ }
+
+ return ret;
+ }
+
+ private static void addMarker(IResource res, int severity, String description, int lineNumber, int charStart, int charEnd) {
+ try {
+ IMarker pbmMarker = res.createMarker(IMarker.PROBLEM);
+ pbmMarker.setAttribute(IMarker.SEVERITY, severity);
+ pbmMarker.setAttribute(IMarker.MESSAGE, description);
+ pbmMarker.setAttribute(IMarker.LINE_NUMBER, (lineNumber == -1) ? 1 : lineNumber);
+ pbmMarker.setAttribute(IMarker.CHAR_START, charStart);
+ pbmMarker.setAttribute(IMarker.CHAR_END, charEnd);
+ } catch(CoreException ce) {
+ ce.printStackTrace(System.err);
+ }
+ }
+
+ public static String getTemplate(String path, Map substitutions) throws IOException {
+ Bundle bundle = Activator.getDefault().getBundle();
+ URL templateURL = bundle.getResource("resources/" + path); //FileLocator.find(bundle, new Path("resources/" + path), Collections.EMPTY_MAP);
+ BufferedInputStream in = new BufferedInputStream(templateURL.openStream());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ int size;
+ byte buffer[] = new byte[1000];
+ while((size = in.read(buffer)) > 0) {
+ out.write(buffer, 0, size);
+ }
+ String ret = out.toString();
+ for(Iterator i = substitutions.keySet().iterator() ; i.hasNext() ; ) {
+ String key = (String)i.next();
+ String value = (String)substitutions.get(key);
+ ret = ret.replaceAll("\\$\\{" + key + "}", value);
+ }
+ return ret;
+ }
+
+// private void createIfMissing(IFolder f, IProgressMonitor monitor) throws CoreException {
+// if(!f.exists()) {
+// createIfMissing((IFolder)f.getParent(), monitor);
+// f.create(0,false, monitor);
+// }
+// }
+
+ private void populateClassPath(IProject project, List classpath) throws IOException {
+ // property: sun.boot.class.path
+ // According to JDT help: If no bootclasspath is specified, the compiler will infer it using the following system properties sun.boot.class.path, vm.boot.class.path or org.apache.harmony.boot.class.path in this order respectively.
+ // see example in org.eclipse.jdt.internal.compiler.batch.Main.handleBootclasspath([...])
+ classpath.add(System.getProperty("java.home") + "/lib/rt.jar");
+
+ Bundle bundle = org.eclipse.m2m.atl.dsls.Activator.getDefault().getBundle();
+ URL urlPlatform = bundle.getEntry("/");
+ URL localFileInPluginURL;
+ localFileInPluginURL = FileLocator.toFileURL(urlPlatform);
+ String atlEnginePath = localFileInPluginURL.getPath().toString();
+
+ classpath.add(atlEnginePath + "libraries/org.eclipse.gmt.tcs.injector.jar");
+
+ urlPlatform = Platform.getBundle("org.antlr.runtime").getEntry("/");
+ localFileInPluginURL = FileLocator.toFileURL(urlPlatform);
+ classpath.add(localFileInPluginURL.getPath().toString());
+ }
+}
diff --git a/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/TCSBuilderCT.java b/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/TCSBuilderCT.java
index 62f99b0..fb179ee 100644
--- a/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/TCSBuilderCT.java
+++ b/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/TCSBuilderCT.java
@@ -1,306 +1,282 @@
-/**
- * Copyright (c) 2007, 2008 INRIA.
- * 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:
- * INRIA - initial API and implementation
- *
- * $Id: TCSBuilderCT.java,v 1.7 2008/06/25 13:02:47 fjouault Exp $
- */
-package org.eclipse.gmt.tcs.builder;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.gmt.tcs.builder.ct.CompositeTransformation;
-import org.eclipse.gmt.tcs.builder.ct.Metamodel;
-import org.eclipse.gmt.tcs.builder.ct.ResourceLocator;
-import org.eclipse.gmt.tcs.builder.ct.definition.ACGTransformation;
-import org.eclipse.gmt.tcs.builder.ct.definition.ATLRefinedTargetDefinition;
-import org.eclipse.gmt.tcs.builder.ct.definition.ATLSourceDefinition;
-import org.eclipse.gmt.tcs.builder.ct.definition.ATLTargetDefinition;
-import org.eclipse.gmt.tcs.builder.ct.definition.ATLTransformation;
-import org.eclipse.gmt.tcs.builder.ct.definition.CompositeTransformationSourceDefinition;
-import org.eclipse.gmt.tcs.builder.ct.definition.CompositeTransformationTargetDefinition;
-import org.eclipse.gmt.tcs.builder.ct.definition.ModelSourceDefinition;
-import org.eclipse.gmt.tcs.builder.ct.definition.ModelTargetDefinition;
-import org.eclipse.gmt.tcs.builder.ct.definition.SourceDefinition;
-import org.eclipse.gmt.tcs.builder.ct.definition.TCSExtraction;
-import org.eclipse.gmt.tcs.builder.ct.definition.TCSInjection;
-import org.eclipse.gmt.tcs.builder.ct.definition.TargetDefinition;
-import org.eclipse.gmt.tcs.builder.ct.definition.Transformation;
-import org.eclipse.gmt.tcs.builder.ct.usage.Source;
-import org.eclipse.gmt.tcs.builder.ct.usage.Target;
-import org.eclipse.gmt.tcs.builder.ct.usage.TransformationUsage;
-import org.eclipse.m2m.atl.engine.AtlModelHandler;
-
-/**
- *
- * @author Frédéric Jouault
- *
- */
-public class TCSBuilderCT {
-
- public Object getTarget(CompositeTransformationTargetDefinition target, Map models) throws IOException {
- return ct.getTarget(target, models);
- }
-
- public CompositeTransformation ct;
- public CompositeTransformationSourceDefinition srckm3;
- public CompositeTransformationSourceDefinition srcannotation;
- public CompositeTransformationSourceDefinition srctcs;
- public CompositeTransformationSourceDefinition srcacg;
- public CompositeTransformationTargetDefinition tgttcsproblem;
-// public CompositeTransformationTargetDefinition tgttcssyntaxproblem;
- public CompositeTransformationTargetDefinition tgtkm3problem;
- public CompositeTransformationTargetDefinition tgtacgproblem;
- public CompositeTransformationTargetDefinition tgtasm;
- public CompositeTransformationTargetDefinition tgttcs;
-// public CompositeTransformationTargetDefinition tgtkm3syntaxproblem;
- public CompositeTransformationTargetDefinition tgteditor;
- public CompositeTransformationTargetDefinition tgtoutline;
- public CompositeTransformationTargetDefinition tgtgrammar;
- public CompositeTransformationTargetDefinition tgtecore;
- public CompositeTransformationTargetDefinition tgtecorePlusAnnotations;
-
- public TCSBuilderCT(ResourceLocator rl) throws IOException {
- AtlModelHandler amh = AtlModelHandler.getDefault(AtlModelHandler.AMH_EMF);
-
- this.rl = rl;
- Metamodel km3mm = getMetamodel("KM3", "-2005");
- Metamodel tcsmm = getMetamodel("TCS");
- Metamodel annotationmm = getMetamodel("Annotation");
- Metamodel refiningTracemm = new Metamodel("RefiningTrace", rl.getResource("ATL/RuntimeSupport/RefiningTrace.ecore"));
-
- Metamodel editormm = getMetamodel("Editor");
- Metamodel outlinemm = getMetamodel("Outline");
-
- Metamodel problemmm = getMetamodel("Problem");
- Metamodel antlrmm = getMetamodel("ANTLR");
-
- Metamodel acgmm = getMetamodel("ACG");
-
- Metamodel ecoremm = new Metamodel("Ecore", amh.getMof());
-
- // TCS Injection
- Transformation tcsinjection = new TCSInjection(problemmm);
- SourceDefinition tcsinjectionSrc = new SourceDefinition(tcsinjection);
- TargetDefinition tcsinjectionTgt = new ModelTargetDefinition(tcsinjection, tcsmm);
-// TargetDefinition tcsinjectionProblemTgt = new ModelTargetDefinition(tcsinjection, problemmm);
-
- // TCS2Problem
- ATLTransformation tcs2problem = new ATLTransformation(rl.getResource("TCS/WFR/TCS2Problem.asm").asTextSource());
- tcs2problem.addLibrary("KM3Helpers", rl.getResource("KM3-2005/Helpers/KM3Helpers.asm").asTextSource());
- SourceDefinition tcs2problemTCSSrc = new ATLSourceDefinition(tcs2problem, "IN", "TCS", tcsmm);
- SourceDefinition tcs2problemKM3Src = new ATLSourceDefinition(tcs2problem, "MM", "KM3", km3mm);
- TargetDefinition tcs2problemTgt = new ATLTargetDefinition(tcs2problem, "OUT", "Problem", problemmm);
-
- // TCS2Editor
- Transformation tcs2editor = new ATLTransformation(rl.getResource("Editor/Compiler/TCS2Editor.asm").asTextSource());
- SourceDefinition tcs2editorSrc = new ATLSourceDefinition(tcs2editor, "IN", "TCS", tcsmm);
- TargetDefinition tcs2editorTgt = new ATLTargetDefinition(tcs2editor, "OUT", "Editor", editormm);
-
- // KM3 Injection
- Transformation km3injection = new TCSInjection(problemmm);
- SourceDefinition km3injectionSrc = new SourceDefinition(km3injection);
- TargetDefinition km3injectionTgt = new ModelTargetDefinition(km3injection, km3mm);
-// TargetDefinition km3injectionProblemTgt = new ModelTargetDefinition(km3injection, problemmm);
-
- // KM32Problem
- ATLTransformation km32problem = new ATLTransformation(rl.getResource("KM3-2005/WFR/KM32Problem.asm").asTextSource());
- SourceDefinition km32problemSrc = new ATLSourceDefinition(km32problem, "IN", "KM3", km3mm);
- TargetDefinition km32problemTgt = new ATLTargetDefinition(km32problem, "OUT", "Problem", problemmm);
-
- // KM32Outline
- ATLTransformation km32outline = new ATLTransformation(rl.getResource("Outline/Compiler/KM32Outline.asm").asTextSource());
- km32outline.addLibrary("KM3Helpers", rl.getResource("KM3-2005/Helpers/KM3Helpers.asm").asTextSource());
- SourceDefinition km32outlineSrc = new ATLSourceDefinition(km32outline, "IN", "KM3", km3mm);
- TargetDefinition km32outlineTgt = new ATLTargetDefinition(km32outline, "OUT", "Outline", outlinemm);
-
- // ACG Injection
- Transformation acginjection = new TCSInjection(problemmm);
- SourceDefinition acginjectionSrc = new SourceDefinition(acginjection);
- TargetDefinition acginjectionTgt = new ModelTargetDefinition(acginjection, acgmm);
-// TargetDefinition acginjectionProblemTgt = new ModelTargetDefinition(acginjection, problemmm);
-
- // ACGCompilation
- ACGTransformation acgCompilation = new ACGTransformation(rl.getResource("ACG/Compiler/ACG.asm").asTextSource());
- SourceDefinition acgCompilationSrc = new ATLSourceDefinition(acgCompilation, "IN", "ACG", acgmm);
- TargetDefinition acgCompilationTgt = new TargetDefinition(acgCompilation);
-
- // KM32Ecore
- ATLTransformation km32ecore = new ATLTransformation(rl.getResource("KM3-2005/Compiler/KM32Ecore.asm").asTextSource());
-// km32ecore.addLibrary("KM3Helpers", rl.getResource("KM3-2005/Helpers/KM3Helpers.asm"));
- SourceDefinition km32ecoreSrc = new ATLSourceDefinition(km32ecore, "IN", "KM3", km3mm);
- TargetDefinition km32ecoreTgt = new ATLTargetDefinition(km32ecore, "OUT", "Ecore", ecoremm);
-
- // Annotation Injection
- Transformation annotationinjection = new TCSInjection(problemmm);
- SourceDefinition annotationinjectionSrc = new SourceDefinition(annotationinjection);
- TargetDefinition annotationinjectionTgt = new ModelTargetDefinition(annotationinjection, annotationmm);
-// TargetDefinition annotationinjectionProblemTgt = new ModelTargetDefinition(annotationinjection, problemmm);
-
- // ApplyAnnotations2Ecore
- ATLTransformation applyAnnotations2ecore = new ATLTransformation(rl.getResource("Annotation/Compiler/ApplyAnnotations2Ecore.asm").asTextSource());
- SourceDefinition applyAnnotations2ecoreSrc = new ATLSourceDefinition(applyAnnotations2ecore, "IN", "Ecore", ecoremm);
- SourceDefinition applyAnnotations2ecoreAnnotationSrc = new ATLSourceDefinition(applyAnnotations2ecore, "annotations", "Annotation", annotationmm);
- TargetDefinition applyAnnotations2ecoreTgt = new ATLRefinedTargetDefinition(applyAnnotations2ecore, applyAnnotations2ecoreSrc);
- TargetDefinition applyAnnotations2ecoreRefiningTraceTgt = new ATLTargetDefinition(applyAnnotations2ecore, "refiningTrace", "RefiningTrace", refiningTracemm);
-
- // TCS2ANTLR
- ATLTransformation tcs2antlr = new ATLTransformation(rl.getResource("TCS/Compiler/TCS2ANTLR.asm").asTextSource());
- tcs2antlr.addLibrary("TCS2ANTLRActions", rl.getResource("TCS/Compiler/TCS2ANTLRv3Actions.asm").asTextSource());
- tcs2antlr.addLibrary("KM3Helpers", rl.getResource("KM3-2005/Helpers/KM3Helpers.asm").asTextSource());
- tcs2antlr.addLibrary("strings", rl.getResource("libs/strings.asm").asTextSource());
- SourceDefinition tcs2antlrTCSSrc = new ATLSourceDefinition(tcs2antlr, "IN", "TCS", tcsmm);
- SourceDefinition tcs2antlrKM3Src = new ATLSourceDefinition(tcs2antlr, "MM", "KM3", km3mm);
- TargetDefinition tcs2antlrTgt = new ATLTargetDefinition(tcs2antlr, "OUT", "ANTLR", antlrmm);
-
- // ANTLR Extraction
- // not asEMFURI() because then this model is somehow not disposed off before its metamodel is
- Transformation antlrextraction = new TCSExtraction(tcsmm, rl.getResource("ANTLR/Syntax/ANTLR-TCS.xmi").asURL());
- SourceDefinition antlrextractionSrc = new ModelSourceDefinition(antlrextraction, antlrmm);
- TargetDefinition antlrextractionTgt = new TargetDefinition(antlrextraction);
- antlrextraction.setOption("identEsc", "");
-
-
- ct = new CompositeTransformation();
- srckm3 = new CompositeTransformationSourceDefinition(ct, km3mm);
- srcannotation = new CompositeTransformationSourceDefinition(ct, annotationmm);
- srctcs = new CompositeTransformationSourceDefinition(ct, tcsmm);
- srcacg = new CompositeTransformationSourceDefinition(ct, acgmm);
- tgttcsproblem = new CompositeTransformationTargetDefinition(ct, problemmm);
- tgtkm3problem = new CompositeTransformationTargetDefinition(ct, problemmm);
- tgtacgproblem = new CompositeTransformationTargetDefinition(ct, problemmm);
- tgtasm = new CompositeTransformationTargetDefinition(ct, null);
- tgteditor = new CompositeTransformationTargetDefinition(ct, editormm);
- tgtoutline = new CompositeTransformationTargetDefinition(ct, outlinemm);
- tgtgrammar = new CompositeTransformationTargetDefinition(ct, antlrmm);
- tgtecore = new CompositeTransformationTargetDefinition(ct, ecoremm);
- tgtecorePlusAnnotations = new CompositeTransformationTargetDefinition(ct, ecoremm);
- tgttcs = new CompositeTransformationTargetDefinition(ct, tcsmm);
-
- // TCS Injection Usage
- TransformationUsage tcsinjectionUsage = new TransformationUsage(tcsinjection);
-// Source tcsinjectionUsageSrc =
- new Source(tcsinjectionUsage, tcsinjectionSrc, srctcs);
- Target tcsinjectionUsageTgt = new Target(tcsinjectionUsage, tcsinjectionTgt);
-// Target tcsinjectionUsageProblemTgt = new Target(tcsinjectionUsage, tcsinjectionProblemTgt);
-
- tgttcs.setSource(tcsinjectionUsageTgt);
-
-// tgttcssyntaxproblem.setSource(tcsinjectionUsageProblemTgt);
-
- // TCS2Editor Usage
- TransformationUsage tcs2editorUsage = new TransformationUsage(tcs2editor);
-// Source tcs2editorUsageSrc =
- new Source(tcs2editorUsage, tcs2editorSrc, tcsinjectionUsageTgt);
- Target tcs2editorUsageTgt = new Target(tcs2editorUsage, tcs2editorTgt);
-
- tgteditor.setSource(tcs2editorUsageTgt);
-
- // KM3 Injection Usage
- TransformationUsage km3injectionUsage = new TransformationUsage(km3injection);
-// Source km3injectionUsageSrc =
- new Source(km3injectionUsage, km3injectionSrc, srckm3);
- Target km3injectionUsageTgt = new Target(km3injectionUsage, km3injectionTgt);
-// Target km3injectionUsageProblemTgt = new Target(km3injectionUsage, km3injectionProblemTgt);
-
-// tgtkm3syntaxproblem.setSource(km3injectionUsageProblemTgt);
-
- // Annotation Injection Usage
- TransformationUsage annotationinjectionUsage = new TransformationUsage(annotationinjection);
-// Source annotation =
- new Source(annotationinjectionUsage, annotationinjectionSrc, srcannotation);
- Target annotationinjectionUsageTgt = new Target(annotationinjectionUsage, annotationinjectionTgt);
-
- // TCS2Problem Usage
- TransformationUsage tcs2problemUsage = new TransformationUsage(tcs2problem);
-// Source tcs2problemUsageTCSSrc =
- new Source(tcs2problemUsage, tcs2problemTCSSrc, tcsinjectionUsageTgt);
-// Source tcs2problemUsageKM3Src =
- new Source(tcs2problemUsage, tcs2problemKM3Src, km3injectionUsageTgt);
- Target tcs2problemUsageTgt = new Target(tcs2problemUsage, tcs2problemTgt);
-
- tgttcsproblem.setSource(tcs2problemUsageTgt);
-
- // KM32Problem Usage
- TransformationUsage km32problemUsage = new TransformationUsage(km32problem);
-// Source km32problemUsageSrc =
- new Source(km32problemUsage, km32problemSrc, km3injectionUsageTgt);
- Target km32problemUsageTgt = new Target(km32problemUsage, km32problemTgt);
-
- tgtkm3problem.setSource(km32problemUsageTgt);
-
- // KM32Outline Usage
- TransformationUsage km32outlineUsage = new TransformationUsage(km32outline);
-// Source km32outlineUsageSrc =
- new Source(km32outlineUsage, km32outlineSrc, km3injectionUsageTgt);
- Target km32outlineUsageTgt = new Target(km32outlineUsage, km32outlineTgt);
-
- tgtoutline.setSource(km32outlineUsageTgt);
-
- // ACG Injection Usage
- TransformationUsage acginjectionUsage = new TransformationUsage(acginjection);
-// Source acginjectionUsageSrc =
- new Source(acginjectionUsage, acginjectionSrc, srcacg);
- Target acginjectionUsageTgt = new Target(acginjectionUsage, acginjectionTgt);
-
- // ACG Compilation Usage
- TransformationUsage acgCompilationUsage = new TransformationUsage(acgCompilation);
-// Source acgCompilationUsageSrc =
- new Source(acgCompilationUsage, acgCompilationSrc, acginjectionUsageTgt);
- Target acgCompilationUsageTgt = new Target(acgCompilationUsage, acgCompilationTgt);
-
- tgtasm.setSource(acgCompilationUsageTgt);
-
- // KM32Ecore Usage
- TransformationUsage km32ecoreUsage = new TransformationUsage(km32ecore);
-// Source km32ecoreUsageSrc =
- new Source(km32ecoreUsage, km32ecoreSrc, km3injectionUsageTgt);
- Target km32ecoreUsageTgt = new Target(km32ecoreUsage, km32ecoreTgt);
-
- tgtecore.setSource(km32ecoreUsageTgt);
-
- // ApplyAnnotations2Ecore Usage
- TransformationUsage applyAnnotations2ecoreUsage = new TransformationUsage(applyAnnotations2ecore);
-// Source applyAnnotations2ecoreUsageSrc =
- new Source(applyAnnotations2ecoreUsage, applyAnnotations2ecoreSrc, km32ecoreUsageTgt);
-// Source applyAnnotations2ecoreUsageAnnotationSrc =
- new Source(applyAnnotations2ecoreUsage, applyAnnotations2ecoreAnnotationSrc, annotationinjectionUsageTgt);
- Target applyAnnotations2ecoreUsageTgt = new Target(applyAnnotations2ecoreUsage, applyAnnotations2ecoreTgt);
-// Target applyAnnotations2ecoreUsageRefiningTraceTgt =
- new Target(applyAnnotations2ecoreUsage, applyAnnotations2ecoreRefiningTraceTgt);
-
- tgtecorePlusAnnotations.setSource(applyAnnotations2ecoreUsageTgt);
-
- // TCS2ANTLR Usage
- TransformationUsage tcs2antlrUsage = new TransformationUsage(tcs2antlr);
-// Source tcs2antlrUsageTCSSrc =
- new Source(tcs2antlrUsage, tcs2antlrTCSSrc, tcsinjectionUsageTgt);
-// Source tcs2antlrUsageKM3Src =
- new Source(tcs2antlrUsage, tcs2antlrKM3Src, km3injectionUsageTgt);
- Target tcs2antlrUsageTgt = new Target(tcs2antlrUsage, tcs2antlrTgt);
-
- // ANTLR Extraction Usage
- TransformationUsage antlrextractionUsage = new TransformationUsage(antlrextraction);
-// Source antlrextractionUsageSrc =
- new Source(antlrextractionUsage, antlrextractionSrc, tcs2antlrUsageTgt);
- Target antlrextractionUsageTgt = new Target(antlrextractionUsage, antlrextractionTgt);
-
- tgtgrammar.setSource(antlrextractionUsageTgt);
- }
-
- private ResourceLocator rl;
-
- protected Metamodel getMetamodel(String name) throws IOException {
- return getMetamodel(name, "");
- }
-
- protected Metamodel getMetamodel(String name, String folderSuffix) throws IOException {
- return new Metamodel(name, rl.getResource(name + folderSuffix + "/Metamodel/" + name + ".ecore"));
- }
-}
+/**
+ * Copyright (c) 2007, 2008 INRIA.
+ * 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:
+ * INRIA - initial API and implementation
+ *
+ * $Id: TCSBuilderCT.java,v 1.7 2008/06/25 13:02:47 fjouault Exp $
+ */
+package org.eclipse.gmt.tcs.builder;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.eclipse.gmt.tcs.builder.ct.CompositeTransformation;
+import org.eclipse.gmt.tcs.builder.ct.Metamodel;
+import org.eclipse.gmt.tcs.builder.ct.ResourceLocator;
+import org.eclipse.gmt.tcs.builder.ct.definition.ACGTransformation;
+import org.eclipse.gmt.tcs.builder.ct.definition.ATLRefinedTargetDefinition;
+import org.eclipse.gmt.tcs.builder.ct.definition.ATLSourceDefinition;
+import org.eclipse.gmt.tcs.builder.ct.definition.ATLTargetDefinition;
+import org.eclipse.gmt.tcs.builder.ct.definition.ATLTransformation;
+import org.eclipse.gmt.tcs.builder.ct.definition.CompositeTransformationSourceDefinition;
+import org.eclipse.gmt.tcs.builder.ct.definition.CompositeTransformationTargetDefinition;
+import org.eclipse.gmt.tcs.builder.ct.definition.ModelSourceDefinition;
+import org.eclipse.gmt.tcs.builder.ct.definition.ModelTargetDefinition;
+import org.eclipse.gmt.tcs.builder.ct.definition.SourceDefinition;
+import org.eclipse.gmt.tcs.builder.ct.definition.TCSExtraction;
+import org.eclipse.gmt.tcs.builder.ct.definition.TCSInjection;
+import org.eclipse.gmt.tcs.builder.ct.definition.TargetDefinition;
+import org.eclipse.gmt.tcs.builder.ct.definition.Transformation;
+import org.eclipse.gmt.tcs.builder.ct.usage.Source;
+import org.eclipse.gmt.tcs.builder.ct.usage.Target;
+import org.eclipse.gmt.tcs.builder.ct.usage.TransformationUsage;
+import org.eclipse.m2m.atl.core.ATLCoreException;
+import org.eclipse.m2m.atl.core.IExtractor;
+import org.eclipse.m2m.atl.core.ModelFactory;
+import org.eclipse.m2m.atl.core.emf.EMFModelFactory;
+import org.eclipse.m2m.atl.core.service.CoreService;
+
+/**
+ *
+ * @author Fr�d�ric Jouault
+ *
+ */
+public class TCSBuilderCT {
+
+ public Object getTarget(CompositeTransformationTargetDefinition target, Map models) throws IOException {
+ return ct.getTarget(target, models);
+ }
+
+ public CompositeTransformation ct;
+ public CompositeTransformationSourceDefinition srckm3;
+ public CompositeTransformationSourceDefinition srcannotation;
+ public CompositeTransformationSourceDefinition srctcs;
+ public CompositeTransformationSourceDefinition srcacg;
+ public CompositeTransformationTargetDefinition tgttcsproblem;
+// public CompositeTransformationTargetDefinition tgttcssyntaxproblem;
+ public CompositeTransformationTargetDefinition tgtkm3problem;
+ public CompositeTransformationTargetDefinition tgtacgproblem;
+ public CompositeTransformationTargetDefinition tgtasm;
+ public CompositeTransformationTargetDefinition tgttcs;
+// public CompositeTransformationTargetDefinition tgtkm3syntaxproblem;
+ public CompositeTransformationTargetDefinition tgteditor;
+ public CompositeTransformationTargetDefinition tgtoutline;
+ public CompositeTransformationTargetDefinition tgtgrammar;
+ public CompositeTransformationTargetDefinition tgtecore;
+ public CompositeTransformationTargetDefinition tgtecorePlusAnnotations;
+
+ public TCSBuilderCT(ResourceLocator rl) throws IOException, ATLCoreException {
+ ModelFactory mf = CoreService.getModelFactory(EMFModelFactory.MODEL_FACTORY_NAME);
+
+ this.rl = rl;
+ Metamodel km3mm = getMetamodel("KM3", "-2005");
+ Metamodel tcsmm = getMetamodel("TCS");
+ Metamodel annotationmm = getMetamodel("Annotation");
+ Metamodel refiningTracemm = new Metamodel("RefiningTrace", rl.getResource("ATL/RuntimeSupport/RefiningTrace.ecore"));
+
+ Metamodel editormm = getMetamodel("Editor");
+ Metamodel outlinemm = getMetamodel("Outline");
+
+ Metamodel problemmm = getMetamodel("Problem");
+ Metamodel antlrmm = getMetamodel("ANTLR");
+
+ Metamodel acgmm = getMetamodel("ACG");
+
+ Metamodel ecoremm = new Metamodel("Ecore", mf.getMetametamodel());
+
+ // TCS Injection
+ Transformation tcsinjection = new TCSInjection(problemmm);
+ SourceDefinition tcsinjectionSrc = new SourceDefinition(tcsinjection);
+ TargetDefinition tcsinjectionTgt = new ModelTargetDefinition(tcsinjection, tcsmm);
+
+ // TCS2Problem
+ ATLTransformation tcs2problem = new ATLTransformation(rl.getResource("TCS/WFR/TCS2Problem.asm").asTextSource());
+ tcs2problem.addLibrary("KM3Helpers", rl.getResource("KM3-2005/Helpers/KM3Helpers.asm").asTextSource());
+ SourceDefinition tcs2problemTCSSrc = new ATLSourceDefinition(tcs2problem, "IN", "TCS", tcsmm);
+ SourceDefinition tcs2problemKM3Src = new ATLSourceDefinition(tcs2problem, "MM", "KM3", km3mm);
+ TargetDefinition tcs2problemTgt = new ATLTargetDefinition(tcs2problem, "OUT", "Problem", problemmm);
+
+ // TCS2Editor
+ Transformation tcs2editor = new ATLTransformation(rl.getResource("Editor/Compiler/TCS2Editor.asm").asTextSource());
+ SourceDefinition tcs2editorSrc = new ATLSourceDefinition(tcs2editor, "IN", "TCS", tcsmm);
+ TargetDefinition tcs2editorTgt = new ATLTargetDefinition(tcs2editor, "OUT", "Editor", editormm);
+
+ // KM3 Injection
+ Transformation km3injection = new TCSInjection(problemmm);
+ SourceDefinition km3injectionSrc = new SourceDefinition(km3injection);
+ TargetDefinition km3injectionTgt = new ModelTargetDefinition(km3injection, km3mm);
+
+ // KM32Problem
+ ATLTransformation km32problem = new ATLTransformation(rl.getResource("KM3-2005/WFR/KM32Problem.asm").asTextSource());
+ SourceDefinition km32problemSrc = new ATLSourceDefinition(km32problem, "IN", "KM3", km3mm);
+ TargetDefinition km32problemTgt = new ATLTargetDefinition(km32problem, "OUT", "Problem", problemmm);
+
+ // KM32Outline
+ ATLTransformation km32outline = new ATLTransformation(rl.getResource("Outline/Compiler/KM32Outline.asm").asTextSource());
+ km32outline.addLibrary("KM3Helpers", rl.getResource("KM3-2005/Helpers/KM3Helpers.asm").asTextSource());
+ SourceDefinition km32outlineSrc = new ATLSourceDefinition(km32outline, "IN", "KM3", km3mm);
+ TargetDefinition km32outlineTgt = new ATLTargetDefinition(km32outline, "OUT", "Outline", outlinemm);
+
+ // ACG Injection
+ Transformation acginjection = new TCSInjection(problemmm);
+ SourceDefinition acginjectionSrc = new SourceDefinition(acginjection);
+ TargetDefinition acginjectionTgt = new ModelTargetDefinition(acginjection, acgmm);
+
+ // ACGCompilation
+ ACGTransformation acgCompilation = new ACGTransformation(rl.getResource("ACG/Compiler/ACG.asm").asTextSource());
+ SourceDefinition acgCompilationSrc = new ATLSourceDefinition(acgCompilation, "IN", "ACG", acgmm);
+ TargetDefinition acgCompilationTgt = new TargetDefinition(acgCompilation);
+
+ // KM32Ecore
+ ATLTransformation km32ecore = new ATLTransformation(rl.getResource("KM3-2005/Compiler/KM32Ecore.asm").asTextSource());
+ SourceDefinition km32ecoreSrc = new ATLSourceDefinition(km32ecore, "IN", "KM3", km3mm);
+ TargetDefinition km32ecoreTgt = new ATLTargetDefinition(km32ecore, "OUT", "Ecore", ecoremm);
+
+ // Annotation Injection
+ Transformation annotationinjection = new TCSInjection(problemmm);
+ SourceDefinition annotationinjectionSrc = new SourceDefinition(annotationinjection);
+ TargetDefinition annotationinjectionTgt = new ModelTargetDefinition(annotationinjection, annotationmm);
+
+ // ApplyAnnotations2Ecore
+ ATLTransformation applyAnnotations2ecore = new ATLTransformation(rl.getResource("Annotation/Compiler/ApplyAnnotations2Ecore.asm").asTextSource());
+ SourceDefinition applyAnnotations2ecoreSrc = new ATLSourceDefinition(applyAnnotations2ecore, "IN", "Ecore", ecoremm);
+ SourceDefinition applyAnnotations2ecoreAnnotationSrc = new ATLSourceDefinition(applyAnnotations2ecore, "annotations", "Annotation", annotationmm);
+ TargetDefinition applyAnnotations2ecoreTgt = new ATLRefinedTargetDefinition(applyAnnotations2ecore, applyAnnotations2ecoreSrc);
+ TargetDefinition applyAnnotations2ecoreRefiningTraceTgt = new ATLTargetDefinition(applyAnnotations2ecore, "refiningTrace", "RefiningTrace", refiningTracemm);
+
+ // TCS2ANTLR
+ ATLTransformation tcs2antlr = new ATLTransformation(rl.getResource("TCS/Compiler/TCS2ANTLR.asm").asTextSource());
+ tcs2antlr.addLibrary("TCS2ANTLRActions", rl.getResource("TCS/Compiler/TCS2ANTLRv3Actions.asm").asTextSource());
+ tcs2antlr.addLibrary("KM3Helpers", rl.getResource("KM3-2005/Helpers/KM3Helpers.asm").asTextSource());
+ tcs2antlr.addLibrary("strings", rl.getResource("libs/strings.asm").asTextSource());
+ SourceDefinition tcs2antlrTCSSrc = new ATLSourceDefinition(tcs2antlr, "IN", "TCS", tcsmm);
+ SourceDefinition tcs2antlrKM3Src = new ATLSourceDefinition(tcs2antlr, "MM", "KM3", km3mm);
+ TargetDefinition tcs2antlrTgt = new ATLTargetDefinition(tcs2antlr, "OUT", "ANTLR", antlrmm);
+
+ // ANTLR Extraction
+ // not asEMFURI() because then this model is somehow not disposed off before its metamodel is
+ Transformation antlrextraction = new TCSExtraction(tcsmm, rl.getResource("ANTLR/Syntax/ANTLR-TCS.xmi").asURL());
+ SourceDefinition antlrextractionSrc = new ModelSourceDefinition(antlrextraction, antlrmm);
+ TargetDefinition antlrextractionTgt = new TargetDefinition(antlrextraction);
+ antlrextraction.setOption("identEsc", "");
+
+
+ ct = new CompositeTransformation();
+ srckm3 = new CompositeTransformationSourceDefinition(ct, km3mm);
+ srcannotation = new CompositeTransformationSourceDefinition(ct, annotationmm);
+ srctcs = new CompositeTransformationSourceDefinition(ct, tcsmm);
+ srcacg = new CompositeTransformationSourceDefinition(ct, acgmm);
+ tgttcsproblem = new CompositeTransformationTargetDefinition(ct, problemmm);
+ tgtkm3problem = new CompositeTransformationTargetDefinition(ct, problemmm);
+ tgtacgproblem = new CompositeTransformationTargetDefinition(ct, problemmm);
+ tgtasm = new CompositeTransformationTargetDefinition(ct, null);
+ tgteditor = new CompositeTransformationTargetDefinition(ct, editormm);
+ tgtoutline = new CompositeTransformationTargetDefinition(ct, outlinemm);
+ tgtgrammar = new CompositeTransformationTargetDefinition(ct, antlrmm);
+ tgtecore = new CompositeTransformationTargetDefinition(ct, ecoremm);
+ tgtecorePlusAnnotations = new CompositeTransformationTargetDefinition(ct, ecoremm);
+ tgttcs = new CompositeTransformationTargetDefinition(ct, tcsmm);
+
+ // TCS Injection Usage
+ TransformationUsage tcsinjectionUsage = new TransformationUsage(tcsinjection);
+ new Source(tcsinjectionUsage, tcsinjectionSrc, srctcs);
+ Target tcsinjectionUsageTgt = new Target(tcsinjectionUsage, tcsinjectionTgt);
+
+ tgttcs.setSource(tcsinjectionUsageTgt);
+
+ // TCS2Editor Usage
+ TransformationUsage tcs2editorUsage = new TransformationUsage(tcs2editor);
+ new Source(tcs2editorUsage, tcs2editorSrc, tcsinjectionUsageTgt);
+ Target tcs2editorUsageTgt = new Target(tcs2editorUsage, tcs2editorTgt);
+
+ tgteditor.setSource(tcs2editorUsageTgt);
+
+ // KM3 Injection Usage
+ TransformationUsage km3injectionUsage = new TransformationUsage(km3injection);
+ new Source(km3injectionUsage, km3injectionSrc, srckm3);
+ Target km3injectionUsageTgt = new Target(km3injectionUsage, km3injectionTgt);
+
+ // Annotation Injection Usage
+ TransformationUsage annotationinjectionUsage = new TransformationUsage(annotationinjection);
+ new Source(annotationinjectionUsage, annotationinjectionSrc, srcannotation);
+ Target annotationinjectionUsageTgt = new Target(annotationinjectionUsage, annotationinjectionTgt);
+
+ // TCS2Problem Usage
+ TransformationUsage tcs2problemUsage = new TransformationUsage(tcs2problem);
+ new Source(tcs2problemUsage, tcs2problemTCSSrc, tcsinjectionUsageTgt);
+ new Source(tcs2problemUsage, tcs2problemKM3Src, km3injectionUsageTgt);
+ Target tcs2problemUsageTgt = new Target(tcs2problemUsage, tcs2problemTgt);
+
+ tgttcsproblem.setSource(tcs2problemUsageTgt);
+
+ // KM32Problem Usage
+ TransformationUsage km32problemUsage = new TransformationUsage(km32problem);
+ new Source(km32problemUsage, km32problemSrc, km3injectionUsageTgt);
+ Target km32problemUsageTgt = new Target(km32problemUsage, km32problemTgt);
+
+ tgtkm3problem.setSource(km32problemUsageTgt);
+
+ // KM32Outline Usage
+ TransformationUsage km32outlineUsage = new TransformationUsage(km32outline);
+ new Source(km32outlineUsage, km32outlineSrc, km3injectionUsageTgt);
+ Target km32outlineUsageTgt = new Target(km32outlineUsage, km32outlineTgt);
+
+ tgtoutline.setSource(km32outlineUsageTgt);
+
+ // ACG Injection Usage
+ TransformationUsage acginjectionUsage = new TransformationUsage(acginjection);
+ new Source(acginjectionUsage, acginjectionSrc, srcacg);
+ Target acginjectionUsageTgt = new Target(acginjectionUsage, acginjectionTgt);
+
+ // ACG Compilation Usage
+ TransformationUsage acgCompilationUsage = new TransformationUsage(acgCompilation);
+ new Source(acgCompilationUsage, acgCompilationSrc, acginjectionUsageTgt);
+ Target acgCompilationUsageTgt = new Target(acgCompilationUsage, acgCompilationTgt);
+
+ tgtasm.setSource(acgCompilationUsageTgt);
+
+ // KM32Ecore Usage
+ TransformationUsage km32ecoreUsage = new TransformationUsage(km32ecore);
+ new Source(km32ecoreUsage, km32ecoreSrc, km3injectionUsageTgt);
+ Target km32ecoreUsageTgt = new Target(km32ecoreUsage, km32ecoreTgt);
+
+ tgtecore.setSource(km32ecoreUsageTgt);
+
+ // ApplyAnnotations2Ecore Usage
+ TransformationUsage applyAnnotations2ecoreUsage = new TransformationUsage(applyAnnotations2ecore);
+ new Source(applyAnnotations2ecoreUsage, applyAnnotations2ecoreSrc, km32ecoreUsageTgt);
+ new Source(applyAnnotations2ecoreUsage, applyAnnotations2ecoreAnnotationSrc, annotationinjectionUsageTgt);
+ Target applyAnnotations2ecoreUsageTgt = new Target(applyAnnotations2ecoreUsage, applyAnnotations2ecoreTgt);
+ new Target(applyAnnotations2ecoreUsage, applyAnnotations2ecoreRefiningTraceTgt);
+
+ tgtecorePlusAnnotations.setSource(applyAnnotations2ecoreUsageTgt);
+
+ // TCS2ANTLR Usage
+ TransformationUsage tcs2antlrUsage = new TransformationUsage(tcs2antlr);
+ new Source(tcs2antlrUsage, tcs2antlrTCSSrc, tcsinjectionUsageTgt);
+ new Source(tcs2antlrUsage, tcs2antlrKM3Src, km3injectionUsageTgt);
+ Target tcs2antlrUsageTgt = new Target(tcs2antlrUsage, tcs2antlrTgt);
+
+ // ANTLR Extraction Usage
+ TransformationUsage antlrextractionUsage = new TransformationUsage(antlrextraction);
+ new Source(antlrextractionUsage, antlrextractionSrc, tcs2antlrUsageTgt);
+ Target antlrextractionUsageTgt = new Target(antlrextractionUsage, antlrextractionTgt);
+
+ tgtgrammar.setSource(antlrextractionUsageTgt);
+ }
+
+ private ResourceLocator rl;
+
+ protected Metamodel getMetamodel(String name) throws IOException, ATLCoreException {
+ return getMetamodel(name, "");
+ }
+
+ protected Metamodel getMetamodel(String name, String folderSuffix) throws IOException, ATLCoreException {
+ return new Metamodel(name, rl.getResource(name + folderSuffix + "/Metamodel/" + name + ".ecore"));
+ }
+}
diff --git a/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ct/Metamodel.java b/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ct/Metamodel.java
index 7c77dd8..9a9fe78 100644
--- a/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ct/Metamodel.java
+++ b/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ct/Metamodel.java
@@ -1,74 +1,84 @@
-/**
- * Copyright (c) 2007, 2008 INRIA.
- * 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:
- * INRIA - initial API and implementation
- *
- * $Id: Metamodel.java,v 1.5 2008/06/25 13:01:57 fjouault Exp $
- */
-package org.eclipse.gmt.tcs.builder.ct;
-
-import java.io.IOException;
-
-import org.eclipse.gmt.tcs.builder.ct.definition.ATLTransformation;
-import org.eclipse.m2m.atl.dsls.Resource;
-import org.eclipse.m2m.atl.dsls.textsource.TextSource;
-import org.eclipse.m2m.atl.engine.AtlEMFModelHandler;
-import org.eclipse.m2m.atl.engine.AtlModelHandler;
-import org.eclipse.m2m.atl.engine.vm.nativelib.ASMModel;
-
-/**
- *
- * @author Frédéric Jouault
- *
- */
-public class Metamodel {
-
- public String name;
- public ASMModel metamodel;
- public ATLTransformation checker = null;
- public TextSource source = null;
-
- public Metamodel(String name, String nsURI) throws IOException {
- this.name = name;
-
- AtlEMFModelHandler amh = (AtlEMFModelHandler)AtlModelHandler.getDefault(AtlModelHandler.AMH_EMF);
-
- metamodel = amh.loadModel(name, amh.getMof(), "uri:" + nsURI);
- }
-
- public Metamodel(String name, ASMModel metamodel) throws IOException {
- this.name = name;
- this.metamodel = metamodel;
- }
-
- public Metamodel(String name, TextSource metamodelTS) throws IOException {
- this.name = name;
-
- AtlModelHandler amh = AtlModelHandler.getDefault(AtlModelHandler.AMH_EMF);
-
- metamodel = amh.loadModel(name, amh.getMof(), metamodelTS.openStream());
- source = metamodelTS;
- }
-
- public Metamodel(String name, Resource metamodelResource) throws IOException {
- this.name = name;
-
- AtlEMFModelHandler amh = (AtlEMFModelHandler)AtlModelHandler.getDefault(AtlModelHandler.AMH_EMF);
-
- metamodel = amh.loadModel(name, amh.getMof(), metamodelResource.asEMFURI());
- source = metamodelResource.asTextSource();
- }
-
- public String getName() {
- return name;
- }
-
- public ASMModel getMetamodel() {
- return metamodel;
- }
-}
+/**
+ * Copyright (c) 2007, 2008 INRIA.
+ * 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:
+ * INRIA - initial API and implementation
+ *
+ * $Id: Metamodel.java,v 1.5 2008/06/25 13:01:57 fjouault Exp $
+ */
+package org.eclipse.gmt.tcs.builder.ct;
+
+import java.io.IOException;
+import java.util.Collections;
+
+import org.eclipse.gmt.tcs.builder.ct.definition.ATLTransformation;
+import org.eclipse.m2m.atl.core.ATLCoreException;
+import org.eclipse.m2m.atl.core.IInjector;
+import org.eclipse.m2m.atl.core.IReferenceModel;
+import org.eclipse.m2m.atl.core.ModelFactory;
+import org.eclipse.m2m.atl.core.emf.EMFModelFactory;
+import org.eclipse.m2m.atl.core.service.CoreService;
+import org.eclipse.m2m.atl.dsls.Resource;
+import org.eclipse.m2m.atl.dsls.textsource.TextSource;
+
+/**
+ *
+ * @author Fr�d�ric Jouault
+ *
+ */
+public class Metamodel {
+
+ public String name;
+ public IReferenceModel metamodel;
+ public ATLTransformation checker = null;
+ public TextSource source = null;
+
+ public Metamodel(String name, String nsURI) throws IOException, ATLCoreException {
+ this.name = name;
+
+ ModelFactory mf = CoreService.getModelFactory(EMFModelFactory.MODEL_FACTORY_NAME);
+ IInjector injector = CoreService.getInjector(mf.getDefaultInjectorName());
+
+ metamodel = mf.newReferenceModel();
+ injector.inject(metamodel, "uri:" + nsURI);
+ }
+
+ public Metamodel(String name, IReferenceModel metamodel) throws IOException {
+ this.name = name;
+ this.metamodel = metamodel;
+ }
+
+ public Metamodel(String name, TextSource metamodelTS) throws IOException, ATLCoreException {
+ this.name = name;
+
+ ModelFactory mf = CoreService.getModelFactory(EMFModelFactory.MODEL_FACTORY_NAME);
+ IInjector injector = CoreService.getInjector(mf.getDefaultInjectorName());
+
+ metamodel = mf.newReferenceModel();
+ injector.inject(metamodel, metamodelTS.openStream(), Collections.emptyMap());
+ source = metamodelTS;
+ }
+
+ public Metamodel(String name, Resource metamodelResource) throws IOException, ATLCoreException {
+ this.name = name;
+
+ ModelFactory mf = CoreService.getModelFactory(EMFModelFactory.MODEL_FACTORY_NAME);
+ IInjector injector = CoreService.getInjector(mf.getDefaultInjectorName());
+
+ metamodel = mf.newReferenceModel();
+ injector.inject(metamodel, "uri:" + metamodelResource.asEMFURI().toString());
+ source = metamodelResource.asTextSource();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public IReferenceModel getMetamodel() {
+ return metamodel;
+ }
+}
diff --git a/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ct/definition/ACGTransformation.java b/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ct/definition/ACGTransformation.java
index 7f2e390..55387e7 100644
--- a/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ct/definition/ACGTransformation.java
+++ b/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ct/definition/ACGTransformation.java
@@ -1,131 +1,139 @@
-/**
- * Copyright (c) 2008 INRIA.
- * 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:
- * INRIA - initial API and implementation
- *
- * $Id: ACGTransformation.java,v 1.2 2008/06/25 13:01:57 fjouault Exp $
- */
-package org.eclipse.gmt.tcs.builder.ct.definition;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.gmt.tcs.builder.ct.usage.Source;
-import org.eclipse.gmt.tcs.builder.ct.usage.Target;
-import org.eclipse.gmt.tcs.builder.ct.usage.TransformationUsage;
-import org.eclipse.m2m.atl.dsls.textsource.ByteArrayTextSource;
-import org.eclipse.m2m.atl.dsls.textsource.TextSource;
-import org.eclipse.m2m.atl.engine.ASMRetriever;
-import org.eclipse.m2m.atl.engine.AtlLauncher;
-import org.eclipse.m2m.atl.engine.AtlModelHandler;
-import org.eclipse.m2m.atl.engine.vm.ASM;
-import org.eclipse.m2m.atl.engine.vm.ASMXMLReader;
-import org.eclipse.m2m.atl.engine.vm.ASMXMLWriter;
-import org.eclipse.m2m.atl.engine.vm.Debugger;
-import org.eclipse.m2m.atl.engine.vm.SimpleDebugger;
-import org.eclipse.m2m.atl.engine.vm.nativelib.ASMModel;
-
-/**
- *
- * @author Frédéric Jouault
- *
- */
-public class ACGTransformation extends Transformation {
-
- public void execute(TransformationUsage usage, Map contextualModels) throws IOException {
- Map libraries = new HashMap(this.libraries);
- AtlModelHandler amh = AtlModelHandler.getDefault(AtlModelHandler.AMH_EMF);
-
- Map models = new HashMap();
- models.put("MOF", amh.getMof());
- for(Iterator i = usage.sources.iterator() ; i.hasNext() ; ) {
- Source source = (Source)i.next();
- ATLSourceDefinition sourceDef = (ATLSourceDefinition)source.definition;
- ASMModel sourceModel = (ASMModel)source.origin.get(contextualModels);
- ASMModel sourceMetamodel = sourceDef.getMetamodel().getMetamodel();
- sourceModel.setIsTarget(false);
- models.put(sourceDef.getMetamodelName(), sourceMetamodel);
- models.put(sourceDef.getModelName(), sourceModel);
- }
-/* for(Iterator i = usage.targets.iterator() ; i.hasNext() ; ) {
- Target target = (Target)i.next();
- ATLTargetDefinition targetDef = (ATLTargetDefinition)target.definition;
- ASMModel targetMetamodel = targetDef.getMetamodel().getMetamodel();
- models.put(targetDef.getMetamodelName(), targetMetamodel);
- ASMModel targetModel = amh.newModel(targetDef.getModelName(), "myTarget.xmi", targetMetamodel);
- models.put(targetDef.getModelName(), targetModel);
-
- contextualModels.put(target, targetModel);
- }
-*/
- IFile file = ASMRetriever.getFile();
- List superimpose = Collections.EMPTY_LIST;
-
- Map options = Collections.EMPTY_MAP;
-
- Debugger debugger = new SimpleDebugger(
- /* step = */ "true".equals(options.get("step")),
- /* stepops = */ new ArrayList(),
- /* deepstepops = */ new ArrayList(),
- /* nostepops = */ new ArrayList(),
- /* deepnostepops = */ new ArrayList(),
- /* showStackTrace = */ true,
- "true".equals(options.get("showSummary")),
- "true".equals(options.get("profile")),
- "true".equals(options.get("continueAfterError"))
- );
-// debugger = new NetworkDebugger(6060, true);
-
- Map asmParams = new HashMap();
- asmParams.put("debug", "false");//$NON-NLS-1$//$NON-NLS-2$
- asmParams.put("WriteTo", file.getLocation().toString());//$NON-NLS-1$
- AtlLauncher.getDefault().launch(asm, libraries, models, asmParams, superimpose, options, debugger);
- ASM asm = ASMRetriever.getASM(file);
- Target target = (Target)usage.targets.get(0);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- Map params = new HashMap();
- params.putAll(options);
- PrintWriter pw = new PrintWriter(baos);
- new ASMXMLWriter(pw, false).print(asm);
- pw.close();
- contextualModels.put(target, new ByteArrayTextSource(baos.toByteArray()));
- }
-
- private ASM asm;
- public Map libraries;
-
- public ACGTransformation(TextSource transformationTS) throws IOException {
- this(transformationTS, Collections.EMPTY_MAP);
- }
-
- public ACGTransformation(TextSource transformationTS, Map libraries) throws IOException {
- asm = new ASMXMLReader().read(transformationTS.openStream());
-
- this.libraries = new HashMap();
- for(Iterator i = libraries.keySet().iterator() ; i.hasNext() ; ) {
- Object key = i.next();
- addLibrary(key, (TextSource)libraries.get(key));
- }
- }
-
- public void addLibrary(Object name, TextSource ts) throws IOException {
- this.libraries.put(name, new ASMXMLReader().read(ts.openStream()));
- }
-
- public ASM getASM() {
- return asm;
- }
-}
+/**
+ * Copyright (c) 2008 INRIA.
+ * 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:
+ * INRIA - initial API and implementation
+ *
+ * $Id: ACGTransformation.java,v 1.2 2008/06/25 13:01:57 fjouault Exp $
+ */
+package org.eclipse.gmt.tcs.builder.ct.definition;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.gmt.tcs.builder.ct.usage.Source;
+import org.eclipse.gmt.tcs.builder.ct.usage.Target;
+import org.eclipse.gmt.tcs.builder.ct.usage.TransformationUsage;
+import org.eclipse.m2m.atl.core.IExtractor;
+import org.eclipse.m2m.atl.core.IModel;
+import org.eclipse.m2m.atl.core.IReferenceModel;
+import org.eclipse.m2m.atl.core.ModelFactory;
+import org.eclipse.m2m.atl.core.emf.EMFModelFactory;
+import org.eclipse.m2m.atl.core.service.CoreService;
+import org.eclipse.m2m.atl.core.ui.vm.asm.ASMInjector;
+import org.eclipse.m2m.atl.dsls.textsource.ByteArrayTextSource;
+import org.eclipse.m2m.atl.dsls.textsource.TextSource;
+import org.eclipse.m2m.atl.engine.vm.ASM;
+import org.eclipse.m2m.atl.engine.vm.ASMReader;
+import org.eclipse.m2m.atl.engine.vm.ASMXMLReader;
+import org.eclipse.m2m.atl.engine.vm.ASMXMLWriter;
+import org.eclipse.m2m.atl.engine.vm.AtlLauncher;
+import org.eclipse.m2m.atl.engine.vm.AtlModelHandler;
+import org.eclipse.m2m.atl.engine.vm.Debugger;
+import org.eclipse.m2m.atl.engine.vm.SimpleDebugger;
+import org.eclipse.m2m.atl.engine.vm.nativelib.ASMModel;
+
+/**
+ *
+ * @author Fr�d�ric Jouault
+ *
+ */
+public class ACGTransformation extends Transformation {
+
+ public void execute(TransformationUsage usage, Map contextualModels) throws IOException {
+ Map libraries = new HashMap(this.libraries);
+ ModelFactory mf = CoreService.getModelFactory(EMFModelFactory.MODEL_FACTORY_NAME);
+ IExtractor extractor = CoreService.getExtractor(mf.getDefaultExtractorName());
+
+ Map models = new HashMap();
+ models.put("MOF", mf.getMetametamodel());
+ for(Iterator i = usage.sources.iterator() ; i.hasNext() ; ) {
+ Source source = (Source)i.next();
+ ATLSourceDefinition sourceDef = (ATLSourceDefinition)source.definition;
+ IModel sourceModel = (IModel)source.origin.get(contextualModels);
+ IReferenceModel sourceMetamodel = sourceDef.getMetamodel().getMetamodel();
+ sourceModel.setIsTarget(false);
+ models.put(sourceDef.getMetamodelName(), sourceMetamodel);
+ models.put(sourceDef.getModelName(), sourceModel);
+ }
+/* for(Iterator i = usage.targets.iterator() ; i.hasNext() ; ) {
+ Target target = (Target)i.next();
+ ATLTargetDefinition targetDef = (ATLTargetDefinition)target.definition;
+ ASMModel targetMetamodel = targetDef.getMetamodel().getMetamodel();
+ models.put(targetDef.getMetamodelName(), targetMetamodel);
+ ASMModel targetModel = amh.newModel(targetDef.getModelName(), "myTarget.xmi", targetMetamodel);
+ models.put(targetDef.getModelName(), targetModel);
+
+ contextualModels.put(target, targetModel);
+ }
+*/
+ IFile file = ASMRetriever.getFile();
+ List superimpose = Collections.EMPTY_LIST;
+
+ Map options = Collections.EMPTY_MAP;
+
+ Debugger debugger = new SimpleDebugger(
+ /* step = */ "true".equals(options.get("step")),
+ /* stepops = */ new ArrayList(),
+ /* deepstepops = */ new ArrayList(),
+ /* nostepops = */ new ArrayList(),
+ /* deepnostepops = */ new ArrayList(),
+ /* showStackTrace = */ true,
+ "true".equals(options.get("showSummary")),
+ "true".equals(options.get("profile")),
+ "true".equals(options.get("continueAfterError"))
+ );
+// debugger = new NetworkDebugger(6060, true);
+
+ Map asmParams = new HashMap();
+ asmParams.put("debug", "false");//$NON-NLS-1$//$NON-NLS-2$
+ asmParams.put("WriteTo", file.getLocation().toString());//$NON-NLS-1$
+ AtlLauncher.getDefault().launch(asm, libraries, models, asmParams, superimpose, options, debugger);
+ ASM asm = ASMRetriever.getASM(file);
+ Target target = (Target)usage.targets.get(0);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ Map params = new HashMap();
+ params.putAll(options);
+ PrintWriter pw = new PrintWriter(baos);
+ new ASMXMLWriter(pw, false).print(asm);
+ pw.close();
+ contextualModels.put(target, new ByteArrayTextSource(baos.toByteArray()));
+ }
+
+ private ASM asm;
+ public Map libraries;
+
+ public ACGTransformation(TextSource transformationTS) throws IOException {
+ this(transformationTS, Collections.EMPTY_MAP);
+ }
+
+ public ACGTransformation(TextSource transformationTS, Map libraries) throws IOException {
+ asm = new ASMXMLReader().read(transformationTS.openStream());
+
+ this.libraries = new HashMap();
+ for(Iterator i = libraries.keySet().iterator() ; i.hasNext() ; ) {
+ Object key = i.next();
+ addLibrary(key, (TextSource)libraries.get(key));
+ }
+ }
+
+ public void addLibrary(Object name, TextSource ts) throws IOException {
+ this.libraries.put(name, new ASMXMLReader().read(ts.openStream()));
+ }
+
+ public ASM getASM() {
+ return asm;
+ }
+}
diff --git a/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ct/definition/ATLTransformation.java b/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ct/definition/ATLTransformation.java
index 7dae3e7..72d6ac8 100644
--- a/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ct/definition/ATLTransformation.java
+++ b/plugins/org.eclipse.gmt.tcs.builder/src/org/eclipse/gmt/tcs/builder/ct/definition/ATLTransformation.java
@@ -1,120 +1,126 @@
-/**
- * Copyright (c) 2007, 2008 INRIA.
- * 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:
- * INRIA - initial API and implementation
- *
- * $Id: ATLTransformation.java,v 1.4 2008/06/25 13:01:57 fjouault Exp $
- */
-package org.eclipse.gmt.tcs.builder.ct.definition;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.gmt.tcs.builder.ct.usage.Source;
-import org.eclipse.gmt.tcs.builder.ct.usage.Target;
-import org.eclipse.gmt.tcs.builder.ct.usage.TransformationUsage;
-import org.eclipse.m2m.atl.dsls.textsource.TextSource;
-import org.eclipse.m2m.atl.engine.AtlLauncher;
-import org.eclipse.m2m.atl.engine.AtlModelHandler;
-import org.eclipse.m2m.atl.engine.vm.ASM;
-import org.eclipse.m2m.atl.engine.vm.ASMXMLReader;
-import org.eclipse.m2m.atl.engine.vm.Debugger;
-import org.eclipse.m2m.atl.engine.vm.SimpleDebugger;
-import org.eclipse.m2m.atl.engine.vm.nativelib.ASMModel;
-
-/**
- *
- * @author Frédéric Jouault
- *
- */
-public class ATLTransformation extends Transformation {
-
- public void execute(TransformationUsage usage, Map contextualModels) throws IOException {
- Map libraries = new HashMap(this.libraries);
- AtlModelHandler amh = AtlModelHandler.getDefault(AtlModelHandler.AMH_EMF);
-
- Map models = new HashMap();
- models.put("MOF", amh.getMof());
- Map sourceModelBySourceDef = new HashMap();
- for(Iterator i = usage.sources.iterator() ; i.hasNext() ; ) {
- Source source = (Source)i.next();
- ATLSourceDefinition sourceDef = (ATLSourceDefinition)source.definition;
- ASMModel sourceModel = (ASMModel)source.origin.get(contextualModels);
- ASMModel sourceMetamodel = sourceDef.getMetamodel().getMetamodel();
- sourceModel.setIsTarget(false);
- models.put(sourceDef.getMetamodelName(), sourceMetamodel);
- models.put(sourceDef.getModelName(), sourceModel);
- sourceModelBySourceDef.put(sourceDef, sourceModel);
- }
- for(Iterator i = usage.targets.iterator() ; i.hasNext() ; ) {
- Target target = (Target)i.next();
- ASMModel targetModel = null;
- if(target.definition instanceof ATLTargetDefinition) {
- ATLTargetDefinition targetDef = (ATLTargetDefinition)target.definition;
- ASMModel targetMetamodel = targetDef.getMetamodel().getMetamodel();
- models.put(targetDef.getMetamodelName(), targetMetamodel);
- targetModel = amh.newModel(targetDef.getModelName(), "myTarget.xmi", targetMetamodel);
- models.put(targetDef.getModelName(), targetModel);
-
- } else {
- ATLRefinedTargetDefinition targetDef = (ATLRefinedTargetDefinition)target.definition;
- targetModel = (ASMModel)sourceModelBySourceDef.get(targetDef.getSourceDefinition());
- }
- contextualModels.put(target, targetModel);
- }
-
- List superimpose = Collections.EMPTY_LIST;
-
- Map options = Collections.EMPTY_MAP;
-
- Debugger debugger = new SimpleDebugger(
- /* step = */ "true".equals(options.get("step")),
- /* stepops = */ new ArrayList(),
- /* deepstepops = */ new ArrayList(),
- /* nostepops = */ new ArrayList(),
- /* deepnostepops = */ new ArrayList(),
- /* showStackTrace = */ true,
- "true".equals(options.get("showSummary")),
- "true".equals(options.get("profile")),
- "true".equals(options.get("continueAfterError"))
- );
-// debugger = new NetworkDebugger(6060, true);
-
- AtlLauncher.getDefault().launch(asm, libraries, models, Collections.EMPTY_MAP, superimpose, options, debugger);
- }
-
- private ASM asm;
- public Map libraries;
-
- public ATLTransformation(TextSource transformationTS) throws IOException {
- this(transformationTS, Collections.EMPTY_MAP);
- }
-
- public ATLTransformation(TextSource transformationTS, Map libraries) throws IOException {
- asm = new ASMXMLReader().read(transformationTS.openStream());
-
- this.libraries = new HashMap();
- for(Iterator i = libraries.keySet().iterator() ; i.hasNext() ; ) {
- Object key = i.next();
- addLibrary(key, (TextSource)libraries.get(key));
- }
- }
-
- public void addLibrary(Object name, TextSource ts) throws IOException {
- this.libraries.put(name, new ASMXMLReader().read(ts.openStream()));
- }
-
- public ASM getASM() {
- return asm;
- }
-}
+/**
+ * Copyright (c) 2007, 2008 INRIA.
+ * 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:
+ * INRIA - initial API and implementation
+ *
+ * $Id: ATLTransformation.java,v 1.4 2008/06/25 13:01:57 fjouault Exp $
+ */
+package org.eclipse.gmt.tcs.builder.ct.definition;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.gmt.tcs.builder.ct.usage.Source;
+import org.eclipse.gmt.tcs.builder.ct.usage.Target;
+import org.eclipse.gmt.tcs.builder.ct.usage.TransformationUsage;
+import org.eclipse.m2m.atl.core.IExtractor;
+import org.eclipse.m2m.atl.core.IModel;
+import org.eclipse.m2m.atl.core.IReferenceModel;
+import org.eclipse.m2m.atl.core.ModelFactory;
+import org.eclipse.m2m.atl.core.emf.EMFModelFactory;
+import org.eclipse.m2m.atl.core.service.CoreService;
+import org.eclipse.m2m.atl.dsls.textsource.TextSource;
+import org.eclipse.m2m.atl.engine.vm.ASM;
+import org.eclipse.m2m.atl.engine.vm.ASMXMLReader;
+import org.eclipse.m2m.atl.engine.vm.AtlLauncher;
+import org.eclipse.m2m.atl.engine.vm.AtlModelHandler;
+import org.eclipse.m2m.atl.engine.vm.Debugger;
+import org.eclipse.m2m.atl.engine.vm.SimpleDebugger;
+
+/**
+ *
+ * @author Fr�d�ric Jouault
+ *
+ */
+public class ATLTransformation extends Transformation {
+
+ public void execute(TransformationUsage usage, Map contextualModels) throws IOException {
+ Map libraries = new HashMap(this.libraries);
+ ModelFactory mf = CoreService.getModelFactory(EMFModelFactory.MODEL_FACTORY_NAME);
+ IExtractor extractor = CoreService.getExtractor(mf.getDefaultExtractorName());
+
+ Map models = new HashMap();
+ models.put("MOF", mf.getMetametamodel());
+ Map sourceModelBySourceDef = new HashMap();
+ for(Iterator i = usage.sources.iterator() ; i.hasNext() ; ) {
+ Source source = (Source)i.next();
+ ATLSourceDefinition sourceDef = (ATLSourceDefinition)source.definition;
+ IModel sourceModel = (IModel)source.origin.get(contextualModels);
+ IReferenceModel sourceMetamodel = sourceDef.getMetamodel().getMetamodel();
+ sourceModel.setIsTarget(false);
+ models.put(sourceDef.getMetamodelName(), sourceMetamodel);
+ models.put(sourceDef.getModelName(), sourceModel);
+ sourceModelBySourceDef.put(sourceDef, sourceModel);
+ }
+ for(Iterator i = usage.targets.iterator() ; i.hasNext() ; ) {
+ Target target = (Target)i.next();
+ IModel targetModel = null;
+ if(target.definition instanceof ATLTargetDefinition) {
+ ATLTargetDefinition targetDef = (ATLTargetDefinition)target.definition;
+ IModel targetMetamodel = targetDef.getMetamodel().getMetamodel();
+ models.put(targetDef.getMetamodelName(), targetMetamodel);
+ targetModel = amh.newModel(targetDef.getModelName(), "myTarget.xmi", targetMetamodel);
+ models.put(targetDef.getModelName(), targetModel);
+
+ } else {
+ ATLRefinedTargetDefinition targetDef = (ATLRefinedTargetDefinition)target.definition;
+ targetModel = (IModel)sourceModelBySourceDef.get(targetDef.getSourceDefinition());
+ }
+ contextualModels.put(target, targetModel);
+ }
+
+ List superimpose = Collections.EMPTY_LIST;
+
+ Map options = Collections.EMPTY_MAP;
+
+ Debugger debugger = new SimpleDebugger(
+ /* step = */ "true".equals(options.get("step")),
+ /* stepops = */ new ArrayList(),
+ /* deepstepops = */ new ArrayList(),
+ /* nostepops = */ new ArrayList(),
+ /* deepnostepops = */ new ArrayList(),
+ /* showStackTrace = */ true,
+ "true".equals(options.get("showSummary")),
+ "true".equals(options.get("profile")),
+ "true".equals(options.get("continueAfterError"))
+ );
+// debugger = new NetworkDebugger(6060, true);
+
+ AtlLauncher.getDefault().launch(asm, libraries, models, Collections.EMPTY_MAP, superimpose, options, debugger);
+ }
+
+ private ASM asm;
+ public Map libraries;
+
+ public ATLTransformation(TextSource transformationTS) throws IOException {
+ this(transformationTS, Collections.EMPTY_MAP);
+ }
+
+ public ATLTransformation(TextSource transformationTS, Map libraries) throws IOException {
+ asm = new ASMXMLReader().read(transformationTS.openStream());
+
+ this.libraries = new HashMap();
+ for(Iterator i = libraries.keySet().iterator() ; i.hasNext() ; ) {
+ Object key = i.next();
+ addLibrary(key, (TextSource)libraries.get(key));
+ }
+ }
+
+ public void addLibrary(Object name, TextSource ts) throws IOException {
+ this.libraries.put(name, new ASMXMLReader().read(ts.openStream()));
+ }
+
+ public ASM getASM() {
+ return asm;
+ }
+}
diff --git a/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/ParserLauncher.java b/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/ParserLauncher.java
index 0c68c6e..4a26476 100644
--- a/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/ParserLauncher.java
+++ b/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/ParserLauncher.java
@@ -1,129 +1,119 @@
-/**
- * Copyright (c) 2008 INRIA.
- * 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:
- * INRIA - initial API and implementation
- *
- * $Id: ParserLauncher.java,v 1.3 2008/06/28 17:12:25 fjouault Exp $
- */
-package org.eclipse.gmt.tcs.injector;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.gmt.tcs.injector.TCSRuntime.RefSetting;
-import org.eclipse.gmt.tcs.injector.wrappers.ParserWrapper;
-
-/**
- *
- * @author Mikaël Barbero
- * @author Frédéric Jouault
- *
- */
-public class ParserLauncher {
-
- private final static int DEFAULT_TAB_SIZE = 8;
-
- private List refSettings;
- private ParserWrapper parserWrapper;
-
- public Object parse(ModelAdapter target, InputStream in, Map arguments) {
- Object ret = null;
-
- refSettings = new ArrayList();
-
- int tabSize = arguments.get("tabSize") == null ? DEFAULT_TAB_SIZE : Integer.parseInt((String)arguments.get("tabSize"));
-
- String parserGeneratorClassName = (String)arguments.get("parserGenerator");
- if(parserGeneratorClassName != null) {
- try {
- parserWrapper = (ParserWrapper)Class.forName("org.eclipse.gmt.tcs.injector.wrappers." + parserGeneratorClassName + ".ParserWrapper", true, Thread.currentThread().getContextClassLoader()).newInstance();
- } catch (InstantiationException e) {
- throw new IllegalArgumentException("Unable to instanciate parser generator with name " + parserGeneratorClassName, e);
- } catch (IllegalAccessException e) {
- throw new IllegalArgumentException("Unable to access to parser generator with name " + parserGeneratorClassName, e);
- } catch (ClassNotFoundException e) {
- throw new IllegalArgumentException("Unable to locate parser generator with name " + parserGeneratorClassName, e);
- }
- } else {
- // default parser generator
- parserWrapper = new org.eclipse.gmt.tcs.injector.wrappers.antlr3.ParserWrapper();
- }
-
- String nameAndProductionRule = (String)arguments.get("name");
- String ss[] = nameAndProductionRule.split("-");
- String name = ss[0];
-
- String productionRule = "main";
- if(ss.length > 1) {
- productionRule = ss[1];
- }
-
- TCSRuntime runtime = new TCSRuntime(target, parserWrapper, refSettings, arguments);
- parserWrapper.setRuntime(runtime);
-
- try {
- ret = parserWrapper.parse(tabSize, name, productionRule, in, arguments);
- } catch (Exception e) {
- e.printStackTrace();
- }
-
-// if(runtime.getNbErrors() == 0) {
- // A RefSetting that can autoCreate an element should come before other
- // RefSettings that might refer to this element.
- Collections.sort(refSettings, new Comparator() {
- public int compare(Object o1, Object o2) {
- RefSetting rs1 = (RefSetting)o1;
- RefSetting rs2 = (RefSetting)o2;
- if(rs1.canAutoCreate() && !rs2.canAutoCreate())
- return -1; // autoCreate first
- else if(rs2.canAutoCreate() && !rs1.canAutoCreate())
- return 1; // autoCreate first
- else // both or none are autoCreate
- return 0; // don't care
- }
- });
-
- // A RefSetting that relies on imported contexts can only be executed after
- // the RefSetting importing the corresponding context (and this, recursively).
- // For now, we sort RefSettings so that all those that import a context
- // are executed first.
- // If a RefSetting that imports a context relies on imported contexts,
- // then this solution is not enough.
- // The concept of imported context should be defined cleanly first.
- Collections.sort(refSettings, new Comparator() {
- public int compare(Object o1, Object o2) {
- RefSetting rs1 = (RefSetting)o1;
- RefSetting rs2 = (RefSetting)o2;
- if(rs1.importContext && !rs2.importContext)
- return -1; // importContext first
- else if(rs2.importContext && !rs1.importContext)
- return 1; // importContext first
- else // both or none are importContext
- return 0; // don't care
- }
- });
-
- for(Iterator i = refSettings.iterator() ; i.hasNext() ; ) {
- RefSetting rs = (RefSetting)i.next();
- try {
- rs.doIt();
- } catch(Exception e) {
- System.out.println("Warning: one refSetting crashed:");
- e.printStackTrace(System.out);
- }
- }
-// }
-
- return ret;
- }
-}
+/**
+ * Copyright (c) 2008, 2014 INRIA.
+ * 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:
+ * INRIA - initial API and implementation
+ * Dennis Wagelaar
+ *
+ * $Id: ParserLauncher.java,v 1.1 2009/04/21 14:12:27 wpiers Exp $
+ */
+package org.eclipse.gmt.tcs.injector;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.gmt.tcs.injector.TCSRuntime.RefSetting;
+import org.eclipse.gmt.tcs.injector.wrappers.ParserWrapper;
+
+/**
+ *
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ * @author <a href="mailto:frederic.jouault@univ-nantes.fr">Frederic Jouault</a>
+ * @author <a href="mailto:dwagelaar@gmail.com">Dennis Wagelaar</a>
+ */
+public class ParserLauncher {
+
+ private final static int DEFAULT_TAB_SIZE = 8;
+
+ private List refSettings;
+ private ParserWrapper parserWrapper;
+
+ public Object parse(ModelAdapter target, Reader in, Map arguments) throws IOException {
+ Object ret = null;
+
+ refSettings = new ArrayList();
+
+ int tabSize = arguments.get("tabSize") == null ? DEFAULT_TAB_SIZE : Integer.parseInt((String)arguments.get("tabSize"));
+
+ String parserGeneratorClassName = (String)arguments.get("parserGenerator");
+ if(parserGeneratorClassName != null) {
+ try {
+ parserWrapper = (ParserWrapper)Class.forName("org.eclipse.gmt.tcs.injector.wrappers." + parserGeneratorClassName + ".ParserWrapper", true, Thread.currentThread().getContextClassLoader()).newInstance();
+ } catch (InstantiationException e) {
+ throw new IllegalArgumentException("Unable to instanciate parser generator with name " + parserGeneratorClassName, e);
+ } catch (IllegalAccessException e) {
+ throw new IllegalArgumentException("Unable to access to parser generator with name " + parserGeneratorClassName, e);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException("Unable to locate parser generator with name " + parserGeneratorClassName, e);
+ }
+ } else {
+ // default parser generator
+ parserWrapper = new org.eclipse.gmt.tcs.injector.wrappers.antlr3.ParserWrapper();
+ }
+
+ String nameAndProductionRule = (String)arguments.get("name");
+ String ss[] = nameAndProductionRule.split("-");
+ String name = ss[0];
+
+ String productionRule = "main";
+ if(ss.length > 1) {
+ productionRule = ss[1];
+ }
+
+ TCSRuntime runtime = new TCSRuntime(target, parserWrapper, refSettings, arguments);
+ parserWrapper.setRuntime(runtime);
+
+ try {
+ ret = parserWrapper.parse(tabSize, name, productionRule, in, arguments);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+// if(runtime.getNbErrors() == 0) {
+ // A RefSetting that relies on imported contexts can only be executed after
+ // the RefSetting importing the corresponding context (and this, recursively).
+ // For now, we sort RefSettings so that all those that import a context
+ // are executed first.
+ // If a RefSetting that imports a context relies on imported contexts,
+ // then this solution is not enough.
+ // The concept of imported context should be defined cleanly first.
+ Collections.sort(refSettings, new Comparator() {
+ public int compare(Object o1, Object o2) {
+ RefSetting rs1 = (RefSetting)o1;
+ RefSetting rs2 = (RefSetting)o2;
+ if(rs1.importContext && !rs2.importContext)
+ return -1; // importContext first
+ else if(rs2.importContext && !rs1.importContext)
+ return 1; // importContext first
+ else // both or none are importContext
+ return 0; // don't care
+ }
+ });
+
+ int nbCrashedRefSettings = 0;
+ for(Iterator i = refSettings.iterator() ; i.hasNext() ; ) {
+ RefSetting rs = (RefSetting)i.next();
+ try {
+ rs.doIt();
+ } catch(Exception e) {
+ nbCrashedRefSettings++;
+ }
+ }
+ if(nbCrashedRefSettings > 0)
+ //TODO: check crashes cause
+ throw new IOException("Warning: " + nbCrashedRefSettings + " refSetting crashed");
+// }
+
+ return ret;
+ }
+}
diff --git a/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/TCSInjector.java b/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/TCSInjector.java
index 748e4cd..aec58bb 100644
--- a/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/TCSInjector.java
+++ b/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/TCSInjector.java
@@ -1,82 +1,97 @@
-/**
- * Copyright (c) 2004, 2008 INRIA.
- * 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:
- * INRIA - initial API and implementation
- *
- * $Id: TCSInjector.java,v 1.7 2008/06/25 12:27:04 fjouault Exp $
- */
-package org.eclipse.gmt.tcs.injector;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.m2m.atl.engine.injectors.Injector;
-import org.eclipse.m2m.atl.engine.vm.nativelib.ASMModel;
-import org.eclipse.m2m.atl.engine.vm.nativelib.ASMModelElement;
-
-/**
- * @author Frédéric Jouault
- * @author Mikaël Barbero
- */
-public class TCSInjector implements Injector {
-
- private static Map parameterTypes = new HashMap();
-
- static {
- parameterTypes.put("name", "String"); // required
- parameterTypes.put("keepNL", "String"); // optional, default = false
- parameterTypes.put("keepLocation", "String"); // optional, default = true
- parameterTypes.put("keepComments", "String"); // optional, default = true
- parameterTypes.put("tabSize", "String"); // optional, default = 8
- parameterTypes.put("parserGenerator", "String");// optional, default = "antlr3"
- parameterTypes.put("hyperlinks", "Map"); // optional, default = null
- parameterTypes.put("trace", "Map"); // optional, default = null
- parameterTypes.put("locationByElement", "Map"); // optional, default = null
- parameterTypes.put("problems", "Model:Problem");// optional, default = null
-
- // Useful when the lexer and/or parser cannot be resolved from here
- parameterTypes.put("lexerClass", "Class"); // optional, default = null
- parameterTypes.put("parserClass", "Class"); // optional, default = null
- parameterTypes.put("extraClasspath", "String"); // optional, default = null
- }
-
- public Map getParameterTypes() {
- return parameterTypes;
- }
-
- public ASMModelElement inject(ASMModel target, InputStream source, Map params) throws IOException {
- this.targetModelAdapter = (ModelAdapter)params.get("modelAdapter");
- if(this.targetModelAdapter == null) {
- this.targetModelAdapter = new ASMModelAdapter(target);
- }
-
- ASMModel problems = (ASMModel)params.get("problems");
- if (problems != null) {
- this.problemsModelAdapter = new ASMModelAdapter(problems);
- params.put("problems", this.problemsModelAdapter);
- }
-
- ASMModelElement root = (ASMModelElement)new ParserLauncher().parse(targetModelAdapter, source, params);
-
- return root;
- }
-
- public String getPrefix() {
- return "ebnf2";
- }
-
- private ModelAdapter problemsModelAdapter;
- private ModelAdapter targetModelAdapter;
-
-
- public void performImportation(ASMModel format, ASMModel extent, InputStream in, String other) throws IOException {
- throw new UnsupportedOperationException("Was deprecated a long time ago. It is now unsupported");
- }
-}
+/**
+ * Copyright (c) 2004, 2008, 2014 INRIA.
+ * 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:
+ * INRIA - initial API and implementation
+ * Dennis Wagelaar
+ *
+ * $Id: TCSInjector.java,v 1.1 2009/04/21 14:11:03 wpiers Exp $
+ */
+package org.eclipse.gmt.tcs.injector;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.m2m.atl.engine.injectors.Injector;
+import org.eclipse.m2m.atl.engine.vm.nativelib.ASMModel;
+import org.eclipse.m2m.atl.engine.vm.nativelib.ASMModelElement;
+
+
+/**
+ * @author <a href="mailto:frederic.jouault@univ-nantes.fr">Frederic Jouault</a>
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ * @author <a href="mailto:dwagelaar@gmail.com">Dennis Wagelaar</a>
+ */
+public class TCSInjector implements Injector {
+
+ private static Map parameterTypes = new HashMap();
+
+ static {
+ parameterTypes.put("name", "String"); // required
+ parameterTypes.put("keepNL", "String"); // optional, default = false
+ parameterTypes.put("keepLocation", "String"); // optional, default = true
+ parameterTypes.put("keepComments", "String"); // optional, default = true
+ parameterTypes.put("tabSize", "String"); // optional, default = 8
+ parameterTypes.put("parserGenerator", "String");// optional, default = "antlr3"
+ parameterTypes.put("hyperlinks", "Map"); // optional, default = null
+ parameterTypes.put("trace", "Map"); // optional, default = null
+ parameterTypes.put("locationByElement", "Map"); // optional, default = null
+ parameterTypes.put("problems", "Model:Problem");// optional, default = null
+
+ // Useful when the lexer and/or parser cannot be resolved from here
+ parameterTypes.put("lexerClass", "Class"); // optional, default = null
+ parameterTypes.put("parserClass", "Class"); // optional, default = null
+ }
+
+ public Map getParameterTypes() {
+ return parameterTypes;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.m2m.atl.engine.injectors.Injector#inject(org.eclipse.m2m.atl.engine.vm.nativelib.ASMModel, java.io.InputStream, java.util.Map)
+ */
+ public ASMModelElement inject(ASMModel target, InputStream source, Map params) throws IOException {
+ return inject(target, new InputStreamReader(source), params);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.m2m.atl.engine.injectors.Injector#inject(org.eclipse.m2m.atl.engine.vm.nativelib.ASMModel, java.io.Reader, java.util.Map)
+ */
+ public ASMModelElement inject(ASMModel target, Reader source, Map params) throws IOException {
+ this.targetModelAdapter = new ASMModelAdapter(target);
+
+ ASMModel problems = (ASMModel)params.get("problems");
+ if (problems != null) {
+ this.problemsModelAdapter = new ASMModelAdapter(problems);
+ params.put("problems", this.problemsModelAdapter);
+ }
+
+ ASMModelElement root = (ASMModelElement)new ParserLauncher().parse(targetModelAdapter, source, params);
+
+ return root;
+ }
+
+ public String getPrefix() {
+ return "ebnf2";
+ }
+
+ protected ModelAdapter problemsModelAdapter;
+ protected ModelAdapter targetModelAdapter;
+
+
+ public void performImportation(ASMModel format, ASMModel extent, InputStream in, String other) throws IOException {
+ throw new UnsupportedOperationException("Was deprecated a long time ago. It is now unsupported");
+ }
+}
diff --git a/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/wrappers/ParserWrapper.java b/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/wrappers/ParserWrapper.java
index 263e7ba..99cee7f 100644
--- a/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/wrappers/ParserWrapper.java
+++ b/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/wrappers/ParserWrapper.java
@@ -1,51 +1,53 @@
-/**
- * Copyright (c) 2004, 2008 INRIA.
- * 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:
- * INRIA - initial API and implementation
- *
- * $Id: ParserWrapper.java,v 1.6 2008/06/28 17:12:25 fjouault Exp $
- */
-package org.eclipse.gmt.tcs.injector.wrappers;
-
-import java.io.InputStream;
-import java.util.Map;
-
-import org.eclipse.gmt.tcs.injector.TCSRuntime;
-
-/**
- * @author Frédéric Jouault
- * @author Mikaël Barbero
- */
-public abstract class ParserWrapper {
- // Token Types
- protected int TT_NL = -1;
- protected int TT_WS = -1;
- protected int TT_COMMENT = -1;
- protected final String pack = "org.eclipse.gmt.tcs.injector.";
- protected TCSRuntime runtime;
-
- public abstract Object parse(int tabSize, String name, String productionRule, InputStream in, Map params) throws Exception;
-
- public abstract void reportError(Exception re);
-
- public abstract void setCommentsBefore(Object ame, Object token);
-
- public abstract void setCommentsAfter(Object ame_, Object token_);
-
- public abstract Object getLastToken();
-
- public abstract String getLocation(Object token);
-
- public abstract int getStartOffset(Object token);
-
- public abstract int getEndOffset(Object token);
-
- public void setRuntime(TCSRuntime runtime) {
- this.runtime = runtime;
- }
+/**
+ * Copyright (c) 2004, 2008, 2014 INRIA.
+ * 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:
+ * INRIA - initial API and implementation
+ * Dennis Wagelaar
+ *
+ * $Id: ParserWrapper.java,v 1.1 2009/04/21 14:12:27 wpiers Exp $
+ */
+package org.eclipse.gmt.tcs.injector.wrappers;
+
+import java.io.Reader;
+import java.util.Map;
+
+import org.eclipse.gmt.tcs.injector.TCSRuntime;
+
+/**
+ * @author <a href="mailto:frederic.jouault@univ-nantes.fr">Frederic Jouault</a>
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ * @author <a href="mailto:dwagelaar@gmail.com">Dennis Wagelaar</a>
+ */
+public abstract class ParserWrapper {
+ // Token Types
+ protected int TT_NL = -1;
+ protected int TT_WS = -1;
+ protected int TT_COMMENT = -1;
+ protected final String pack = "org.eclipse.m2m.atl.dsls.tcs.injector."; //$NON-NLS-1$
+ protected TCSRuntime runtime;
+
+ public abstract Object parse(int tabSize, String name, String productionRule, Reader in, Map params) throws Exception;
+
+ public abstract void reportError(Exception re);
+
+ public abstract void setCommentsBefore(Object ame, Object token);
+
+ public abstract void setCommentsAfter(Object ame_, Object token_);
+
+ public abstract Object getLastToken();
+
+ public abstract String getLocation(Object token);
+
+ public abstract int getStartOffset(Object token);
+
+ public abstract int getEndOffset(Object token);
+
+ public void setRuntime(TCSRuntime runtime) {
+ this.runtime = runtime;
+ }
}
\ No newline at end of file
diff --git a/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/wrappers/antlr3/ParserWrapper.java b/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/wrappers/antlr3/ParserWrapper.java
index e2a0246..a5b9761 100644
--- a/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/wrappers/antlr3/ParserWrapper.java
+++ b/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/wrappers/antlr3/ParserWrapper.java
@@ -1,252 +1,248 @@
-/**
- * Copyright (c) 2004, 2008 INRIA.
- * 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:
- * INRIA - initial API and implementation
- *
- * $Id: ParserWrapper.java,v 1.14 2008/07/04 13:03:24 fjouault Exp $
- */
-package org.eclipse.gmt.tcs.injector.wrappers.antlr3;
-
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.antlr.runtime.ANTLRStringStream;
-import org.antlr.runtime.CharStream;
-import org.antlr.runtime.CommonToken;
-import org.antlr.runtime.CommonTokenStream;
-import org.antlr.runtime.Lexer;
-import org.antlr.runtime.Parser;
-import org.antlr.runtime.RecognitionException;
-import org.antlr.runtime.Token;
-import org.antlr.runtime.TokenStream;
-import org.eclipse.gmt.tcs.injector.TCSClassLoader;
-
-/**
- * @author Frédéric Jouault
- * @author Mikaël Barbero
- */
-public class ParserWrapper extends org.eclipse.gmt.tcs.injector.wrappers.ParserWrapper {
-
- private Parser parser;
- private Lexer lexer;
-
- public ParserWrapper() {
- }
-
- public Object parse(int tabSize, String name, String productionRule, InputStream in, Map params) throws Exception {
- Class lexerClass = (Class)params.get("lexerClass");
- Class parserClass = (Class)params.get("parserClass");
- if((lexerClass == null) || (parserClass == null)) {
- URL extraClasspath[] = (URL[])params.get("extraClasspath");
- ClassLoader cl = ParserWrapper.class.getClassLoader();
- if(extraClasspath != null) {
- cl = new TCSClassLoader(extraClasspath, cl);
- }
- if(lexerClass == null) {
- try {
- lexerClass = cl.loadClass(pack + name + "_ANTLR3Lexer");
- } catch (ClassNotFoundException e) {
- throw new IllegalArgumentException("Unable to locate lexer class with name " + name, e);
- }
- }
- if(parserClass == null) {
- try {
- parserClass = cl.loadClass(pack + name + "_ANTLR3Parser");
- } catch (ClassNotFoundException e) {
- throw new IllegalArgumentException("Unable to locate parser class with name " + name, e);
- }
- }
- }
-
-
- Object ret = null;
- InputStreamReader isr = new InputStreamReader(in);
- StringBuffer s = new StringBuffer();
- char buffer[] = new char[10000];
- int size;
- while((size = isr.read(buffer)) > 0) {
- s.append(buffer, 0, size);
- }
- ANTLRStringStream stream = new ANTLRStringStream(s.toString());
-
- lexer = (Lexer)lexerClass.getDeclaredConstructor(new Class[] {CharStream.class}).newInstance(new Object[] {stream});
-
- CommonTokenStream tokens = new CommonTokenStream(lexer);
- try {
- TT_NL = ((Integer)parserClass.getField("NL").get(null)).intValue();
- tokens.setTokenTypeChannel(TT_NL, 99);
- //tokens.discardTokenType(TT_NL);
- } catch(Exception e) {
- }
- try {
- TT_WS = ((Integer)parserClass.getField("WS").get(null)).intValue();
- tokens.discardTokenType(TT_WS);
- } catch(Exception e) {
- }
- try {
- TT_COMMENT = ((Integer)parserClass.getField("COMMENT").get(null)).intValue();
- tokens.setTokenTypeChannel(TT_COMMENT, 99);
- //tokens.discardTokenType(TT_COMMENT);
- } catch(Exception e) {
- }
-
- parser = (Parser)parserClass.getDeclaredConstructor(new Class[] {TokenStream.class}).newInstance(new Object[] {tokens});
-
- Field f = parserClass.getField("ei");
- f.set(parser, runtime);
-
- f = lexerClass.getField("ei");
- f.set(lexer, runtime);
-
- Method m = parserClass.getMethod(productionRule, new Class[] {});
- try {
- ret = m.invoke(parser, new Object[] {});
- } catch(java.lang.reflect.InvocationTargetException ite) {
- ite.getCause().printStackTrace(System.out);
- }
-
- return ret;
- }
-
- public void reportError(Exception e) {
- RecognitionException re = (RecognitionException)e;
- String msg = null;
- if(re.input instanceof ANTLRStringStream) {
- msg = lexer.getErrorMessage(re, lexer.getTokenNames());
- } else {
- msg = parser.getErrorMessage(re, parser.getTokenNames());
- }
- // TODO: try to use re.token to get a complete location (may not always be possible, like for lexer errors)
- runtime.reportProblem("Error", msg, re.line + ":" + (re.charPositionInLine + 1));
- }
-
- /**
- * set up a list with the comments before a model element. The list contains a set of tokens
- * @param input
- * @param index
- * @return
- */
- private List setTokenListBefore (TokenStream input, int index ){
- List cb = new ArrayList();
- if (index - 1 > 0 ) {
- for (int i = index - 1 ; i >= 0 && (
- input.get(i).getType() == TT_COMMENT || input.get(i).getType() == TT_NL) ; i--) {
- cb.add(input.get(i));
- }
- }
- return cb;
- }
-
- /**
- * sets the comments before a model element.
- * the input is the current stream. the index is the index of the current token
- */
- public void setCommentsBefore(Object ame, Object params_) {
- if(params_ instanceof Object[]) {
- Object params[] = (Object[])params_;
- if((params[0] == null) || (params[1] == null)) return;
- TokenStream input = (TokenStream)params[0];
- int index = ((Token)params[1]).getTokenIndex();
-
- setComments(setTokenListBefore(input, index), ame, true, "commentsBefore");
- }
- }
- /**
- * set us a list with the comments after a model element.
- * @param input
- * @param index
- * @return set of tokens
- */
- private List setTokenListAfter (TokenStream input, int index){
- List ca = new ArrayList();
- if (index + 1 > 0 ) {
- for (int i = index + 1;
- i < input.size() && (
- input.get(i).getType() == TT_COMMENT || input.get(i).getType() == TT_NL)
- ; i++) {
- ca.add(input.get(i));
- }
- }
- return ca;
- }
- /**
- *
- * @param commentList a list with a set of tokens
- * @param ame an ASM model element
- * @param inverseOrder indicates if the elements of the list should be created in a normal order or on the inverse order
- * @param elementName the name of the element that stores the comments
- */
- private void setComments (List commentList, Object ame, boolean inverseOrder, String elementName){
- if(runtime.isKeepComments()) {
- if(commentList.size() > 0) {
- List aList = new ArrayList();
- for (Iterator tokens = commentList.iterator(); tokens.hasNext();) {
- Token token = (Token) tokens.next();
- if(token.getType() == TT_COMMENT) {
- if (inverseOrder)
- aList.add(0, token.getText());
- else
- aList.add(token.getText());
- } else if(token.getType() == TT_NL) {
- if(runtime.isKeepNL())
- if (inverseOrder)
- aList.add(0, "\n");
- else
- aList.add("\n");
- }
- }
- try {
- runtime.getTargetModelAdapter().set(ame, elementName, aList);
- } catch(Exception e) {
- runtime.reportProblem("Warning", "could not set comments of " + ame + ", disabling further comments setting", ame);
- runtime.setKeepComments(false);
- }
- }
- }
-
- }
- public void setCommentsAfter(Object ame, Object params_) {
- if(params_ instanceof Object[]) {
- Object params[] = (Object[])params_;
- if((params[0] == null) || (params[1] == null)) return;
-
- TokenStream input = (TokenStream)params[0];
- int index = ((Token)params[1]).getTokenIndex();
-
- setComments(setTokenListAfter(input, index), ame, false,"commentsAfter");
-
- runtime.setLastWasCreation(false);
- }
- }
-
- public String getLocation(Object token) {
- ANTLR3LocationToken lt = ((ANTLR3LocationToken)token);
- return lt.getLine() + ":" + (lt.getCharPositionInLine() + 1) + "-" + lt.getEndLine() + ":" + (lt.getEndColumn() + 1);
- }
-
- public int getStartOffset(Object token) {
- CommonToken t = ((CommonToken)token);
- return t.getStartIndex();
- }
-
- public int getEndOffset(Object token) {
- CommonToken t = ((CommonToken)token);
- return t.getStopIndex();
- }
-
- public Object getLastToken() {
- return parser.getTokenStream().LT(-1);
- }
-}
+/**
+ * Copyright (c) 2004, 2008, 2014 INRIA.
+ * 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:
+ * INRIA - initial API and implementation
+ * Dennis Wagelaar
+ *
+ * $Id: ParserWrapper.java,v 1.1 2009/04/21 14:12:27 wpiers Exp $
+ */
+package org.eclipse.gmt.tcs.injector.wrappers.antlr3;
+
+import java.io.Reader;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.antlr.runtime.ANTLRReaderStream;
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.CommonToken;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.Lexer;
+import org.antlr.runtime.Parser;
+import org.antlr.runtime.RecognitionException;
+import org.antlr.runtime.Token;
+import org.antlr.runtime.TokenStream;
+import org.eclipse.gmt.tcs.injector.TCSClassLoader;
+
+/**
+ * @author <a href="mailto:frederic.jouault@univ-nantes.fr">Frederic Jouault</a>
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ * @author <a href="mailto:dwagelaar@gmail.com">Dennis Wagelaar</a>
+ */
+public class ParserWrapper extends org.eclipse.gmt.tcs.injector.wrappers.ParserWrapper {
+
+ private Parser parser;
+ private Lexer lexer;
+
+ public ParserWrapper() {
+ }
+
+ public Object parse(int tabSize, String name, String productionRule, Reader isr, Map params) throws Exception {
+ Class lexerClass = (Class)params.get("lexerClass");
+ Class parserClass = (Class)params.get("parserClass");
+ if((lexerClass == null) || (parserClass == null)) {
+ URL extraClasspath[] = (URL[])params.get("extraClasspath");
+ ClassLoader cl = ParserWrapper.class.getClassLoader();
+ if(extraClasspath != null) {
+ cl = new TCSClassLoader(extraClasspath, cl);
+ }
+ if(lexerClass == null) {
+ try {
+ lexerClass = cl.loadClass(pack + name + "_ANTLR3Lexer");
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException("Unable to locate lexer class with name " + name);
+ }
+ }
+ if(parserClass == null) {
+ try {
+ parserClass = cl.loadClass(pack + name + "_ANTLR3Parser");
+ } catch (ClassNotFoundException e) {
+ //throw new IllegalArgumentException("Unable to locate parser class with name " + name, e);
+ throw new IllegalArgumentException("Unable to locate parser class with name " + name);
+ }
+ }
+ }
+
+
+ ANTLRReaderStream stream = new ANTLRReaderStream(isr);
+
+ lexer = (Lexer)lexerClass.getDeclaredConstructor(new Class[] {CharStream.class}).newInstance(new Object[] {stream});
+
+ CommonTokenStream tokens = new CommonTokenStream(lexer);
+ try {
+ TT_NL = ((Integer)parserClass.getField("NL").get(null)).intValue();
+ tokens.setTokenTypeChannel(TT_NL, 99);
+ //tokens.discardTokenType(TT_NL);
+ } catch(Exception e) {
+ }
+ try {
+ TT_WS = ((Integer)parserClass.getField("WS").get(null)).intValue();
+ tokens.discardTokenType(TT_WS);
+ } catch(Exception e) {
+ }
+ try {
+ TT_COMMENT = ((Integer)parserClass.getField("COMMENT").get(null)).intValue();
+ tokens.setTokenTypeChannel(TT_COMMENT, 99);
+ //tokens.discardTokenType(TT_COMMENT);
+ } catch(Exception e) {
+ }
+
+ parser = (Parser)parserClass.getDeclaredConstructor(new Class[] {TokenStream.class}).newInstance(new Object[] {tokens});
+
+ Field f = parserClass.getField("ei");
+ f.set(parser, runtime);
+
+ f = lexerClass.getField("ei");
+ f.set(lexer, runtime);
+
+ Method m = parserClass.getMethod(productionRule, new Class[] {});
+ Object ret = null;
+ try {
+ ret = m.invoke(parser, new Object[] {});
+ } catch(java.lang.reflect.InvocationTargetException ite) {
+ ite.getCause().printStackTrace(System.out);
+ }
+
+ return ret;
+ }
+
+ public void reportError(Exception e) {
+ RecognitionException re = (RecognitionException)e;
+ String msg = null;
+ if(re.input instanceof ANTLRStringStream) {
+ msg = lexer.getErrorMessage(re, lexer.getTokenNames());
+ } else {
+ msg = parser.getErrorMessage(re, parser.getTokenNames());
+ }
+ // TODO: try to use re.token to get a complete location (may not always be possible, like for lexer errors)
+ runtime.reportProblem("Error", msg, re.line + ":" + (re.charPositionInLine + 1));
+ }
+
+ /**
+ * set up a list with the comments before a model element. The list contains a set of tokens
+ * @param input
+ * @param index
+ * @return
+ */
+ private List setTokenListBefore (TokenStream input, int index ){
+ List cb = new ArrayList();
+ if (index - 1 > 0 ) {
+ for (int i = index - 1 ; i >= 0 && (
+ input.get(i).getType() == TT_COMMENT || input.get(i).getType() == TT_NL) ; i--) {
+ cb.add(input.get(i));
+ }
+ }
+ return cb;
+ }
+
+ /**
+ * sets the comments before a model element.
+ * the input is the current stream. the index is the index of the current token
+ */
+ public void setCommentsBefore(Object ame, Object params_) {
+ if(params_ instanceof Object[]) {
+ Object params[] = (Object[])params_;
+ if((params[0] == null) || (params[1] == null)) return;
+ TokenStream input = (TokenStream)params[0];
+ int index = ((Token)params[1]).getTokenIndex();
+
+ setComments(setTokenListBefore(input, index), ame, true, "commentsBefore");
+ }
+ }
+ /**
+ * set us a list with the comments after a model element.
+ * @param input
+ * @param index
+ * @return set of tokens
+ */
+ private List setTokenListAfter (TokenStream input, int index){
+ List ca = new ArrayList();
+ if (index + 1 > 0 ) {
+ for (int i = index + 1;
+ i < input.size() && (
+ input.get(i).getType() == TT_COMMENT || input.get(i).getType() == TT_NL)
+ ; i++) {
+ ca.add(input.get(i));
+ }
+ }
+ return ca;
+ }
+ /**
+ *
+ * @param commentList a list with a set of tokens
+ * @param ame an ASM model element
+ * @param inverseOrder indicates if the elements of the list should be created in a normal order or on the inverse order
+ * @param elementName the name of the element that stores the comments
+ */
+ private void setComments (List commentList, Object ame, boolean inverseOrder, String elementName){
+ if(runtime.isKeepComments()) {
+ if(commentList.size() > 0) {
+ List aList = new ArrayList();
+ for (Iterator tokens = commentList.iterator(); tokens.hasNext();) {
+ Token token = (Token) tokens.next();
+ if(token.getType() == TT_COMMENT) {
+ if (inverseOrder)
+ aList.add(0, token.getText());
+ else
+ aList.add(token.getText());
+ } else if(token.getType() == TT_NL) {
+ if(runtime.isKeepNL())
+ if (inverseOrder)
+ aList.add(0, "\n");
+ else
+ aList.add("\n");
+ }
+ }
+ try {
+ runtime.getTargetModelAdapter().set(ame, elementName, aList);
+ } catch(Exception e) {
+ runtime.reportProblem("Warning", "could not set comments of " + ame + ", disabling further comments setting", ame);
+ runtime.setKeepComments(false);
+ }
+ }
+ }
+
+ }
+ public void setCommentsAfter(Object ame, Object params_) {
+ if(params_ instanceof Object[]) {
+ Object params[] = (Object[])params_;
+ if((params[0] == null) || (params[1] == null)) return;
+
+ TokenStream input = (TokenStream)params[0];
+ int index = ((Token)params[1]).getTokenIndex();
+
+ setComments(setTokenListAfter(input, index), ame, false,"commentsAfter");
+
+ runtime.setLastWasCreation(false);
+ }
+ }
+
+ public String getLocation(Object token) {
+ ANTLR3LocationToken lt = ((ANTLR3LocationToken)token);
+ return lt.getLine() + ":" + (lt.getCharPositionInLine() + 1) + "-" + lt.getEndLine() + ":" + (lt.getEndColumn() + 1);
+ }
+
+ public int getStartOffset(Object token) {
+ CommonToken t = ((CommonToken)token);
+ return t.getStartIndex();
+ }
+
+ public int getEndOffset(Object token) {
+ CommonToken t = ((CommonToken)token);
+ return t.getStopIndex();
+ }
+
+ public Object getLastToken() {
+ return parser.getTokenStream().LT(-1);
+ }
+}
diff --git a/plugins/org.eclipse.gmt.tcs.metadata/META-INF/MANIFEST.MF b/plugins/org.eclipse.gmt.tcs.metadata/META-INF/MANIFEST.MF
index b744a77..4904584 100644
--- a/plugins/org.eclipse.gmt.tcs.metadata/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.gmt.tcs.metadata/META-INF/MANIFEST.MF
@@ -1,20 +1,21 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.gmt.tcs.metadata;singleton:=true
-Bundle-Version: 0.8.0
-Bundle-Activator: org.eclipse.gmt.tcs.metadata.Activator
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.resources,
- org.eclipse.ui,
- org.eclipse.m2m.atl.engine.vm,
- org.eclipse.m2m.atl.drivers.emf4atl,
- org.eclipse.gmt.tcs.injector,
- org.eclipse.gmt.tcs.extractor,
- org.eclipse.m2m.atl.engine.emfvm,
- org.eclipse.m2m.atl.core.ui.vm,
- org.eclipse.m2m.atl.engine
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.gmt.tcs.metadata
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.gmt.tcs.metadata;singleton:=true
+Bundle-Version: 0.8.0
+Bundle-Activator: org.eclipse.gmt.tcs.metadata.Activator
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.core.resources,
+ org.eclipse.ui,
+ org.eclipse.m2m.atl.engine.vm,
+ org.eclipse.m2m.atl.drivers.emf4atl,
+ org.eclipse.gmt.tcs.injector,
+ org.eclipse.gmt.tcs.extractor,
+ org.eclipse.m2m.atl.engine.emfvm,
+ org.eclipse.m2m.atl.core.ui.vm,
+ org.eclipse.m2m.atl.engine,
+ org.eclipse.uml2.uml;bundle-version="4.0.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Eclipse-LazyStart: true
+Export-Package: org.eclipse.gmt.tcs.metadata
diff --git a/plugins/org.eclipse.gmt.tcs.metadata/src/org/eclipse/gmt/tcs/metadata/InjectorForATL.java b/plugins/org.eclipse.gmt.tcs.metadata/src/org/eclipse/gmt/tcs/metadata/InjectorForATL.java
index fedec46..88cab6a 100644
--- a/plugins/org.eclipse.gmt.tcs.metadata/src/org/eclipse/gmt/tcs/metadata/InjectorForATL.java
+++ b/plugins/org.eclipse.gmt.tcs.metadata/src/org/eclipse/gmt/tcs/metadata/InjectorForATL.java
@@ -1,101 +1,106 @@
-/**
- * Copyright (c) 2014 ESEO.
- * 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:
- * ESEO - initial API and implementation
- *
- * $Id$
- */
-package org.eclipse.gmt.tcs.metadata;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.m2m.atl.core.ATLCoreException;
-import org.eclipse.m2m.atl.core.IInjector;
-import org.eclipse.m2m.atl.core.IModel;
-import org.eclipse.m2m.atl.core.emf.EMFInjector;
-import org.eclipse.m2m.atl.core.emf.EMFModel;
-import org.eclipse.m2m.atl.drivers.emf4atl.ASMEMFModel;
-import org.eclipse.m2m.atl.drivers.emf4atl.EMFModelLoader;
-import org.eclipse.m2m.atl.dsls.textsource.TextSource;
-import org.eclipse.m2m.atl.engine.vm.AtlModelHandler;
-import org.eclipse.uml2.uml.util.UMLUtil;
-
-/**
- *
- * @author Frédéric Jouault
- */
-public class InjectorForATL implements IInjector {
-
- public void inject(IModel targetModel, String source)
- throws ATLCoreException {
- this.inject(targetModel, source, new HashMap());
- }
-
- public void inject(IModel targetModel, String source, Map params) throws ATLCoreException {
- final URI uri = URI.createURI(source);
-
- // TODO: get language by name rather than by extension? this is currently unsupported by LanguageRegistry
- Language language = LanguageRegistry.getDefault().getLanguage(uri.fileExtension());
-
- // Passing ml=null to ASMEMFModel to make sure it will not unload the resource when garbage collected.
- EMFModelLoader ml = null;
- ModelFactory factory = ASMModelFactory.getDefault();
-
- String extension = "xmi";
- if(language.getSource() != null) {
- String ext = language.getSource().getProperty("model.ext");
- if(ext != null) {
- extension = ext;
- }
- }
-
- // ((EMFModel)targetModel).getResource() is not necessarily initialized yet.
- // If we create an ASMEMFModel in a standard way, it will have a resource, however
- // that resource will be dropped as soon as the (temporary) ASMEMFModel is dropped/garbage collected.
- // We therefore obtain a resource from the model factory of the target model.
- // Moreover, we must use targetModel.getReferenceModel(), and not language.getMetamodel(factory).
- // It is the responsibility of the caller to make sure that it is the right metamodel.
- Resource resource =
- ((EMFModel)targetModel).getModelFactory().getResourceSet().createResource(URI.createFileURI("model." + extension));
- resource.setURI(uri); // set actual URI so that dependencies (e.g., other resources) may be resolved
- resource.getResourceSet().getLoadOptions().put(XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.TRUE);
- UMLUtil.init(resource.getResourceSet());
- ASMEMFModel model = new ASMEMFModel("model", resource,
- new ASMEMFModel(language.getName(), ((EMFModel)targetModel.getReferenceModel()).getResource(), (ASMEMFModel)ASMEMFModel.getMOF(), false, ml) {},
- true, ml) {
- };
-
- // For resolution to happen, WFR must be executed, for which we need the two following things:
- params.put("vmLauncher", new RegularVMLauncher());
- if(!params.containsKey("problems")) {
- params.put("problems", factory.newModel("pbs", AtlModelHandler.getDefault(AtlModelHandler.AMH_EMF).createModelLoader().getBuiltInMetaModel("Problem.ecore")));
- }
-
- language.inject(factory, model, new TextSource() {
- public InputStream openStream() throws IOException {
- return new URL(uri.toString()).openStream();
- }
- }, params);
-
- // put our Resource in targetModel
- new EMFInjector().inject(targetModel, resource);
- }
-
- public void inject(IModel targetModel, InputStream source, Map options)
- throws ATLCoreException {
- throw new RuntimeException("injecting: " + source + " with options: " + options + " is not supported yet, inject from URI");
- }
-
-}
+/**
+ * Copyright (c) 2014 ESEO.
+ * 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:
+ * ESEO - initial API and implementation
+ *
+ * $Id$
+ */
+package org.eclipse.gmt.tcs.metadata;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+import org.eclipse.m2m.atl.core.ATLCoreException;
+import org.eclipse.m2m.atl.core.IInjector;
+import org.eclipse.m2m.atl.core.IModel;
+import org.eclipse.m2m.atl.core.emf.EMFInjector;
+import org.eclipse.m2m.atl.core.emf.EMFModel;
+import org.eclipse.m2m.atl.drivers.emf4atl.ASMEMFModel;
+import org.eclipse.m2m.atl.drivers.emf4atl.EMFModelLoader;
+import org.eclipse.m2m.atl.dsls.textsource.TextSource;
+import org.eclipse.m2m.atl.engine.vm.AtlModelHandler;
+import org.eclipse.uml2.uml.util.UMLUtil;
+
+/**
+ *
+ * @author Fr�d�ric Jouault
+ */
+public class InjectorForATL implements IInjector {
+
+ public void inject(IModel targetModel, String source)
+ throws ATLCoreException {
+ this.inject(targetModel, source, new HashMap());
+ }
+
+ public void inject(IModel targetModel, String source, Map params) throws ATLCoreException {
+ final URI uri = URI.createURI(source);
+
+ // TODO: get language by name rather than by extension? this is currently unsupported by LanguageRegistry
+ Language language = LanguageRegistry.getDefault().getLanguage(uri.fileExtension());
+
+ // Passing ml=null to ASMEMFModel to make sure it will not unload the resource when garbage collected.
+ EMFModelLoader ml = null;
+ ModelFactory factory = ASMModelFactory.getDefault();
+
+ String extension = "xmi";
+ if(language.getSource() != null) {
+ String ext = language.getSource().getProperty("model.ext");
+ if(ext != null) {
+ extension = ext;
+ }
+ }
+
+ // ((EMFModel)targetModel).getResource() is not necessarily initialized yet.
+ // If we create an ASMEMFModel in a standard way, it will have a resource, however
+ // that resource will be dropped as soon as the (temporary) ASMEMFModel is dropped/garbage collected.
+ // We therefore obtain a resource from the model factory of the target model.
+ // Moreover, we must use targetModel.getReferenceModel(), and not language.getMetamodel(factory).
+ // It is the responsibility of the caller to make sure that it is the right metamodel.
+ Resource resource =
+ ((EMFModel)targetModel).getModelFactory().getResourceSet().createResource(URI.createFileURI("model." + extension));
+ resource.setURI(uri); // set actual URI so that dependencies (e.g., other resources) may be resolved
+ resource.getResourceSet().getLoadOptions().put(XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.TRUE);
+ UMLUtil.init(resource.getResourceSet());
+ ASMEMFModel model = new ASMEMFModel("model", resource,
+ new ASMEMFModel(language.getName(), ((EMFModel)targetModel.getReferenceModel()).getResource(), (ASMEMFModel)ASMEMFModel.getMOF(), false, ml) {},
+ true, ml) {
+ };
+
+ // For resolution to happen, WFR must be executed, for which we need the two following things:
+ params.put("vmLauncher", new RegularVMLauncher());
+ if(!params.containsKey("problems")) {
+ params.put("problems", factory.newModel("pbs", AtlModelHandler.getDefault(AtlModelHandler.AMH_EMF).createModelLoader().getBuiltInMetaModel("Problem.ecore")));
+ }
+
+ language.inject(factory, model, new TextSource() {
+ public InputStream openStream() throws IOException {
+ return new URL(uri.toString()).openStream();
+ }
+ }, params);
+
+ // put our Resource in targetModel
+ new EMFInjector().inject(targetModel, resource);
+ }
+
+ public void inject(IModel targetModel, InputStream source, Map options)
+ throws ATLCoreException {
+ throw new RuntimeException("injecting: " + source + " with options: " + options + " is not supported yet, inject from URI");
+ }
+
+ public void inject(IModel targetModel, Reader source, Map options) throws ATLCoreException {
+ throw new RuntimeException("injecting: " + source + " with options: " + options + " is not supported yet, inject from URI");
+ }
+
+}