diff options
| author | cbrun | 2015-03-18 11:04:09 +0000 |
|---|---|---|
| committer | cbrun | 2015-04-17 16:12:53 +0000 |
| commit | 64aaa7a8c69a8191ee0401968e57c2df7d96ba39 (patch) | |
| tree | 0077d9b42af7d8bfdb6a6d56990913e79839f2a3 | |
| parent | d6f03116306271a4639cd9c4fc03e98c8402fb47 (diff) | |
| download | org.eclipse.sirius-64aaa7a8c69a8191ee0401968e57c2df7d96ba39.tar.gz org.eclipse.sirius-64aaa7a8c69a8191ee0401968e57c2df7d96ba39.tar.xz org.eclipse.sirius-64aaa7a8c69a8191ee0401968e57c2df7d96ba39.zip | |
[460947] Register EPackages from the classpath in AQL
Use the JavaExtensionsManager infrastructure to compute the list of
EPackages which are available in the current classpath instead of
initializing AQL by registering all the EPackages which are installed in
the current platform.
This avoid an important initialization cost where AQL would trigger the
loading of every registered EPackage (and their own classpath)
This also prevent the side effect that the static analysis of AQL has to
analyse all those EPackages and then be slower than expected.
Bug: 460947
Change-Id: I7aa823ad3cbad10332e939ed7a6a71539be0fb02
Signed-off-by: Cedric Brun <cedric.brun@obeo.fr>
| -rw-r--r-- | plugins/org.eclipse.sirius.common.acceleo.aql/src/org/eclipse/sirius/common/acceleo/aql/business/internal/AQLSiriusInterpreter.java | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/plugins/org.eclipse.sirius.common.acceleo.aql/src/org/eclipse/sirius/common/acceleo/aql/business/internal/AQLSiriusInterpreter.java b/plugins/org.eclipse.sirius.common.acceleo.aql/src/org/eclipse/sirius/common/acceleo/aql/business/internal/AQLSiriusInterpreter.java index 46dc9a4eaf..73bcb79dba 100644 --- a/plugins/org.eclipse.sirius.common.acceleo.aql/src/org/eclipse/sirius/common/acceleo/aql/business/internal/AQLSiriusInterpreter.java +++ b/plugins/org.eclipse.sirius.common.acceleo.aql/src/org/eclipse/sirius/common/acceleo/aql/business/internal/AQLSiriusInterpreter.java @@ -46,7 +46,6 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; -import org.eclipse.emf.ecore.EPackage.Registry; import org.eclipse.emf.ecore.EStructuralFeature.Setting; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.util.ECrossReferenceAdapter; @@ -55,6 +54,7 @@ import org.eclipse.sirius.common.acceleo.aql.business.api.AQLConstants; import org.eclipse.sirius.common.acceleo.aql.business.api.ExpressionTrimmer; import org.eclipse.sirius.common.acceleo.aql.business.api.TypesUtil; import org.eclipse.sirius.common.tools.api.interpreter.ClassLoadingCallback; +import org.eclipse.sirius.common.tools.api.interpreter.EPackageLoadingCallback; import org.eclipse.sirius.common.tools.api.interpreter.EvaluationException; import org.eclipse.sirius.common.tools.api.interpreter.IInterpreterContext; import org.eclipse.sirius.common.tools.api.interpreter.IInterpreterStatus; @@ -117,13 +117,28 @@ public class AQLSiriusInterpreter extends AcceleoAbstractInterpreter { } }; + private final EPackageLoadingCallback ePackageCallBack; + /** * Create a new interpreter supporting the AQL evaluation engine. */ public AQLSiriusInterpreter() { super(); this.queryEnvironment = new QueryEnvironment(xRef); + this.ePackageCallBack = new EPackageLoadingCallback() { + + @Override + public void loaded(String nsURI, EPackage pak) { + queryEnvironment.registerEPackage(pak); + } + + @Override + public void unloaded(String nsURI, EPackage pak) { + queryEnvironment.removeEPackage(pak.getNsPrefix()); + } + }; this.javaExtensions.addClassLoadingCallBack(callback); + this.javaExtensions.addEPackageCallBack(ePackageCallBack); final IQueryBuilderEngine builder = new QueryBuilderEngine(queryEnvironment); this.parsedExpressions = CacheBuilder.newBuilder().maximumSize(500).build(new CacheLoader<String, AstResult>() { @@ -134,7 +149,6 @@ public class AQLSiriusInterpreter extends AcceleoAbstractInterpreter { }); this.queryEnvironment.registerEPackage(EcorePackage.eINSTANCE); - registerEcoreModels(EPackage.Registry.INSTANCE); } @@ -158,6 +172,7 @@ public class AQLSiriusInterpreter extends AcceleoAbstractInterpreter { public void dispose() { super.dispose(); this.javaExtensions.removeClassLoadingCallBack(callback); + this.javaExtensions.removeEPackageCallBack(ePackageCallBack); } @Override @@ -165,9 +180,6 @@ public class AQLSiriusInterpreter extends AcceleoAbstractInterpreter { String expression = new ExpressionTrimmer(fullExpression).getExpression(); Map<String, Object> variables = Maps.newLinkedHashMap(getVariables()); variables.put("self", target); - if (target != null && target.eResource() != null && target.eResource().getResourceSet() != null) { - registerEcoreModels(target.eResource().getResourceSet().getPackageRegistry()); - } AstResult build; try { build = parsedExpressions.get(expression); @@ -183,15 +195,6 @@ public class AQLSiriusInterpreter extends AcceleoAbstractInterpreter { } } - private void registerEcoreModels(Registry packageRegistry) { - for (String nsURI : packageRegistry.keySet()) { - EPackage pak = packageRegistry.getEPackage(nsURI); - if (pak != null && this.queryEnvironment.getEPackageProvider().getEPackage(pak.getNsPrefix()) == null) { - this.queryEnvironment.registerEPackage(pak); - } - } - } - @Override public String getVariablePrefix() { /* |
