Bug 580098 - Improve controller loop performances
Change-Id: If6d33ccebf34a2a9019a89cfc7fa4c0a42199e2c
Signed-off-by: Sebastien Revol <sebastien.revol@cea.fr>
diff --git a/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/AbstractExternallyControlledVisitor.java b/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/AbstractExternallyControlledVisitor.java
index e4442f0..8076bf5 100644
--- a/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/AbstractExternallyControlledVisitor.java
+++ b/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/AbstractExternallyControlledVisitor.java
@@ -56,7 +56,6 @@
public abstract IExternallyControlledVisitor<? extends ISemanticVisitor> getStackParent();
-
@Override
public List<IControllerAdvice> getRegisteredAdvices() {
return advices;
diff --git a/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/ExternalController.java b/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/ExternalController.java
index 54a79eb..179328d 100644
--- a/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/ExternalController.java
+++ b/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/ExternalController.java
@@ -20,6 +20,9 @@
public class ExternalController {
protected IControlledVisitorPushPullStrategy pushPullStrategy;
+
+
+ IExternallyControlledVisitor<? extends ISemanticVisitor> lastPulledVisitor= null;
public ExternalController(IControlledVisitorPushPullStrategy strategy) {
this.pushPullStrategy = strategy;
@@ -32,7 +35,14 @@
public void step() {
// this is the responsibility of the pushPullStrategy to provide only visitors
// that can execute
- IExternallyControlledVisitor<? extends ISemanticVisitor> visitor = pushPullStrategy.pullEnabledVisitor();
+ IExternallyControlledVisitor<? extends ISemanticVisitor> visitor=null;
+ if (lastPulledVisitor != null) {
+ visitor = lastPulledVisitor;
+ lastPulledVisitor = null;
+ }else {
+ visitor = pushPullStrategy.pullEnabledVisitor();
+ }
+
// we perform a first loop on all visitors that can execute now
while (visitor != null) {
visitor.doExecute();
@@ -41,7 +51,12 @@
}
public boolean hasEnabledVisitors() {
- return pushPullStrategy.hasEnabledVisitors();
+ //TODO Check if there is no cases where the the lastPulledVisitor finally can't execute...
+ if (lastPulledVisitor != null ) {
+ return true;
+ }
+ lastPulledVisitor = pushPullStrategy.pullEnabledVisitor();
+ return lastPulledVisitor != null;
}
}
diff --git a/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/IControlledVisitorPushPullStrategy.java b/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/IControlledVisitorPushPullStrategy.java
index a769ecc..1a895b1 100644
--- a/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/IControlledVisitorPushPullStrategy.java
+++ b/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/IControlledVisitorPushPullStrategy.java
@@ -22,6 +22,5 @@
public IExternallyControlledVisitor<? extends ISemanticVisitor> pullEnabledVisitor();
public void pushVisitor(IExternallyControlledVisitor<? extends ISemanticVisitor> visitor);
- public boolean hasEnabledVisitors();
}
diff --git a/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/LIFOPushPullStrategy.java b/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/LIFOPushPullStrategy.java
index beaa3e3..c87e0ee 100644
--- a/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/LIFOPushPullStrategy.java
+++ b/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/LIFOPushPullStrategy.java
@@ -42,15 +42,6 @@
visitors.push(visitor);
}
- @Override
- public boolean hasEnabledVisitors() {
- Iterator<IExternallyControlledVisitor<? extends ISemanticVisitor>> visitorIterator = visitors.iterator();
- while (visitorIterator.hasNext()){
- if (visitorIterator.next().isExecutionAllowed()){
- return true;
- }
- }
- return false;
- }
+
}
diff --git a/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/NodeEdgeAlternatePushPullStrategy.java b/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/NodeEdgeAlternatePushPullStrategy.java
index b86cf5f..08f2d37 100644
--- a/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/NodeEdgeAlternatePushPullStrategy.java
+++ b/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/controller/NodeEdgeAlternatePushPullStrategy.java
@@ -91,37 +91,7 @@
}
- @Override
- public boolean hasEnabledVisitors() {
- Iterator<IExternallyControlledVisitor<? extends ISemanticVisitor>> visitorIterator = startingActionVisitors.iterator();
- while (visitorIterator.hasNext()){
- if (visitorIterator.next().isExecutionAllowed()){
- return true;
- }
- }
-
- visitorIterator = finishingActionVisitors.iterator();
- while (visitorIterator.hasNext()){
- if (visitorIterator.next().isExecutionAllowed()){
- return true;
- }
- }
-
- visitorIterator = startingOthers.iterator();
- while (visitorIterator.hasNext()){
- if (visitorIterator.next().isExecutionAllowed()){
- return true;
- }
- }
-
- visitorIterator = finishingOthers.iterator();
- while (visitorIterator.hasNext()){
- if (visitorIterator.next().isExecutionAllowed()){
- return true;
- }
- }
- return false;
- }
+
}
diff --git a/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/semantics/ExternalControlExecutionFactory.java b/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/semantics/ExternalControlExecutionFactory.java
index 82b7190..822e1c0 100644
--- a/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/semantics/ExternalControlExecutionFactory.java
+++ b/externalcontrol/bundles/org.eclipse.papyrus.moka.externalcontrol/src/org/eclipse/papyrus/moka/externalcontrol/semantics/ExternalControlExecutionFactory.java
@@ -86,10 +86,15 @@
IExternallyControlledVisitor<? extends ISemanticVisitor> controlledVisitor= null;
List<IControllerAdvice> adviceList = getControllerAdvices(element, delegatedVisitor);
+
+ if (adviceList.isEmpty()) {
+ return delegatedVisitor;
+ }
+
if(delegatedVisitor instanceof ActivityExecution){
controlledVisitor= new ExternallyControlledActivityExecution((ActivityExecution)delegatedVisitor, controller, adviceList);
- }else if (delegatedVisitor instanceof CallActionActivation && isNotInLoopNodeTest(element)) {
+ }else if (delegatedVisitor instanceof CallActionActivation ) {
controlledVisitor= new ExternallyControlledCallActionActivation((CallActionActivation) delegatedVisitor, controller, adviceList);
}