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);
 		}