diff options
| author | cbrun | 2015-05-26 09:07:22 +0000 |
|---|---|---|
| committer | Pierre-Charles David | 2015-05-26 15:32:56 +0000 |
| commit | a7a3d50497c2224e94b58d6bdd0c4a39e785b3ee (patch) | |
| tree | 763fc96d70d6dd9f855428765f3a260fe094b07a | |
| parent | bbbcc69b0abc318c5a971d56d702ea0638563085 (diff) | |
| download | org.eclipse.sirius-a7a3d50497c2224e94b58d6bdd0c4a39e785b3ee.tar.gz org.eclipse.sirius-a7a3d50497c2224e94b58d6bdd0c4a39e785b3ee.tar.xz org.eclipse.sirius-a7a3d50497c2224e94b58d6bdd0c4a39e785b3ee.zip | |
[467860] Introduce a method to trigger the loading of services
Bug: 467860
Change-Id: I3fba920e09a133f5cfef60705c309cfea5dcb1c1
Signed-off-by: Cedric Brun <cedric.brun@obeo.fr>
3 files changed, 41 insertions, 8 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 84f8a87b69..2c99efe3a9 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 @@ -177,6 +177,7 @@ public class AQLSiriusInterpreter extends AcceleoAbstractInterpreter { @Override public Object evaluate(EObject target, String fullExpression) throws EvaluationException { + this.javaExtensions.reloadIfNeeded(); String expression = new ExpressionTrimmer(fullExpression).getExpression(); Map<String, Object> variables = getVariables(); variables.put("self", target); @@ -221,7 +222,8 @@ public class AQLSiriusInterpreter extends AcceleoAbstractInterpreter { @Override public ValidationResult analyzeExpression(IInterpreterContext context, String fullExpression) { - + this.javaExtensions.reloadIfNeeded(); + String trimmedExpression = new ExpressionTrimmer(fullExpression).getExpression(); ValidationResult result = new ValidationResult(); @@ -285,6 +287,14 @@ public class AQLSiriusInterpreter extends AcceleoAbstractInterpreter { * @return The query environment currently used by this interpreter. */ public IQueryEnvironment getQueryEnvironment() { + /* + * The JavaExtensionManager might impact the query environment when + * loading classes. We trigger the reload before returning the + * IQueryEnvironment so that it is properly configured with EPackages + * and imports. + */ + this.javaExtensions.reloadIfNeeded(); + return this.queryEnvironment; } } diff --git a/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/interpreter/JavaExtensionsManager.java b/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/interpreter/JavaExtensionsManager.java index 5dfdc0cb5a..0361eef5b8 100644 --- a/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/interpreter/JavaExtensionsManager.java +++ b/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/interpreter/JavaExtensionsManager.java @@ -82,6 +82,10 @@ public final class JavaExtensionsManager { private List<EPackageLoadingCallback> ePackageCallbacks = Lists.newArrayList(); + private boolean shouldLoadServices = true; + + private boolean shouldLoadEPackages = true; + private ClasspathChangeCallback onWorkspaceChange = new ClasspathChangeCallback() { public void classpathChanged(Set<String> updatedProjects) { @@ -215,8 +219,23 @@ public final class JavaExtensionsManager { * being done concurrently. */ private synchronized void reload() { - reloadEPackages(); - reloadJavaExtensions(); + this.shouldLoadEPackages = true; + this.shouldLoadServices = true; + } + + /*** + * This will trigger the loading of EPackages or java Classes with the + * current configuration (search scope and imports). + */ + public synchronized void reloadIfNeeded() { + if (this.shouldLoadEPackages) { + reloadEPackages(); + this.shouldLoadEPackages = false; + } + if (this.shouldLoadServices) { + loadJavaExtensions(this.imports); + this.shouldLoadServices = false; + } } private void reloadEPackages() { @@ -426,7 +445,7 @@ public final class JavaExtensionsManager { public void addImport(String classQualifiedName) { if (classQualifiedName != null && classQualifiedName.contains(".")) { this.imports.add(classQualifiedName); - loadJavaExtensions(Sets.newHashSet(classQualifiedName)); + this.shouldLoadServices = true; } } @@ -465,10 +484,6 @@ public final class JavaExtensionsManager { this.couldNotBeLoaded.clear(); } - private void reloadJavaExtensions() { - loadJavaExtensions(this.imports); - } - private void loadJavaExtensions(Set<String> addedImports) { Map<String, Class> toUnload = Maps.newLinkedHashMap(); Map<String, Class> toLoad = Maps.newLinkedHashMap(); diff --git a/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/internal/interpreter/ServiceInterpreter.java b/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/internal/interpreter/ServiceInterpreter.java index 4a599359a1..f4be2bb7da 100644 --- a/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/internal/interpreter/ServiceInterpreter.java +++ b/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/internal/interpreter/ServiceInterpreter.java @@ -121,6 +121,7 @@ public class ServiceInterpreter extends VariableInterpreter implements org.eclip @Override public Object evaluate(EObject target, String expression) throws EvaluationException { + javaExtensions.reloadIfNeeded(); Object evaluation = null; if (target != null && expression != null && expression.startsWith(PREFIX)) { String serviceCall = expression.substring(PREFIX.length()).trim(); @@ -253,6 +254,13 @@ public class ServiceInterpreter extends VariableInterpreter implements org.eclip } public Map<String, IService> getServices() { + /* + * The callback registered to the java extension manager might update + * this.services depending on what is loaded. We make sure any pending + * reload is done before returning this list. + */ + javaExtensions.reloadIfNeeded(); + return new HashMap<String, IService>(services); } |
