Skip to content
This repository was archived by the owner on May 22, 2021. It is now read-only.

Commit 8c080c1

Browse files
committed
Behavior correction + Tests and bug fix + test examples
1 parent be602b9 commit 8c080c1

File tree

12 files changed

+186
-72
lines changed

12 files changed

+186
-72
lines changed

filename.txt

Lines changed: 0 additions & 7 deletions
This file was deleted.

pom.xml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,22 @@
1414
<scope>test</scope>
1515
</dependency>
1616
</dependencies>
17-
17+
<build>
18+
<plugins>
19+
<plugin>
20+
<artifactId>maven-assembly-plugin</artifactId>
21+
<configuration>
22+
<archive>
23+
<manifest>
24+
<mainClass>Main</mainClass>
25+
</manifest>
26+
</archive>
27+
<descriptorRefs>
28+
<descriptorRef>jar-with-dependencies</descriptorRef>
29+
</descriptorRefs>
30+
</configuration>
31+
</plugin>
32+
</plugins>
33+
</build>
1834

1935
</project>

src/main/java/Main.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,36 @@
1-
import org.xml.sax.SAXException;
2-
import stateMachine.SCXMLToJava;
1+
import generator.SCXMLToJava;
32

4-
import javax.xml.parsers.ParserConfigurationException;
53
import java.io.File;
6-
import java.io.IOException;
4+
import java.util.Arrays;
75

86
/**
97
* Created by Rami on 09/03/2017.
108
*/
119
public class Main {
1210

13-
public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException {
11+
public static void main(String[] args){
12+
System.out.println(Arrays.toString(args));
13+
if(args.length == 2){
14+
File output = new File(args[0]);
15+
if(output.exists() && !output.isDirectory()){
16+
System.out.println("Invalid Path: " + args[0] + " File exists.");
17+
System.exit(1);
18+
}
19+
if(!output.exists()){
20+
output.mkdir();
21+
}
22+
try {
23+
SCXMLToJava builder = new SCXMLToJava(new File(args[1]));
24+
builder.generateJavaCode(output);
25+
} catch (Exception e) {
26+
System.out.println("Error");
27+
System.out.println(e.getMessage());
28+
e.printStackTrace();
29+
}
30+
}else{
31+
System.out.println("Bad Arguments");
32+
}
33+
1434

15-
SCXMLToJava builder = new SCXMLToJava(new File("src\\main\\resources\\test.scxml"));
16-
builder.generateJavaCode();
1735
}
1836
}

src/main/java/Main2.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public static void main(String[] args){
1414
String input = "";
1515
while(!input.equals("exit")){
1616
input = sc.nextLine();
17-
ms.notifyEvent(new Event(input).setType(Event.Type.SEND));
17+
//ms.notifyEvent(new Event(input).setType(Event.Type.SEND));
1818
}
1919
}
2020
}

src/main/java/stateMachine/SCXMLToJava.java renamed to src/main/java/generator/SCXMLToJava.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package stateMachine;
1+
package generator;
22

33
import javax.xml.parsers.DocumentBuilderFactory;
44
import javax.xml.parsers.DocumentBuilder;
@@ -25,6 +25,7 @@ public class SCXMLToJava {
2525
private final String constructorHeader="public GStateMachine()" + openInst + "\n";
2626
private final String fileName = "GStateMachine.java";
2727
private String javaCode;
28+
private File outputFile;
2829

2930
private Document doc;
3031

@@ -35,10 +36,15 @@ public SCXMLToJava(File scxmlDocument) throws ParserConfigurationException, IOEx
3536
this.doc.getDocumentElement().normalize();
3637
}
3738

38-
public void generateJavaCode() throws IOException {
39+
public void generateJavaCode(File output) throws IOException {
40+
String path = output.getAbsolutePath();
41+
this.outputFile = new File(path + "\\" + this.fileName);
42+
if(outputFile.exists()){
43+
outputFile.delete();
44+
}
3945
String constructorBody = parseScxml(this.doc);
4046
this.javaCode = packageHeader + messageHeader + classNameHeader + constructorHeader + constructorBody + closeInst + closeInst;
41-
Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(this.fileName), "utf-8"));
47+
Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "utf-8"));
4248
writer.write(this.javaCode);
4349
writer.flush();
4450
writer.close();
@@ -160,6 +166,6 @@ private String parseTransitionEventsTrigger(Element e){
160166
}
161167

162168
public File getJavaCodeFile(){
163-
return new File(this.fileName);
169+
return this.outputFile;
164170
}
165171
}

src/main/java/stateMachine/AbstractStateMachine.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
/**
99
* Created by Rami on 08/03/2017.
1010
*/
11-
public abstract class AbstractStateMachine implements Serializable {
11+
public abstract class AbstractStateMachine implements StateMachine {
1212

1313
protected List<State> stateList;
1414
protected State initState;
@@ -52,6 +52,8 @@ public void notifyEvent(Event e){
5252
this.eventHandler.notifyEvent(e);
5353
}
5454

55+
public void notifyEvent(String event){this.eventHandler.notifyEvent(new Event(event));}
56+
5557
public void connectToEvent(String eventName, Object object, Method method){
5658
for(State state : stateList){
5759
if(state.hasSentEvent(eventName)){
@@ -89,7 +91,7 @@ public void linkStates(){
8991
}
9092
}
9193

92-
public void triggerEvent(String name) {
94+
protected void triggerEvent(String name) {
9395
this.currentState = this.currentState.notifyEvent(name);
9496
}
9597
}

src/main/java/stateMachine/EventHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ private Event getNextEvent(){
5151
}
5252

5353
public void notifyEvent(Event e) {
54+
System.out.println("adding event " + e.getName());
5455
this.eventsStack.add(e);
5556
}
5657
}
Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package stateMachine;
22

3+
import java.lang.reflect.Method;
4+
35
/**
4-
* Created by Rami on 09/03/2017.
6+
* Created by Rami on 15/04/2017.
57
*/
6-
public class StateMachine extends AbstractStateMachine {
7-
8+
public interface StateMachine {
89

9-
public StateMachine(){
10-
}
10+
void start();
11+
void stop();
12+
void notifyEvent(String event);
13+
void notifyEvent(Event e);
14+
void connectToEvent(String eventName, Callable callable);
15+
void connectToEvent(String eventName, Object object, Method method);
16+
void connectToEvent(String eventName, Object object, Method method, Object[] args);
1117
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<scxml version="1.0" xmlns="http://www.w3.org/2005/07/scxml">
2+
<state id="State1">
3+
<transition event="event1" target="State2" type="external">
4+
<send event="event2" delay="1000"/>
5+
</transition>
6+
</state>
7+
<state id="State2">
8+
<transition event="event2" target="State1" type="external"/>
9+
</state>
10+
</scxml>
Lines changed: 16 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package integration;
2-
import org.junit.Before;
2+
import generator.SCXMLToJava;
33
import org.junit.BeforeClass;
44
import org.junit.Test;
55
import org.xml.sax.SAXException;
@@ -20,59 +20,30 @@
2020
/**
2121
* Created by Rami on 08/04/2017.
2222
*/
23-
public class SimpleStateMachineTest {
24-
25-
static String ressourceDir = "src\\main\\resources\\";
26-
static String integrationTestDir = "integrationTests\\";
27-
static AbstractStateMachine stateMachine;
23+
public class SimpleStateMachineTest extends TestEnv{
2824

2925
@BeforeClass
30-
public static void prepareEnv(){
31-
File scxml = new File(ressourceDir + integrationTestDir +"test1.scxml");
32-
try {
33-
SCXMLToJava builder = new SCXMLToJava(scxml);
34-
builder.generateJavaCode();
35-
File javaCode = builder.getJavaCodeFile();
36-
File root = javaCode.getAbsoluteFile().getParentFile();
37-
System.out.println(root);
38-
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
39-
compiler.run(null, System.out, System.err, javaCode.getPath());
40-
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[]{root.toURI().toURL()});
41-
Class<?> cls = Class.forName("GStateMachine", true, classLoader);
42-
stateMachine = (AbstractStateMachine) cls.newInstance();
43-
} catch (ParserConfigurationException e) {
44-
e.printStackTrace();
45-
} catch (IOException e) {
46-
e.printStackTrace();
47-
} catch (SAXException e) {
48-
e.printStackTrace();
49-
} catch (IllegalAccessException e) {
50-
e.printStackTrace();
51-
} catch (InstantiationException e) {
52-
e.printStackTrace();
53-
} catch (ClassNotFoundException e) {
54-
e.printStackTrace();
55-
}
26+
public static void prep(){
27+
prepareEnv("test1.scxml");
5628
}
5729

58-
5930
@Test
6031
public void testInitState(){
6132
//Test if the proper state has been set to initial (State1 without prior indication)
62-
assertEquals(this.stateMachine.getInitState().getId(), "State1");
33+
assertEquals(super.stateMachine.getInitState().getId(), "State1");
6334

6435
//Test if initial state is current state if we do not start the machine
65-
assertEquals(this.stateMachine.getInitState(), this.stateMachine.getCurrentState());
36+
assertEquals(super.stateMachine.getInitState(), super.stateMachine.getCurrentState());
6637
}
6738

6839
@Test
6940
public void testNbOfStates(){
70-
assertEquals(this.stateMachine.getStateList().size(), 2);
41+
assertEquals(super.stateMachine.getStateList().size(), 2);
7142
}
7243

7344
@Test
7445
public void testStatesNames(){
75-
List<State> states = this.stateMachine.getStateList();
46+
List<State> states = super.stateMachine.getStateList();
7647
List<State> expected = new ArrayList<State>();
7748
expected.add(new State("State1"));
7849
expected.add(new State("State2"));
@@ -83,15 +54,15 @@ public void testStatesNames(){
8354

8455
@Test
8556
public void testNBOfTransitions(){
86-
List<State> states = this.stateMachine.getStateList();
57+
List<State> states = super.stateMachine.getStateList();
8758
for(State state: states){
8859
assertEquals(state.getTransitions().size(), 1);
8960
}
9061
}
9162

9263
@Test
9364
public void testTransition(){
94-
List<State> states = this.stateMachine.getStateList();
65+
List<State> states = super.stateMachine.getStateList();
9566
assertEquals(states.get(0).getTransitions().get(0).from(), states.get(0));
9667
assertEquals(states.get(0).getTransitions().get(0).to(), states.get(1));
9768

@@ -102,22 +73,22 @@ public void testTransition(){
10273

10374
@Test
10475
public void testSendingEvent(){
105-
this.stateMachine.start();
106-
this.stateMachine.notifyEvent(new Event("event1"));
76+
super.stateMachine.start();
77+
super.stateMachine.notifyEvent(new Event("event1"));
10778
try {
10879
Thread.sleep(100);
10980
} catch (InterruptedException e) {
11081
e.printStackTrace();
11182
}
112-
assertEquals("State2", this.stateMachine.getCurrentState().getId());
83+
assertEquals("State2", super.stateMachine.getCurrentState().getId());
11384

114-
this.stateMachine.start();
115-
this.stateMachine.notifyEvent(new Event("event2"));
85+
super.stateMachine.start();
86+
super.stateMachine.notifyEvent(new Event("event2"));
11687
try {
11788
Thread.sleep(100);
11889
} catch (InterruptedException e) {
11990
e.printStackTrace();
12091
}
121-
assertEquals("State1", this.stateMachine.getCurrentState().getId());
92+
assertEquals("State1", super.stateMachine.getCurrentState().getId());
12293
}
12394
}

0 commit comments

Comments
 (0)