@SuppressWarnings("unchecked")
public static EndlicherAutomat gesamtAutomat(
final EndlicherAutomat[] endAuts,
final Condition[] conds) {
HashMap[] knotZuord = new HashMap[endAuts.length];
EndlicherAutomat neu = new EndlicherAutomat();
int lfdNr = 1;
ArrayList<Integer> knot;
ArrayList<Integer> knot1;
Iterator<Integer> it, it1;
Iterator<Transition> it3;
Integer aktKnNum;
Knoten aktKn;
ZInfo info;
Knoten zielKn;
Integer zielKnNum;
Condition aktBed;
Condition neuBed = null;
Condition zwischBed;
int numOrig1, numOrig2;
int idlBefehl;
EndlicherAutomat[] eas = new EndlicherAutomat[endAuts.length];
LinkedList<Transition> trans;
Transition tran;
String[] args = {"log 4"};
if (endAuts == null
|| conds == null
|| endAuts.length != conds.length
|| endAuts.length == 0) {
SonstMeth.log(SonstMeth.LOG_ERROR,
"Gesamtautomat konnte nicht erzeugt werden.",
new Parametersatz(args));
}
for (int i = 0; i < eas.length; i++) {
eas[i] = new EndlicherAutomat();
eas[i].erzeugeAusSequenz(
endAuts[i].erzeugeStringSeq(),
fmg.fmg8.endlAutomat.translator.Konstanten.STD_TRANSL_BE,
false);
if (eas[i].istLeer()) {
eas[i].einfuegenKnoten(Integer.MAX_VALUE,
SonstMeth.posSuch(
fmg.fmg8.umgebung2D.Konstanten.BEF,
"stp"),
1,
1);
eas[i].setStart(eas[i].holeKnoten(Integer.MAX_VALUE));
}
}
// Neue Knoten zuordnen.
for (int i = 0; i < eas.length; i++) {
knotZuord[i] = new HashMap<Integer, Integer>();
knot = new ArrayList<Integer>(eas[i].holAdj().keySet());
it = knot.iterator();
while (it.hasNext()) {
aktKnNum = it.next();
aktKn = eas[i].holeKnoten(aktKnNum);
info = aktKn.getInfo();
neu.einfuegenKnoten(lfdNr,
info.getAktion(),
info.getParam(),
info.getAlter());
knotZuord[i].put(aktKnNum, lfdNr);
lfdNr++;
}
}
// Neue Kanten INTER Automaten zuordnen.
for (int i = 0; i < eas.length; i++) {
zielKn = eas[i].holeStartzustand();
if (zielKn != null) {
zielKnNum = (Integer) knotZuord[i].get(zielKn.holeName());
neuBed = SonstMeth.ausFormatBed(conds[i].formatted());
for (int j = 0; j < i; j++) {
zwischBed = SonstMeth.ausFormatBed(conds[j].formatted());
zwischBed.negiere();
neuBed = new InnerNode(neuBed,
zwischBed,
fmg.fmg8.endlAutomat.Konstanten.UND);
}
for (int j = 0; j < eas.length; j++) {
if (j != i) {
knot = new ArrayList<Integer>(
eas[j].holAdj().keySet());
it = knot.iterator();
while (it.hasNext()) {
aktKnNum = (Integer) knotZuord[j].get(it.next());
neu.einfuegKante(aktKnNum, zielKnNum, neuBed, 1);
}
}
}
}
}
// Neue Kanten INTRA Automaten zuordnen.
for (int i = 0; i < eas.length; i++) {
knot1 = new ArrayList<Integer>(eas[i].holAdj().keySet());
it1 = knot1.iterator();
while (it1.hasNext()) {
numOrig1 = it1.next();
aktKnNum = (Integer) knotZuord[i].get(numOrig1);
aktKn = eas[i].holeKnoten(numOrig1);
if (aktKn.getInfo() != null
&& aktKn.getInfo().getBedingungen() != null) {
trans = aktKn.getInfo().getBedingungen();
it3 = trans.iterator();
while (it3.hasNext()) {
tran = it3.next();
numOrig2 = tran.getFolgezustand();
zielKnNum = (Integer) knotZuord[i].get(numOrig2);
aktBed = tran.getCond();
if (aktBed != null) {
neu.einfuegKante(aktKnNum, zielKnNum, aktBed, 1);
}
}
}
}
}
// true - Kanten zu den einzelnen Startknoten einf�gen.
for (int i = 0; i < eas.length; i++) {
zielKn = eas[i].holeStartzustand();
if (zielKn != null) {
zielKnNum = (Integer) knotZuord[i].get(zielKn.holeName());
knot = new ArrayList<Integer>(eas[i].holAdj().keySet());
it = knot.iterator();
while (it.hasNext()) {
aktKnNum = (Integer) knotZuord[i].get(it.next());
neu.einfuegKante(aktKnNum,
zielKnNum,
SonstMeth.ausBed("t"),
1);
}
}
}
// Einen IDLE-Startknoten einf�gen.
idlBefehl = SonstMeth.posSuch(fmg.fmg8.umgebung2D.Konstanten.BEF,
"IDL");
neu.einfuegenKnoten(lfdNr, idlBefehl, 1, 1);
neu.setStart(neu.holeKnoten(lfdNr));
for (int i = 0; i < conds.length; i++) {
if (i > 0) {
neuBed = conds[i];
} else {
neuBed = SonstMeth.ausFormatBed(conds[i].formatted());
for (int j = 1; j < conds.length; j++) {
zwischBed = SonstMeth.ausFormatBed(conds[j].formatted());
zwischBed.negiere();
neuBed = new InnerNode(
neuBed,
zwischBed,
fmg.fmg8.endlAutomat.Konstanten.ODER);
}
}
if (conds.length == 1) {
neuBed = SonstMeth.ausBed("t");
}
if (eas[i].holeStartzustand() != null) {
neu.einfuegKante(lfdNr,
(Integer)
knotZuord[i].get(eas[i].holeStartzustand().holeName()),
neuBed,
1);
}