use of org.softlang.metalib.xtext.fsml.fsml.FSMState in project metalib by softlang.
the class FsmlGenerator method doGenerate.
@Override
public void doGenerate(final Resource resource, final IFileSystemAccess2 fsa, final IGeneratorContext context) {
final String packageName = this.getPackageName(resource);
final String packagePath = this.getPackagePath(resource);
TreeIterator<EObject> _allContents = resource.getAllContents();
Iterator<FSM> _filter = Iterators.<FSM>filter(_allContents, FSM.class);
Iterable<FSM> _iterable = IteratorExtensions.<FSM>toIterable(_filter);
for (final FSM fsm : _iterable) {
{
EList<FSMState> _states = fsm.getStates();
final Function1<FSMState, String> _function = (FSMState s) -> {
return s.getName();
};
List<String> _map = ListExtensions.<FSMState, String>map(_states, _function);
final Set<String> states = IterableExtensions.<String>toSet(_map);
EList<FSMState> _states_1 = fsm.getStates();
final Function1<FSMState, Boolean> _function_1 = (FSMState s) -> {
return Boolean.valueOf(s.isInitial());
};
FSMState _findFirst = IterableExtensions.<FSMState>findFirst(_states_1, _function_1);
final String initial = _findFirst.getName();
EList<FSMState> _states_2 = fsm.getStates();
final Function1<FSMState, List<String>> _function_2 = (FSMState s) -> {
EList<FSMTransition> _transitions = s.getTransitions();
final Function1<FSMTransition, String> _function_3 = (FSMTransition t) -> {
return t.getInput();
};
return ListExtensions.<FSMTransition, String>map(_transitions, _function_3);
};
List<List<String>> _map_1 = ListExtensions.<FSMState, List<String>>map(_states_2, _function_2);
Iterable<String> _flatten = Iterables.<String>concat(_map_1);
final Set<String> inputs = IterableExtensions.<String>toSet(_flatten);
EList<FSMState> _states_3 = fsm.getStates();
final Function1<FSMState, Iterable<String>> _function_3 = (FSMState s) -> {
EList<FSMTransition> _transitions = s.getTransitions();
final Function1<FSMTransition, Boolean> _function_4 = (FSMTransition t) -> {
String _action = t.getAction();
return Boolean.valueOf((!Objects.equal(_action, null)));
};
Iterable<FSMTransition> _filter_1 = IterableExtensions.<FSMTransition>filter(_transitions, _function_4);
final Function1<FSMTransition, String> _function_5 = (FSMTransition t) -> {
return t.getAction();
};
return IterableExtensions.<FSMTransition, String>map(_filter_1, _function_5);
};
List<Iterable<String>> _map_2 = ListExtensions.<FSMState, Iterable<String>>map(_states_3, _function_3);
Iterable<String> _flatten_1 = Iterables.<String>concat(_map_2);
final Set<String> actions = IterableExtensions.<String>toSet(_flatten_1);
StringConcatenation _builder = new StringConcatenation();
_builder.append("package ");
_builder.append(packageName, "");
_builder.append(";");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("public enum State");
_builder.newLine();
_builder.append("{");
_builder.newLine();
_builder.append("\t");
{
boolean _hasElements = false;
for (final String x : states) {
if (!_hasElements) {
_hasElements = true;
} else {
_builder.appendImmediate(", ", "\t");
}
_builder.append(x, "\t");
}
}
_builder.newLineIfNotEmpty();
_builder.append("}");
fsa.generateFile((packagePath + "/State.java"), _builder);
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("package ");
_builder_1.append(packageName, "");
_builder_1.append(";");
_builder_1.newLineIfNotEmpty();
_builder_1.newLine();
_builder_1.append("public enum Input");
_builder_1.newLine();
_builder_1.append("{");
_builder_1.newLine();
_builder_1.append("\t");
{
boolean _hasElements_1 = false;
for (final String x_1 : inputs) {
if (!_hasElements_1) {
_hasElements_1 = true;
} else {
_builder_1.appendImmediate(", ", "\t");
}
_builder_1.append(x_1, "\t");
}
}
_builder_1.newLineIfNotEmpty();
_builder_1.append("}");
fsa.generateFile((packagePath + "/Input.java"), _builder_1);
StringConcatenation _builder_2 = new StringConcatenation();
_builder_2.append("package ");
_builder_2.append(packageName, "");
_builder_2.append(";");
_builder_2.newLineIfNotEmpty();
_builder_2.newLine();
_builder_2.append("public enum Action");
_builder_2.newLine();
_builder_2.append("{");
_builder_2.newLine();
_builder_2.append("\t");
{
boolean _hasElements_2 = false;
for (final String x_2 : actions) {
if (!_hasElements_2) {
_hasElements_2 = true;
} else {
_builder_2.appendImmediate(", ", "\t");
}
_builder_2.append(x_2, "\t");
}
}
_builder_2.newLineIfNotEmpty();
_builder_2.append("}");
fsa.generateFile((packagePath + "/Action.java"), _builder_2);
StringConcatenation _builder_3 = new StringConcatenation();
_builder_3.append("package ");
_builder_3.append(packageName, "");
_builder_3.append(";");
_builder_3.newLineIfNotEmpty();
_builder_3.newLine();
_builder_3.append("import org.softlang.metalib.xtext.fsml.runtime.HandlerBase;");
_builder_3.newLine();
_builder_3.newLine();
_builder_3.append("public abstract class Handler implements HandlerBase<Action>");
_builder_3.newLine();
_builder_3.append("{");
_builder_3.newLine();
_builder_3.append("\t");
_builder_3.append("@Override");
_builder_3.newLine();
_builder_3.append("\t");
_builder_3.append("public void handle(Action action)");
_builder_3.newLine();
_builder_3.append("\t");
_builder_3.append("{");
_builder_3.newLine();
_builder_3.append("\t\t");
_builder_3.append("if(action == null)");
_builder_3.newLine();
_builder_3.append("\t\t");
_builder_3.append("{");
_builder_3.newLine();
_builder_3.append("\t\t\t");
_builder_3.append("throw new IllegalArgumentException(\"null\");");
_builder_3.newLine();
_builder_3.append("\t\t");
_builder_3.append("}");
_builder_3.newLine();
_builder_3.append("\t\t");
_builder_3.newLine();
_builder_3.append("\t\t");
_builder_3.append("switch(action)");
_builder_3.newLine();
_builder_3.append("\t\t");
_builder_3.append("{");
_builder_3.newLine();
{
for (final String x_3 : actions) {
_builder_3.append("\t\t\t");
_builder_3.append("case ");
_builder_3.append(x_3, "\t\t\t");
_builder_3.append(":");
_builder_3.newLineIfNotEmpty();
_builder_3.append("\t\t\t");
_builder_3.append("\t");
_builder_3.append("handle");
String _firstUpper = StringExtensions.toFirstUpper(x_3);
_builder_3.append(_firstUpper, "\t\t\t\t");
_builder_3.append("();");
_builder_3.newLineIfNotEmpty();
_builder_3.append("\t\t\t");
_builder_3.append("\t");
_builder_3.append("return;");
_builder_3.newLine();
}
}
_builder_3.append("\t\t\t");
_builder_3.newLine();
_builder_3.append("\t\t\t");
_builder_3.append("default:");
_builder_3.newLine();
_builder_3.append("\t\t\t");
_builder_3.append("throw new IllegalArgumentException(action.toString());");
_builder_3.newLine();
_builder_3.append("\t\t");
_builder_3.append("}");
_builder_3.newLine();
_builder_3.append("\t");
_builder_3.append("}");
_builder_3.newLine();
_builder_3.append("\t");
_builder_3.newLine();
{
for (final String x_4 : actions) {
_builder_3.append("\t");
_builder_3.append("protected void handle");
String _firstUpper_1 = StringExtensions.toFirstUpper(x_4);
_builder_3.append(_firstUpper_1, "\t");
_builder_3.append("()");
_builder_3.newLineIfNotEmpty();
_builder_3.append("\t");
_builder_3.append("{");
_builder_3.newLine();
_builder_3.append("\t");
_builder_3.append("\t");
_builder_3.append("unhandled(Action.");
_builder_3.append(x_4, "\t\t");
_builder_3.append(");");
_builder_3.newLineIfNotEmpty();
_builder_3.append("\t");
_builder_3.append("}");
_builder_3.newLine();
_builder_3.append("\t");
_builder_3.newLine();
}
}
_builder_3.append("\t");
_builder_3.newLine();
_builder_3.append("\t");
_builder_3.append("protected void unhandled(Action action)");
_builder_3.newLine();
_builder_3.append("\t");
_builder_3.append("{");
_builder_3.newLine();
_builder_3.append("\t\t");
_builder_3.append("final Class<?> c = getClass();");
_builder_3.newLine();
_builder_3.append("\t\t");
_builder_3.newLine();
_builder_3.append("\t\t");
_builder_3.append("System.out.println(\"Unhandled action in \" + (c.isAnonymousClass() ? \"anonymous class\" : c.getSimpleName()) + \": \" + action);");
_builder_3.newLine();
_builder_3.append("\t");
_builder_3.append("}");
_builder_3.newLine();
_builder_3.append("}");
fsa.generateFile((packagePath + "/Handler.java"), _builder_3);
StringConcatenation _builder_4 = new StringConcatenation();
_builder_4.append("package ");
_builder_4.append(packageName, "");
_builder_4.append(";");
_builder_4.newLineIfNotEmpty();
_builder_4.newLine();
_builder_4.append("import org.softlang.metalib.xtext.fsml.runtime.HandlerBase;");
_builder_4.newLine();
_builder_4.append("import org.softlang.metalib.xtext.fsml.runtime.StepperBase;");
_builder_4.newLine();
_builder_4.newLine();
_builder_4.append("public class Stepper extends StepperBase<State, Input, Action>");
_builder_4.newLine();
_builder_4.append("{");
_builder_4.newLine();
_builder_4.append("\t");
_builder_4.append("public Stepper(HandlerBase<Action> handler)");
_builder_4.newLine();
_builder_4.append("\t");
_builder_4.append("{");
_builder_4.newLine();
_builder_4.append("\t\t");
_builder_4.append("this.handler = handler;");
_builder_4.newLine();
_builder_4.append("\t\t");
_builder_4.append("this.state = State.");
_builder_4.append(initial, "\t\t");
_builder_4.append(";");
_builder_4.newLineIfNotEmpty();
_builder_4.append("\t\t");
_builder_4.newLine();
{
EList<FSMState> _states_4 = fsm.getStates();
for (final FSMState s : _states_4) {
{
EList<FSMTransition> _transitions = s.getTransitions();
for (final FSMTransition t : _transitions) {
_builder_4.append("\t\t");
_builder_4.append("add(State.");
String _name = s.getName();
_builder_4.append(_name, "\t\t");
_builder_4.append(", Input.");
String _input = t.getInput();
_builder_4.append(_input, "\t\t");
_builder_4.append(", ");
{
String _action = t.getAction();
boolean _notEquals = (!Objects.equal(_action, null));
if (_notEquals) {
_builder_4.append("Action.");
String _action_1 = t.getAction();
_builder_4.append(_action_1, "\t\t");
} else {
_builder_4.append("null");
}
}
_builder_4.append(", State.");
FSMState _destinationState = this.getDestinationState(t);
String _name_1 = _destinationState.getName();
_builder_4.append(_name_1, "\t\t");
_builder_4.append(");");
_builder_4.newLineIfNotEmpty();
}
}
}
}
_builder_4.append("\t");
_builder_4.append("}");
_builder_4.newLine();
_builder_4.append("}");
fsa.generateFile((packagePath + "/Stepper.java"), _builder_4);
StringConcatenation _builder_5 = new StringConcatenation();
_builder_5.append("(");
_builder_5.newLine();
_builder_5.append(" ");
_builder_5.append("% States");
_builder_5.newLine();
_builder_5.append(" ");
_builder_5.append("[");
_builder_5.newLine();
_builder_5.append(" ");
{
EList<FSMState> _states_5 = fsm.getStates();
boolean _hasElements_3 = false;
for (final FSMState s_1 : _states_5) {
if (!_hasElements_3) {
_hasElements_3 = true;
} else {
_builder_5.appendImmediate(",\r\n", " ");
}
_builder_5.append("\t(");
String _name_2 = s_1.getName();
_builder_5.append(_name_2, " ");
_builder_5.append(",");
String _name_3 = s_1.getName();
_builder_5.append(_name_3, " ");
_builder_5.append(",ellipse,[");
{
boolean _isInitial = s_1.isInitial();
if (_isInitial) {
_builder_5.append("filled");
}
}
_builder_5.append("])");
}
}
_builder_5.newLineIfNotEmpty();
_builder_5.append(" ");
_builder_5.append("],");
_builder_5.newLine();
_builder_5.append(" ");
_builder_5.append("% Edges");
_builder_5.newLine();
_builder_5.append(" ");
_builder_5.append("[");
_builder_5.newLine();
_builder_5.append(" ");
{
EList<FSMState> _states_6 = fsm.getStates();
final Function1<FSMState, EList<FSMTransition>> _function_4 = (FSMState it) -> {
return it.getTransitions();
};
List<EList<FSMTransition>> _map_3 = ListExtensions.<FSMState, EList<FSMTransition>>map(_states_6, _function_4);
Iterable<FSMTransition> _flatten_2 = Iterables.<FSMTransition>concat(_map_3);
boolean _hasElements_4 = false;
for (final FSMTransition t_1 : _flatten_2) {
if (!_hasElements_4) {
_hasElements_4 = true;
} else {
_builder_5.appendImmediate(",\r\n", " ");
}
_builder_5.append(" (");
FSMState _containingState = this.getContainingState(t_1);
String _name_4 = _containingState.getName();
_builder_5.append(_name_4, " ");
_builder_5.append(",");
FSMState _destinationState_1 = this.getDestinationState(t_1);
String _name_5 = _destinationState_1.getName();
_builder_5.append(_name_5, " ");
_builder_5.append(",[");
String _graphLabel = this.getGraphLabel(t_1);
_builder_5.append(_graphLabel, " ");
_builder_5.append("])");
}
}
_builder_5.newLineIfNotEmpty();
_builder_5.append(" ");
_builder_5.append("]");
_builder_5.newLine();
_builder_5.append(").");
_builder_5.newLine();
fsa.generateFile((packagePath + ".dgl"), _builder_5);
}
}
}
use of org.softlang.metalib.xtext.fsml.fsml.FSMState in project metalib by softlang.
the class FsmlValidator method incomingStates.
/**
* Returns all states that have the given state as target in any of their transitions
*/
public Iterable<FSMState> incomingStates(final FSMState s) {
EObject _eContainer = s.eContainer();
final FSM fsm = ((FSM) _eContainer);
EList<FSMState> _states = fsm.getStates();
final Function1<FSMState, EList<FSMTransition>> _function = (FSMState it) -> {
return it.getTransitions();
};
List<EList<FSMTransition>> _map = ListExtensions.<FSMState, EList<FSMTransition>>map(_states, _function);
Iterable<FSMTransition> _flatten = Iterables.<FSMTransition>concat(_map);
final Function1<FSMTransition, Boolean> _function_1 = (FSMTransition it) -> {
FSMState _target = it.getTarget();
return Boolean.valueOf(Objects.equal(_target, s));
};
Iterable<FSMTransition> _filter = IterableExtensions.<FSMTransition>filter(_flatten, _function_1);
final Function1<FSMTransition, FSMState> _function_2 = (FSMTransition it) -> {
EObject _eContainer_1 = it.eContainer();
return ((FSMState) _eContainer_1);
};
return IterableExtensions.<FSMTransition, FSMState>map(_filter, _function_2);
}
use of org.softlang.metalib.xtext.fsml.fsml.FSMState in project metalib by softlang.
the class FsmlValidator method checkHasInitialState.
/**
* Constraint check 'fsmSingleInitial'; checks if there is only one initial
* state and marks all states if none of them is initial and marks some of
* them if they are not exclusively initial
*/
@Check
public void checkHasInitialState(final FSM fsm) {
EList<FSMState> _states = fsm.getStates();
final Function1<FSMState, Boolean> _function = (FSMState it) -> {
return Boolean.valueOf(it.isInitial());
};
Iterable<FSMState> _filter = IterableExtensions.<FSMState>filter(_states, _function);
final int initCount = IterableExtensions.size(_filter);
if ((initCount < 1)) {
EList<FSMState> _states_1 = fsm.getStates();
for (final FSMState s : _states_1) {
this.error("FSM has no initial state", s, FsmlPackage.Literals.FSM_STATE__NAME, FsmlValidator.NO_INITIAL_STATE);
}
} else {
if ((initCount > 1)) {
EList<FSMState> _states_2 = fsm.getStates();
final Function1<FSMState, Boolean> _function_1 = (FSMState it) -> {
return Boolean.valueOf(it.isInitial());
};
Iterable<FSMState> _filter_1 = IterableExtensions.<FSMState>filter(_states_2, _function_1);
for (final FSMState s_1 : _filter_1) {
this.error("FSM has more than one initial state", s_1, FsmlPackage.Literals.FSM_STATE__NAME, FsmlValidator.MORE_THAN_ONE_INITIAL_STATE);
}
}
}
}
use of org.softlang.metalib.xtext.fsml.fsml.FSMState in project metalib by softlang.
the class Tests method setup.
/**
* Setup creates the reference finite state machine
*/
@Before
public void setup() {
FSMState _createFSMState = this.fsmlFactory.createFSMState();
final Procedure1<FSMState> _function = (FSMState it) -> {
it.setInitial(true);
it.setName("locked");
};
FSMState _doubleArrow = ObjectExtensions.<FSMState>operator_doubleArrow(_createFSMState, _function);
this.locked = _doubleArrow;
FSMState _createFSMState_1 = this.fsmlFactory.createFSMState();
final Procedure1<FSMState> _function_1 = (FSMState it) -> {
it.setName("unlocked");
};
FSMState _doubleArrow_1 = ObjectExtensions.<FSMState>operator_doubleArrow(_createFSMState_1, _function_1);
this.unlocked = _doubleArrow_1;
FSMState _createFSMState_2 = this.fsmlFactory.createFSMState();
final Procedure1<FSMState> _function_2 = (FSMState it) -> {
it.setName("exception");
};
FSMState _doubleArrow_2 = ObjectExtensions.<FSMState>operator_doubleArrow(_createFSMState_2, _function_2);
this.exception = _doubleArrow_2;
final Procedure1<FSMState> _function_3 = (FSMState it) -> {
EList<FSMTransition> _transitions = it.getTransitions();
FSMTransition _createFSMTransition = this.fsmlFactory.createFSMTransition();
final Procedure1<FSMTransition> _function_4 = (FSMTransition it_1) -> {
it_1.setInput("ticket");
it_1.setAction("collect");
it_1.setTarget(this.unlocked);
};
FSMTransition _doubleArrow_3 = ObjectExtensions.<FSMTransition>operator_doubleArrow(_createFSMTransition, _function_4);
_transitions.add(_doubleArrow_3);
EList<FSMTransition> _transitions_1 = it.getTransitions();
FSMTransition _createFSMTransition_1 = this.fsmlFactory.createFSMTransition();
final Procedure1<FSMTransition> _function_5 = (FSMTransition it_1) -> {
it_1.setInput("pass");
it_1.setAction("alarm");
it_1.setTarget(this.exception);
};
FSMTransition _doubleArrow_4 = ObjectExtensions.<FSMTransition>operator_doubleArrow(_createFSMTransition_1, _function_5);
_transitions_1.add(_doubleArrow_4);
};
ObjectExtensions.<FSMState>operator_doubleArrow(this.locked, _function_3);
final Procedure1<FSMState> _function_4 = (FSMState it) -> {
EList<FSMTransition> _transitions = it.getTransitions();
FSMTransition _createFSMTransition = this.fsmlFactory.createFSMTransition();
final Procedure1<FSMTransition> _function_5 = (FSMTransition it_1) -> {
it_1.setInput("ticket");
it_1.setAction("eject");
};
FSMTransition _doubleArrow_3 = ObjectExtensions.<FSMTransition>operator_doubleArrow(_createFSMTransition, _function_5);
_transitions.add(_doubleArrow_3);
EList<FSMTransition> _transitions_1 = it.getTransitions();
FSMTransition _createFSMTransition_1 = this.fsmlFactory.createFSMTransition();
final Procedure1<FSMTransition> _function_6 = (FSMTransition it_1) -> {
it_1.setInput("pass");
it_1.setTarget(this.locked);
};
FSMTransition _doubleArrow_4 = ObjectExtensions.<FSMTransition>operator_doubleArrow(_createFSMTransition_1, _function_6);
_transitions_1.add(_doubleArrow_4);
};
ObjectExtensions.<FSMState>operator_doubleArrow(this.unlocked, _function_4);
final Procedure1<FSMState> _function_5 = (FSMState it) -> {
EList<FSMTransition> _transitions = it.getTransitions();
FSMTransition _createFSMTransition = this.fsmlFactory.createFSMTransition();
final Procedure1<FSMTransition> _function_6 = (FSMTransition it_1) -> {
it_1.setInput("ticket");
it_1.setAction("eject");
};
FSMTransition _doubleArrow_3 = ObjectExtensions.<FSMTransition>operator_doubleArrow(_createFSMTransition, _function_6);
_transitions.add(_doubleArrow_3);
EList<FSMTransition> _transitions_1 = it.getTransitions();
FSMTransition _createFSMTransition_1 = this.fsmlFactory.createFSMTransition();
final Procedure1<FSMTransition> _function_7 = (FSMTransition it_1) -> {
it_1.setInput("pass");
};
FSMTransition _doubleArrow_4 = ObjectExtensions.<FSMTransition>operator_doubleArrow(_createFSMTransition_1, _function_7);
_transitions_1.add(_doubleArrow_4);
EList<FSMTransition> _transitions_2 = it.getTransitions();
FSMTransition _createFSMTransition_2 = this.fsmlFactory.createFSMTransition();
final Procedure1<FSMTransition> _function_8 = (FSMTransition it_1) -> {
it_1.setInput("mute");
};
FSMTransition _doubleArrow_5 = ObjectExtensions.<FSMTransition>operator_doubleArrow(_createFSMTransition_2, _function_8);
_transitions_2.add(_doubleArrow_5);
EList<FSMTransition> _transitions_3 = it.getTransitions();
FSMTransition _createFSMTransition_3 = this.fsmlFactory.createFSMTransition();
final Procedure1<FSMTransition> _function_9 = (FSMTransition it_1) -> {
it_1.setInput("release");
it_1.setTarget(this.locked);
};
FSMTransition _doubleArrow_6 = ObjectExtensions.<FSMTransition>operator_doubleArrow(_createFSMTransition_3, _function_9);
_transitions_3.add(_doubleArrow_6);
};
ObjectExtensions.<FSMState>operator_doubleArrow(this.exception, _function_5);
FSM _createFSM = this.fsmlFactory.createFSM();
final Procedure1<FSM> _function_6 = (FSM it) -> {
EList<FSMState> _states = it.getStates();
_states.add(this.locked);
EList<FSMState> _states_1 = it.getStates();
_states_1.add(this.unlocked);
EList<FSMState> _states_2 = it.getStates();
_states_2.add(this.exception);
};
FSM _doubleArrow_3 = ObjectExtensions.<FSM>operator_doubleArrow(_createFSM, _function_6);
this.fsm = _doubleArrow_3;
}
use of org.softlang.metalib.xtext.fsml.fsml.FSMState in project metalib by softlang.
the class FSMTransitionImpl method setTarget.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setTarget(FSMState newTarget) {
FSMState oldTarget = target;
target = newTarget;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, FsmlPackage.FSM_TRANSITION__TARGET, oldTarget, target));
}
Aggregations