|
StateMachine |
|
/*
* $Id: StateMachine.java,v 1.8.4.4 2001/03/15 00:39:59 brydon Exp $
* Copyright 2001 Sun Microsystems, Inc. All rights reserved.
* Copyright 2001 Sun Microsystems, Inc. Tous droits réservés.
*
*/
package com.sun.j2ee.blueprints.petstore.control.ejb;
import java.rmi.RemoteException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.ejb.SessionContext;
import java.util.Collection;
import java.util.HashMap;
import com.sun.j2ee.blueprints.util.tracer.Debug;
import com.sun.j2ee.blueprints.petstore.control.event.EStoreEvent;
import com.sun.j2ee.blueprints.petstore.control.exceptions.EStoreEventException;
/**
* This class is a Universal front back end of an application
* which ties all EJB components together dynamically at runtime.
*
* This class should not be updated to handle various event types.
* This class will use ActionHandlers to handle events that require
* processing beyond the scope of this class.
*
* A second option to event handling is to do so in the XML descriptor
* itself.
*
* State may be stored in the attributeMap
* Configuration of this file is via an XML descriptor.
*
*/
public class StateMachine implements java.io.Serializable {
private ShoppingClientControllerEJB sccejb;
private ModelUpdateManager mum;
private HashMap orderTable;
private HashMap attributeMap;
private HashMap handlerMap;
private SessionContext sc;
public StateMachine(ShoppingClientControllerEJB sccejb, SessionContext sc) {
this.sccejb = sccejb;
this.sc = sc;
this.mum = new ModelUpdateManager();
attributeMap = new HashMap();
handlerMap = new HashMap();
}
public Collection handleEvent(EStoreEvent ese) throws
EStoreEventException{
Debug.println("StateMachine: received event= " + ese);
String eventName = ese.getEventName();
if (eventName != null) {
Debug.println("StateMachine: processingEvent= " + eventName);
String handlerName = getHandlerName(eventName);
Debug.println("StateMachine: process handler class = " + handlerName);
StateHandler handler = null;
try {
if (handlerMap.get(eventName) != null) {
handler = (StateHandler)handlerMap.get(eventName);
} else {
handler = (StateHandler)Class.forName(handlerName).newInstance();
handlerMap.put(eventName, handler);
}
} catch (Exception ex) {
Debug.println("StateMachine: error loading " + handlerName + " :" + ex);
}
if (handler != null) {
Debug.println("StateMachine: loaded handler " + handlerName);
handler.init(this);
Debug.println("StateMachine: initialzied " + handlerName);
// do the magic
handler.doStart();
handler.perform(ese);
handler.doEnd();
Debug.println("StateMachine: sucessfully processed :" + eventName);
}
}
return (mum.getUpdatedModels(ese));
}
private String getHandlerName(String eventName) {
// do the lookup
Debug.println("StateMachine: looking up:" + eventName + "<");
try {
InitialContext ic = new InitialContext();
return (String)ic.lookup(eventName);
} catch (javax.naming.NamingException ex) {
Debug.println("AccountHandler caught: " + ex);
// ignore.. we are working around it below.
}
return null;
}
public void setAttribute(String key, Object value) {
attributeMap.put(key, value);
}
public Object getAttribute(String key) {
return attributeMap.get(key);
}
public ShoppingClientControllerEJB getShoppingClientControllerEJB() {
return sccejb;
}
public SessionContext getSessionContext() {
return sc;
}
}
|
StateMachine |
|