KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jboss > boot > servlets > BootServlet


1 /*
2  * JBoss, the OpenSource J2EE webOS
3  *
4  * Distributable under LGPL license.
5  * See terms of license at gnu.org.
6  */

7 package org.jboss.boot.servlets;
8
9 import java.io.BufferedInputStream JavaDoc;
10 import java.io.File JavaDoc;
11 import java.io.FileInputStream JavaDoc;
12 import java.io.FileNotFoundException JavaDoc;
13 import java.io.FileOutputStream JavaDoc;
14 import java.io.InputStream JavaDoc;
15 import java.io.IOException JavaDoc;
16 import java.net.URL JavaDoc;
17 import java.util.Enumeration JavaDoc;
18 import java.util.jar.JarEntry JavaDoc;
19 import java.util.jar.JarFile JavaDoc;
20 import java.util.jar.JarOutputStream JavaDoc;
21 import java.util.jar.Manifest JavaDoc;
22 import javax.servlet.ServletConfig JavaDoc;
23 import javax.servlet.ServletException JavaDoc;
24 import javax.servlet.ServletOutputStream JavaDoc;
25 import javax.servlet.http.HttpServlet JavaDoc;
26 import javax.servlet.http.HttpServletRequest JavaDoc;
27 import javax.servlet.http.HttpServletResponse JavaDoc;
28 import javax.xml.transform.TransformerFactory JavaDoc;
29 import javax.xml.transform.Transformer JavaDoc;
30 import javax.xml.transform.TransformerConfigurationException JavaDoc;
31 import javax.xml.transform.TransformerException JavaDoc;
32 import javax.xml.transform.Source JavaDoc;
33 import javax.xml.transform.stream.StreamSource JavaDoc;
34 import javax.xml.transform.stream.StreamResult JavaDoc;
35
36 import gnu.regexp.RE;
37 import gnu.regexp.REException;
38
39 import org.jboss.logging.Logger;
40
41 /** A prototype of a boot installation servlet that can be used as the
42 class loader for a JBoss server net install. This servlet transforms any
43 xml content requested using the default.xsl document available under the
44 transformBaseDir init-param. A configBaseDir init-param that defines the
45 root of the JBoss server distribution must be defined.
46
47  * @author Scott.Stark@jboss.org
48  * @version $revision:$
49  */

50 public class BootServlet extends HttpServlet JavaDoc
51 {
52    static Logger log = Logger.getLogger(BootServlet.class);
53    static File JavaDoc configBase;
54    static File JavaDoc transformBase;
55    static RE variableRE;
56    static TransformerFactory JavaDoc xsltFactory;
57
58    /** Initializes the servlet.
59     */

60    public void init(ServletConfig JavaDoc config) throws ServletException JavaDoc
61    {
62       super.init(config);
63       String JavaDoc configBaseDir = config.getInitParameter("configBaseDir");
64       if( configBaseDir == null )
65          throw new ServletException JavaDoc("No configBaseDir parameter specified");
66       configBase = new File JavaDoc(configBaseDir);
67       if( configBase.exists() == false || configBase.isDirectory() == false )
68          throw new ServletException JavaDoc("The configBaseDir("+configBaseDir+") does not exist is not a directory");
69       log.info("Using configBaseDir = "+configBase.getAbsolutePath());
70
71       String JavaDoc transformBaseDir = config.getInitParameter("transformBaseDir");
72       if( transformBaseDir == null )
73          log.warn("No transformBaseDir parameter specified, using classpath resources");
74       else
75       {
76          transformBase = new File JavaDoc(transformBaseDir);
77          if( transformBase.exists() == false || transformBase.isDirectory() == false )
78             throw new ServletException JavaDoc("The transformBaseDir("+transformBaseDir+") does not exist is not a directory");
79          log.info("Using transformBaseDir = "+transformBase.getAbsolutePath());
80       }
81
82       String JavaDoc reExp = config.getInitParameter("variableRE");
83       if( reExp == null )
84          reExp = "([^$]+)?\\${([^}]+)}([^$]+)?";
85       try
86       {
87          variableRE = new RE(reExp);
88          Util.setVariableRE(variableRE);
89          log.info("Using variableRE = "+variableRE.toString());
90       }
91       catch(REException e)
92       {
93          throw new ServletException JavaDoc("Failed to init variableRE", e);
94       }
95
96       xsltFactory = TransformerFactory.newInstance();
97    }
98
99    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
100     * @param request servlet request
101     * @param response servlet response
102     */

103    protected void processRequest(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
104       throws ServletException JavaDoc, IOException JavaDoc, TransformerException JavaDoc
105    {
106       String JavaDoc pathInfo = request.getPathInfo();
107       log.trace("Begin, pathInfo = "+pathInfo);
108       if( pathInfo.charAt(0) == '/' )
109          pathInfo = pathInfo.substring(1);
110       ServletOutputStream JavaDoc out = response.getOutputStream();
111       if( isJar(pathInfo) )
112          transformJarFile(out, pathInfo);
113       else if( isXml(pathInfo) )
114          transformFile(out, pathInfo);
115       else
116          copy(out, pathInfo);
117       log.trace("End, pathInfo = "+pathInfo);
118    }
119
120    /** Handles the HTTP <code>GET</code> method.
121     * @param request servlet request
122     * @param response servlet response
123     */

124    protected void doGet(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
125       throws ServletException JavaDoc, IOException JavaDoc
126    {
127       try
128       {
129          processRequest(request, response);
130       }
131       catch(TransformerException JavaDoc e)
132       {
133          throw new ServletException JavaDoc("XLST failure", e);
134       }
135    }
136
137    /** Handles the HTTP <code>POST</code> method.
138     * @param request servlet request
139     * @param response servlet response
140     */

141    protected void doPost(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
142       throws ServletException JavaDoc, IOException JavaDoc
143    {
144       try
145       {
146          processRequest(request, response);
147       }
148       catch(TransformerException JavaDoc e)
149       {
150          throw new ServletException JavaDoc("XLST failure", e);
151       }
152    }
153
154    public String JavaDoc getServletInfo()
155    {
156       return "JBoss net boot servlet";
157    }
158
159    static boolean isJar(String JavaDoc path)
160    {
161       boolean isJar = path.endsWith(".jar")
162          | path.endsWith(".war")
163          | path.endsWith(".ear")
164          | path.endsWith(".rar")
165          | path.endsWith(".sar");
166       return isJar;
167    }
168    static boolean isXml(String JavaDoc path)
169    {
170       return path.endsWith(".xml");
171    }
172
173    static void copy(ServletOutputStream JavaDoc out, String JavaDoc path) throws IOException JavaDoc
174    {
175       File JavaDoc content = new File JavaDoc(configBase, path);
176       FileInputStream JavaDoc fis = new FileInputStream JavaDoc(content);
177       BufferedInputStream JavaDoc bis = new BufferedInputStream JavaDoc(fis);
178       byte[] buffer = new byte[2048];
179       int bytes = bis.read(buffer);
180       while( bytes > 0 )
181       {
182          out.write(buffer, 0, bytes);
183          bytes = bis.read(buffer);
184       }
185       bis.close();
186       out.close();
187    }
188    static void transformFile(ServletOutputStream JavaDoc out, String JavaDoc path)
189       throws IOException JavaDoc, TransformerException JavaDoc
190    {
191       // Get the XML input document and the stylesheet.
192
File JavaDoc serviceFile = new File JavaDoc(configBase, path);
193       FileInputStream JavaDoc fisXML = new FileInputStream JavaDoc(serviceFile);
194       Source JavaDoc xmlSource = new StreamSource JavaDoc(fisXML);
195       InputStream JavaDoc fisXSL = null;
196       if( transformBase != null )
197       {
198          File JavaDoc hostXSL = new File JavaDoc(transformBase, "default.xsl");
199          fisXSL = new FileInputStream JavaDoc(hostXSL);
200       }
201       else
202       {
203          ClassLoader JavaDoc loader = Thread.currentThread().getContextClassLoader();
204          URL JavaDoc hostXSL = loader.getResource("default.xsl");
205          if( hostXSL == null )
206             throw new FileNotFoundException JavaDoc("Failed to find resource: default.xsl");
207          fisXSL = hostXSL.openStream();
208       }
209       Source JavaDoc xslSource = new StreamSource JavaDoc(fisXSL);
210       // Generate the transformer.
211
Transformer JavaDoc transformer = xsltFactory.newTransformer(xslSource);
212       // Perform the transformation, sending the output to the response.
213
transformer.transform(xmlSource, new StreamResult JavaDoc(out));
214       out.close();
215    }
216    static void transformJarFile(ServletOutputStream JavaDoc out, String JavaDoc path)
217       throws IOException JavaDoc, TransformerException JavaDoc
218    {
219       TransformerFactory JavaDoc xsltFactory = TransformerFactory.newInstance();
220       // Get the XML input document and the stylesheet.
221
File JavaDoc serviceFile = new File JavaDoc(configBase, path);
222       JarFile JavaDoc sarFile = new JarFile JavaDoc(serviceFile);
223       Manifest JavaDoc mf = sarFile.getManifest();
224       Enumeration JavaDoc entries = sarFile.entries();
225       JarOutputStream JavaDoc jos = new JarOutputStream JavaDoc(out, mf);
226       File JavaDoc hostXSL = new File JavaDoc(transformBase, "default.xsl");
227       byte[] buffer = new byte[2048];
228
229       while( entries.hasMoreElements() )
230       {
231          JarEntry JavaDoc entry = (JarEntry JavaDoc) entries.nextElement();
232          InputStream JavaDoc is = sarFile.getInputStream(entry);
233          String JavaDoc name = entry.getName();
234          log.trace("Begin entry: "+name+", size="+entry.getSize());
235          if( name.equals("META-INF/MANIFEST.MF") )
236             continue;
237          if( name.endsWith(".xml") == false )
238          {
239             jos.putNextEntry(entry);
240             // Copy the entry
241
int totalBytes = 0;
242             int bytes = is.read(buffer);
243             while( bytes > 0 )
244             {
245                jos.write(buffer, 0, bytes);
246                totalBytes += bytes;
247                bytes = is.read(buffer);
248             }
249             is.close();
250             jos.flush();
251          }
252          else
253          {
254             JarEntry JavaDoc newEntry = new JarEntry JavaDoc(name);
255             newEntry.setTime(entry.getTime());
256             jos.putNextEntry(newEntry);
257             Source JavaDoc xmlSource = new StreamSource JavaDoc(is);
258             FileInputStream JavaDoc fisXSL = new FileInputStream JavaDoc(hostXSL);
259             Source JavaDoc xslSource = new StreamSource JavaDoc(fisXSL);
260             // Generate the transformer.
261
Transformer JavaDoc transformer = xsltFactory.newTransformer(xslSource);
262             // Perform the transformation, sending the output to the response.
263
transformer.transform(xmlSource, new StreamResult JavaDoc(jos));
264          }
265          jos.closeEntry();
266          log.trace("End entry: "+name);
267       }
268
269       jos.close();
270    }
271
272 }
273
Popular Tags