1 package com.instantbank.lettertemplate.control.web;
2
3 import java.io.Serializable;
4 import javax.servlet.http.HttpServletRequest;
5 import javax.servlet.http.HttpSession;
6 import javax.servlet.ServletContext;
7 import java.util.HashMap;
8 import java.util.Iterator;
9 import java.util.Locale;
10 import com.instantbank.lettertemplate.control.util.WebKeys;
11 import com.instantbank.lettertemplate.control.web.handlers.FlowHandler;
12 import com.instantbank.common.utilcomponents.Debug;
13 import com.instantbank.lettertemplate.control.LetterTemplateEventException;
14
15
22 public class ScreenFlowManager
23 implements Serializable {
24
25
26
27 private HashMap screens;
28 private HashMap urlMappings;
29 private HashMap screenDefinitionMappings;
30 private Debug debug = null;
31
32 private String defaultScreen = "INDEX";
33
34
35
38 public ScreenFlowManager() {
39 debug = new Debug();
40 debug.setDebugginOn(true);
41 debug.setPreMessage("** ScreenFlowManager: ");
42 screens = new HashMap();
43 }
44
45
46
52 public void init(ServletContext context) {
53 String screenDefinitionsURL = null;
54 String requestMappingsURL = null;
55 try {
56 requestMappingsURL
57 = context.getResource
58 ("/WEB-INF/xml/requestmappings.xml").toString();
59 }
60 catch(java.net.MalformedURLException ex) {
61 debug.println("Initializing ScreenFlowManager "
62 + " malformed URL exception: " + ex);
63 }
64
65
66
67 screenDefinitionMappings
68 = ScreenFlowXmlDAO.loadScreenDefinitionMappings
69 (requestMappingsURL);
70 Iterator it = screenDefinitionMappings.keySet().iterator();
71 while(it.hasNext()) {
72 String language = (String)it.next();
73 debug.println("loading screen definitions " +
74 " for language " + language);
75 try {
76 String mappings
77 = (String)screenDefinitionMappings.get(language);
78 debug.println("mappings are: "
79 + mappings);
80 screenDefinitionsURL
81 = context.getResource(mappings).toString();
82 }
83 catch(java.net.MalformedURLException ex) {
84 debug.println(" initializing "
85 + "ScreenFlowManager malformed URL exception: " + ex);
86 }
87 HashMap screenDefinitions
88 = ScreenFlowXmlDAO.loadScreenDefinitions
89 (screenDefinitionsURL);
90 screens.put(language, screenDefinitions);
91 urlMappings
92 = ScreenFlowXmlDAO.loadRequestMappings
93 (requestMappingsURL);
94 }
95
96 debug.println("initialized Screens "
97 + " and URL mappings");
98 }
99
100
101
107 public HashMap getScreens(Locale locale) {
108 String languageKey = locale.getLanguage()
109 + "_" + locale.getCountry();
110 if(screens.containsKey(languageKey)) {
111 return (HashMap)screens.get(languageKey);
112 }
113 return null;
114 }
115
116
117
123 public String getTemplate(Locale locale) {
124 HashMap localeScreens = getScreens(locale);
125 if(localeScreens == null) {
126 return null;
127 }
128 else {
129 return (String)localeScreens.get(ScreenFlowXmlDAO.TEMPLATE);
130 }
131 }
132
133
134
144 public URLMapping getURLMapping(String urlPattern) {
145 if((urlMappings != null) && urlMappings.containsKey(urlPattern)) {
146 return (URLMapping)urlMappings.get(urlPattern);
147 }
148 else {
149 return null;
150 }
151 }
152
153
154
165 public void getNextScreen(HttpServletRequest request, Object answer,
166 ServletContext context)
167 throws LetterTemplateEventException {
168 String selectedURL = request.getPathInfo();
169
170 debug.println("selectedURL:" + selectedURL);
171
172 String currentScreen = defaultScreen;
173
174 URLMapping urlMapping = getURLMapping(selectedURL);
175 if(urlMapping != null) {
176 if(!urlMapping.useFlowHandler()) {
177 currentScreen = urlMapping.getScreen();
178 }
179 else {
180 debug.println("using flow handler for:" + selectedURL);
181
182 FlowHandler handler = null;
183 String flowHandlerString = urlMapping.getFlowHandler();
184 try {
185 handler
186 = (FlowHandler)getClass().getClassLoader()
187 .loadClass(flowHandlerString).newInstance();
188
189
190 handler.doStart(request);
191
192 String flowResult = handler.processFlow
193 (request, answer, context);
194 debug.println("flow handler " +
195 " processing result=" + flowResult);
196 handler.doEnd(request);
197
198 currentScreen = urlMapping.getResultScreen(flowResult);
199
200 }
201 catch(Exception ex) {
202 debug.println("caught loading handler: " + ex);
203 throw new LetterTemplateEventException(ex.getMessage());
204 }
205 }
206 }
207
208 request.getSession().setAttribute
209 (WebKeys.CurrentScreen, currentScreen);
210 debug.println("final currentScreen:" + currentScreen);
211 }
212
213
214
223 public Parameter getParameter(String key, HttpSession session) {
224 String currentScreen
225 = (String)session.getAttribute(WebKeys.CurrentScreen);
226 Locale locale = (Locale)session.getAttribute(WebKeys.LanguageKey);
227 if(locale == null) {
228 locale = Locale.US;
229 }
230 if(currentScreen == null) {
231 currentScreen = defaultScreen;
232 }
233 if(screens == null || currentScreen == null) {
234 return null;
235 }
236 Screen screen = (Screen)getScreens(locale).get(currentScreen);
237 if(screen == null) {
238 return null;
239 }
240 return screen.getParameter(key);
241 }
242
243
244
249 public void setDefaultScreen(String defaultScreen) {
250 this.defaultScreen = defaultScreen;
251 }
252
253
254
260 public String getCurrentScreen(HttpSession session) {
261 return (String)session.getAttribute(WebKeys.CurrentScreen);
262 }
263 }
264
265