diff options
| author | cbrun | 2015-05-05 14:02:13 +0000 |
|---|---|---|
| committer | Cedric Brun | 2015-05-07 08:06:52 +0000 |
| commit | 65108f46161e6870df69982a296679913dd00314 (patch) | |
| tree | 1c6a13d682bd22bcee980a9fc572dca6a7f187c8 | |
| parent | ced42b0e68fae6b6eea898136ca8cdafb9d75d13 (diff) | |
| download | org.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>
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 |
