001 package com.croftsoft.apps.wyrm.servlet;
002
003 // J2SE
004 import java.io.*;
005 import java.net.*;
006 import java.util.*;
007 import javax.naming.*;
008 import javax.rmi.*;
009 import javax.xml.transform.*;
010 import javax.xml.transform.dom.*;
011 import javax.xml.transform.stream.*;
012
013 // J2EE
014 import javax.servlet.*;
015 import javax.servlet.http.*;
016
017 // Standard Extensions
018 import javax.xml.bind.JAXBContext;
019 import javax.xml.bind.JAXBException;
020 import javax.xml.bind.Marshaller;
021 import javax.xml.bind.Validator;
022
023 // CroftSoft Core
024 import com.croftsoft.core.lang.ClassLib;
025
026 // Application
027 import com.croftsoft.apps.wyrm.WyrmConstants;
028 import com.croftsoft.apps.wyrm.server.WyrmServerLocal;
029 import com.croftsoft.apps.wyrm.server.WyrmServerLocalHome;
030 import com.croftsoft.apps.wyrm.xjc.*;
031
032 /*********************************************************************
033 * Wyrm Servlet class.
034 *
035 * @version
036 * 2002-11-03
037 * @since
038 * 2002-10-16
039 * @author
040 * <a href="http://alumni.caltech.edu/~croft">David Wallace Croft</a>
041 *********************************************************************/
042
043 public final class WyrmServlet
044 extends HttpServlet
045 implements WyrmConstants
046 //////////////////////////////////////////////////////////////////////
047 //////////////////////////////////////////////////////////////////////
048 {
049
050 private static final String WYRM_SERVER_LOCAL_HOME
051 = "WyrmServerLocalHome";
052
053 //
054
055 private static final String PARAM_PASSWORD = "password";
056
057 private static final String PARAM_PASSWORD_2 = "password2";
058
059 private static final String PARAM_REQUEST = "request";
060
061 private static final String PARAM_USERNAME = "username";
062
063 //
064
065 private static final String SESSION_USERNAME = "username";
066
067 private static final String SESSION_PASSWORD = "password";
068
069 //
070
071 private static final String ENCODING_CHARSET = "utf-8";
072
073 private static final String XSLT_FILE = "/xsl/browser.xsl";
074
075 private static final String JAXB_CONTEXT_PATH
076 = "com.croftsoft.apps.wyrm.xjc";
077
078 private static final String SCHEMA_LOCATION_NAMESPACE
079 = "https://www.croftsoft.com/apps/wyrm/xjc ";
080
081 private static final String XSD_DIR = "/xsd/";
082
083 private static final String XSD_EXT = ".xsd";
084
085 //
086
087 private WyrmServerLocal wyrmServerLocal;
088
089 private JAXBContext jaxbContext;
090
091 private Templates templates;
092
093 //////////////////////////////////////////////////////////////////////
094 //////////////////////////////////////////////////////////////////////
095
096 public void init ( )
097 throws ServletException
098 //////////////////////////////////////////////////////////////////////
099 {
100 try
101 {
102
103 // Do I need to use narrow with a local home interface?
104
105 WyrmServerLocalHome wyrmServerLocalHome
106 = ( WyrmServerLocalHome ) PortableRemoteObject.narrow (
107 new InitialContext ( ).lookup ( WYRM_SERVER_LOCAL_HOME ),
108 WyrmServerLocalHome.class );
109
110 wyrmServerLocal = wyrmServerLocalHome.create ( );
111
112 jaxbContext = JAXBContext.newInstance ( JAXB_CONTEXT_PATH );
113
114 TransformerFactory transformerFactory
115 = TransformerFactory.newInstance ( );
116
117 URL xsltURL = getServletContext ( ).getResource ( XSLT_FILE );
118
119 templates = transformerFactory.newTemplates (
120 new StreamSource ( xsltURL.toExternalForm ( ) ) );
121 }
122 catch ( Exception ex )
123 {
124 throw new ServletException ( ex );
125 }
126 }
127
128 public void service (
129 HttpServletRequest httpServletRequest,
130 HttpServletResponse httpServletResponse )
131 throws IOException, ServletException
132 //////////////////////////////////////////////////////////////////////
133 {
134 try
135 {
136 Object request = toRequest ( httpServletRequest );
137
138 // System.out.println ( "Request: " + request );
139
140 Object response = wyrmServerLocal.serve ( request );
141
142 // System.out.println ( "Response: " + response );
143
144 if ( response == null )
145 {
146 httpServletResponse.setStatus (
147 HttpServletResponse.SC_NO_CONTENT );
148 }
149 else
150 {
151 httpServletResponse.setStatus ( HttpServletResponse.SC_OK );
152
153 // Is a Validator thread safe? If so, move creation to init().
154
155 Validator validator = jaxbContext.createValidator ( );
156
157 if ( !validator.validateRoot ( response ) )
158 {
159 throw new Exception ( "validateRoot returned false" );
160 }
161
162 Marshaller marshaller = jaxbContext.createMarshaller ( );
163
164 // Since the JAXB_ENCODING property is UTF-8 by default,
165 // setting this is unnecessary when the ENCODING_CHARSET
166 // is UTF-8.
167 //
168 // marshaller.setProperty (
169 // Marshaller.JAXB_ENCODING, ENCODING_CHARSET );
170
171 // JAXB_FORMATTED_OUTPUT is false by default.
172 //
173 // marshaller.setProperty (
174 // Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE );
175
176 /*
177 This is broken since the JAXB_SCHEMA_LOCATION uses the "xsi" namespace
178 but does not define it.
179
180 String shortName
181 = ClassLib.getShortName ( response.getClass ( ) );
182
183 // Trim off "Impl" at the end of the class name.
184
185 String schemaLocationHint
186 = httpServletRequest.getScheme ( )
187 + "://"
188 + httpServletRequest.getServerName ( )
189 + ":"
190 + httpServletRequest.getServerPort ( )
191 + httpServletRequest.getContextPath ( )
192 + XSD_DIR
193 + shortName.substring ( 0, shortName.length ( ) - 4 )
194 + XSD_EXT;
195
196 String jaxbSchemaLocation
197 = SCHEMA_LOCATION_NAMESPACE
198 + schemaLocationHint;
199
200 marshaller.setProperty (
201 Marshaller.JAXB_SCHEMA_LOCATION, jaxbSchemaLocation );
202 */
203
204 DOMResult domResult = new DOMResult ( );
205
206 marshaller.marshal ( response, domResult );
207
208 DOMSource domSource = new DOMSource ( domResult.getNode ( ) );
209
210 // Templates is thread safe; Transformer is not.
211
212 Transformer transformer = templates.newTransformer ( );
213
214 httpServletResponse.setContentType (
215 "text/xml; charset=" + ENCODING_CHARSET );
216
217 transformer.transform (
218 domSource,
219 new StreamResult ( httpServletResponse.getWriter ( ) ) );
220 }
221 }
222 catch ( Exception ex )
223 {
224 ex.printStackTrace ( httpServletResponse.getWriter ( ) );
225 }
226 }
227
228 //////////////////////////////////////////////////////////////////////
229 //////////////////////////////////////////////////////////////////////
230
231 private Object toRequest ( HttpServletRequest httpServletRequest )
232 throws JAXBException
233 //////////////////////////////////////////////////////////////////////
234 {
235 String requestType
236 = httpServletRequest.getParameter ( PARAM_REQUEST );
237
238 String password = null;
239
240 String username = null;
241
242 HttpSession httpSession = httpServletRequest.getSession ( );
243
244 if ( requestType == null )
245 {
246 requestType = TYPE_STATE;
247 }
248
249 if ( requestType.equals ( TYPE_CREATE_USER )
250 || requestType.equals ( TYPE_LOGIN ) )
251 {
252 username = httpServletRequest.getParameter ( PARAM_USERNAME );
253
254 password = httpServletRequest.getParameter ( PARAM_PASSWORD );
255
256 if ( requestType.equals ( TYPE_CREATE_USER ) )
257 {
258 String password2
259 = httpServletRequest.getParameter ( PARAM_PASSWORD_2 );
260
261 if ( ( password != null )
262 && !password.equals ( password2 ) )
263 {
264 password = null;
265 }
266 }
267
268 httpSession.setAttribute ( SESSION_USERNAME, username );
269
270 httpSession.setAttribute ( SESSION_PASSWORD, password );
271 }
272 else
273 {
274 password = ( String ) httpSession.getAttribute ( SESSION_PASSWORD );
275
276 username = ( String ) httpSession.getAttribute ( SESSION_USERNAME );
277
278 if ( requestType.equals ( TYPE_LOGOUT ) )
279 {
280 httpSession.invalidate ( );
281 }
282 }
283
284 Request request = ObjectFactory.createRequest ( );
285
286 request.setType ( requestType );
287
288 request.setUsername ( username );
289
290 request.setPassword ( password );
291
292 return request;
293 }
294
295 //////////////////////////////////////////////////////////////////////
296 //////////////////////////////////////////////////////////////////////
297 }