-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathMySCXMLListener.java
136 lines (125 loc) · 3.66 KB
/
MySCXMLListener.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package edu.usc.ict.simcoach.dialogue.scxml;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.concurrent.LinkedBlockingQueue;
import org.apache.commons.scxml.SCXMLListener;
import org.apache.commons.scxml.model.Transition;
import org.apache.commons.scxml.model.TransitionTarget;
public class MySCXMLListener extends Thread implements SCXMLListener {
HashMap<TransitionTarget,HashSet<Transition>> activeTransitions=new HashMap<TransitionTarget, HashSet<Transition>>();
private LinkedBlockingQueue<String> events=new LinkedBlockingQueue<String>();
private Socket socket;
private PrintWriter out;
private InputStream in;
private String server;
private int port;
public MySCXMLListener(String server,int port) {
super();
this.server=server;
this.port=port;
reconnect();
activeTransitions.clear();
events.clear();
start();
}
public void run() {
while (true) {
if (!events.isEmpty() && checkConnection()) {
try {
String event=events.take();
System.out.println(event);
out.println(event);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private boolean reconnect() {
try {
socket = new Socket(server, port);
socket.setSoTimeout(5000);
out = new PrintWriter(socket.getOutputStream(), true);
in = socket.getInputStream();
return true;
} catch (Exception e) {
socket=null;
out=null;
in=null;
return false;
}
}
private boolean connected() {
try {
return !((socket==null) || (in.read()<0));
} catch (IOException e) {
return false;
}
}
private boolean checkConnection() {
return connected() || reconnect();
}
@Override
public void onEntry(TransitionTarget state) {
try {
sendActiveState(state);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onExit(TransitionTarget state) {
try {
sendInactiveState(state);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onTransition(TransitionTarget from, TransitionTarget to,Transition tr) {
assert(from.equals(tr.getParent()));
assert(tr.getTargets().contains(to)||tr.getTargets().isEmpty());
try {
sendActiveTransition(from,to,tr);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!activeTransitions.containsKey(to)) {
HashSet<Transition> set = new HashSet<Transition>();
set.add(tr);
activeTransitions.put(to, set);
} else {
HashSet<Transition> set = activeTransitions.get(to);
set.add(tr);
}
}
private void sendActiveState(TransitionTarget state) throws InterruptedException {
events.put("1 "+state.getId());
HashSet<Transition> set = activeTransitions.get(state);
if (set!=null) {
for(Transition tr:set) {
sendInactiveTransition(state,tr);
}
}
}
private void sendInactiveState(TransitionTarget state) throws InterruptedException {
events.put("0 "+state.getId());
HashSet<Transition> set = activeTransitions.get(state);
if (set!=null) {
for(Transition tr:set) {
sendInactiveTransition(state,tr);
}
}
}
private void sendActiveTransition(TransitionTarget from, TransitionTarget to, Transition tr) throws InterruptedException {
events.put("3 "+from.getId()+" -> "+to.getId());
}
private void sendInactiveTransition(TransitionTarget to,Transition tr) throws InterruptedException {
events.put("2 "+tr.getParent().getId()+" -> "+to.getId());
}
}