[jboss-cvs] JBossAS SVN: r57918 - in branches/JBoss_4_0_5_GA_JBAS-3790/tomcat: . src/main/org/jboss/web src/main/org/jboss/web/jsf src/main/org/jboss/web/jsf/integration src/main/org/jboss/web/jsf/integration/config src/main/org/jboss/web/tomcat src/main/org/jboss/web/tomcat/tc6 src/main/org/jboss/web/tomcat/tc6/jasper src/resources

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Oct 30 09:22:15 EST 2006


Author: stan.silvert at jboss.com
Date: 2006-10-30 09:22:11 -0500 (Mon, 30 Oct 2006)
New Revision: 57918

Added:
   branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/jsf/
   branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/jsf/integration/
   branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/jsf/integration/config/
   branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/jsf/integration/config/JBossJSFConfigureListener.java
   branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/jsf/integration/config/Log4JConversionFilter.java
   branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/tomcat/tc6/
   branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/tomcat/tc6/jasper/
   branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/tomcat/tc6/jasper/JspServletOptions.java
   branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/tomcat/tc6/jasper/TagLibCache.java
Modified:
   branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/build.xml
   branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/resources/web.xml
Log:
Add JSF 1.2, JSP 2.1, and JSTL 1.2


Modified: branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/build.xml
===================================================================
--- branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/build.xml	2006-10-30 14:21:55 UTC (rev 57917)
+++ branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/build.xml	2006-10-30 14:22:11 UTC (rev 57918)
@@ -54,7 +54,9 @@
     <!-- The combined library classpath -->
     <path id="library.classpath">
       <path refid="sun.servlet.classpath"/>
+      <path refid="sun.jsf.classpath"/>
       <path refid="apache.commons.classpath"/>
+      <path refid="apache.log4j.classpath"/>
       <path refid="junit.junit.classpath"/>
       <path refid="dom4j.dom4j.classpath"/>
       <path refid="oswego.concurrent.classpath"/>
@@ -152,8 +154,8 @@
     <mkdir dir="${build.classes}"/>
     <javac destdir="${build.classes}"
       optimize="${javac.optimize}"
-      target="${javac.target}"
-      source="${javac.source}"
+      target="1.5"
+      source="1.5"
       debug="${javac.debug}"
       depend="${javac.depend}"
       verbose="${javac.verbose}"
@@ -223,34 +225,36 @@
     <copy todir="${build.deploy}/jbossweb-tomcat55.sar">
       <fileset dir="${apache.tomcat55.lib}">
         <include name="*.jar"/>
+        <exclude name="jasper-*"/>
       </fileset>
+      <fileset dir="${jboss.web.lib}">
+         <include name="el-api.jar"/>
+         <include name="jasper-jdt.jar"/>
+         <include name="jsp-api.jar"/>
+      </fileset>
     </copy>
 
    <copy todir="${build.deploy}/jbossweb-tomcat55.sar"
         file="${apache.modeler.lib}/commons-modeler.jar" />
 
      <copy todir="${build.deploy}/jbossweb-tomcat55.sar"
-        file="${commons.el.lib}/commons-el.jar" />
+        file="${sun.jstl.lib}/jstl.jar" />
 
-     <copy todir="${build.deploy}/jbossweb-tomcat55.sar/jsf-libs">
-        <fileset dir="${apache.myfaces.lib}">
-           <include name="jstl.jar"/>
-           <include name="myfaces-api.jar"/>
-           <include name="myfaces-impl.jar"/>
-        </fileset>
-     </copy>
+     <mkdir dir="${build.deploy}/jbossweb-tomcat55.sar/jsf-libs"/>
+   
+    <copy todir="${build.deploy}/jbossweb-tomcat55.sar/jsf-libs">        
+       <fileset dir="${sun.jsf.lib}">           
+          <include name="*.jar" />
+       </fileset>
+    </copy>
 
-     <copy todir="${build.deploy}/jbossweb-tomcat55.sar/jsf-libs"
-        file="${apache.collections.lib}/commons-collections.jar" />
-     <copy todir="${build.deploy}/jbossweb-tomcat55.sar/jsf-libs"
-        file="${apache.codec.lib}/commons-codec.jar" />
-     <copy todir="${build.deploy}/jbossweb-tomcat55.sar/jsf-libs"
-        file="${apache.beanutils.lib}/commons-beanutils.jar" />
-     <copy todir="${build.deploy}/jbossweb-tomcat55.sar/jsf-libs"
-        file="${apache.digester.lib}/commons-digester-1.6.jar" />
-     <copy todir="${build.deploy}/jbossweb-tomcat55.sar/jsf-libs"
-        file="${apache.lang.lib}/commons-lang-2.1.jar" />
-
+    <!-- jar for jsf integration classes -->
+    <jar jarfile="${build.deploy}/jbossweb-tomcat55.sar/jsf-libs/jboss-faces.jar">
+      <fileset dir="${build.classes}">
+         <include name="org/jboss/web/jsf/integration/**"/>
+      </fileset>
+    </jar>
+     
     <jar jarfile="${build.deploy}/jbossweb-tomcat55.sar/tomcat55-service.jar"
       manifest="${build.etc}/default.mf">
       <!-- The service classes -->
@@ -261,6 +265,7 @@
         <include name="org/jboss/web/tomcat/filters/**"/>
         <include name="org/jboss/web/tomcat/servlets/**"/>
         <include name="org/jboss/web/tomcat/tc5/**"/>
+        <include name="org/jboss/web/tomcat/tc6/**"/>
         <include name="org/jboss/web/tomcat/security/**"/>
         <include name="org/jboss/web/tomcat/statistics/**"/>
       </fileset>

Added: branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/jsf/integration/config/JBossJSFConfigureListener.java
===================================================================
--- branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/jsf/integration/config/JBossJSFConfigureListener.java	2006-10-30 14:21:55 UTC (rev 57917)
+++ branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/jsf/integration/config/JBossJSFConfigureListener.java	2006-10-30 14:22:11 UTC (rev 57918)
@@ -0,0 +1,96 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.web.jsf.integration.config;
+
+import com.sun.faces.config.ConfigureListener;
+import com.sun.faces.util.Util;
+import java.util.logging.Filter;
+import javax.faces.FactoryFinder;
+import javax.faces.application.Application;
+import javax.faces.application.ApplicationFactory;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.jsp.JspFactory;
+import org.apache.log4j.Logger;
+
+/**
+ * This ServletContextListener sets up a JBoss-specific environment for JSF
+ * and then delegates the rest of the setup to the JSF RI.
+ *
+ * @author Stan Silvert
+ */
+public class JBossJSFConfigureListener extends ConfigureListener 
+{
+    
+    private static Logger LOG = Logger.getLogger(JBossJSFConfigureListener.class);
+    
+    public static final String SHOULD_LOG_CONFIG_MESSAGES = "com.sun.faces.displayConfiguration";
+    
+    private ServletContext servletContext;
+    
+    @Override
+    public void contextInitialized(ServletContextEvent event) 
+    {
+        this.servletContext = event.getServletContext();
+        
+        // If the pluginClass is not set, assume Log4J
+        if (System.getProperty("org.jboss.logging.Logger.pluginClass") == null) 
+        {
+            setLog4J();
+        }
+
+        super.contextInitialized(event);
+    }
+    
+    /**
+     * If Log4J is being used, set a filter that converts JSF RI java.util.logger
+     * messages to Log4J messages.
+     */
+    private void setLog4J() 
+    {
+        Filter conversionFilter = new Log4JConversionFilter(logConfigMessages());
+        
+        java.util.logging.Logger.getLogger(Util.FACES_LOGGER)
+                                .setFilter(conversionFilter);
+        java.util.logging.Logger.getLogger(Util.FACES_LOGGER + Util.APPLICATION_LOGGER)
+                                .setFilter(conversionFilter);
+        java.util.logging.Logger.getLogger(Util.FACES_LOGGER + Util.CONFIG_LOGGER)
+                                .setFilter(conversionFilter);
+        java.util.logging.Logger.getLogger(Util.FACES_LOGGER + Util.CONTEXT_LOGGER)
+                                .setFilter(conversionFilter);
+        java.util.logging.Logger.getLogger(Util.FACES_LOGGER + Util.LIFECYCLE_LOGGER)
+                                .setFilter(conversionFilter);
+        java.util.logging.Logger.getLogger(Util.FACES_LOGGER + Util.RENDERKIT_LOGGER)
+                                .setFilter(conversionFilter);
+        java.util.logging.Logger.getLogger(Util.FACES_LOGGER + Util.TAGLIB_LOGGER)
+                                .setFilter(conversionFilter);
+    }
+    
+    // should we log the configuration messages?
+    private boolean logConfigMessages() 
+    {
+        String shouldLogConfigParam = this.servletContext.getInitParameter(SHOULD_LOG_CONFIG_MESSAGES);
+        return (shouldLogConfigParam != null) && (shouldLogConfigParam.equalsIgnoreCase("true"));
+    }
+    
+}

Added: branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/jsf/integration/config/Log4JConversionFilter.java
===================================================================
--- branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/jsf/integration/config/Log4JConversionFilter.java	2006-10-30 14:21:55 UTC (rev 57917)
+++ branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/jsf/integration/config/Log4JConversionFilter.java	2006-10-30 14:22:11 UTC (rev 57918)
@@ -0,0 +1,159 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.web.jsf.integration.config;
+
+import com.sun.faces.util.Util;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.logging.Filter;
+import java.util.logging.Formatter;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.SimpleFormatter;
+import org.apache.log4j.Logger;
+import org.apache.log4j.Priority;
+
+/**
+ * This filter is used to convert java.util.logging messages from the JSF RI
+ * to Log4J messages.
+ *
+ * @author Stan Silvert
+ */
+public class Log4JConversionFilter implements Filter 
+{
+    
+    // cache Logger instances.  Logger.getLogger() is known to be slow.
+    // See http://www.qos.ch/logging/thinkAgain.jsp
+    private Map<String, Logger> loggerCache = new HashMap<String, Logger>();
+    
+    private Formatter formatter = new SimpleFormatter();
+    
+    // should we log the INFO level config messages that tell about
+    // servlet context params?
+    private boolean logConfigMessages;
+    
+    public Log4JConversionFilter(boolean logConfigMessages) 
+    {
+        this.logConfigMessages = logConfigMessages;
+    }
+    
+    private boolean isConfigStartupMessage(LogRecord record) 
+    {
+        return record.getMessage().equals("jsf.config.listener.version") ||
+               record.getMessage().equals("jsf.config.listener.version.complete");
+    }
+    
+    /**
+     * If the JSF RI message should be logged, convert the JDK 1.4 
+     * LogRecord to a Log4J message.
+     *
+     * @return <code>false</code> because JDK 1.4 logging should not happen
+     *         for JSF if this filter is active.
+     */
+    public boolean isLoggable(LogRecord record) 
+    {
+        if (!logConfigMessages && isConfigStartupMessage(record)) return false;
+        
+        Logger logger = getLogger(record);
+        
+        if (record.getThrown() != null) 
+        {
+            logWithThrowable(logger, record);
+        } 
+        else 
+        {
+            logWithoutThrowable(logger, record);
+        }
+        
+        return false;
+    }
+    
+    private void logWithThrowable(Logger logger, LogRecord record) 
+    {
+        int loggedLevel = record.getLevel().intValue();
+        Object message = formatter.formatMessage(record);
+        Throwable throwable = record.getThrown();
+        
+        if (loggedLevel == Level.INFO.intValue()) 
+        {
+            logger.info(message, throwable);
+            return;
+        }
+        
+        if (loggedLevel == Level.WARNING.intValue()) 
+        {
+            logger.warn(message, throwable);
+            return;
+        }
+        
+        if (loggedLevel == Level.SEVERE.intValue()) 
+        {
+            logger.fatal(message, throwable);
+            return;
+        }
+    
+        logger.info(message, throwable);
+    }
+    
+    private void logWithoutThrowable(Logger logger, LogRecord record) 
+    {
+        int loggedLevel = record.getLevel().intValue();
+        Object message = formatter.formatMessage(record);
+        
+        if (loggedLevel == Level.INFO.intValue()) 
+        {
+            logger.info(message);
+            return;
+        }
+        
+        if (loggedLevel == Level.WARNING.intValue()) 
+        {
+            logger.warn(message);
+            return;
+        }
+        
+        if (loggedLevel == Level.SEVERE.intValue()) 
+        {
+            logger.fatal(message);
+            return;
+        }
+    
+        logger.info(message);
+    }
+    
+    // get the Log4J logger corresponding to the java.util.logger.LogRecord
+    private Logger getLogger(LogRecord record) 
+    {
+        String loggerName = record.getLoggerName();
+        Logger logger = loggerCache.get(loggerName);
+        if (logger == null) 
+        {
+            logger = Logger.getLogger(loggerName);
+            loggerCache.put(loggerName, logger);
+        }
+        
+        return logger;
+    }
+    
+}

Added: branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/tomcat/tc6/jasper/JspServletOptions.java
===================================================================
--- branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/tomcat/tc6/jasper/JspServletOptions.java	2006-10-30 14:21:55 UTC (rev 57917)
+++ branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/tomcat/tc6/jasper/JspServletOptions.java	2006-10-30 14:22:11 UTC (rev 57918)
@@ -0,0 +1,792 @@
+/*
+ * Copyright 1999,2004 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.web.tomcat.tc6.jasper;
+
+import java.util.Properties;
+import java.util.Enumeration;
+import java.util.ArrayList;
+import java.util.Map;
+import java.io.File;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+
+import org.apache.jasper.Options;
+import org.apache.jasper.Constants;
+import org.apache.jasper.xmlparser.ParserUtils;
+import org.apache.jasper.compiler.TldLocationsCache;
+import org.apache.jasper.compiler.JspConfig;
+import org.apache.jasper.compiler.TagPluginManager;
+import org.apache.jasper.compiler.Localizer;
+import org.jboss.logging.Logger;
+
+/**
+ * Override the default JspServletOptions to externalize the jsp layer
+ * configuration. This overrides the default TagLibCache to the jboss version.
+ * 
+ * @author Scott.Stark at jboss.org
+ * @version $Revision: 57000 $
+ */
+public class JspServletOptions
+   implements Options
+{
+   static Logger log = Logger.getLogger(JspServletOptions.class);
+
+   private Properties settings = new Properties();
+
+   /**
+    * Is Jasper being used in development mode?
+    */
+   private boolean development = true;
+
+   /**
+    * Should Ant fork its java compiles of JSP pages.
+    */
+   public boolean fork = true;
+
+   /**
+    * Do you want to keep the generated Java files around?
+    */
+   private boolean keepGenerated = true;
+
+   /**
+    * Should white spaces between directives or actions be trimmed?
+    */
+   private boolean trimSpaces = false;
+
+   /**
+    * Determines whether tag handler pooling is enabled.
+    */
+   private boolean isPoolingEnabled = true;
+
+   /**
+    * Do you want support for "mapped" files? This will generate servlet that
+    * has a print statement per line of the JSP file. This seems like a really
+    * nice feature to have for debugging.
+    */
+   private boolean mappedFile = true;
+
+   /**
+    * Do you want stack traces and such displayed in the client's browser? If
+    * this is false, such messages go to the standard error or a log file if the
+    * standard error is redirected.
+    */
+   private boolean sendErrorToClient = false;
+
+   /**
+    * Do we want to include debugging information in the class file?
+    */
+   private boolean classDebugInfo = true;
+
+   /**
+    * Background compile thread check interval in seconds.
+    */
+   private int checkInterval = 0;
+
+   /**
+    * Is the generation of SMAP info for JSR45 debuggin suppressed?
+    */
+   private boolean isSmapSuppressed = false;
+
+   /**
+    * Should SMAP info for JSR45 debugging be dumped to a file?
+    */
+   private boolean isSmapDumped = false;
+
+   /**
+    * Are Text strings to be generated as char arrays?
+    */
+   private boolean genStringAsCharArray = false;
+
+   private boolean errorOnUseBeanInvalidClassAttribute = true;
+
+   /**
+    * I want to see my generated servlets. Which directory are they in?
+    */
+   private File scratchDir;
+
+   /**
+    * Need to have this as is for versions 4 and 5 of IE. Can be set from the
+    * initParams so if it changes in the future all that is needed is to have a
+    * jsp initParam of type ieClassId="<value>"
+    */
+   private String ieClassId = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93";
+
+   /**
+    * What classpath should I use while compiling generated servlets?
+    */
+   private String classpath = null;
+
+   /**
+    * Compiler to use.
+    */
+   private String compiler = null;
+
+   /**
+    * The compiler class name.
+    */
+   private String compilerClassName = null;
+   
+   /**
+    * Compiler target VM.
+    */
+   private String compilerTargetVM = "1.4";
+
+   /**
+    * The compiler source VM.
+    */
+   private String compilerSourceVM = "1.4";
+
+   /**
+    * Cache for the TLD locations
+    */
+   private TldLocationsCache tldLocationsCache = null;
+
+   /**
+    * Jsp config information
+    */
+   private JspConfig jspConfig = null;
+
+   /**
+    * TagPluginManager
+    */
+   private TagPluginManager tagPluginManager = null;
+
+   /**
+    * Java platform encoding to generate the JSP page servlet.
+    */
+   private String javaEncoding = "UTF8";
+
+   /**
+    * Modification test interval.
+    */
+   private int modificationTestInterval = 4;
+
+   private boolean ignoreAnnotations;
+
+
+
+   /**
+    * Is generation of X-Powered-By response header enabled/disabled?
+    */
+   private boolean xpoweredBy;
+
+
+   public boolean getIgnoreAnnotations()
+   {
+      return ignoreAnnotations;
+   }
+
+   public void setIgnoreAnnotations(boolean ignoreAnnotations)
+   {
+      this.ignoreAnnotations = ignoreAnnotations;
+   }
+
+   public String getProperty(String name)
+   {
+      return settings.getProperty(name);
+   }
+
+   public void setProperty(String name, String value)
+   {
+      if (name != null && value != null)
+      {
+         settings.setProperty(name, value);
+      }
+   }
+
+   /**
+    * Are we keeping generated code around?
+    */
+   public boolean getKeepGenerated()
+   {
+      return keepGenerated;
+   }
+
+   /**
+    * Should white spaces between directives or actions be trimmed?
+    */
+   public boolean getTrimSpaces()
+   {
+      return trimSpaces;
+   }
+
+   public boolean isPoolingEnabled()
+   {
+      return isPoolingEnabled;
+   }
+
+   /**
+    * Are we supporting HTML mapped servlets?
+    */
+   public boolean getMappedFile()
+   {
+      return mappedFile;
+   }
+
+   /**
+    * Should errors be sent to client or thrown into stderr?
+    */
+   public boolean getSendErrorToClient()
+   {
+      return sendErrorToClient;
+   }
+
+   /**
+    * Should class files be compiled with debug information?
+    */
+   public boolean getClassDebugInfo()
+   {
+      return classDebugInfo;
+   }
+
+   /**
+    * Background JSP compile thread check intervall
+    */
+   public int getCheckInterval()
+   {
+      return checkInterval;
+   }
+
+   /**
+    * Modification test interval.
+    */
+   public int getModificationTestInterval()
+   {
+      return modificationTestInterval;
+   }
+
+   /**
+    * Is Jasper being used in development mode?
+    */
+   public boolean getDevelopment()
+   {
+      return development;
+   }
+
+   /**
+    * Is the generation of SMAP info for JSR45 debuggin suppressed?
+    */
+   public boolean isSmapSuppressed()
+   {
+      return isSmapSuppressed;
+   }
+
+   /**
+    * Should SMAP info for JSR45 debugging be dumped to a file?
+    */
+   public boolean isSmapDumped()
+   {
+      return isSmapDumped;
+   }
+
+   /**
+    * Are Text strings to be generated as char arrays?
+    */
+   public boolean genStringAsCharArray()
+   {
+      return this.genStringAsCharArray;
+   }
+
+   /**
+    * Class ID for use in the plugin tag when the browser is IE.
+    */
+   public String getIeClassId()
+   {
+      return ieClassId;
+   }
+
+   /**
+    * What is my scratch dir?
+    */
+   public File getScratchDir()
+   {
+      return scratchDir;
+   }
+
+   /**
+    * What classpath should I use while compiling the servlets generated from
+    * JSP files?
+    */
+   public String getClassPath()
+   {
+      return classpath;
+   }
+
+   /**
+    * Is generation of X-Powered-By response header enabled/disabled?
+    */
+   public boolean isXpoweredBy()
+   {
+      return xpoweredBy;
+   }
+
+   /**
+    * Compiler to use.
+    */
+   public String getCompiler()
+   {
+      return compiler;
+   }
+
+   /**
+    * @see Options#getCompilerClassName
+    */
+   public String getCompilerClassName()
+   {
+      return compilerClassName;
+   }
+   
+   /**
+    * @see Options#getCompilerTargetVM
+    */
+   public String getCompilerTargetVM()
+   {
+      return compilerTargetVM;
+   }
+
+   /**
+    * @see Options#getCompilerSourceVM
+    */
+   public String getCompilerSourceVM()
+   {
+      return compilerSourceVM;
+   }
+
+   public boolean getErrorOnUseBeanInvalidClassAttribute()
+   {
+      return errorOnUseBeanInvalidClassAttribute;
+   }
+
+   public void setErrorOnUseBeanInvalidClassAttribute(boolean b)
+   {
+      errorOnUseBeanInvalidClassAttribute = b;
+   }
+
+   public TldLocationsCache getTldLocationsCache()
+   {
+      return tldLocationsCache;
+   }
+
+   public void setTldLocationsCache(TldLocationsCache tldC)
+   {
+      tldLocationsCache = tldC;
+   }
+
+   public String getJavaEncoding()
+   {
+      return javaEncoding;
+   }
+
+   public boolean getFork()
+   {
+      return fork;
+   }
+
+   public JspConfig getJspConfig()
+   {
+      return jspConfig;
+   }
+
+   public TagPluginManager getTagPluginManager()
+   {
+      return tagPluginManager;
+   }
+
+   /**
+    * Is caching enabled (used for precompilation).
+    */
+   public boolean isCaching()
+   {
+      return false;
+   }
+    
+   /**
+    * The web-application wide cache for the returned TreeNode
+    * by parseXMLDocument in TagLibraryInfoImpl.parseTLD,
+    * if isCaching returns true.
+    * 
+    * @return the Map(String uri, TreeNode tld) instance.
+    */
+   public Map getCache()
+   {
+      return null;
+   }
+
+   /**
+    * Create an EmbeddedServletOptions object using data available from
+    * ServletConfig and ServletContext.
+    */
+   public JspServletOptions(ServletConfig config, ServletContext context)
+   {
+
+      Enumeration enumeration = config.getInitParameterNames();
+      while (enumeration.hasMoreElements())
+      {
+         String k = (String) enumeration.nextElement();
+         String v = config.getInitParameter(k);
+         setProperty(k, v);
+      }
+
+      // quick hack
+      String validating = config.getInitParameter("validating");
+      if ("false".equals(validating)) ParserUtils.validating = false;
+
+      String keepgen = config.getInitParameter("keepgenerated");
+      if (keepgen != null)
+      {
+         if (keepgen.equalsIgnoreCase("true"))
+         {
+            this.keepGenerated = true;
+         }
+         else if (keepgen.equalsIgnoreCase("false"))
+         {
+            this.keepGenerated = false;
+         }
+         else
+         {
+            log.warn(Localizer.getMessage("jsp.warning.keepgen"));
+         }
+      }
+
+
+      String trimsp = config.getInitParameter("trimSpaces");
+      if (trimsp != null)
+      {
+         if (trimsp.equalsIgnoreCase("true"))
+         {
+            trimSpaces = true;
+         }
+         else if (trimsp.equalsIgnoreCase("false"))
+         {
+            trimSpaces = false;
+         }
+         else
+         {
+            log.warn(Localizer.getMessage("jsp.warning.trimspaces"));
+         }
+      }
+
+      this.isPoolingEnabled = true;
+      String poolingEnabledParam
+         = config.getInitParameter("enablePooling");
+      if (poolingEnabledParam != null
+         && !poolingEnabledParam.equalsIgnoreCase("true"))
+      {
+         if (poolingEnabledParam.equalsIgnoreCase("false"))
+         {
+            this.isPoolingEnabled = false;
+         }
+         else
+         {
+            log.warn(Localizer.getMessage("jsp.warning.enablePooling"));
+         }
+      }
+
+      String mapFile = config.getInitParameter("mappedfile");
+      if (mapFile != null)
+      {
+         if (mapFile.equalsIgnoreCase("true"))
+         {
+            this.mappedFile = true;
+         }
+         else if (mapFile.equalsIgnoreCase("false"))
+         {
+            this.mappedFile = false;
+         }
+         else
+         {
+            log.warn(Localizer.getMessage("jsp.warning.mappedFile"));
+         }
+      }
+
+      String senderr = config.getInitParameter("sendErrToClient");
+      if (senderr != null)
+      {
+         if (senderr.equalsIgnoreCase("true"))
+         {
+            this.sendErrorToClient = true;
+         }
+         else if (senderr.equalsIgnoreCase("false"))
+         {
+            this.sendErrorToClient = false;
+         }
+         else
+         {
+            log.warn(Localizer.getMessage("jsp.warning.sendErrToClient"));
+         }
+      }
+
+      String debugInfo = config.getInitParameter("classdebuginfo");
+      if (debugInfo != null)
+      {
+         if (debugInfo.equalsIgnoreCase("true"))
+         {
+            this.classDebugInfo = true;
+         }
+         else if (debugInfo.equalsIgnoreCase("false"))
+         {
+            this.classDebugInfo = false;
+         }
+         else
+         {
+            log.warn(Localizer.getMessage("jsp.warning.classDebugInfo"));
+         }
+      }
+
+      String checkInterval = config.getInitParameter("checkInterval");
+      if (checkInterval != null)
+      {
+         try
+         {
+            this.checkInterval = Integer.parseInt(checkInterval);
+            if (this.checkInterval == 0)
+            {
+               this.checkInterval = 300;
+               log.warn(Localizer.getMessage("jsp.warning.checkInterval"));
+            }
+         }
+         catch (NumberFormatException ex)
+         {
+            log.warn(Localizer.getMessage("jsp.warning.checkInterval"));
+         }
+      }
+
+      String modificationTestInterval = config.getInitParameter("modificationTestInterval");
+      if (modificationTestInterval != null)
+      {
+         try
+         {
+            this.modificationTestInterval = Integer.parseInt(modificationTestInterval);
+         }
+         catch (NumberFormatException ex)
+         {
+            log.warn(Localizer.getMessage("jsp.warning.modificationTestInterval"));
+         }
+      }
+
+      String development = config.getInitParameter("development");
+      if (development != null)
+      {
+         if (development.equalsIgnoreCase("true"))
+         {
+            this.development = true;
+         }
+         else if (development.equalsIgnoreCase("false"))
+         {
+            this.development = false;
+         }
+         else
+         {
+            log.warn(Localizer.getMessage("jsp.warning.development"));
+         }
+      }
+
+      String suppressSmap = config.getInitParameter("suppressSmap");
+      if (suppressSmap != null)
+      {
+         if (suppressSmap.equalsIgnoreCase("true"))
+         {
+            isSmapSuppressed = true;
+         }
+         else if (suppressSmap.equalsIgnoreCase("false"))
+         {
+            isSmapSuppressed = false;
+         }
+         else
+         {
+            log.warn(Localizer.getMessage("jsp.warning.suppressSmap"));
+         }
+      }
+
+      String dumpSmap = config.getInitParameter("dumpSmap");
+      if (dumpSmap != null)
+      {
+         if (dumpSmap.equalsIgnoreCase("true"))
+         {
+            isSmapDumped = true;
+         }
+         else if (dumpSmap.equalsIgnoreCase("false"))
+         {
+            isSmapDumped = false;
+         }
+         else
+         {
+            log.warn(Localizer.getMessage("jsp.warning.dumpSmap"));
+         }
+      }
+
+      String genCharArray = config.getInitParameter("genStrAsCharArray");
+      if (genCharArray != null)
+      {
+         if (genCharArray.equalsIgnoreCase("true"))
+         {
+            genStringAsCharArray = true;
+         }
+         else if (genCharArray.equalsIgnoreCase("false"))
+         {
+            genStringAsCharArray = false;
+         }
+         else
+         {
+            log.warn(Localizer.getMessage("jsp.warning.genchararray"));
+         }
+      }
+
+      String errBeanClass =
+         config.getInitParameter("errorOnUseBeanInvalidClassAttribute");
+      if (errBeanClass != null)
+      {
+         if (errBeanClass.equalsIgnoreCase("true"))
+         {
+            errorOnUseBeanInvalidClassAttribute = true;
+         }
+         else if (errBeanClass.equalsIgnoreCase("false"))
+         {
+            errorOnUseBeanInvalidClassAttribute = false;
+         }
+         else
+         {
+            log.warn(Localizer.getMessage("jsp.warning.errBean"));
+         }
+      }
+
+      String ieClassId = config.getInitParameter("ieClassId");
+      if (ieClassId != null)
+         this.ieClassId = ieClassId;
+
+      String classpath = config.getInitParameter("classpath");
+      if (classpath != null)
+         this.classpath = classpath;
+
+      /*
+       * scratchdir
+       */
+      String dir = config.getInitParameter("scratchdir");
+      if (dir != null)
+      {
+         scratchDir = new File(dir);
+      }
+      else
+      {
+         // First try the Servlet 2.2 javax.servlet.context.tempdir property
+         scratchDir = (File) context.getAttribute(Constants.TMP_DIR);
+         if (scratchDir == null)
+         {
+            // Not running in a Servlet 2.2 container.
+            // Try to get the JDK 1.2 java.io.tmpdir property
+            dir = System.getProperty("java.io.tmpdir");
+            if (dir != null)
+               scratchDir = new File(dir);
+         }
+      }
+      if (this.scratchDir == null)
+      {
+         log.fatal(Localizer.getMessage("jsp.error.no.scratch.dir"));
+         return;
+      }
+
+      if (!(scratchDir.exists() && scratchDir.canRead() &&
+         scratchDir.canWrite() && scratchDir.isDirectory()))
+         log.fatal(Localizer.getMessage("jsp.error.bad.scratch.dir",
+            scratchDir.getAbsolutePath()));
+
+      this.compiler = config.getInitParameter("compiler");
+
+      String compilerTargetVM = config.getInitParameter("compilerTargetVM");
+      if (compilerTargetVM != null)
+      {
+         this.compilerTargetVM = compilerTargetVM;
+      }
+
+      String compilerSourceVM = config.getInitParameter("compilerSourceVM");
+      if (compilerSourceVM != null)
+      {
+         this.compilerSourceVM = compilerSourceVM;
+      }
+
+      String javaEncoding = config.getInitParameter("javaEncoding");
+      if (javaEncoding != null)
+      {
+         this.javaEncoding = javaEncoding;
+      }
+
+      String compilerClassName = config.getInitParameter("compilerClassName");
+      if(compilerClassName != null)
+      {
+         this.compilerClassName = compilerClassName;
+      }
+      
+      String fork = config.getInitParameter("fork");
+      if (fork != null)
+      {
+         if (fork.equalsIgnoreCase("true"))
+         {
+            this.fork = true;
+         }
+         else if (fork.equalsIgnoreCase("false"))
+         {
+            this.fork = false;
+         }
+         else
+         {
+            log.warn(Localizer.getMessage("jsp.warning.fork"));
+         }
+      }
+
+      String xpoweredBy = config.getInitParameter("xpoweredBy");
+      if (xpoweredBy != null)
+      {
+         if (xpoweredBy.equalsIgnoreCase("true"))
+         {
+            this.xpoweredBy = true;
+         }
+         else if (xpoweredBy.equalsIgnoreCase("false"))
+         {
+            this.xpoweredBy = false;
+         }
+         else
+         {
+            log.warn(Localizer.getMessage("jsp.warning.xpoweredBy"));
+         }
+      }
+
+      /* Setup the global Tag Libraries location cache for this web app. The
+         tagLibJarN entries define the jars the cache should scan. 
+      */
+      String base = "tagLibJar";
+      ArrayList tldJars = new ArrayList();
+      int count = 0;
+      String jarPath = null;
+      do
+      {
+         String name = base + count;
+         jarPath = config.getInitParameter(name);
+         if( jarPath != null )
+            tldJars.add(jarPath);
+         count ++;
+      } while( jarPath != null );
+      
+      tldLocationsCache = new TagLibCache(context, tldJars);
+
+      // Setup the jsp config info for this web app.
+      jspConfig = new JspConfig(context);
+
+      // Create a Tag plugin instance
+      tagPluginManager = new TagPluginManager(context);
+   }
+
+}

Added: branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/tomcat/tc6/jasper/TagLibCache.java
===================================================================
--- branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/tomcat/tc6/jasper/TagLibCache.java	2006-10-30 14:21:55 UTC (rev 57917)
+++ branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/main/org/jboss/web/tomcat/tc6/jasper/TagLibCache.java	2006-10-30 14:22:11 UTC (rev 57918)
@@ -0,0 +1,446 @@
+/*
+ * Copyright 1999,2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.web.tomcat.tc6.jasper;
+
+import java.util.Set;
+import java.util.Iterator;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.jar.JarEntry;
+import java.util.jar.JarInputStream;
+import java.io.InputStream;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.MalformedURLException;
+import javax.servlet.ServletContext;
+import java.util.Map; // SYNC
+
+import org.apache.jasper.compiler.TldLocationsCache;
+import org.apache.jasper.compiler.Localizer;
+import org.apache.jasper.JasperException;
+import org.apache.jasper.Constants;
+import org.apache.jasper.xmlparser.TreeNode;
+import org.apache.jasper.xmlparser.ParserUtils;
+import org.jboss.logging.Logger;
+
+/**
+ * A prototype TagLibCache that allows one to obtain shared tlds from the
+ * jbossweb sar conf/tlds directory.
+ * @author Scott.Stark at jboss.org
+ * @version $Revision: 45726 $
+ */
+public class TagLibCache extends TldLocationsCache
+{
+   private static final String WEB_XML = "/WEB-INF/web.xml";
+   private static final String JAR_FILE_SUFFIX = ".jar";
+
+   private static Logger log = Logger.getLogger(TagLibCache.class);
+
+   private ServletContext ctx;
+   private HashMap mappings;
+   private ArrayList tagLibJars;
+
+   public TagLibCache(ServletContext ctx, ArrayList tagLibJars)
+   {
+      super(ctx, true);
+      this.ctx = ctx;
+      this.tagLibJars = tagLibJars;
+   }
+
+   /**
+    * Gets the 'location' of the TLD associated with the given taglib 'uri'.
+    *
+    * Returns null if the uri is not associated with any tag library 'exposed'
+    * in the web application. A tag library is 'exposed' either explicitly in
+    * web.xml or implicitly via the uri tag in the TLD of a taglib deployed in a
+    * jar file (WEB-INF/lib).
+    * @param uri The taglib uri
+    * @return An array of two Strings: The first element denotes the real path
+    *         to the TLD. If the path to the TLD points to a jar file, then the
+    *         second element denotes the name of the TLD entry in the jar file.
+    *         Returns null if the uri is not associated with any tag library
+    *         'exposed' in the web application.
+    */
+   public String[] getLocation(String uri) throws JasperException
+   {
+      if (mappings == null)
+         init();
+      String[] locations = (String[]) mappings.get(uri);
+      return locations;
+   }
+
+   private synchronized void init() throws JasperException
+   {
+     if (mappings != null)
+     {
+       return;
+     }
+
+     HashMap tmpMappings = null;
+      try
+      {
+         tmpMappings = new HashMap();
+         processWebDotXml(tmpMappings);
+         loadStandardTlds(tmpMappings);
+         processTldsInFileSystem("/WEB-INF/", tmpMappings);
+      }
+      catch (Exception ex)
+      {
+         String msg = Localizer.getMessage("jsp.error.internal.tldinit", ex.getMessage());
+         throw new JasperException(msg, ex);
+      }
+      finally
+      {
+        mappings = tmpMappings;
+      }
+   }
+
+   /*
+    * Populates taglib map described in web.xml.
+    */
+   protected void processWebDotXml(Map tmpMappings) throws Exception
+   {
+
+      InputStream is = null;
+
+      try
+      {
+         // Acquire input stream to web application deployment descriptor
+         String altDDName = (String) ctx.getAttribute(Constants.ALT_DD_ATTR);
+         if (altDDName != null)
+         {
+            try
+            {
+               is = new FileInputStream(altDDName);
+            }
+            catch (FileNotFoundException e)
+            {
+               log.warn(Localizer.getMessage("jsp.error.internal.filenotfound",
+                  altDDName));
+            }
+         }
+         else
+         {
+            is = ctx.getResourceAsStream(WEB_XML);
+            if (is == null)
+            {
+               log.warn(Localizer.getMessage("jsp.error.internal.filenotfound",
+                  WEB_XML));
+            }
+         }
+
+         if (is == null)
+         {
+            return;
+         }
+
+         // Parse the web application deployment descriptor
+         TreeNode webtld = null;
+         // altDDName is the absolute path of the DD
+         if (altDDName != null)
+         {
+            webtld = new ParserUtils().parseXMLDocument(altDDName, is);
+         }
+         else
+         {
+            webtld = new ParserUtils().parseXMLDocument(WEB_XML, is);
+         }
+
+         // Allow taglib to be an element of the root or jsp-config (JSP2.0)
+         TreeNode jspConfig = webtld.findChild("jsp-config");
+         if (jspConfig != null)
+         {
+            webtld = jspConfig;
+         }
+         Iterator taglibs = webtld.findChildren("taglib");
+         while (taglibs.hasNext())
+         {
+
+            // Parse the next <taglib> element
+            TreeNode taglib = (TreeNode) taglibs.next();
+            String tagUri = null;
+            String tagLoc = null;
+            TreeNode child = taglib.findChild("taglib-uri");
+            if (child != null)
+               tagUri = child.getBody();
+            child = taglib.findChild("taglib-location");
+            if (child != null)
+               tagLoc = child.getBody();
+
+            // Save this location if appropriate
+            if (tagLoc == null)
+               continue;
+            if (uriType(tagLoc) == NOROOT_REL_URI)
+               tagLoc = "/WEB-INF/" + tagLoc;
+            String tagLoc2 = null;
+            if (tagLoc.endsWith(JAR_FILE_SUFFIX))
+            {
+               tagLoc = ctx.getResource(tagLoc).toString();
+               tagLoc2 = "META-INF/taglib.tld";
+            }
+            tmpMappings.put(tagUri, new String[]{tagLoc, tagLoc2}); // SYNC
+         }
+      }
+      finally
+      {
+         if (is != null)
+         {
+            try
+            {
+               is.close();
+            }
+            catch (Throwable t)
+            {
+            }
+         }
+      }
+   }
+
+   protected void loadStandardTlds(Map tmpMappings) throws MalformedURLException // SYNC
+   {
+      if( tagLibJars.size() == 0 )
+         return;
+
+      // Locate the conf/web.xml
+      ClassLoader loader = Thread.currentThread().getContextClassLoader();
+      URL web = loader.getResource("conf/web.xml");
+      URL sarURL = new URL(web, "..");
+      for(int n = 0; n < tagLibJars.size(); n ++)
+      {
+         String jarPath = (String) tagLibJars.get(n);
+         try
+         {
+            URL url = new URL(sarURL, jarPath);
+            String resourcePath = url.toString();
+            log.debug("Scanning for tlds in: "+resourcePath);
+            URLConnection conn = url.openConnection();
+            conn.setUseCaches(false);
+            scanJar(conn, resourcePath, true, tmpMappings); // SYNC
+         }
+         catch (Exception e)
+         {
+            log.debug("Failed to scan: "+jarPath, e);
+         }
+      }
+   }
+
+   /*
+    * Searches the filesystem under /WEB-INF for any TLD files, and adds
+    * an implicit map entry to the taglib map for any TLD that has a <uri>
+    * element.
+    */
+   protected void processTldsInFileSystem(String startPath, Map tmpMappings) // SYNC
+      throws Exception
+   {
+
+      Set dirList = ctx.getResourcePaths(startPath);
+      if (dirList != null)
+      {
+         Iterator it = dirList.iterator();
+         while (it.hasNext())
+         {
+            String path = (String) it.next();
+            if (path.endsWith("/"))
+            {
+               processTldsInFileSystem(path, tmpMappings); // SYNC
+            }
+            if( path.endsWith(".jar") )
+            {
+               URL resURL = ctx.getResource(path);
+               URLConnection conn = resURL.openConnection();
+               conn.setUseCaches(false);
+               this.scanJar(conn, resURL.toString(), false, tmpMappings); // SYNC
+            }
+            else if ( path.endsWith(".tld") == true )
+            {
+               InputStream stream = ctx.getResourceAsStream(path);
+               String uri = null;
+               try
+               {
+                  uri = getUriFromTld(path, stream);
+               }
+               finally
+               {
+                  if (stream != null)
+                  {
+                     try
+                     {
+                        stream.close();
+                     }
+                     catch (Throwable t)
+                     {
+                        // do nothing
+                     }
+                  }
+               }
+               // Add implicit map entry only if its uri is not already
+               // present in the map
+               if (uri != null && tmpMappings.get(uri) == null) // SYNC
+               {
+                  tmpMappings.put(uri, new String[]{path, null}); // SYNC
+               }
+            }
+         }
+      }
+   }
+
+   /**
+    * Scans the given JarInputStream for TLD files located in META-INF (or a
+    * subdirectory of it), adding an implicit map entry to the taglib map for
+    * any TLD that has a <uri> element.
+    * @param conn - the 
+    * @param ignore true if any exceptions raised when processing the given JAR
+    * should be ignored, false otherwise
+    */
+   private void scanJar(URLConnection conn, String resourcePath, boolean ignore, Map tmpMappings) // SYNC
+      throws JasperException, IOException
+   {
+      InputStream connIS = conn.getInputStream();
+      JarInputStream jis = new JarInputStream(connIS);
+      try
+      {
+         JarEntry entry = jis.getNextJarEntry();
+         while( entry != null )
+         {
+            String name = entry.getName();
+            if( name.endsWith(".tld") == false )
+            {
+               entry = jis.getNextJarEntry();
+               continue;
+            }
+
+            EntryInputStream eis = new EntryInputStream(jis);
+            String uri = getUriFromTld(resourcePath, eis);
+            // Add implicit map entry only if its uri is not already
+            // present in the map
+            if (uri != null && tmpMappings.get(uri) == null) // SYNC
+            {
+               tmpMappings.put(uri, new String[]{resourcePath, name}); // SYNC
+            }
+            entry = jis.getNextJarEntry();
+         }
+      }
+      catch (Exception ex)
+      {
+         if (!ignore)
+         {
+            throw new JasperException(ex);
+         }
+      }
+      finally
+      {
+         if( jis != null )
+         {
+            try
+            {
+               jis.close();
+            }
+            catch (Throwable t)
+            {
+               // ignore
+            }
+         }
+
+         if (connIS != null)
+         {
+            try
+            {
+               connIS.close();
+            }
+            catch (Throwable t)
+            {
+               // ignore
+            }
+         }
+      }
+   }
+
+   /*
+    * Returns the value of the uri element of the given TLD, or null if the
+    * given TLD does not contain any such element.
+    */
+   private String getUriFromTld(String resourcePath, InputStream in)
+      throws JasperException
+   {
+      // Parse the tag library descriptor at the specified resource path
+      TreeNode tld = new ParserUtils().parseXMLDocument(resourcePath, in);
+      TreeNode uri = tld.findChild("uri");
+      if (uri != null)
+      {
+         String body = uri.getBody();
+         if (body != null)
+            return body;
+      }
+
+      return null;
+   }
+
+   /**
+    * Used to ignore the close on the jar entry input stream since this
+    * closes the jar stream, not just the entry.
+    */ 
+   static class EntryInputStream extends InputStream
+   {
+      private JarInputStream jis;
+      EntryInputStream(JarInputStream jis)
+      {
+         this.jis = jis;
+      }
+
+      public int read() throws IOException
+      {
+         return jis.read();
+      }
+
+      public int available() throws IOException
+      {
+         return jis.available();
+      }
+
+      public void close() throws IOException
+      {
+         
+      }
+
+      public void reset() throws IOException
+      {
+         jis.reset();
+      }
+
+      public boolean markSupported()
+      {
+         return jis.markSupported();
+      }
+
+      public synchronized void mark(int readlimit)
+      {
+         jis.mark(readlimit);
+      }
+
+      public long skip(long n) throws IOException
+      {
+         return jis.skip(n);
+      }
+
+      public int read(byte b[], int off, int len) throws IOException
+      {
+         return jis.read(b, off, len);
+      }
+   }
+}

Modified: branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/resources/web.xml
===================================================================
--- branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/resources/web.xml	2006-10-30 14:21:55 UTC (rev 57917)
+++ branches/JBoss_4_0_5_GA_JBAS-3790/tomcat/src/resources/web.xml	2006-10-30 14:22:11 UTC (rev 57918)
@@ -34,6 +34,12 @@
       <listener-class>org.jboss.web.tomcat.security.SecurityFlushSessionListener</listener-class>
    </listener>
 
+   <!-- Configures JSF for a web application if the javax.faces.webapp.FacesServlet is declared -->
+   <!-- in web.xml.                                                                             -->
+   <listener>
+     <listener-class>org.jboss.web.jsf.integration.config.JBossJSFConfigureListener</listener-class>
+   </listener>
+
    <!-- ================== Built In Servlet Definitions ==================== -->
 
 
@@ -221,12 +227,12 @@
          <param-name>xpoweredBy</param-name>
          <param-value>false</param-value>
       </init-param>
-      <!-- Uncomment to use jdk1.5 features in jsp pages
+      <!-- Uncomment to use jdk1.5 features in jsp pages -->
       <init-param>
          <param-name>compilerSourceVM</param-name>
          <param-value>1.5</param-value>
       </init-param>
-      -->
+      
       <!-- Use a custom options class to allow the shared tag lib descriptors
        to be loaded from jars in the tomcat sar conf/tlds directory. The
        standard options implementation can only find taglibs based on the
@@ -234,18 +240,24 @@
       -->
       <init-param>
          <param-name>engineOptionsClass</param-name>
-         <param-value>org.jboss.web.tomcat.tc5.jasper.JspServletOptions</param-value>
+         <param-value>org.jboss.web.tomcat.tc6.jasper.JspServletOptions</param-value>
       </init-param>
       <!-- Specify the jars relative to the jbossweb-tomcat55.sar that should
         be scanned for common tag lib descriptors to include in every war
         deployment.
       -->
       <init-param>
-         <description>MyFaces tlds</description>
+         <description>JSF standard tlds</description>
          <param-name>tagLibJar0</param-name>
-         <param-value>jsf-libs/myfaces-impl.jar</param-value>
+         <param-value>jsf-libs/jsf-impl.jar</param-value>
       </init-param>
+      <init-param>
+         <description>JSTL standard tlds</description>
+         <param-name>tagLibJar1</param-name>
+         <param-value>jstl.jar</param-value>
+      </init-param>
 
+
       <load-on-startup>3</load-on-startup>
    </servlet>
 




More information about the jboss-cvs-commits mailing list