Author: remy.maucherat(a)jboss.com
Date: 2008-05-02 12:47:59 -0400 (Fri, 02 May 2008)
New Revision: 606
Modified:
trunk/bin/catalina.sh
trunk/java/org/apache/catalina/connector/OutputBuffer.java
trunk/java/org/apache/catalina/session/PersistentManagerBase.java
trunk/java/org/apache/catalina/startup/ClassLoaderFactory.java
trunk/java/org/apache/catalina/startup/HostConfig.java
trunk/java/org/apache/catalina/valves/PersistentValve.java
trunk/java/org/apache/el/lang/ELSupport.java
trunk/java/org/apache/jasper/JspCompilationContext.java
trunk/java/org/apache/tomcat/util/buf/B2CConverter.java
trunk/java/org/apache/tomcat/util/buf/C2BConverter.java
trunk/java/org/apache/tomcat/util/buf/UTF8Decoder.java
trunk/webapps/docs/aio.xml
trunk/webapps/docs/changelog.xml
Log:
- Port Tomcat fixes.
- Some minor regressions (EL glitch + switch to NIO for character handling).
Modified: trunk/bin/catalina.sh
===================================================================
--- trunk/bin/catalina.sh 2008-05-02 16:46:39 UTC (rev 605)
+++ trunk/bin/catalina.sh 2008-05-02 16:47:59 UTC (rev 606)
@@ -181,7 +181,8 @@
# Set juli LogManager if it is present
if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then
- JAVA_OPTS="$JAVA_OPTS
"-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
"-Djava.util.logging.config.file="$CATALINA_BASE/conf/logging.properties"
+ JAVA_OPTS="$JAVA_OPTS
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
+
LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
fi
# ----- Execute The Requested Command -----------------------------------------
@@ -224,7 +225,7 @@
if [ "$1" = "-security" ] ; then
echo "Using Security Manager"
shift
- exec "$_RUNJDB" $JAVA_OPTS $CATALINA_OPTS \
+ exec "$_RUNJDB" $JAVA_OPTS "$LOGGING_CONFIG" $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath
"$CLASSPATH" \
-sourcepath "$CATALINA_HOME"/../../java \
-Djava.security.manager \
@@ -234,7 +235,7 @@
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
org.apache.catalina.startup.Bootstrap "$@" start
else
- exec "$_RUNJDB" $JAVA_OPTS $CATALINA_OPTS \
+ exec "$_RUNJDB" $JAVA_OPTS "$LOGGING_CONFIG" $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath
"$CLASSPATH" \
-sourcepath "$CATALINA_HOME"/../../java \
-Dcatalina.base="$CATALINA_BASE" \
@@ -250,7 +251,7 @@
if [ "$1" = "-security" ] ; then
echo "Using Security Manager"
shift
- exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
+ exec "$_RUNJAVA" $JAVA_OPTS "$LOGGING_CONFIG" $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath
"$CLASSPATH" \
-Djava.security.manager \
-Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
@@ -259,7 +260,7 @@
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
org.apache.catalina.startup.Bootstrap "$@" start
else
- exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
+ exec "$_RUNJAVA" $JAVA_OPTS "$LOGGING_CONFIG" $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath
"$CLASSPATH" \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
@@ -274,7 +275,7 @@
if [ "$1" = "-security" ] ; then
echo "Using Security Manager"
shift
- "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
+ "$_RUNJAVA" $JAVA_OPTS "$LOGGING_CONFIG" $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath
"$CLASSPATH" \
-Djava.security.manager \
-Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
@@ -288,7 +289,7 @@
echo $! > $CATALINA_PID
fi
else
- "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
+ "$_RUNJAVA" $JAVA_OPTS "$LOGGING_CONFIG" $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath
"$CLASSPATH" \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
@@ -353,4 +354,4 @@
echo " version What version of tomcat are you running?"
exit 1
-fi
+fi
\ No newline at end of file
Modified: trunk/java/org/apache/catalina/connector/OutputBuffer.java
===================================================================
--- trunk/java/org/apache/catalina/connector/OutputBuffer.java 2008-05-02 16:46:39 UTC
(rev 605)
+++ trunk/java/org/apache/catalina/connector/OutputBuffer.java 2008-05-02 16:47:59 UTC
(rev 606)
@@ -458,7 +458,6 @@
public void realWriteChars(char buf[], int off, int len)
throws IOException {
- charsWritten += len;
outputCharChunk.setChars(buf, off, len);
while (outputCharChunk.getLength() > 0) {
conv.convert(outputCharChunk, bb);
@@ -476,6 +475,7 @@
return;
cb.append((char) c);
+ charsWritten ++;
}
@@ -495,6 +495,7 @@
return;
cb.append(c, off, len);
+ charsWritten += len;
}
@@ -511,6 +512,7 @@
if (s == null)
s = "null";
cb.append(s, off, len);
+ charsWritten += len;
}
@@ -524,6 +526,7 @@
if (s == null)
s = "null";
cb.append(s);
+ charsWritten += s.length();
}
@@ -608,7 +611,7 @@
}
public int getContentWritten() {
- long size = bytesWritten + charsWritten ;
+ long size = bytesWritten + charsWritten;
if (size < Integer.MAX_VALUE) {
return (int) size;
}
Modified: trunk/java/org/apache/catalina/session/PersistentManagerBase.java
===================================================================
--- trunk/java/org/apache/catalina/session/PersistentManagerBase.java 2008-05-02 16:46:39
UTC (rev 605)
+++ trunk/java/org/apache/catalina/session/PersistentManagerBase.java 2008-05-02 16:47:59
UTC (rev 606)
@@ -212,10 +212,10 @@
/**
- * Indicates how many seconds old a session can get, after its last use in a
- * request, before it should be backed up to the store. -1 means sessions
- * are not backed up.
- */
+ * Indicates how many seconds old a session can get, after its last use in a
+ * request, before it should be backed up to the store. -1 means sessions
+ * are not backed up.
+ */
public int getMaxIdleBackup() {
return maxIdleBackup;
@@ -315,13 +315,13 @@
/**
- * Set the Container with which this Manager has been associated. If it is a
- * Context (the usual case), listen for changes to the session timeout
- * property.
- *
- * @param container
- * The associated Container
- */
+ * Set the Container with which this Manager has been associated. If it is a
+ * Context (the usual case), listen for changes to the session timeout
+ * property.
+ *
+ * @param container
+ * The associated Container
+ */
public void setContainer(Container container) {
// De-register from the old Container (if any)
@@ -535,8 +535,8 @@
/**
* Implements the Manager interface, direct call to processExpires and
processPersistenceChecks
*/
- public void processExpires() {
-
+ public void processExpires() {
+
long timeNow = System.currentTimeMillis();
Session sessions[] = findSessions();
int expireHere = 0 ;
@@ -557,8 +557,8 @@
if(log.isDebugEnabled())
log.debug("End expire sessions " + getName() + "
processingTime " + (timeEnd - timeNow) + " expired sessions: " +
expireHere);
processingTime += (timeEnd - timeNow);
-
- }
+
+ }
/**
@@ -590,6 +590,23 @@
public Session findSession(String id) throws IOException {
Session session = super.findSession(id);
+ // OK, at this point, we're not sure if another thread is trying to
+ // remove the session or not so the only way around this is to lock it
+ // (or attempt to) and then try to get it by this session id again. If
+ // the other code ran swapOut, then we should get a null back during
+ // this run, and if not, we lock it out so we can access the session
+ // safely.
+ if(session != null) {
+ synchronized(session){
+ session = super.findSession(session.getIdInternal());
+ if(session != null){
+ // To keep any external calling code from messing up the
+ // concurrency.
+ session.access();
+ session.endAccess();
+ }
+ }
+ }
if (session != null)
return (session);
@@ -1024,24 +1041,24 @@
long timeNow = System.currentTimeMillis();
// Swap out all sessions idle longer than maxIdleSwap
- // FIXME: What's preventing us from mangling a session during
- // a request?
if (maxIdleSwap >= 0) {
for (int i = 0; i < sessions.length; i++) {
StandardSession session = (StandardSession) sessions[i];
- if (!session.isValid())
- continue;
- int timeIdle = // Truncate, do not round up
- (int) ((timeNow - session.getLastAccessedTime()) / 1000L);
- if (timeIdle > maxIdleSwap && timeIdle > minIdleSwap) {
- if (log.isDebugEnabled())
- log.debug(sm.getString
- ("persistentManager.swapMaxIdle",
- session.getIdInternal(), new Integer(timeIdle)));
- try {
- swapOut(session);
- } catch (IOException e) {
- ; // This is logged in writeSession()
+ synchronized (session) {
+ if (!session.isValid())
+ continue;
+ int timeIdle = // Truncate, do not round up
+ (int) ((timeNow - session.getLastAccessedTime()) / 1000L);
+ if (timeIdle > maxIdleSwap && timeIdle > minIdleSwap)
{
+ if (log.isDebugEnabled())
+ log.debug(sm.getString
+ ("persistentManager.swapMaxIdle",
+ session.getIdInternal(), new Integer(timeIdle)));
+ try {
+ swapOut(session);
+ } catch (IOException e) {
+ ; // This is logged in writeSession()
+ }
}
}
}
@@ -1073,19 +1090,21 @@
long timeNow = System.currentTimeMillis();
for (int i = 0; i < sessions.length && toswap > 0; i++) {
- int timeIdle = // Truncate, do not round up
- (int) ((timeNow - sessions[i].getLastAccessedTime()) / 1000L);
- if (timeIdle > minIdleSwap) {
- if(log.isDebugEnabled())
- log.debug(sm.getString
- ("persistentManager.swapTooManyActive",
- sessions[i].getIdInternal(), new Integer(timeIdle)));
- try {
- swapOut(sessions[i]);
- } catch (IOException e) {
- ; // This is logged in writeSession()
+ synchronized (sessions[i]) {
+ int timeIdle = // Truncate, do not round up
+ (int) ((timeNow - sessions[i].getLastAccessedTime()) / 1000L);
+ if (timeIdle > minIdleSwap) {
+ if(log.isDebugEnabled())
+ log.debug(sm.getString
+ ("persistentManager.swapTooManyActive",
+ sessions[i].getIdInternal(), new Integer(timeIdle)));
+ try {
+ swapOut(sessions[i]);
+ } catch (IOException e) {
+ ; // This is logged in writeSession()
+ }
+ toswap--;
}
- toswap--;
}
}
@@ -1107,20 +1126,22 @@
if (maxIdleBackup >= 0) {
for (int i = 0; i < sessions.length; i++) {
StandardSession session = (StandardSession) sessions[i];
- if (!session.isValid())
- continue;
- int timeIdle = // Truncate, do not round up
- (int) ((timeNow - session.getLastAccessedTime()) / 1000L);
- if (timeIdle > maxIdleBackup) {
- if (log.isDebugEnabled())
- log.debug(sm.getString
- ("persistentManager.backupMaxIdle",
- session.getIdInternal(), new Integer(timeIdle)));
-
- try {
- writeSession(session);
- } catch (IOException e) {
- ; // This is logged in writeSession()
+ synchronized (session) {
+ if (!session.isValid())
+ continue;
+ int timeIdle = // Truncate, do not round up
+ (int) ((timeNow - session.getLastAccessedTime()) / 1000L);
+ if (timeIdle > maxIdleBackup) {
+ if (log.isDebugEnabled())
+ log.debug(sm.getString
+ ("persistentManager.backupMaxIdle",
+ session.getIdInternal(), new Integer(timeIdle)));
+
+ try {
+ writeSession(session);
+ } catch (IOException e) {
+ ; // This is logged in writeSession()
+ }
}
}
}
Modified: trunk/java/org/apache/catalina/startup/ClassLoaderFactory.java
===================================================================
--- trunk/java/org/apache/catalina/startup/ClassLoaderFactory.java 2008-05-02 16:46:39 UTC
(rev 605)
+++ trunk/java/org/apache/catalina/startup/ClassLoaderFactory.java 2008-05-02 16:47:59 UTC
(rev 606)
@@ -121,7 +121,7 @@
if (!file.exists() || !file.canRead())
continue;
file = new File(file.getCanonicalPath() + File.separator);
- URL url = file.toURL();
+ URL url = file.toURI().toURL();
if (log.isDebugEnabled())
log.debug(" Including directory " + url);
list.add(url);
@@ -143,7 +143,7 @@
File file = new File(directory, filenames[j]);
if (log.isDebugEnabled())
log.debug(" Including jar file " +
file.getAbsolutePath());
- URL url = file.toURL();
+ URL url = file.toURI().toURL();
list.add(url);
}
}
@@ -201,7 +201,7 @@
if (!directory.exists() || !directory.isDirectory() ||
!directory.canRead())
continue;
- URL url = directory.toURL();
+ URL url = directory.toURI().toURL();
if (log.isDebugEnabled())
log.debug(" Including directory " + url);
list.add(url);
@@ -210,7 +210,7 @@
file = new File(file.getCanonicalPath());
if (!file.exists() || !file.canRead())
continue;
- URL url = file.toURL();
+ URL url = file.toURI().toURL();
if (log.isDebugEnabled())
log.debug(" Including jar file " + url);
list.add(url);
@@ -234,7 +234,7 @@
if (log.isDebugEnabled())
log.debug(" Including glob jar file "
+ file.getAbsolutePath());
- URL url = file.toURL();
+ URL url = file.toURI().toURL();
list.add(url);
}
}
Modified: trunk/java/org/apache/catalina/startup/HostConfig.java
===================================================================
--- trunk/java/org/apache/catalina/startup/HostConfig.java 2008-05-02 16:46:39 UTC (rev
605)
+++ trunk/java/org/apache/catalina/startup/HostConfig.java 2008-05-02 16:47:59 UTC (rev
606)
@@ -696,7 +696,7 @@
if (files[i].equalsIgnoreCase("WEB-INF"))
continue;
File dir = new File(appBase, files[i]);
- if (files[i].toLowerCase().endsWith(".war")) {
+ if (files[i].toLowerCase().endsWith(".war") &&
dir.isFile()) {
// Calculate the context path and make sure it is unique
String contextPath = "/" + files[i];
Modified: trunk/java/org/apache/catalina/valves/PersistentValve.java
===================================================================
--- trunk/java/org/apache/catalina/valves/PersistentValve.java 2008-05-02 16:46:39 UTC
(rev 605)
+++ trunk/java/org/apache/catalina/valves/PersistentValve.java 2008-05-02 16:47:59 UTC
(rev 606)
@@ -30,16 +30,18 @@
import org.apache.catalina.Store;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
-import org.apache.catalina.core.StandardHost;
import org.apache.catalina.session.PersistentManager;
import org.apache.catalina.util.StringManager;
/**
- * Valve that implements the default basic behavior for the
- * <code>StandardHost</code> container implementation.
+ * Valve that implements per-request session persistence. It is intended to be
+ * used with non-sticky load-balancers.
* <p>
* <b>USAGE CONSTRAINT</b>: To work correctly it requires a
PersistentManager.
+ * <p>
+ * <b>USAGE CONSTRAINT</b>: To work correctly it assumes only one request
exists
+ * per session at any one time.
*
* @author Jean-Frederic Clere
* @version $Revision$ $Date$
@@ -97,7 +99,6 @@
throws IOException, ServletException {
// Select the Context to be used for this Request
- StandardHost host = (StandardHost) getContainer();
Context context = request.getContext();
if (context == null) {
response.sendError
Modified: trunk/java/org/apache/el/lang/ELSupport.java
===================================================================
--- trunk/java/org/apache/el/lang/ELSupport.java 2008-05-02 16:46:39 UTC (rev 605)
+++ trunk/java/org/apache/el/lang/ELSupport.java 2008-05-02 16:47:59 UTC (rev 606)
@@ -343,7 +343,7 @@
public final static Object coerceToType(final Object obj, final Class type)
throws IllegalArgumentException {
if (type == null || Object.class.equals(type) ||
- type.equals(obj.getClass())) {
+ (obj != null && type.equals(obj.getClass()))) {
return obj;
}
if (String.class.equals(type)) {
Modified: trunk/java/org/apache/jasper/JspCompilationContext.java
===================================================================
--- trunk/java/org/apache/jasper/JspCompilationContext.java 2008-05-02 16:46:39 UTC (rev
605)
+++ trunk/java/org/apache/jasper/JspCompilationContext.java 2008-05-02 16:47:59 UTC (rev
606)
@@ -654,19 +654,18 @@
protected void createOutputDir() {
String path = null;
if (isTagFile()) {
- String tagName = tagInfo.getTagClassName();
- path = tagName.replace('.', '/');
- path = path.substring(0, path.lastIndexOf('/'));
+ String tagName = tagInfo.getTagClassName();
+ path = tagName.replace('.', File.separatorChar);
+ path = path.substring(0, path.lastIndexOf(File.separatorChar));
} else {
- path = getServletPackageName().replace('.', '/');
- }
+ path = getServletPackageName().replace('.',File.separatorChar);
+ }
// Append servlet or tag handler path to scratch dir
try {
- baseUrl = options.getScratchDir().toURL();
- String outUrlString = baseUrl.toString() + '/' + path;
- URL outUrl = new URL(outUrlString);
- outputDir = outUrl.getFile() + File.separator;
+ File base = options.getScratchDir();
+ baseUrl = base.toURI().toURL();
+ outputDir = base.getAbsolutePath() + File.separator + path +
File.separator;
if (!makeOutputDir()) {
throw new
IllegalStateException(Localizer.getMessage("jsp.error.outputfolder"));
}
Modified: trunk/java/org/apache/tomcat/util/buf/B2CConverter.java
===================================================================
--- trunk/java/org/apache/tomcat/util/buf/B2CConverter.java 2008-05-02 16:46:39 UTC (rev
605)
+++ trunk/java/org/apache/tomcat/util/buf/B2CConverter.java 2008-05-02 16:47:59 UTC (rev
606)
@@ -19,11 +19,13 @@
package org.apache.tomcat.util.buf;
import java.io.IOException;
+import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CoderResult;
+import java.nio.charset.UnsupportedCharsetException;
/**
* NIO based character decoder.
@@ -47,8 +49,13 @@
/**
* Create a decoder for the specified charset.
*/
- public B2CConverter(String charset) {
- decoder = Charset.forName(charset).newDecoder();
+ public B2CConverter(String charset)
+ throws IOException {
+ try {
+ decoder = Charset.forName(charset).newDecoder();
+ } catch (UnsupportedCharsetException e) {
+ throw new UnsupportedEncodingException(charset);
+ }
byte[] left = new byte[4];
leftovers = ByteBuffer.wrap(left);
}
Modified: trunk/java/org/apache/tomcat/util/buf/C2BConverter.java
===================================================================
--- trunk/java/org/apache/tomcat/util/buf/C2BConverter.java 2008-05-02 16:46:39 UTC (rev
605)
+++ trunk/java/org/apache/tomcat/util/buf/C2BConverter.java 2008-05-02 16:47:59 UTC (rev
606)
@@ -18,11 +18,13 @@
package org.apache.tomcat.util.buf;
import java.io.IOException;
+import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CoderResult;
+import java.nio.charset.UnsupportedCharsetException;
/**
* NIO based character encoder.
@@ -41,8 +43,13 @@
/**
* Create an encoder for the specified charset.
*/
- public C2BConverter(String charset) {
- encoder = Charset.forName(charset).newEncoder();
+ public C2BConverter(String charset)
+ throws IOException {
+ try {
+ encoder = Charset.forName(charset).newEncoder();
+ } catch (UnsupportedCharsetException e) {
+ throw new UnsupportedEncodingException(charset);
+ }
}
/**
Modified: trunk/java/org/apache/tomcat/util/buf/UTF8Decoder.java
===================================================================
--- trunk/java/org/apache/tomcat/util/buf/UTF8Decoder.java 2008-05-02 16:46:39 UTC (rev
605)
+++ trunk/java/org/apache/tomcat/util/buf/UTF8Decoder.java 2008-05-02 16:47:59 UTC (rev
606)
@@ -39,7 +39,8 @@
// may have state !!
- public UTF8Decoder() {
+ public UTF8Decoder()
+ throws IOException {
super("UTF-8");
}
Modified: trunk/webapps/docs/aio.xml
===================================================================
--- trunk/webapps/docs/aio.xml 2008-05-02 16:46:39 UTC (rev 605)
+++ trunk/webapps/docs/aio.xml 2008-05-02 16:47:59 UTC (rev 606)
@@ -333,10 +333,11 @@
<p>
Any servlet can instruct JBoss Web to perform a sendfile call by setting the
appropriate
- response attributes. When using sendfile, it is best to ensure that neither the
+ response attributes. It is also necessary to correctly set the content length
+ for the response. When using sendfile, it is best to ensure that neither the
request or response have been wrapped, since as the response body will be sent later
by the connector itself, it cannot be filtered. Other than setting the 3 needed
- response attributes, the servlet should not send any response data, but it may use
+ request attributes, the servlet should not send any response data, but it may use
any method which will result in modifying the response header (like setting
cookies).
</p>
@@ -344,7 +345,7 @@
<li>org.apache.tomcat.sendfile.filename: Canonical filename of the file which
will be sent as
a String</li>
<li>org.apache.tomcat.sendfile.start: Start offset as a Long</li>
- <li>org.apache.tomcat.sendfile.start: End offset as a Long</li>
+ <li>org.apache.tomcat.sendfile.end: End offset as a Long</li>
</ul>
</section>
Modified: trunk/webapps/docs/changelog.xml
===================================================================
--- trunk/webapps/docs/changelog.xml 2008-05-02 16:46:39 UTC (rev 605)
+++ trunk/webapps/docs/changelog.xml 2008-05-02 16:47:59 UTC (rev 606)
@@ -16,6 +16,53 @@
<body>
+<section name="JBoss Web 2.1.1.CR2 (remm)">
+ <subsection name="General">
+ <changelog>
+ <update>
+ Add Maven target to the dist script. (remm)
+ </update>
+ <fix>
+ <bug>43578</bug>: Tomcat doesn't start if installation path
contains a space.
+ Patch submitted by Ray Sauers. (markt)
+ </fix>
+ </changelog>
+ </subsection>
+ <subsection name="Catalina">
+ <changelog>
+ <fix>
+ <bug>43142</bug>: Directory xxx.war is not always a war. (markt)
+ </fix>
+ <fix>
+ <jboss-jira>JBCTS-778</jboss-jira>: Fix updating charsWritten.
(remm)
+ </fix>
+ <fix>
+ <bug>43343</bug>: Correctly handle the case where a request arrives
for a session
+ we are in the middle of persisting. (remm)
+ </fix>
+ <fix>
+ <bug>43150</bug>: Improve URL conversion so that some more special
chars can be used
+ in the installation path. (markt)
+ </fix>
+ </changelog>
+ </subsection>
+ <subsection name="Coyote">
+ <changelog>
+ <fix>
+ <jboss-jira>JBCTS-779</jboss-jira>: Exception types for invalid
charset (should return the
+ java.io exception rather than the java.nio one). (remm)
+ </fix>
+ </changelog>
+ </subsection>
+ <subsection name="Jasper">
+ <changelog>
+ <fix>
+ <jboss-jira>JBCTS-776</jboss-jira>: NPE regression in EL type
handling. (remm)
+ </fix>
+ </changelog>
+ </subsection>
+</section>
+
<section name="JBoss Web 2.1.1.CR1 (remm)">
<subsection name="General">
<changelog>