blob: 32c2bd6926f5d25290e4e8233ca30528761a179d [file] [log] [blame]
/**
* generated by Xtext
*/
package org.eclipse.xtext.example.fowlerdsl.generator;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.example.fowlerdsl.statemachine.Command;
import org.eclipse.xtext.example.fowlerdsl.statemachine.Event;
import org.eclipse.xtext.example.fowlerdsl.statemachine.State;
import org.eclipse.xtext.example.fowlerdsl.statemachine.Statemachine;
import org.eclipse.xtext.example.fowlerdsl.statemachine.Transition;
import org.eclipse.xtext.generator.IFileSystemAccess;
import org.eclipse.xtext.generator.IGenerator;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.ListExtensions;
import org.eclipse.xtext.xbase.lib.StringExtensions;
@SuppressWarnings("all")
public class StatemachineGenerator implements IGenerator {
@Override
public void doGenerate(final Resource resource, final IFileSystemAccess fsa) {
String _className = this.className(resource);
String _plus = (_className + ".java");
EList<EObject> _contents = resource.getContents();
EObject _head = IterableExtensions.<EObject>head(_contents);
CharSequence _javaCode = this.toJavaCode(((Statemachine) _head));
fsa.generateFile(_plus, _javaCode);
}
public String className(final Resource res) {
URI _uRI = res.getURI();
String name = _uRI.lastSegment();
int _indexOf = name.indexOf(".");
return name.substring(0, _indexOf);
}
public CharSequence toJavaCode(final Statemachine sm) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("import java.io.BufferedReader;");
_builder.newLine();
_builder.append("import java.io.IOException;");
_builder.newLine();
_builder.append("import java.io.InputStreamReader;");
_builder.newLine();
_builder.newLine();
_builder.append("public class ");
Resource _eResource = sm.eResource();
String _className = this.className(_eResource);
_builder.append(_className, "");
_builder.append(" {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("public static void main(String[] args) {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("new ");
Resource _eResource_1 = sm.eResource();
String _className_1 = this.className(_eResource_1);
_builder.append(_className_1, "\t\t");
_builder.append("().run();");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
{
EList<Command> _commands = sm.getCommands();
for(final Command c : _commands) {
_builder.append("\t");
CharSequence _declareCommand = this.declareCommand(c);
_builder.append(_declareCommand, "\t");
_builder.newLineIfNotEmpty();
}
}
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("protected void run() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("boolean executeActions = true;");
_builder.newLine();
_builder.append("\t\t");
_builder.append("String currentState = \"");
EList<State> _states = sm.getStates();
State _head = IterableExtensions.<State>head(_states);
String _name = _head.getName();
_builder.append(_name, "\t\t");
_builder.append("\";");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("String lastEvent = null;");
_builder.newLine();
_builder.append("\t\t");
_builder.append("while (true) {");
_builder.newLine();
{
EList<State> _states_1 = sm.getStates();
for(final State state : _states_1) {
_builder.append("\t\t\t");
CharSequence _generateCode = this.generateCode(state);
_builder.append(_generateCode, "\t\t\t");
_builder.newLineIfNotEmpty();
}
}
{
EList<Event> _resetEvents = sm.getResetEvents();
for(final Event resetEvent : _resetEvents) {
_builder.append("\t\t\t");
_builder.append("if (\"");
String _name_1 = resetEvent.getName();
_builder.append(_name_1, "\t\t\t");
_builder.append("\".equals(lastEvent)) {");
_builder.newLineIfNotEmpty();
_builder.append("\t\t\t");
_builder.append("\t");
_builder.append("System.out.println(\"Resetting state machine.\");");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("\t");
_builder.append("currentState = \"");
EList<State> _states_2 = sm.getStates();
State _head_1 = IterableExtensions.<State>head(_states_2);
String _name_2 = _head_1.getName();
_builder.append(_name_2, "\t\t\t\t");
_builder.append("\";");
_builder.newLineIfNotEmpty();
_builder.append("\t\t\t");
_builder.append("\t");
_builder.append("executeActions = true;");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("}");
_builder.newLine();
}
}
_builder.append("\t\t\t");
_builder.newLine();
_builder.append("\t\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("private String receiveEvent() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("System.out.flush();");
_builder.newLine();
_builder.append("\t\t");
_builder.append("BufferedReader br = new BufferedReader(new InputStreamReader(System.in));");
_builder.newLine();
_builder.append("\t\t");
_builder.append("try {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("return br.readLine();");
_builder.newLine();
_builder.append("\t\t");
_builder.append("} catch (IOException ioe) {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("System.out.println(\"Problem reading input\");");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("return \"\";");
_builder.newLine();
_builder.append("\t\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
return _builder;
}
public CharSequence declareCommand(final Command command) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("protected void do");
String _name = command.getName();
String _firstUpper = StringExtensions.toFirstUpper(_name);
_builder.append(_firstUpper, "");
_builder.append("() {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("System.out.println(\"Executing command ");
String _name_1 = command.getName();
_builder.append(_name_1, "\t");
_builder.append(" (");
String _code = command.getCode();
_builder.append(_code, "\t");
_builder.append(")\");");
_builder.newLineIfNotEmpty();
_builder.append("}");
_builder.newLine();
return _builder;
}
public CharSequence generateCode(final State state) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("if (currentState.equals(\"");
String _name = state.getName();
_builder.append(_name, "");
_builder.append("\")) {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("if (executeActions) {");
_builder.newLine();
{
EList<Command> _actions = state.getActions();
for(final Command c : _actions) {
_builder.append("\t\t");
_builder.append("do");
String _name_1 = c.getName();
String _firstUpper = StringExtensions.toFirstUpper(_name_1);
_builder.append(_firstUpper, "\t\t");
_builder.append("();");
_builder.newLineIfNotEmpty();
}
}
_builder.append("\t\t");
_builder.append("executeActions = false;");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.append("System.out.println(\"Your are now in state \'");
String _name_2 = state.getName();
_builder.append(_name_2, "\t");
_builder.append("\'. Possible events are [");
EList<Transition> _transitions = state.getTransitions();
final Function1<Transition, String> _function = (Transition t) -> {
Event _event = t.getEvent();
return _event.getName();
};
List<String> _map = ListExtensions.<Transition, String>map(_transitions, _function);
String _join = IterableExtensions.join(_map, ", ");
_builder.append(_join, "\t");
_builder.append("].\");");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("lastEvent = receiveEvent();");
_builder.newLine();
{
EList<Transition> _transitions_1 = state.getTransitions();
for(final Transition t : _transitions_1) {
_builder.append("\t");
_builder.append("if (\"");
Event _event = t.getEvent();
String _name_3 = _event.getName();
_builder.append(_name_3, "\t");
_builder.append("\".equals(lastEvent)) {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("\t");
_builder.append("currentState = \"");
State _state = t.getState();
String _name_4 = _state.getName();
_builder.append(_name_4, "\t\t");
_builder.append("\";");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("\t");
_builder.append("executeActions = true;");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
}
}
_builder.append("}");
_builder.newLine();
return _builder;
}
}