Bug 518875 Adding new components' translation 

Change-Id: I47ceaac0d606efe63b8af6a9b5dd2b7bacfa63d7
Signed-off-by: Imen Boudhiba <imen.boudhiba@cea.fr>
diff --git a/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/core/InteractionCodeGenerator.java b/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/core/InteractionCodeGenerator.java
index be74fde..c9e1016 100644
--- a/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/core/InteractionCodeGenerator.java
+++ b/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/core/InteractionCodeGenerator.java
@@ -10,6 +10,8 @@
  *******************************************************************************/

 package org.eclipse.efm.modeling.codegen.xlia.core;

 

+import java.util.ArrayList;

+

 import org.eclipse.efm.modeling.codegen.xlia.util.PrettyPrintWriter;

 import org.eclipse.efm.modeling.codegen.xlia.util.StatemachineContext;

 import org.eclipse.efm.modeling.codegen.xlia.util.UmlFactory;

@@ -169,8 +171,6 @@
 			for (Lifeline lifeline : element.getCovereds()) {

 				lfContext = new StatemachineContext(lifeline);

 				

-				// TODO lfContext.isLastFragmentTransformation ???

-				lfContext.isLastFragmentTransformation = false;

 				transformFragment(element, lfContext);

 				

 				lfContext.toWriter(fSupervisor.fStatemachineFactory, writer);

@@ -231,18 +231,33 @@
 	 */

 	private void transformInteractionOperand(InteractionOperand element,

 			StatemachineContext lfContext) {

-

+		

+		ArrayList<InteractionFragment> fragmentList = new ArrayList<InteractionFragment>();

+		

 		for( InteractionFragment iFragment : element.getFragments() ) {

-			

 			if (iFragment.getCovereds().contains(lfContext.coveredLifeline)) {

-				// TODO lfContext.isLastFragmentTransformation ???

-				lfContext.isLastFragmentTransformation = false;

-				transformFragment(iFragment, lfContext);

+				fragmentList.add(iFragment);

 			}

 		}

 		

-		Transition tr_final = lfContext.createTransition(

-				"tr_final", lfContext.currentState, lfContext.finalState);

+		if( fragmentList.isEmpty() ) {

+			lfContext.performNoCoveredFragment();

+		}

+		else {

+			lfContext.isLastFragmentTransformation = false;

+			

+			for( InteractionFragment iFragment : fragmentList ){ //element.getFragments() ) {

+				

+				if (fragmentList.indexOf(iFragment) == fragmentList.size()-1 ) {

+					// lfContext.isLastFragmentTransformation 

+					lfContext.isLastFragmentTransformation = true;

+				}

+				transformFragment(iFragment, lfContext);

+			}

+			

+			//Transition tr_final = lfContext.createTransition(

+			//		"tr_final", lfContext.currentState, lfContext.finalState);

+		}

 	}

 

 	/**

@@ -252,21 +267,34 @@
 	 */

 	public void transformCombinedFragment(CombinedFragment element,

 			StatemachineContext lfContext) {

-

-		if (element.getInteractionOperator() == InteractionOperatorKind.LOOP_LITERAL) {

+		

+		switch (element.getInteractionOperator()) {

+		case LOOP_LITERAL:

 			transformCombinedFragmentLoop(element, lfContext);

-		}

-		

-		else if (element.getInteractionOperator()== InteractionOperatorKind.ALT_LITERAL) {

+			break;

+

+		case ALT_LITERAL:

 			transformCombinedFragmentAlt(element, lfContext);

-		}

-		

-		else if (element.getInteractionOperator()== InteractionOperatorKind.OPT_LITERAL) {

+			break;

+

+		case OPT_LITERAL:

 			transformCombinedFragmentOpt(element, lfContext);

-		}

-		

-		else if (element.getInteractionOperator()== InteractionOperatorKind.STRICT_LITERAL) {

+			break;

+

+		case SEQ_LITERAL:

+			transformCombinedFragmentSequence(element, lfContext);

+			break;

+

+		case STRICT_LITERAL:

 			transformCombinedFragmentStrict(element, lfContext);

+			break;

+

+		case PAR_LITERAL:

+			transformCombinedFragmentParallel(element, lfContext);

+			break;

+

+		default:

+			break;

 		}

 	}

 

@@ -312,7 +340,6 @@
 				"tr_quit_loop", loopState, quitloopState);

 		lfContext.currentState = quitloopState;

 		

-		

 		StatemachineContext loopContext = new StatemachineContext(lfContext, element);

 		

 		for( InteractionOperand iFragment : element.getOperands()) {

@@ -361,38 +388,129 @@
 }

 

 

+//////////////////////////////////////Transform Sequence Fragment //////////////////////////////

+////////////////////////////////////////////////////////////////////////////////////////////

+// TODO

+public void transformCombinedFragmentSequence(

+		CombinedFragment element, StatemachineContext lfContext) {

+

+	lfContext.currentState.setName("SeqFragment#" + element.getName());

+	State exitSeqState = lfContext.createTargetState("exit_seq#" + element.getName());

+

+	State regionSeqState = lfContext.createTargetState("target_seq#" + element.getName());

+	for( InteractionOperand iFragment : element.getOperands()) {

+

+		Constraint regionGuard = iFragment.getGuard();

+

+		Transition entrySeq = lfContext.createTransition(

+				"tr_seq_region#" + iFragment.getName(), lfContext.currentState, regionSeqState);

+		//	UmlFactory.setGuard(entryStrict, regionGuard);			

+

+		StatemachineContext seqContext = new StatemachineContext(lfContext, iFragment);

+

+		transformInteractionOperand(iFragment, seqContext);

+

+	}

+

+	Transition exitSeq = lfContext.createTransition(

+			"tr_seq_quit#" + element.getName(), lfContext.currentState, exitSeqState);

+	lfContext.currentState = exitSeqState;

+}

+

+

 //////////////////////////////////////Transform Strict Fragment //////////////////////////////

 ////////////////////////////////////////////////////////////////////////////////////////////

 

-public void transformCombinedFragmentStrict(CombinedFragment element,

-StatemachineContext lfContext) {

+public void transformCombinedFragmentStrict(

+		CombinedFragment element, StatemachineContext lfContext) {

 

 	lfContext.currentState.setName("StrictFragment#" + element.getName());

-	State exitStrictState = lfContext.createTargetState("exit_strict#" + element.getName());

 	

-	State regionStrictState = lfContext.createTargetState("target_strict#" + element.getName());

+	State elseStrictState = null;

+	Transition elseStrictTransition = null;

+	State operandStrictState = null;

+

 	for( InteractionOperand iFragment : element.getOperands()) {

-		

-			Constraint regionGuard = iFragment.getGuard();

-			Transition entryStrict = lfContext.createTransition(

-					"tr_strict_region#" + iFragment.getName(), lfContext.currentState, regionStrictState);

-			UmlFactory.setGuard(entryStrict, regionGuard);

-			StatemachineContext strictContext = new StatemachineContext(lfContext, element);

-			

-			transformInteractionOperand(iFragment, strictContext);

-			

+

+		if( elseStrictState != null ) {

+			elseStrictState.setName("strict#" + iFragment.getName());

+			operandStrictState = elseStrictState;

+			elseStrictState = null;

 		}

+		else {

+			operandStrictState = lfContext.createNewState("strict#" + iFragment.getName());

+		}

+		Transition operandStrictTransition = lfContext.createTransition(

+				"tr_strict_region#" + iFragment.getName(), lfContext.currentState, operandStrictState);

 		

+		Constraint regionGuard = iFragment.getGuard();

+		if( regionGuard != null ) {

+			UmlFactory.setGuard(operandStrictTransition, regionGuard);

+			

+			// previous else transition

+			if( elseStrictTransition != null ) {

+				UmlFactory.setGuard(elseStrictTransition, regionGuard);

+				

+			}

+			

+			elseStrictState = lfContext.createNewState("else_strict#" + iFragment.getName());

+			

+			elseStrictTransition = lfContext.createTransition(

+					"tr_else_strict_region#" + iFragment.getName(), lfContext.currentState, elseStrictState);

+		}

+			

+		lfContext.currentState = operandStrictState;

+

+		StatemachineContext strictContext = new StatemachineContext(lfContext, iFragment);

+

+		transformInteractionOperand(iFragment, strictContext);

+	}

+

+	if( elseStrictState != null ) {

+		elseStrictState.setName("exit_strict#" + element.getName());

+	}

+	else {

+		elseStrictState = lfContext.createTargetState("exit_strict#" + element.getName());

+	}

 	Transition exitStrict = lfContext.createTransition(

-			"tr_strict_quit#" + element.getName(), regionStrictState, exitStrictState);

-		lfContext.currentState = exitStrictState;

+			"tr_strict_quit#" + element.getName(), lfContext.currentState, elseStrictState);

+	lfContext.currentState = elseStrictState;

+}

+

+

+//////////////////////////////////////Transform Parallel Fragment //////////////////////////////

+////////////////////////////////////////////////////////////////////////////////////////////

+//TODO

+

+public void transformCombinedFragmentParallel(

+		CombinedFragment element, StatemachineContext lfContext) {

+

+	lfContext.currentState.setName("ParFragment#" + element.getName());

+	State exitParState = lfContext.createTargetState("exit_par#" + element.getName());

+

+	State regionStrictState = lfContext.createTargetState("target_par#" + element.getName());

+	for( InteractionOperand iFragment : element.getOperands()) {

+

+		Constraint regionGuard = iFragment.getGuard();

+		//	Transition entryStrict = lfContext.createTransition(

+		//			"tr_strict_region#" + iFragment.getName(), lfContext.currentState, regionStrictState);

+		//	UmlFactory.setGuard(entryStrict, regionGuard);			

+

+		StatemachineContext parContext = new StatemachineContext(lfContext, iFragment);

+

+		transformInteractionOperand(iFragment, parContext);

+

+	}

+

+	Transition exitPar = lfContext.createTransition(

+			"tr_par_quit#" + element.getName(), lfContext.currentState, exitParState);

+	lfContext.currentState = exitParState;

 

 

 }

 

 

 

-

 //////////////////////////////////////Transform Opt Fragment //////////////////////////////

 ////////////////////////////////////////////////////////////////////////////////////////////

 

@@ -507,7 +625,7 @@
 		lfContext.currentState.setName("MsgOcc#" + element.getName());

 		State targetState = lfContext.createTargetState("targetMsgOcc#" + element.getName());

 		Transition MsgOcc_tr= lfContext.createTransition(

-				element.getName(), lfContext.currentState, targetState);

+				"tr_" + element.getName(), lfContext.currentState, targetState);

 			

 		Message message = element.getMessage();

 		if( element.isReceive() ){

@@ -515,8 +633,7 @@
 			StringBuffer MsgReceiveAction = new StringBuffer("input ");

 			lfContext.inputMessage.add(message);

 

-			MsgReceiveAction

-				.append(message.getReceiveEvent().getLabel());//.getSignature().getLabel() )

+			MsgReceiveAction.append( message.getSignature().getLabel() );//.getSignature().getLabel() )

 			if (! (message.getArguments().isEmpty()) ){

 				boolean isnotFirst = false;

 

@@ -542,7 +659,7 @@
 			StringBuffer MsgReceiveAction = new StringBuffer("output ");

 			lfContext.outputMessage.add(message);

 			

-			MsgReceiveAction.append(message.getSignature().getLabel() );

+			MsgReceiveAction.append( message.getSignature().getLabel() );

 			

 			if (! (message.getArguments().isEmpty()) ){

 				MsgReceiveAction.append("(");

@@ -561,7 +678,7 @@
 				MsgReceiveAction.append(" )");	

 			}

 			

-			MsgReceiveAction.append(" to ");

+			MsgReceiveAction.append(" --> ");

 			

 			

 			if (message.getReceiveEvent() instanceof MessageOccurrenceSpecification){

diff --git a/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/core/MainCodeGenerator.java b/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/core/MainCodeGenerator.java
index 8880254..edb518e 100644
--- a/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/core/MainCodeGenerator.java
+++ b/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/core/MainCodeGenerator.java
@@ -204,7 +204,7 @@
 			fStatemachineFactory.transformState((State)element, writer);
 		}
 		else if( element instanceof Vertex ) {
-			fStatemachineFactory.transformVertexContent((Vertex)element, writer);
+			fStatemachineFactory.transformVertexTransition((Vertex)element, writer);
 		}
 		else if( element instanceof Transition ) {
 			fStatemachineFactory.transformTransition((Transition)element, writer);
diff --git a/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/core/StatemachineCodeGenerator.java b/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/core/StatemachineCodeGenerator.java
index 482bb19..b14f9b0 100644
--- a/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/core/StatemachineCodeGenerator.java
+++ b/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/core/StatemachineCodeGenerator.java
@@ -73,7 +73,7 @@
 			transformState((State)element, writer);
 		}
 		else if( element instanceof Vertex ) {
-			transformVertexContent((Vertex)element, writer);
+			transformVertexTransition((Vertex)element, writer);
 		}
 		else if( element instanceof Transition ) {
 			transformTransition((Transition)element, writer);
@@ -257,7 +257,7 @@
 			.append(element.getName())
 			.appendEol(" {");
 
-		transformVertexContent(element, writer);
+		transformVertexTransition(element, writer);
 
 		writer.appendTab("} // end pseudo-state ")
 			.appendEol2(element.getName());
@@ -274,7 +274,7 @@
 			.append(element.getName())
 			.appendEol(" {");
 
-		transformVertexContent(element, writer);
+		transformVertexTransition(element, writer);
 
 		writer.appendTab("} // end final-state ")
 			.appendEol2(element.getName());
@@ -299,12 +299,15 @@
 
 		transformStateActivity(element, writer);
 
-		transformVertexContent(element, writer);
-
 		transformConnectionPoint(element, writer);
 
 		transformRegion(element.getRegions(), writer);
 
+		if( ! element.getRegions().isEmpty() ) {
+			writer.appendTab2Eol("@transition:");
+		}
+		transformVertexTransition(element, writer);
+
 		writer.appendTab("} // end state ")
 			.appendEol2(element.getName());
 	}
@@ -362,7 +365,7 @@
 			.append(element.getName())
 			.appendEol(" {");
 
-		transformVertexContent(element, writer);
+		transformVertexTransition(element, writer);
 
 		writer.appendTab("} // end vertex ")
 			.appendEol2(element.getName());
@@ -373,7 +376,7 @@
 	 * @param element
 	 * @param writer
 	 */
-	public void transformVertexContent(
+	public void transformVertexTransition(
 			Vertex element, PrettyPrintWriter writer) {
 		// A writer indenting with TAB + iTAB -> TAB2
 		PrettyPrintWriter writer2 = writer.itab2();
diff --git a/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/util/StatemachineContext.java b/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/util/StatemachineContext.java
index 534a4e1..f937143 100644
--- a/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/util/StatemachineContext.java
+++ b/codegen/org.eclipse.efm.modeling.codegen.xlia/src/org/eclipse/efm/modeling/codegen/xlia/util/StatemachineContext.java
@@ -16,9 +16,9 @@
 import org.eclipse.uml2.uml.Constraint;

 import org.eclipse.uml2.uml.Expression;

 import org.eclipse.uml2.uml.FinalState;

+import org.eclipse.uml2.uml.InteractionFragment;

 import org.eclipse.uml2.uml.Lifeline;

 import org.eclipse.uml2.uml.Message;

-import org.eclipse.uml2.uml.NamedElement;

 import org.eclipse.uml2.uml.Pseudostate;

 import org.eclipse.uml2.uml.Region;

 import org.eclipse.uml2.uml.State;

@@ -31,6 +31,8 @@
 public class StatemachineContext {

 	

 	public Lifeline coveredLifeline;

+	

+	protected InteractionFragment interactionFragment;

 

 	public StatemachineContext parentContext;

 	

@@ -63,12 +65,11 @@
 //	}	

 //	

 	

-	

-	

-	

 	public StatemachineContext(Lifeline lifeline) {

 		coveredLifeline = lifeline;

 		

+		interactionFragment = null;

+		

 		inputMessage = new ArrayList<Message>();

 		outputMessage = new ArrayList<Message>();

 		

@@ -90,9 +91,11 @@
 //		Property varY = UmlFactory.createVariable(statemachine, "top_" + lifeline.getName(), UmlFactory.integerType());

 	}	

 	

-	public StatemachineContext(StatemachineContext parentCtx, NamedElement element) {

+	public StatemachineContext(StatemachineContext parentCtx, InteractionFragment element) {

 		coveredLifeline = parentCtx.coveredLifeline;

 		

+		interactionFragment = element;

+		

 		inputMessage = parentCtx.inputMessage;

 		outputMessage = parentCtx.outputMessage;

 

@@ -101,7 +104,7 @@
 		statemachine = parentCtx.statemachine;

 		

 		region = parentCtx.currentState.createRegion(element.getName());

-		

+

 		initializeState(element.getName());

 	}

 	

@@ -118,6 +121,25 @@
 				"final_" + name, UMLPackage.eINSTANCE.getFinalState());

 	}

 	

+	

+	public void performNoCoveredFragment() {

+		if( (interactionFragment != null)

+			&& (region.getTransitions().size() == 1)

+			&& (region.getSubvertices().size() == 3)

+			&& (region.getTransitions().get(0).getSource() == initialState)

+			&& (region.getTransitions().get(0).getTarget() == currentState) )

+		{

+			region.getTransitions().get(0).setTarget(finalState);

+			region.getSubvertices().remove(currentState);

+			

+			currentState = finalState;

+			

+			System.out.println("performNoCoveredFragment for lifeline <" +

+					coveredLifeline.getName() + "> covered by fragment : " + interactionFragment.getName() );

+		}

+	}

+

+	

 	///////////////////////////////////////////////////////////////////////////

 	// [COMPOSITE] STATE 

 	///////////////////////////////////////////////////////////////////////////

@@ -143,6 +165,13 @@
 	}

 

 	

+	public State createNewState(String name) {

+		State state = (State) region.createSubvertex(name, UMLPackage.eINSTANCE.getState());

+		

+		return( state );

+	}

+

+	

 	///////////////////////////////////////////////////////////////////////////

 	// TRANSITION

 	///////////////////////////////////////////////////////////////////////////

@@ -193,5 +222,6 @@
 		statemachineCodegen.transformStatemachine(

 				statemachine, inputMessage, writer);

 	}

+

 }