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