Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcbrun2015-05-05 14:02:13 +0000
committerCedric Brun2015-05-07 08:06:52 +0000
commit65108f46161e6870df69982a296679913dd00314 (patch)
tree1c6a13d682bd22bcee980a9fc572dca6a7f187c8
parentced42b0e68fae6b6eea898136ca8cdafb9d75d13 (diff)
downloadorg.eclipse.sirius-65108f46161e6870df69982a296679913dd00314.tar.gz
org.eclipse.sirius-65108f46161e6870df69982a296679913dd00314.tar.xz
org.eclipse.sirius-65108f46161e6870df69982a296679913dd00314.zip
[463226] Use VariableManager in AQL
After benchmarking the Sirius interpreters it appears that the ListMultimap used to store the current variables in the AQL interpreter has a performance overhead which is 3 times bigger compared to the "VariableManager" (which is already used in the VariableInterpreter and ServiceInterpreter). Bug: 463226 Change-Id: Ia554a195c83103a608e610dd64b05c2d5662265e 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.java15
-rw-r--r--plugins/org.eclipse.sirius.common.acceleo.aql/src/org/eclipse/sirius/common/acceleo/aql/business/internal/AcceleoAbstractInterpreter.java40
2 files changed, 18 insertions, 37 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 a8ca0631f7..6ecdeb8645 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
@@ -10,13 +10,6 @@
*******************************************************************************/
package org.eclipse.sirius.common.acceleo.aql.business.internal;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -66,6 +59,12 @@ import org.eclipse.sirius.ecore.extender.business.api.accessor.EcoreMetamodelDes
import org.eclipse.sirius.ecore.extender.business.api.accessor.MetamodelDescriptor;
import org.eclipse.sirius.ecore.extender.business.api.accessor.ModelAccessor;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
/**
* A Sirius interpreter using the Acceleo Query Language. It only supports
* expressions which are not using implicit variables.
@@ -178,7 +177,7 @@ public class AQLSiriusInterpreter extends AcceleoAbstractInterpreter {
@Override
public Object evaluate(EObject target, String fullExpression) throws EvaluationException {
String expression = new ExpressionTrimmer(fullExpression).getExpression();
- Map<String, Object> variables = Maps.newLinkedHashMap(getVariables());
+ Map<String, Object> variables = getVariables();
variables.put("self", target);
AstResult build;
try {
diff --git a/plugins/org.eclipse.sirius.common.acceleo.aql/src/org/eclipse/sirius/common/acceleo/aql/business/internal/AcceleoAbstractInterpreter.java b/plugins/org.eclipse.sirius.common.acceleo.aql/src/org/eclipse/sirius/common/acceleo/aql/business/internal/AcceleoAbstractInterpreter.java
index 8cf8e36b97..a23188d446 100644
--- a/plugins/org.eclipse.sirius.common.acceleo.aql/src/org/eclipse/sirius/common/acceleo/aql/business/internal/AcceleoAbstractInterpreter.java
+++ b/plugins/org.eclipse.sirius.common.acceleo.aql/src/org/eclipse/sirius/common/acceleo/aql/business/internal/AcceleoAbstractInterpreter.java
@@ -10,9 +10,6 @@
*******************************************************************************/
package org.eclipse.sirius.common.acceleo.aql.business.internal;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import java.util.Collection;
@@ -24,6 +21,7 @@ import java.util.Set;
import org.eclipse.sirius.common.tools.api.interpreter.IInterpreter;
import org.eclipse.sirius.common.tools.api.interpreter.IVariableStatusListener;
import org.eclipse.sirius.common.tools.api.interpreter.JavaExtensionsManager;
+import org.eclipse.sirius.common.tools.api.interpreter.VariableManager;
import org.eclipse.sirius.common.tools.internal.interpreter.AbstractInterpreter;
/**
@@ -45,7 +43,7 @@ public abstract class AcceleoAbstractInterpreter extends AbstractInterpreter {
* consider the value to be a Collection, but setting/unsetting will only
* work one object by one object.
*/
- private ListMultimap<String, Object> variables = ArrayListMultimap.create();
+ private VariableManager variables;
/** This will contain the listeners interested in our variables' status. */
private final Set<IVariableStatusListener> variableStatusListeners = Sets.newHashSet();
@@ -55,6 +53,7 @@ public abstract class AcceleoAbstractInterpreter extends AbstractInterpreter {
*/
public AcceleoAbstractInterpreter() {
javaExtensions = JavaExtensionsManager.createManagerWithOverride();
+ variables = new VariableManager();
}
/**
@@ -91,7 +90,7 @@ public abstract class AcceleoAbstractInterpreter extends AbstractInterpreter {
*/
@Override
public void clearVariables() {
- variables.clear();
+ variables.clearVariables();
notifyVariableListeners();
}
@@ -102,7 +101,7 @@ public abstract class AcceleoAbstractInterpreter extends AbstractInterpreter {
*/
@Override
public void dispose() {
- variables.clear();
+ variables.clearVariables();
variableStatusListeners.clear();
this.javaExtensions.dispose();
@@ -115,13 +114,7 @@ public abstract class AcceleoAbstractInterpreter extends AbstractInterpreter {
*/
@Override
public Object getVariable(String name) {
- if (variables.containsKey(name)) {
- final List<Object> values = variables.get(name);
- if (!values.isEmpty()) {
- return AcceleoAbstractInterpreter.getLast(values);
- }
- }
- return null;
+ return variables.getVariable(name);
}
/**
@@ -130,12 +123,8 @@ public abstract class AcceleoAbstractInterpreter extends AbstractInterpreter {
* @see org.eclipse.sirius.common.tools.api.interpreter.IInterpreter#getVariables()
*/
@Override
- public Map<String, ?> getVariables() {
- Map<String, Object> topMostValues = Maps.newHashMap();
- for (String varName : variables.keySet()) {
- topMostValues.put(varName, getVariable(varName));
- }
- return topMostValues;
+ public Map<String, Object> getVariables() {
+ return variables.getVariables();
}
/**
@@ -184,7 +173,7 @@ public abstract class AcceleoAbstractInterpreter extends AbstractInterpreter {
*/
@Override
public void setVariable(String name, Object value) {
- variables.put(name, value);
+ variables.setVariable(name, value);
}
/**
@@ -194,15 +183,8 @@ public abstract class AcceleoAbstractInterpreter extends AbstractInterpreter {
*/
@Override
public void unSetVariable(String name) {
- if (variables.containsKey(name)) {
- final List<Object> values = variables.get(name);
- if (!values.isEmpty()) {
- final ListIterator<?> iterator = values.listIterator(values.size());
- iterator.previous();
- iterator.remove();
- notifyVariableListeners();
- }
- }
+ variables.unSetVariable(name);
+ notifyVariableListeners();
}
@Override

Back to the top