| /* |
| * generated by Xtext |
| */ |
| package org.eclipse.xtext.example.fowlerdsl.generator |
| |
| import org.eclipse.emf.ecore.resource.Resource |
| import org.eclipse.xtext.example.fowlerdsl.statemachine.Command |
| import org.eclipse.xtext.example.fowlerdsl.statemachine.State |
| import org.eclipse.xtext.example.fowlerdsl.statemachine.Statemachine |
| import org.eclipse.xtext.generator.IFileSystemAccess |
| import org.eclipse.xtext.generator.IGenerator |
| |
| class StatemachineGenerator implements IGenerator { |
| |
| override void doGenerate(Resource resource, IFileSystemAccess fsa) { |
| fsa.generateFile(resource.className+".java", toJavaCode(resource.contents.head as Statemachine)) |
| } |
| |
| def className(Resource res) { |
| var name = res.URI.lastSegment |
| return name.substring(0, name.indexOf('.')) |
| } |
| |
| def toJavaCode(Statemachine sm) ''' |
| import java.io.BufferedReader; |
| import java.io.IOException; |
| import java.io.InputStreamReader; |
| |
| public class «sm.eResource.className» { |
| |
| public static void main(String[] args) { |
| new «sm.eResource.className»().run(); |
| } |
| |
| «FOR c : sm.commands» |
| «c.declareCommand» |
| «ENDFOR» |
| |
| protected void run() { |
| boolean executeActions = true; |
| String currentState = "«sm.states.head.name»"; |
| String lastEvent = null; |
| while (true) { |
| «FOR state : sm.states» |
| «state.generateCode» |
| «ENDFOR» |
| «FOR resetEvent : sm.resetEvents» |
| if ("«resetEvent.name»".equals(lastEvent)) { |
| System.out.println("Resetting state machine."); |
| currentState = "«sm.states.head.name»"; |
| executeActions = true; |
| } |
| «ENDFOR» |
| |
| } |
| } |
| |
| private String receiveEvent() { |
| System.out.flush(); |
| BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); |
| try { |
| return br.readLine(); |
| } catch (IOException ioe) { |
| System.out.println("Problem reading input"); |
| return ""; |
| } |
| } |
| } |
| ''' |
| |
| def declareCommand(Command command) ''' |
| protected void do«command.name.toFirstUpper»() { |
| System.out.println("Executing command «command.name» («command.code»)"); |
| } |
| ''' |
| |
| def generateCode(State state) ''' |
| if (currentState.equals("«state.name»")) { |
| if (executeActions) { |
| «FOR c : state.actions» |
| do«c.name.toFirstUpper»(); |
| «ENDFOR» |
| executeActions = false; |
| } |
| System.out.println("Your are now in state '«state.name»'. Possible events are [« |
| state.transitions.map(t | t.event.name).join(', ')»]."); |
| lastEvent = receiveEvent(); |
| «FOR t : state.transitions» |
| if ("«t.event.name»".equals(lastEvent)) { |
| currentState = "«t.state.name»"; |
| executeActions = true; |
| } |
| «ENDFOR» |
| } |
| ''' |
| |
| } |