Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcbrun2015-03-18 11:04:09 +0000
committercbrun2015-04-17 16:12:53 +0000
commit64aaa7a8c69a8191ee0401968e57c2df7d96ba39 (patch)
tree0077d9b42af7d8bfdb6a6d56990913e79839f2a3
parentd6f03116306271a4639cd9c4fc03e98c8402fb47 (diff)
downloadorg.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.java31
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() {
/*

Back to the top