1 package com.instantbank.lettertemplate.control.ejb;
2
3 import java.io.Serializable;
4 import java.util.Collection;
5 import java.util.List;
6 import java.util.HashMap;
7
8 import java.rmi.RemoteException;
9 import javax.naming.InitialContext;
10 import javax.naming.NamingException;
11 import javax.ejb.SessionContext;
12
13 import com.instantbank.lettertemplate.control.ejb.handlers.StateHandler;
14 import com.instantbank.common.utilcomponents.Debug;
15 import com.instantbank.common.utilcomponents.LetterTemplateExceptionMessage;
16 import com.instantbank.lettertemplate.control.LetterTemplateEventException;
17 import com.instantbank.lettertemplate.control.event.LetterTemplateEvent;
18
19
31 public class StateMachine
32 implements Serializable {
33
34
35 private LetterTemplateControllerEJB sccejb;
36
37
38 private ModelUpdateManager mum;
39
40
41 private HashMap attributeMap;
42
43
44 private HashMap handlerMap;
45
46
47 private SessionContext sc;
48
49
50 private Debug debug = null;
51
52
53
59 public StateMachine(LetterTemplateControllerEJB sccejb, SessionContext sc) {
60 debug = new Debug();
61 debug.setDebugginOn(true);
62 debug.setPreMessage("** StateMachine: ");
63 debug.println("StateMachine instanced");
64 this.sccejb = sccejb;
65 this.sc = sc;
66 this.mum = new ModelUpdateManager();
67 attributeMap = new HashMap();
68 handlerMap = new HashMap();
69 }
70
71
72
83 public Collection handleEvent(LetterTemplateEvent ese)
84 throws RemoteException, LetterTemplateEventException {
85
86 debug.println("received event= " + ese);
87 Object answer = "";
88
89 String eventName = ese.getEventName();
90
91 if(eventName != null) {
92 String handlerName = getHandlerName(eventName);
93
94 StateHandler handler = null;
95 try {
96 if(handlerMap.get(eventName) != null) {
97 handler = (StateHandler)handlerMap.get(eventName);
98 }
99 else {
100 handler = (StateHandler)Class.forName(handlerName)
101 .newInstance();
102 handlerMap.put(eventName, handler);
103 }
104 }
105 catch(Exception ex) {
106 debug.println("error loading " + handlerName + " :" + ex);
107 throw new LetterTemplateEventException
108 (LetterTemplateExceptionMessage.HANDLER_NOT_LOAD + ex.getMessage());
109 }
110
111 if(handler != null) {
112 handler.init(this);
113
114
115 handler.doStart();
116 answer = handler.perform(ese);
117 handler.doEnd();
118 debug.println("totally processed :" + eventName);
119 if(answer == null) {
120 throw new LetterTemplateEventException
121 (LetterTemplateExceptionMessage.NULL_ANSWER);
122 }
123 }
124 }
125 else {
126 debug.println("eventName is null");
127 throw new LetterTemplateEventException
128 (LetterTemplateExceptionMessage.EVENT_NOT_KNOWN + ese.toString());
129 }
130 return (mum.getUpdatedModels(ese, answer));
131 }
132
133
134
141 private String getHandlerName(String eventName)
142 throws LetterTemplateEventException {
143
144 try {
145 InitialContext ic = new InitialContext();
146 return (String)ic.lookup(eventName);
147 }
148 catch(javax.naming.NamingException ex) {
149 debug.println("Handler caught: " + ex);
150 throw new LetterTemplateEventException
151 (LetterTemplateExceptionMessage.HANDLER_NOT_KNOWN + ex.getMessage());
152 }
153 }
154
155
156
162 public void setAttribute(String key, Object value) {
163 attributeMap.put(key, value);
164 }
165
166
167
173 public Object getAttribute(String key) {
174 return attributeMap.get(key);
175 }
176
177
178
183 public LetterTemplateControllerEJB getLetterTemplateControllerEJB() {
184 return sccejb;
185 }
186
187
188
193 public SessionContext getSessionContext() {
194 return sc;
195 }
196
197 }
198
199