diff options
author | Dennis Wagelaar | 2018-04-22 09:40:58 +0000 |
---|---|---|
committer | Dennis Wagelaar | 2018-04-22 09:45:48 +0000 |
commit | 3f7763c6a1891c1f90d5df8795c35a3bf7760090 (patch) | |
tree | 7959c67e0f3af7814ea925777862be0acdde05b6 /plugins | |
parent | 08cee69270ded49249c0a46733d6b3cad3784c71 (diff) | |
download | org.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')
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 Binary files differnew file mode 100644 index 00000000..8c97c5bb --- /dev/null +++ b/plugins/org.eclipse.m2m.atl.dsls/lib/org.antlr.runtime_3.0.0.v200803061811.jar 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"); |