package lsm;
public interface Machine {
public String getStat();
public String input(String edge);
}
//
package lsm;
import java.util.ArrayList;
final public class MachineBuilder {
private class MiniMachine implements Machine {
Runnable[][] rs;
int[][] stats;
int current = 0;
String[] sts;
String[] eds;
Runnable er=null;
@Override
public String getStat() {
return sts[current];
}
@Override
public String input(String edge) {
int i = 0;
int last=current;
boolean find=false;
for (; i < eds.length; ++i) {
if (eds[i] == edge&&(stats[current][i]>0)) {
current = stats[current][i];
find=true;
break;
}
if (eds[i] != null && (eds[i].equals(edge))&&(stats[current][i]>0)) {
current = stats[current][i];
find=true;
break;
}
}
if(find){
if (rs[last][i] != null) {
((Runnable) rs[last][i]).run();
}
}else if(er!=null){
er.run();
}
return sts[current];
}
}
private String[] sts;
private String[] eds;
private Runnable er;
private ArrayList alst = new ArrayList();
public void putState(String[] stats) {
sts = stats;
}
public void putEdge(String[] edges) {
eds = edges;
}
public void putAction(String start, String edge, String dest, Runnable r) {
Object[] sr = new Object[4];
sr[0] = start;
sr[1] = edge;
sr[2] = dest;
sr[3] = r;
alst.add(sr);
}
public void setError(Runnable r){
er=r;
}
private boolean isSame(Object o1, Object o2) {
if (o1 == null) {
if (o2 == null) {
return true;
} else {
return false;
}
} else if (o1.equals(o2)) {
return true;
} else {
return false;
}
}
public Machine build() {
MiniMachine mm = new MiniMachine();
mm.eds = eds;
mm.sts = sts;
mm.stats = new int[sts.length][eds.length];
mm.rs = new Runnable[sts.length][eds.length];
mm.er=er;
for (int i = 0; i < mm.sts.length; ++i) {
for (int j = 0; j < mm.eds.length; ++j) {
mm.stats[i][j] = -1;
}
}
for (Object[] os : alst) {
int indexOfStat = -1;
int indexOfEdge = -1;
int destOfStat = -1;
for (int i = 0; i < mm.sts.length; ++i) {
if (isSame(mm.sts[i], os[0])) {
indexOfStat = i;
break;
}
}
for (int i = 0; i < mm.eds.length; ++i) {
if (isSame(mm.eds[i], os[1])) {
indexOfEdge = i;
break;
}
}
if (indexOfStat >= 0 && indexOfEdge >= 0) {
for (int i = 0; i < mm.sts.length; ++i) {
if (isSame(mm.sts[i], os[2])) {
destOfStat = i;
break;
}
}
if (destOfStat >= 0) {
mm.stats[indexOfStat][indexOfEdge] = destOfStat;
if (os[3] != null) {
mm.rs[indexOfStat][indexOfEdge] = (Runnable) os[3];
}
}
}
}
sts = null;
eds = null;
er=null;
alst.clear();
return mm;
}
}
//
package lsm;
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MachineBuilder mb=new MachineBuilder();
mb.putEdge(new String[]{"a","b","c","d"});
mb.putState(new String[]{"0","1","2","3"});
mb.setError(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("no way");
}});
mb.putAction("0", "a", "1", new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("word");
}});
mb.putAction("1", "b", "2", new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("hallo");
}});
mb.putAction("2", "c", "1", null);
mb.putAction("1", "d", "3", null);
Machine m=mb.build();
System.out.println(m.getStat());
m.input("a");
System.out.println(m.getStat());
m.input("b");
System.out.println(m.getStat());
m.input("c");
System.out.println(m.getStat());
m.input("c");
System.out.println(m.getStat());
m.input("d");
System.out.println(m.getStat());
}
}