Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDennis Wagelaar2018-04-22 09:40:58 +0000
committerDennis Wagelaar2018-04-22 09:45:48 +0000
commit3f7763c6a1891c1f90d5df8795c35a3bf7760090 (patch)
tree7959c67e0f3af7814ea925777862be0acdde05b6 /plugins
parent08cee69270ded49249c0a46733d6b3cad3784c71 (diff)
downloadorg.eclipse.atl-3f7763c6a1891c1f90d5df8795c35a3bf7760090.tar.gz
org.eclipse.atl-3f7763c6a1891c1f90d5df8795c35a3bf7760090.tar.xz
org.eclipse.atl-3f7763c6a1891c1f90d5df8795c35a3bf7760090.zip
514604: ATL is not current (incompatible with Xtext, Orbit)
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=514604 Make ANTLR internal.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.m2m.atl.dsls/.classpath1
-rw-r--r--plugins/org.eclipse.m2m.atl.dsls/.project2
-rw-r--r--plugins/org.eclipse.m2m.atl.dsls/META-INF/MANIFEST.MF1
-rw-r--r--plugins/org.eclipse.m2m.atl.dsls/build.properties4
-rw-r--r--plugins/org.eclipse.m2m.atl.dsls/lib/org.antlr.runtime_3.0.0.v200803061811.jarbin0 -> 111057 bytes
-rw-r--r--plugins/org.eclipse.m2m.atl.dsls/src/org/eclipse/m2m/atl/dsls/tcs/injector/ANTLR3ClassLoader.java95
-rw-r--r--plugins/org.eclipse.m2m.atl.dsls/src/org/eclipse/m2m/atl/dsls/tcs/injector/ParserLauncher.java6
7 files changed, 105 insertions, 4 deletions
diff --git a/plugins/org.eclipse.m2m.atl.dsls/.classpath b/plugins/org.eclipse.m2m.atl.dsls/.classpath
index 2fbb7a23..326620b9 100644
--- a/plugins/org.eclipse.m2m.atl.dsls/.classpath
+++ b/plugins/org.eclipse.m2m.atl.dsls/.classpath
@@ -3,5 +3,6 @@
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
+ <classpathentry kind="lib" path="lib/org.antlr.runtime_3.0.0.v200803061811.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/plugins/org.eclipse.m2m.atl.dsls/.project b/plugins/org.eclipse.m2m.atl.dsls/.project
index c58ebe92..84569736 100644
--- a/plugins/org.eclipse.m2m.atl.dsls/.project
+++ b/plugins/org.eclipse.m2m.atl.dsls/.project
@@ -22,7 +22,7 @@
</buildCommand>
<buildCommand>
<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
- <triggers>full,incremental,</triggers>
+ <triggers>full,</triggers>
<arguments>
<dictionary>
<key>LaunchConfigHandle</key>
diff --git a/plugins/org.eclipse.m2m.atl.dsls/META-INF/MANIFEST.MF b/plugins/org.eclipse.m2m.atl.dsls/META-INF/MANIFEST.MF
index 990e65d2..25e75525 100644
--- a/plugins/org.eclipse.m2m.atl.dsls/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.m2m.atl.dsls/META-INF/MANIFEST.MF
@@ -14,7 +14,6 @@ Export-Package: org.eclipse.m2m.atl.dsls,
org.eclipse.m2m.atl.dsls.textsource
Require-Bundle: org.eclipse.core.resources,
org.eclipse.core.runtime,
- org.antlr.runtime;bundle-version="[3.0.0,3.1.0)",
org.eclipse.m2m.atl.common,
org.eclipse.emf.common,
org.eclipse.m2m.atl.core.emf,
diff --git a/plugins/org.eclipse.m2m.atl.dsls/build.properties b/plugins/org.eclipse.m2m.atl.dsls/build.properties
index 372ef7a5..380a2316 100644
--- a/plugins/org.eclipse.m2m.atl.dsls/build.properties
+++ b/plugins/org.eclipse.m2m.atl.dsls/build.properties
@@ -6,7 +6,9 @@ bin.includes = META-INF/,\
about.html,\
plugin.properties,\
resources/,\
- schema/
+ schema/,\
+ lib/
src.includes = schema/,\
resources/,\
about.html
+jars.extra.classpath = lib/org.antlr.runtime_3.0.0.v200803061811.jar
diff --git a/plugins/org.eclipse.m2m.atl.dsls/lib/org.antlr.runtime_3.0.0.v200803061811.jar b/plugins/org.eclipse.m2m.atl.dsls/lib/org.antlr.runtime_3.0.0.v200803061811.jar
new file mode 100644
index 00000000..8c97c5bb
--- /dev/null
+++ b/plugins/org.eclipse.m2m.atl.dsls/lib/org.antlr.runtime_3.0.0.v200803061811.jar
Binary files differ
diff --git a/plugins/org.eclipse.m2m.atl.dsls/src/org/eclipse/m2m/atl/dsls/tcs/injector/ANTLR3ClassLoader.java b/plugins/org.eclipse.m2m.atl.dsls/src/org/eclipse/m2m/atl/dsls/tcs/injector/ANTLR3ClassLoader.java
new file mode 100644
index 00000000..4a0d18cb
--- /dev/null
+++ b/plugins/org.eclipse.m2m.atl.dsls/src/org/eclipse/m2m/atl/dsls/tcs/injector/ANTLR3ClassLoader.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Willink Transformations and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * E.D.Willink - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.m2m.atl.dsls.tcs.injector;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+import org.eclipse.m2m.atl.dsls.tcs.injector.wrappers.ParserWrapper;
+
+/**
+ * The ANTLR3ClassLoader ensures that all ANTLR classes are loaded from the internal ANTLR 3.0.0 library without
+ * regard to any other versions of ANTLR that may be one the classpath.
+ */
+public class ANTLR3ClassLoader extends URLClassLoader
+{
+ private static final String ORG_ANTLR_RUNTIME = "org.antlr.runtime";
+ private static final String ORG_ANTLR_RUNTIME_3_0_0_JAR = "org.antlr.runtime_3.0.0.v200803061811.jar";
+ private static final String ORG_ECLIPSE_M2M_ATL_DSLS_TCS_INJECTOR = ANTLR3ClassLoader.class.getPackage().getName();
+ private static final String ORG_ECLIPSE_M2M_ATL_DSLS_TCS_INJECTOR_WRAPPERS_ANTLR3 = ORG_ECLIPSE_M2M_ATL_DSLS_TCS_INJECTOR + ".wrappers.antlr3";
+ private static final String ORG_ECLIPSE_M2M_ATL_DSLS_TCS_INJECTOR_WRAPPERS_ANTLR3_PARSERWRAPPER = ORG_ECLIPSE_M2M_ATL_DSLS_TCS_INJECTOR_WRAPPERS_ANTLR3 + ".ParserWrapper";
+
+ private static ANTLR3ClassLoader antlrClassLoader = null;
+
+ /**
+ * Return the ANTLR3 ParserWrapper loading ANTLR3 classes from the local library and other classes from
+ * classLoader.
+ *
+ * @param classLoader
+ * the parent {@link ClassLoader}
+ * @return the ANTLR3 {@link ParserWrapper}
+ */
+ public static ParserWrapper getParserWrapper(ClassLoader classLoader) throws Exception {
+ final Class parserWrapperClass = getAntlrClassLoader(classLoader)
+ .loadClass(ORG_ECLIPSE_M2M_ATL_DSLS_TCS_INJECTOR_WRAPPERS_ANTLR3_PARSERWRAPPER);
+ return (ParserWrapper)parserWrapperClass.newInstance();
+ }
+
+ private static synchronized ANTLR3ClassLoader getAntlrClassLoader(ClassLoader classLoader)
+ throws MalformedURLException, IOException {
+ if (antlrClassLoader == null) {
+ final URL resourceUrl = ANTLR3ClassLoader.class.getClassLoader().getResource("/");
+ final String resourcePath = resourceUrl.toString();
+ final int binIndex = resourcePath.lastIndexOf("/bin");
+ final String antlrPath = (binIndex < 0 ? resourcePath : resourcePath.substring(0, binIndex + 1))
+ + "lib/" + ORG_ANTLR_RUNTIME_3_0_0_JAR;
+ final URL antlrURL = new URL(antlrPath);
+ final InputStream inputStream = antlrURL.openStream(); // Throws an IOException if local ANTLR library missing avoiding confusing resolution elsewhere
+ inputStream.close();
+ final URL localURL = new URL(resourcePath);
+ antlrClassLoader = new ANTLR3ClassLoader(new URL[] {antlrURL, localURL}, classLoader);
+ }
+ return antlrClassLoader;
+ }
+
+ private final ClassLoader parent;
+
+ private ANTLR3ClassLoader(URL[] urls, ClassLoader parent) throws MalformedURLException {
+ super(urls, null);
+ this.parent = parent;
+ }
+
+ /**
+ * ANTLR and all classes that reference ANTLR must use this ClassLoader to avoid 'same' class loaded twice issues.
+ */
+ public Class loadClass(String name) throws ClassNotFoundException {
+ try {
+ if (name.startsWith(ORG_ANTLR_RUNTIME)) {
+ final Class loadClass = super.loadClass(name);
+ return loadClass;
+ }
+ if (name.startsWith(ORG_ECLIPSE_M2M_ATL_DSLS_TCS_INJECTOR_WRAPPERS_ANTLR3)) {
+ final Class loadClass = super.loadClass(name);
+ return loadClass;
+ }
+ if (name.startsWith(ORG_ECLIPSE_M2M_ATL_DSLS_TCS_INJECTOR) && name.contains("ANTLR3")) {
+ final Class loadClass = super.loadClass(name);
+ return loadClass;
+ }
+ } catch (final ClassNotFoundException e) {
+ return parent.loadClass(name);
+ }
+ return parent.loadClass(name);
+ }
+}
diff --git a/plugins/org.eclipse.m2m.atl.dsls/src/org/eclipse/m2m/atl/dsls/tcs/injector/ParserLauncher.java b/plugins/org.eclipse.m2m.atl.dsls/src/org/eclipse/m2m/atl/dsls/tcs/injector/ParserLauncher.java
index ca5a5a6d..a4a27bf3 100644
--- a/plugins/org.eclipse.m2m.atl.dsls/src/org/eclipse/m2m/atl/dsls/tcs/injector/ParserLauncher.java
+++ b/plugins/org.eclipse.m2m.atl.dsls/src/org/eclipse/m2m/atl/dsls/tcs/injector/ParserLauncher.java
@@ -61,7 +61,11 @@ public class ParserLauncher {
}
} else {
// default parser generator
- parserWrapper = new org.eclipse.m2m.atl.dsls.tcs.injector.wrappers.antlr3.ParserWrapper();
+ try {
+ parserWrapper = ANTLR3ClassLoader.getParserWrapper(getClass().getClassLoader());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
}
String nameAndProductionRule = (String)arguments.get("name");

Back to the top