package org.apache.ode.bpel.runtime.history;
import java.util.Vector;
import org.apache.ode.bpel.o.ASTVisitor;
import org.apache.ode.bpel.o.OActivity;
import org.apache.ode.bpel.o.OAssign;
import org.apache.ode.bpel.o.OBase;
import org.apache.ode.bpel.o.OCatch;
import org.apache.ode.bpel.o.OFaultHandler;
import org.apache.ode.bpel.o.OFlow;
import org.apache.ode.bpel.o.OInvoke;
import org.apache.ode.bpel.o.OProcess;
import org.apache.ode.bpel.o.OScope;
import org.apache.ode.bpel.o.OSequence;
import org.apache.ode.bpel.o.OSwitch;
import tud.st.bpel.history.facts.StaticActivityFact;
import tud.st.bpel.history.facts.StaticInvokeFact;
/**
* Visitor that collects the static process facts by visiting
* the ODE-AST.
*
* @author A. Look
*
*/
public class ODECollectStaticProcessFactsVisitor implements ASTVisitor {
private Vector<StaticActivityFact> activities;
private Vector<StaticInvokeFact> invokes;
public ODECollectStaticProcessFactsVisitor() {
activities = new Vector<StaticActivityFact>();
invokes = new Vector<StaticInvokeFact>();
}
public Iterable<StaticActivityFact> getActivites() {
return activities;
}
public Iterable<StaticInvokeFact> getInvokes() {
return invokes;
}
public void visit(OProcess oprocess) {
// AST contains DefaultCompensationHandelrs etc.
// We don't want to handle those!
oprocess.procesScope.accept(this);
}
public void visit(OSequence osequence) {
for(OActivity a : osequence.sequence) {
a.accept(this);
}
}
// In Apache ODE every invoke lives within its own scope
// see: http://ode.apache.org/atomic-scopes-extension-for-bpel.html
public void visit(OScope scope) {
System.out.println("Visiting OScope with activity: " + scope.activity.getClass().getSimpleName());
scope.activity.accept(this);
scope.faultHandler.accept(this);
}
public void visit(OFaultHandler ofault) {
for(OCatch c : ofault.catchBlocks) {
c.accept(this);
}
}
public void visit(OCatch ocatch) {
ocatch.activity.accept(this);
}
public void visit(OActivity oactivity) {
String actId = oactivity.getXPath();
if(actId != null) {
System.out.println("Adding static ACTIVITY fact: " + oactivity.toString() + " (" + oactivity.getXPath() + ")");
String parentId = "-1";
if(oactivity.getParent() != null) {
parentId = oactivity.getParent().getXPath();
}
activities.add(new ODEStaticActivityFact(actId, parentId));
}
else {
System.out.println("Found OActivity without xpath: " + oactivity.getClass().getSimpleName());
}
}
public void visit(OAssign oassign) {
visit((OActivity)oassign);
for(OAssign.Copy c : oassign.copy) {
activities.add(new ODEStaticActivityFact(c.getXPath(), oassign.getXPath()));
}
}
public void visit(OInvoke oinvoke) {
System.out.println("Adding static INVOKE fact: " + oinvoke.toString() + " (" + oinvoke.getXPath() + ")");
invokes.add(new ODEStaticInvokeFact(oinvoke.getXPath(),
// ODE wraps a Scope implicitly around Invokes, use parents parent.
oinvoke.getParent().getParent().getXPath(),
oinvoke.partnerLink.getName(),
oinvoke.partnerLink.partnerRolePortType.getQName().toString(),
oinvoke.operation.getName(),
oinvoke.inputVar.name,
oinvoke.outputVar.name));
}
// If statements sind als switch OSwitch implementiert
public void visit(OSwitch oswitch) {
System.out.println("Adding static OSwitch fact: " + oswitch.toString() + " (" + oswitch.getXPath() + ")");
visit((OActivity)oswitch);
for(OSwitch.OCase c : oswitch.getCases()) {
c.activity.accept(this);
}
}
public void visit(OFlow oflow) {
System.out.println("Adding static OFlow fact: " + oflow.toString() + " (" + oflow.getXPath() + ")");
visit((OActivity)oflow);
for(OActivity a : oflow.parallelActivities) {
a.accept(this);
}
}
public void visit(OBase base) {
System.out.println("Unhandled OBase: " + base.getClass().getSimpleName());
}
}