| /** |
| * 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; |
| } |
| } |