Author: remy.maucherat(a)jboss.com
Date: 2009-04-09 15:25:39 -0400 (Thu, 09 Apr 2009)
New Revision: 1003
Modified:
trunk/java/org/apache/catalina/core/StandardHost.java
trunk/java/org/apache/catalina/loader/WebappClassLoader.java
trunk/java/org/apache/catalina/realm/JNDIRealm.java
trunk/java/org/apache/catalina/session/ManagerBase.java
trunk/java/org/apache/catalina/ssi/SSIServlet.java
trunk/java/org/apache/catalina/util/InstanceSupport.java
trunk/java/org/apache/catalina/util/LifecycleSupport.java
trunk/java/org/apache/jasper/compiler/Generator.java
trunk/java/org/apache/jasper/compiler/ScriptingVariabler.java
trunk/java/org/apache/tomcat/util/modeler/BaseModelMBean.java
trunk/webapps/docs/changelog.xml
Log:
- Port minor fixes.
- Add sync to JMX.
Modified: trunk/java/org/apache/catalina/core/StandardHost.java
===================================================================
--- trunk/java/org/apache/catalina/core/StandardHost.java 2009-04-09 17:02:09 UTC (rev
1002)
+++ trunk/java/org/apache/catalina/core/StandardHost.java 2009-04-09 19:25:39 UTC (rev
1003)
@@ -607,29 +607,25 @@
alias = alias.toLowerCase();
- synchronized (aliases) {
-
- // Make sure this alias is currently present
- int n = -1;
- for (int i = 0; i < aliases.length; i++) {
- if (aliases[i].equals(alias)) {
- n = i;
- break;
- }
+ // Make sure this alias is currently present
+ int n = -1;
+ for (int i = 0; i < aliases.length; i++) {
+ if (aliases[i].equals(alias)) {
+ n = i;
+ break;
}
- if (n < 0)
- return;
+ }
+ if (n < 0)
+ return;
- // Remove the specified alias
- int j = 0;
- String results[] = new String[aliases.length - 1];
- for (int i = 0; i < aliases.length; i++) {
- if (i != n)
- results[j++] = aliases[i];
- }
- aliases = results;
-
+ // Remove the specified alias
+ int j = 0;
+ String results[] = new String[aliases.length - 1];
+ for (int i = 0; i < aliases.length; i++) {
+ if (i != n)
+ results[j++] = aliases[i];
}
+ aliases = results;
// Inform interested listeners
fireContainerEvent(REMOVE_ALIAS_EVENT, alias);
@@ -747,7 +743,7 @@
private boolean initialized=false;
- public void init() {
+ public synchronized void init() {
if( initialized ) return;
initialized=true;
@@ -790,7 +786,7 @@
}
}
- public void destroy() throws Exception {
+ public synchronized void destroy() throws Exception {
// destroy our child containers, if any
Container children[] = findChildren();
super.destroy();
Modified: trunk/java/org/apache/catalina/loader/WebappClassLoader.java
===================================================================
--- trunk/java/org/apache/catalina/loader/WebappClassLoader.java 2009-04-09 17:02:09 UTC
(rev 1002)
+++ trunk/java/org/apache/catalina/loader/WebappClassLoader.java 2009-04-09 19:25:39 UTC
(rev 1003)
@@ -1276,7 +1276,7 @@
// the webapp from overriding J2SE classes
if (SYSTEM_CL_DELEGATION) {
try {
- clazz = system.loadClass(name);
+ clazz = Class.forName(name, false, system);
if (clazz != null) {
if (resolve)
resolveClass(clazz);
@@ -1312,7 +1312,7 @@
if (loader == null)
loader = system;
try {
- clazz = loader.loadClass(name);
+ clazz = Class.forName(name, false, loader);
if (clazz != null) {
if (log.isDebugEnabled())
log.debug(" Loading class from parent");
@@ -1349,7 +1349,7 @@
if (loader == null)
loader = system;
try {
- clazz = loader.loadClass(name);
+ clazz = Class.forName(name, false, loader);
if (clazz != null) {
if (log.isDebugEnabled())
log.debug(" Loading class from parent");
Modified: trunk/java/org/apache/catalina/realm/JNDIRealm.java
===================================================================
--- trunk/java/org/apache/catalina/realm/JNDIRealm.java 2009-04-09 17:02:09 UTC (rev
1002)
+++ trunk/java/org/apache/catalina/realm/JNDIRealm.java 2009-04-09 19:25:39 UTC (rev
1003)
@@ -18,6 +18,8 @@
package org.apache.catalina.realm;
import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.security.Principal;
import java.text.MessageFormat;
import java.util.ArrayList;
@@ -30,16 +32,16 @@
import java.util.Map;
import java.util.Set;
-import javax.naming.Context;
+import javax.naming.AuthenticationException;
import javax.naming.CommunicationException;
import javax.naming.CompositeName;
+import javax.naming.Context;
import javax.naming.InvalidNameException;
+import javax.naming.Name;
import javax.naming.NameNotFoundException;
+import javax.naming.NameParser;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
-import javax.naming.NameParser;
-import javax.naming.Name;
-import javax.naming.AuthenticationException;
import javax.naming.PartialResultException;
import javax.naming.ServiceUnavailableException;
import javax.naming.directory.Attribute;
@@ -48,6 +50,7 @@
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
+
import org.apache.catalina.LifecycleException;
import org.apache.catalina.util.Base64;
import org.apache.tomcat.util.buf.ByteChunk;
@@ -2150,19 +2153,51 @@
* @param result The search result
* @return String containing the distinguished name
*/
- protected String getDistinguishedName(DirContext context, String base, SearchResult
result)
- throws NamingException {
- // Get the entry's distinguished name
- NameParser parser = context.getNameParser("");
- Name contextName = parser.parse(context.getNameInNamespace());
- Name baseName = parser.parse(base);
-
- // Bugzilla 32269
- Name entryName = parser.parse(new CompositeName(result.getName()).get(0));
-
- Name name = contextName.addAll(baseName);
- name = name.addAll(entryName);
- return name.toString();
+ protected String getDistinguishedName(DirContext context, String base,
+ SearchResult result) throws NamingException {
+ // Get the entry's distinguished name. For relative results, this means
+ // we need to composite a name with the base name, the context name, and
+ // the result name. For non-relative names, use the returned name.
+ if (result.isRelative()) {
+ if (containerLog.isTraceEnabled()) {
+ containerLog.trace(" search returned relative name: " +
+ result.getName());
+ }
+ NameParser parser = context.getNameParser("");
+ Name contextName = parser.parse(context.getNameInNamespace());
+ Name baseName = parser.parse(base);
+
+ // Bugzilla 32269
+ Name entryName =
+ parser.parse(new CompositeName(result.getName()).get(0));
+
+ Name name = contextName.addAll(baseName);
+ name = name.addAll(entryName);
+ return name.toString();
+ } else {
+ String absoluteName = result.getName();
+ if (containerLog.isTraceEnabled())
+ containerLog.trace(" search returned absolute name: " +
+ result.getName());
+ try {
+ // Normalize the name by running it through the name parser.
+ NameParser parser = context.getNameParser("");
+ URI userNameUri = new URI(absoluteName);
+ String pathComponent = userNameUri.getPath();
+ // Should not ever have an empty path component, since that is /{DN}
+ if (pathComponent.length() < 1 ) {
+ throw new InvalidNameException(
+ "Search returned unparseable absolute name: " +
+ absoluteName );
+ }
+ Name name = parser.parse(pathComponent.substring(1));
+ return name.toString();
+ } catch ( URISyntaxException e ) {
+ throw new InvalidNameException(
+ "Search returned unparseable absolute name: " +
+ absoluteName );
+ }
+ }
}
Modified: trunk/java/org/apache/catalina/session/ManagerBase.java
===================================================================
--- trunk/java/org/apache/catalina/session/ManagerBase.java 2009-04-09 17:02:09 UTC (rev
1002)
+++ trunk/java/org/apache/catalina/session/ManagerBase.java 2009-04-09 19:25:39 UTC (rev
1003)
@@ -221,9 +221,13 @@
// ------------------------------------------------------------- Security classes
- private class PrivilegedSetRandomFile implements PrivilegedAction{
+ private class PrivilegedSetRandomFile implements
PrivilegedAction<DataInputStream>{
- public Object run(){
+ public PrivilegedSetRandomFile(String s) {
+ devRandomSource = s;
+ }
+
+ public DataInputStream run(){
try {
File f=new File( devRandomSource );
if( ! f.exists() ) return null;
@@ -233,8 +237,18 @@
log.debug( "Opening " + devRandomSource );
return randomIS;
} catch (IOException ex){
+ log.warn("Error reading " + devRandomSource, ex);
+ if (randomIS != null) {
+ try {
+ randomIS.close();
+ } catch (Exception e) {
+ log.warn("Failed to close randomIS.");
+ }
+ }
+ devRandomSource = null;
+ randomIS=null;
return null;
- }
+ }
}
}
@@ -505,10 +519,10 @@
* - so use it if available.
*/
public void setRandomFile( String s ) {
- // as a hack, you can use a static file - and genarate the same
+ // as a hack, you can use a static file - and generate the same
// session ids ( good for strange debugging )
if (Globals.IS_SECURITY_ENABLED){
- randomIS = (DataInputStream)AccessController.doPrivileged(new
PrivilegedSetRandomFile());
+ randomIS = AccessController.doPrivileged(new PrivilegedSetRandomFile(s));
} else {
try{
devRandomSource=s;
@@ -519,12 +533,15 @@
if( log.isDebugEnabled() )
log.debug( "Opening " + devRandomSource );
} catch( IOException ex ) {
- try {
- randomIS.close();
- } catch (Exception e) {
- log.warn("Failed to close randomIS.");
+ log.warn("Error reading " + devRandomSource, ex);
+ if (randomIS != null) {
+ try {
+ randomIS.close();
+ } catch (Exception e) {
+ log.warn("Failed to close randomIS.");
+ }
}
-
+ devRandomSource = null;
randomIS=null;
}
}
Modified: trunk/java/org/apache/catalina/ssi/SSIServlet.java
===================================================================
--- trunk/java/org/apache/catalina/ssi/SSIServlet.java 2009-04-09 17:02:09 UTC (rev 1002)
+++ trunk/java/org/apache/catalina/ssi/SSIServlet.java 2009-04-09 19:25:39 UTC (rev 1003)
@@ -210,5 +210,6 @@
String text = stringWriter.toString();
res.getWriter().write(text);
}
+ bufferedReader.close();
}
}
\ No newline at end of file
Modified: trunk/java/org/apache/catalina/util/InstanceSupport.java
===================================================================
--- trunk/java/org/apache/catalina/util/InstanceSupport.java 2009-04-09 17:02:09 UTC (rev
1002)
+++ trunk/java/org/apache/catalina/util/InstanceSupport.java 2009-04-09 19:25:39 UTC (rev
1003)
@@ -93,16 +93,14 @@
*
* @param listener The listener to add
*/
- public void addInstanceListener(InstanceListener listener) {
+ public synchronized void addInstanceListener(InstanceListener listener) {
- synchronized (listeners) {
- InstanceListener results[] =
+ InstanceListener results[] =
new InstanceListener[listeners.length + 1];
- for (int i = 0; i < listeners.length; i++)
- results[i] = listeners[i];
- results[listeners.length] = listener;
- listeners = results;
- }
+ for (int i = 0; i < listeners.length; i++)
+ results[i] = listeners[i];
+ results[listeners.length] = listener;
+ listeners = results;
}
@@ -310,27 +308,25 @@
*
* @param listener The listener to remove
*/
- public void removeInstanceListener(InstanceListener listener) {
+ public synchronized void removeInstanceListener(InstanceListener listener) {
- synchronized (listeners) {
- int n = -1;
- for (int i = 0; i < listeners.length; i++) {
- if (listeners[i] == listener) {
- n = i;
- break;
- }
+ int n = -1;
+ for (int i = 0; i < listeners.length; i++) {
+ if (listeners[i] == listener) {
+ n = i;
+ break;
}
- if (n < 0)
- return;
- InstanceListener results[] =
- new InstanceListener[listeners.length - 1];
- int j = 0;
- for (int i = 0; i < listeners.length; i++) {
- if (i != n)
- results[j++] = listeners[i];
- }
- listeners = results;
}
+ if (n < 0)
+ return;
+ InstanceListener results[] =
+ new InstanceListener[listeners.length - 1];
+ int j = 0;
+ for (int i = 0; i < listeners.length; i++) {
+ if (i != n)
+ results[j++] = listeners[i];
+ }
+ listeners = results;
}
Modified: trunk/java/org/apache/catalina/util/LifecycleSupport.java
===================================================================
--- trunk/java/org/apache/catalina/util/LifecycleSupport.java 2009-04-09 17:02:09 UTC (rev
1002)
+++ trunk/java/org/apache/catalina/util/LifecycleSupport.java 2009-04-09 19:25:39 UTC (rev
1003)
@@ -76,16 +76,14 @@
*
* @param listener The listener to add
*/
- public void addLifecycleListener(LifecycleListener listener) {
+ public synchronized void addLifecycleListener(LifecycleListener listener) {
- synchronized (listeners) {
- LifecycleListener results[] =
+ LifecycleListener results[] =
new LifecycleListener[listeners.length + 1];
- for (int i = 0; i < listeners.length; i++)
- results[i] = listeners[i];
- results[listeners.length] = listener;
- listeners = results;
- }
+ for (int i = 0; i < listeners.length; i++)
+ results[i] = listeners[i];
+ results[listeners.length] = listener;
+ listeners = results;
}
@@ -124,27 +122,25 @@
*
* @param listener The listener to remove
*/
- public void removeLifecycleListener(LifecycleListener listener) {
+ public synchronized void removeLifecycleListener(LifecycleListener listener) {
- synchronized (listeners) {
- int n = -1;
- for (int i = 0; i < listeners.length; i++) {
- if (listeners[i] == listener) {
- n = i;
- break;
- }
+ int n = -1;
+ for (int i = 0; i < listeners.length; i++) {
+ if (listeners[i] == listener) {
+ n = i;
+ break;
}
- if (n < 0)
- return;
- LifecycleListener results[] =
- new LifecycleListener[listeners.length - 1];
- int j = 0;
- for (int i = 0; i < listeners.length; i++) {
- if (i != n)
- results[j++] = listeners[i];
- }
- listeners = results;
}
+ if (n < 0)
+ return;
+ LifecycleListener results[] =
+ new LifecycleListener[listeners.length - 1];
+ int j = 0;
+ for (int i = 0; i < listeners.length; i++) {
+ if (i != n)
+ results[j++] = listeners[i];
+ }
+ listeners = results;
}
Modified: trunk/java/org/apache/jasper/compiler/Generator.java
===================================================================
--- trunk/java/org/apache/jasper/compiler/Generator.java 2009-04-09 17:02:09 UTC (rev
1002)
+++ trunk/java/org/apache/jasper/compiler/Generator.java 2009-04-09 19:25:39 UTC (rev
1003)
@@ -1591,8 +1591,7 @@
s0 = "<param name=\"type\""
+ makeAttr("value", "application/x-java-"
+ type
- + ";"
- + ((jreversion == null) ? "" :
"version="
+ + ((jreversion == null) ? "" :
";version="
+ jreversion)) + '>';
out.printil("out.write(" + quote(s0) + ");");
out.printil("out.write(\"\\n\");");
@@ -1611,8 +1610,7 @@
s0 = "<EMBED"
+ makeAttr("type", "application/x-java-"
+ type
- + ";"
- + ((jreversion == null) ? "" :
"version="
+ + ((jreversion == null) ? "" :
";version="
+ jreversion)) + makeAttr("name", name);
// s1 and s2 are the same as before.
Modified: trunk/java/org/apache/jasper/compiler/ScriptingVariabler.java
===================================================================
--- trunk/java/org/apache/jasper/compiler/ScriptingVariabler.java 2009-04-09 17:02:09 UTC
(rev 1002)
+++ trunk/java/org/apache/jasper/compiler/ScriptingVariabler.java 2009-04-09 19:25:39 UTC
(rev 1003)
@@ -68,7 +68,7 @@
public void visit(Node.CustomTag n) throws JasperException {
setScriptingVars(n, VariableInfo.AT_BEGIN);
setScriptingVars(n, VariableInfo.NESTED);
- visitBody(n);
+ new ScriptingVariableVisitor(err).visitBody(n);
setScriptingVars(n, VariableInfo.AT_END);
}
Modified: trunk/java/org/apache/tomcat/util/modeler/BaseModelMBean.java
===================================================================
--- trunk/java/org/apache/tomcat/util/modeler/BaseModelMBean.java 2009-04-09 17:02:09 UTC
(rev 1002)
+++ trunk/java/org/apache/tomcat/util/modeler/BaseModelMBean.java 2009-04-09 19:25:39 UTC
(rev 1003)
@@ -186,7 +186,9 @@
if( declaring.isAssignableFrom(this.getClass()) ) {
result = m.invoke(this, NO_ARGS_PARAM );
} else {
- result = m.invoke(resource, NO_ARGS_PARAM );
+ synchronized (resource) {
+ result = m.invoke(resource, NO_ARGS_PARAM );
+ }
}
} catch (InvocationTargetException e) {
Throwable t = e.getTargetException();
@@ -294,7 +296,9 @@
if( method.getDeclaringClass().isAssignableFrom( this.getClass()) ) {
result = method.invoke(this, params );
} else {
- result = method.invoke(resource, params);
+ synchronized (resource) {
+ result = method.invoke(resource, params);
+ }
}
} catch (InvocationTargetException e) {
Throwable t = e.getTargetException();
@@ -411,7 +415,9 @@
if( m.getDeclaringClass().isAssignableFrom( this.getClass()) ) {
m.invoke(this, new Object[] { value });
} else {
- m.invoke(resource, new Object[] { value });
+ synchronized (resource) {
+ m.invoke(resource, new Object[] { value });
+ }
}
} catch (InvocationTargetException e) {
Throwable t = e.getTargetException();
Modified: trunk/webapps/docs/changelog.xml
===================================================================
--- trunk/webapps/docs/changelog.xml 2009-04-09 17:02:09 UTC (rev 1002)
+++ trunk/webapps/docs/changelog.xml 2009-04-09 19:25:39 UTC (rev 1003)
@@ -56,6 +56,18 @@
<fix>
<bug>46933</bug>: Simplify StringManager using Java 5 features. Based
on a patch by Jens Kapitza. (markt)
</fix>
+ <fix>
+ <bug>46961</bug>: Prefer Class.forName for Java 6 compatibility with
array fake types. (markt)
+ </fix>
+ <fix>
+ <bug>42579</bug>: Handle both relative and absolute search results in
JNDI realm. Patch provided by Brandon DuRette. (markt)
+ </fix>
+ <fix>
+ <bug>46967</bug>: Secure random security manager fix. Based on a
patch provided by Kirk Wolf. (markt)
+ </fix>
+ <fix>
+ <bug>46562</bug>: In SSI, close the reader when done. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Coyote">
@@ -76,6 +88,13 @@
<fix>
<bug>46915</bug>: JSTL issues resolving resource bundle keys.
(markt)
</fix>
+ <fix>
+ <bug>46909</bug>: The ';' should really only be used if there
is a following parameter. (markt)
+ </fix>
+ <fix>
+ <bug>42390</bug>: Correct JSP compilation error with nested tagfile
tags with variables with "AT_BEGIN" scope.
+ Patch provided by Konstantin Kolinko. (markt)
+ </fix>
</changelog>
</subsection>
</section>