001         package com.croftsoft.core.servlet;
002    
003         import java.io.*;
004    
005         import javax.servlet.*;
006         import javax.servlet.http.*;
007    
008         import com.croftsoft.core.io.Encoder;
009         import com.croftsoft.core.io.Parser;
010         import com.croftsoft.core.role.Server;
011    
012         /*********************************************************************
013         * Relays HTTP requests to a Server.
014         *
015         * @version
016         *   $Id: HttpGatewayServlet.java,v 1.2 2006/11/28 01:31:07 croft Exp $
017         * @since
018         *   2003-05-13
019         * @author
020         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
021         *********************************************************************/
022    
023         public abstract class  HttpGatewayServlet
024           extends HttpServlet
025         //////////////////////////////////////////////////////////////////////
026         //////////////////////////////////////////////////////////////////////
027         {
028    
029         private final Server   server;
030    
031         private final Parser   parser;
032    
033         private final Encoder  encoder;
034    
035         //////////////////////////////////////////////////////////////////////
036         // protected and public constructor methods
037         //////////////////////////////////////////////////////////////////////
038    
039         protected  HttpGatewayServlet (
040           Server   server,
041           Parser   parser,
042           Encoder  encoder )
043         //////////////////////////////////////////////////////////////////////
044         {
045           this.server  = server;
046    
047           this.parser  = parser;
048    
049           this.encoder = encoder;
050         }
051    
052         public  HttpGatewayServlet ( )
053         //////////////////////////////////////////////////////////////////////
054         {
055           this ( ( Server ) null, ( Parser ) null, ( Encoder ) null );
056         }
057    
058         //////////////////////////////////////////////////////////////////////
059         // protected Encoder/Parser/Server methods that may be overridden
060         //////////////////////////////////////////////////////////////////////
061    
062         protected byte [ ]  encode ( Object  object )
063           throws IOException
064         //////////////////////////////////////////////////////////////////////
065         {
066           return encoder.encode ( object );
067         }
068    
069         protected Object  parse (
070           InputStream  inputStream,
071           int          contentLength )
072           throws IOException
073         //////////////////////////////////////////////////////////////////////
074         {
075           return parser.parse ( inputStream, contentLength );
076         }
077    
078         protected Object  serve ( Object  request )
079         //////////////////////////////////////////////////////////////////////
080         {
081           return server.serve ( request );
082         }
083    
084         //////////////////////////////////////////////////////////////////////
085         // public final service method
086         //////////////////////////////////////////////////////////////////////
087    
088         @Override
089         public final void  service (
090           HttpServletRequest   httpServletRequest,
091           HttpServletResponse  httpServletResponse )
092           throws IOException, ServletException
093         //////////////////////////////////////////////////////////////////////
094         {
095           try
096           {
097             Object  request = null;
098    
099             try
100             {
101               request = parse (
102                 httpServletRequest.getInputStream ( ), -1 );
103             }
104             catch ( IOException  ex )
105             {
106               httpServletResponse.setStatus (
107                   HttpServletResponse.SC_BAD_REQUEST );
108             }
109    
110             if ( request != null )
111             {
112               Object  response = serve ( request );
113    
114               if ( response != null )
115               {
116                 httpServletResponse.setStatus ( HttpServletResponse.SC_OK );
117    
118                 byte [ ]  bytes = encode ( response );
119    
120                 httpServletResponse.getOutputStream ( ).write ( bytes );
121               }
122               else
123               {
124                 httpServletResponse.setStatus (
125                   HttpServletResponse.SC_ACCEPTED );
126               }
127             }
128           }
129           catch ( Exception  ex )
130           {
131             httpServletResponse.setStatus (
132               HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
133    
134             log ( ex.getMessage ( ), ex );
135           }
136         }
137    
138         //////////////////////////////////////////////////////////////////////
139         //////////////////////////////////////////////////////////////////////
140         }