Stephen Davidson wrote:
> Greetings.
>
> I wrote a custom class for this, as I found that the standard merges
> that I tried did not work. The parser for the Web.xml file is
> Order-Sensitive for the elements. For your convenience, I have posted a
> copy of the class that I am using.
>
> NOTE: This class triggers JBoss Patch#537795/Jetty Patch#573842.
>
> -Steve
Thanks Steve, but I think I should be OK.
The snippet file looks like :
<servlet/>
.
.
.
<servlet-mapping/>
.
.
.
as long as I insert it between the last <servlet/> and first
<servlet-mapping/> entry in my web.xml I should be OK - or is Jasper
likely to start outputting a third directive to screw me ?
Jules
>
>
> ------------------------------------------------------------------------
>
> /*
> * MergeWebXML.java
> *
> * Created on March 15, 2002, 3:38 PM
> */
>
> package com.hrnexus;
>
> import java.io.File;
> import java.io.FileOutputStream;
> import java.io.IOException;
> import java.util.Iterator;
> import java.util.List;
> import org.jdom.Document;
> import org.jdom.DocType;
> import org.jdom.Element;
> import org.jdom.JDOMException;
> import org.jdom.input.SAXBuilder;
> import org.jdom.output.XMLOutputter;
> import com.hrnexus.common.shared.ParameterProcessor;
>
> /**
> *
> * @author Stephen Davidson
> */
> public class MergeWebXML {
> private final static boolean DEBUG = true;
> protected static final SAXBuilder builder = new SAXBuilder();
> protected static final ParameterProcessor proc = new
>ParameterProcessor("server");
> protected static final XMLOutputter outputter;
>
> private final static String IGNORE_SECTION_TOKEN = new String();
>
> protected final JspFilter jspFilter;
> private String jspBuildDir;
> private String jspXmlFile;
>
> static{
> outputter = new XMLOutputter(" ", true); //Indent 3 spaces, Newlines =
>true;
> outputter.setLineSeparator(System.getProperty("line.separator"));
> outputter.setOmitEncoding(false);
> outputter.setOmitDeclaration(false);
> outputter.setTextTrim(true);
> outputter.setTextNormalize(true);
> }
>
> /** Creates a new instance of MergeWebXML */
> public MergeWebXML(final String[] args) {
> for(int idx = 0; idx < args.length;idx++){
> if (args[idx].equals("-b")){
> jspBuildDir = args[++idx];
> idx++;
> }
>
> if (args[idx].equals("-f")){
> jspXmlFile = args[++idx];
> //idx++; //If more parameters are added, uncomment this.
> //Last Parameter should not increment, as for-loop does to prevent
> //infinite looping.
> }
> }
> if (jspXmlFile == null)
> throw new NullPointerException("Must set parameter -f");
> //initialize builder
> jspFilter = new JspFilter("Importer");
> }
>
> private void execute(){
> FileOutputStream outStream = null;
> try{
> //Load default web.xml file (Read/Write)
> File fWebXml = new File(proc.get("SourceDirectory"),
>"loadbuild/web.xml");
> if (DEBUG){
> System.out.println(fWebXml.getAbsolutePath());
> byte[] b = new byte[8196];
> int read;
> java.io.BufferedInputStream bStream = new
>java.io.BufferedInputStream(new java.io.FileInputStream(fWebXml));
> while ((read = bStream.read(b)) >= 0){
> System.out.write(b, 0, read);
> }
> bStream.close();
> }
> final Document hrxWebXml = builder.build(fWebXml);
>
> //Load generated webxml.xml file (Read Only)
> final File fJspWebXml = new File(jspBuildDir, jspXmlFile);
> final Document jspWebXML = builder.build(fJspWebXml);
>
> //merge
> //SPDBUG: The Web.XML file is ORDER SENSITIVE! The following is not
>viable!
> final Element rootHRX_XML = hrxWebXml.getRootElement();
> final Element rootJspWebXML = jspWebXML.getRootElement();
> // final List jspElements = rootJspWebXML.getChildren();
> final Element rootWebXML = new Element("web-app");
>
> //Add <servlet> section
> final Iterator itHRX = rootHRX_XML.getChildren().iterator();
> final Element firstServletMapping = loadXMLSection(itHRX, rootWebXML,
>"servlet", null);
> loadXMLSection(rootJspWebXML.getChildren("servlet").iterator(),
> rootWebXML, "servlet", null); //This should
>return null
>
> //Add <servlet-mapping> section
> final Element elementHandle = loadXMLSection(itHRX, rootWebXML,
>"servlet-mapping", firstServletMapping);
> loadXMLSection(rootJspWebXML.getChildren("servlet-mapping").iterator(),
> rootWebXML, "servlet-mapping", null); //This should
>return null
>
> //Add rest of HRX web.xml
> loadXMLSection(itHRX, rootWebXML, IGNORE_SECTION_TOKEN, elementHandle);
>
> //save
> if (DEBUG){
> System.out.println("Merged XML File::::::");
> outputter.output(rootWebXML, System.out);
> }
> final File outFile = new File(jspBuildDir, "web.xml");
> outStream = new FileOutputStream(outFile);
> DocType docType = hrxWebXml.getDocType();
> if ( docType != null ){
> docType = (DocType)docType.clone();
> }
> final Document webXml = new Document(rootWebXML, docType);
> outputter.output(webXml, outStream);
> }
> catch (JDOMException e){
> e.printStackTrace();
> throw new RuntimeException();
> }
> catch(java.io.FileNotFoundException e){
> e.printStackTrace();
> throw new RuntimeException(e.getMessage());
> }
> catch(java.io.IOException e){
> e.printStackTrace();
> throw new RuntimeException(e.getMessage());
> }
> finally{
> if (outStream != null){
> try{
> outStream.flush();
> }catch(IOException e){e.printStackTrace();}
> try{
> outStream.close();
> }catch(IOException e){e.printStackTrace();}
> }
> }
> }
>
> private Element loadXMLSection(final Iterator it, final Element rootElement,
> final String elementName, final Element firstElement){
> if ( (it == null) || (rootElement == null) || (elementName == null))
> throw new IllegalArgumentException("Nulls not allowed! Iterator = " + it
> + " rootElement = " + rootElement + " String elementName = " +
>elementName);
> if (firstElement != null)
> rootElement.addContent(firstElement);
> Element lastElement = null;
> try{
> do{
> final Element webElement = (Element) it.next();
> //Make copy for new page
> lastElement = (Element)webElement.clone();
> if ( (elementName == IGNORE_SECTION_TOKEN)
> || elementName.equals(lastElement.getName())){
> //Is Element "Proscribed?"
> if (jspFilter.canAdd(lastElement)){
> //Add to new page.
> rootElement.addContent(lastElement);
> }
> }
> else{
> break;
> }
> } while(true);
> }
> catch(java.util.NoSuchElementException e){
> //Overran list
> }
> //SPDBUG: JDom b8 is throwing this instead!
> catch(IllegalStateException e){
> //Overran list
> }
> return(lastElement);
> }
>
> public static void usage(){
> System.out.println("Usage: com.hrnexus.MergeWebXML -d <jspBuildDir> -f
><jspWebXMLFile>");
> }
>
> public static void main(final String[] args){
> if ((args == null) || (args.length < 1 )){
> usage();
> return;
> }
> //else
> MergeWebXML merger = new MergeWebXML(args);
> merger.execute();
> }
> //******************************************************************************
> //Private Helper classes
> //******************************************************************************
> //The following class filters out all classes from the supplied directory.
> //TODO: Enhance JspFilter to take a list of directories to exclude?
> private class JspFilter extends org.jdom.filter.ElementFilter
> {
> final protected String jspName;
> public JspFilter(final String jspName){
> this.jspName = jspName;
> };
> public JspFilter(final String jspName, final String name){
> super(name);
> this.jspName = jspName;
> };
> public JspFilter(final String jspName, final String name, org.jdom.Namespace
>namespace){
> super(name, namespace);
> this.jspName = jspName;
> };
>
> public boolean canAdd(final Object obj)
> {
> try{
> final Element currentElement = (Element)obj;
> final String servletName =
>currentElement.getChildText("servlet-name");
> if ((servletName != null) && (servletName.startsWith(jspName))){
> return(false);
> }
> } catch (ClassCastException e){}; //Not Element, so let super class
>handle object
> //default case
> return(super.canAdd(obj));
> }
> }
> }
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development