//EJBController:
/**
* EJB控制器EJB的Session Bean实现。
* 更多的细节参考StateMachine。
*/
public class EJBControllerLocalEJB implements SessionBean {
protected StateMachine sm;
protected SessionContext sc;
public EJBControllerLocalEJB() {}
public void ejbCreate() {
sm = new StateMachine(this, sc);
}
/** 就是这里调用了StateMachine, 此时ev中包含了完整的EJBAction类路径*/
public EventResponse processEvent(Event ev) throws EventException {
return (sm.processEvent(ev));
}
public void setSessionContext(SessionContext sc) {
this.sc = sc;
}
public void ejbRemove() {
sm = null;
}
public void ejbActivate() {}
public void ejbPassivate() {}
}
//这是StateMachine部分源码
public class StateMachine
implements java.io.Serializable {
private EJBControllerLocalEJB ccejb;
private HashMap attributeMap;
private HashMap actionMap;
private SessionContext sc;
public StateMachine(EJBControllerLocalEJB ccejb, SessionContext sc) {
this.ccejb = ccejb;
this.sc = sc;
attributeMap = new HashMap();
actionMap = new HashMap();
}
//操作事件
public EventResponse processEvent(Event ev) throws EventException {
//取得EJBAction的类名
String actionName = ev.getEJBActionClassName();
EventResponse response = null;
if (actionName != null) {
EJBAction action = null;
try {
//控制EJBAction的instance,调用过就放入actionMap,待用
if (actionMap.get(actionName) != null) {
action = (EJBAction) actionMap.get(actionName);
}
else {
//实例化具体的EJBAction
//就是这里出的错!actionName是完整且正确的类路径!!!
action = (EJBAction) Class.forName(actionName).newInstance();
actionMap.put(actionName, action);
}
}
catch (Exception ex) {
System.err.println("StateMachine: error loading " + actionName + " :" +
ex);
}
if (action != null) {
action.init(this);
// do the magic
action.doStart();
response = action.perform(ev);
action.doEnd();
}
}
return response;
}