costin 00/12/31 17:58:39
Modified: src/share/org/apache/tomcat/startup EmbededTomcat.java
Added: src/share/org/apache/tomcat/modules/config AutoSetup.java
DefaultCMSetter.java LoaderInterceptor11.java
LoaderInterceptor12.java PolicyInterceptor.java
src/share/org/apache/tomcat/modules/generators
ErrorHandler.java
src/share/org/apache/tomcat/modules/loggers LogEvents.java
Removed: src/share/org/apache/tomcat/context AutoSetup.java
DefaultCMSetter.java ErrorHandler.java
LoaderInterceptor11.java LoaderInterceptor12.java
LogEvents.java PolicyInterceptor.java
Log:
Reorganized modules in tomcat.context, based on module type
( config, generators, loggers )
Revision Changes Path
1.1
jakarta-tomcat/src/share/org/apache/tomcat/modules/config/AutoSetup.java
Index: AutoSetup.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* [Additional notices, if required by prior licensing conditions]
*
*/
package org.apache.tomcat.context;
import org.apache.tomcat.core.*;
import org.apache.tomcat.util.*;
import java.io.*;
import java.net.*;
import java.util.*;
/**
* Prepare a context manager - expand wars in webapps and
* automaticly install contexts
*
* This happens _before_ Context.init()
*
* @author [EMAIL PROTECTED]
*/
public class AutoSetup extends BaseInterceptor {
int debug=0;
Hashtable definedContexts=new Hashtable();
public AutoSetup() {
}
/** This will add all contexts to the default host.
* We need a mechanism ( or convention ) to configure
* virtual hosts too
*/
public void engineStart(ContextManager cm) throws TomcatException {
String home=cm.getHome();
File webappD=new File(home + "/webapps");
if (! webappD.exists() || ! webappD.isDirectory()) {
log("No webapps/ directory " + webappD );
return ; // nothing to set up
}
Enumeration en=cm.getContexts();
while (en.hasMoreElements()){
Context ctx=(Context)en.nextElement();
if( ctx.getHost()== null ) {
// this is a context that goes into the default server
// we care only about the root context for autosetup
// until we define a pattern for automatic vhost setup.
definedContexts.put( ctx.getPath(), ctx );
if(debug>0) log("Register explicit context " + ctx.getPath());
}
}
String[] list = webappD.list();
if( list.length==0 ) {
log("No apps in webapps/ ");
}
for (int i = 0; i < list.length; i++) {
String name = list[i];
if( name.endsWith(".war") ) {
String fname=name.substring(0, name.length()-4);
File appDir=new File( home + "/webapps/" + fname);
if( ! appDir.exists() ) {
// no check if war file is "newer" than directory
// To update you need to "remove" the context first!!!
appDir.mkdirs();
// Expand war file
try {
FileUtil.expand(home + "/webapps/" + name,
home + "/webapps/" + fname);
} catch( IOException ex) {
log("expanding webapp " + name, ex);
// do what ?
}
}
// we will add the directory to the path
name=fname;
}
// XXX XXX Add a .xml case
// If a "path.xml" file is found in webapps/, it will be loaded
// as a <context> fragment ( what will allow setting options
// for contexts or automatic config for contexts with different base)
// Decode path
// Path will be based on the War name
// Current code supports only one level, we
// need to decide an encoding scheme for multi-level
String path="/" + name; // decode(name)
// log("XXX : " + path );
if( path.equals("/ROOT") )
path="";
if( definedContexts.get(path) == null ) {
// if no explicit set up and is a directory
File f=new File( webappD, name);
if (f.isDirectory()) {
Context ctx=new Context();
ctx.setContextManager( cm );
ctx.setPath(path);
definedContexts.put( path, ctx );
// use absolute filename based on CM home instead of relative
// don't assume HOME==TOMCAT_HOME
ctx.setDocBase( f.getAbsolutePath() );
if( debug > 0 )
log("automatic add " + ctx.toString() + " " + path);
cm.addContext(ctx);
ctx.init();
} else {
if( debug>0)
log("Already set up: " + path + " "
+ definedContexts.get(path));
}
}
}
}
}
1.1
jakarta-tomcat/src/share/org/apache/tomcat/modules/config/DefaultCMSetter.java
Index: DefaultCMSetter.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* [Additional notices, if required by prior licensing conditions]
*
*/
package org.apache.tomcat.modules.aaa;
import org.apache.tomcat.core.*;
import org.apache.tomcat.request.*;
import org.apache.tomcat.util.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.security.*;
import org.apache.tomcat.util.log.*;
// don't extend - replace !
/**
* Check ContextManager and set defaults for non-set properties
*
* @author [EMAIL PROTECTED]
*/
public final class DefaultCMSetter extends BaseInterceptor {
/** Default work dir, relative to home
*/
public static final String DEFAULT_WORK_DIR="work";
public DefaultCMSetter() {
}
/** Adjust context manager paths.
* FIRST
*/
public void engineInit( ContextManager cm )
throws TomcatException
{
// Adjust paths in CM
String home=cm.getHome();
if( home==null ) {
// try system property
home=System.getProperty(ContextManager.TOMCAT_HOME);
}
// Make it absolute
if( home!= null ) {
home=FileUtil.getCanonicalPath( home );
cm.setHome( home );
log( "engineInit: home= " + home );
}
String installDir=cm.getInstallDir();
if( installDir!= null ) {
installDir=FileUtil.getCanonicalPath( installDir );
cm.setInstallDir( installDir );
log( "engineInit: install= " + installDir );
}
// if only one is set home==installDir
if( home!=null && installDir == null )
cm.setInstallDir( home );
if( home==null && installDir != null )
cm.setHome( installDir );
// if neither home or install is set,
// and no system property, try "."
if( home==null && installDir==null ) {
home=FileUtil.getCanonicalPath( "." );
installDir=home;
cm.setHome( home );
cm.setInstallDir( home );
}
// Adjust work dir
String workDir=cm.getWorkDir();
if( workDir==null ) {
workDir= DEFAULT_WORK_DIR;
}
if( ! FileUtil.isAbsolute( workDir )) {
workDir=FileUtil.
getCanonicalPath(home + File.separator+
workDir);
}
cm.setWorkDir( workDir );
initLoggers(cm.getLoggers());
}
/** Generate a random number
*/
public void engineStart( ContextManager cm )
throws TomcatException
{
try {
PrintWriter stopF=new PrintWriter
(new FileWriter(cm.getHome() + "/conf/random.txt"));
stopF.println( Math.random() );
stopF.close();
} catch( IOException ex ) {
log( "Can't create stop file " + ex );
}
}
private void initLoggers(Hashtable Loggers){
if( Loggers!=null ){
Enumeration el=Loggers.elements();
while( el.hasMoreElements()){
Logger l=(Logger)el.nextElement();
String path=l.getPath();
if( path!=null ) {
File f=new File( path );
if( ! f.isAbsolute() ) {
File wd= new File(cm.getHome(), f.getPath());
l.setPath( wd.getAbsolutePath() );
}
// create the files, ready to log.
}
l.open();
}
}
}
/** Adjust paths
*/
public void addContext( ContextManager cm, Context ctx)
throws TomcatException
{
// adjust context paths and loggers
String docBase=ctx.getDocBase();
String absPath=ctx.getAbsolutePath();
if( absPath==null ) {
if (FileUtil.isAbsolute( docBase ) )
absPath=docBase;
else
absPath = cm.getHome() + File.separator + docBase;
try {
absPath = new File(absPath).getCanonicalPath();
} catch (IOException npe) {
}
ctx.setAbsolutePath( absPath );
}
if( debug > 0 ) {
String h=ctx.getHost();
log( "addContext: " + ((h==null) ? "":h) + ":" +
ctx.getPath() + " " + docBase + " " + absPath + " " +
cm.getHome());
}
// this would belong to a logger interceptor ?
Log loghelper=ctx.getLog();
Log loghelperServlet=ctx.getServletLog();
if( loghelper!=null && loghelper.getLogger() != null )
cm.addLogger( loghelper.getLogger() );
if( loghelperServlet != null &&
loghelperServlet.getLogger() != null)
cm.addLogger( loghelperServlet.getLogger() );
}
}
1.1
jakarta-tomcat/src/share/org/apache/tomcat/modules/config/LoaderInterceptor11.java
Index: LoaderInterceptor11.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* [Additional notices, if required by prior licensing conditions]
*
*/
package org.apache.tomcat.modules.config;
import org.apache.tomcat.core.*;
import org.apache.tomcat.request.*;
import org.apache.tomcat.util.*;
import org.apache.tomcat.util.depend.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.security.*;
/**
* Set class loader based on WEB-INF/classes, lib.
* Use with JDK1.1.
*
* @author [EMAIL PROTECTED]
*/
public class LoaderInterceptor11 extends BaseInterceptor {
public LoaderInterceptor11() {
}
public void addContext( ContextManager cm, Context context)
throws TomcatException
{
String base = context.getAbsolutePath();
// Add "WEB-INF/classes"
File dir = new File(base + "/WEB-INF/classes");
// GS, Fix for the jar@lib directory problem.
// Thanks for Kevin Jones for providing the fix.
if( dir.exists() ) {
try {
URL url=new URL( "file", null, dir.getAbsolutePath() + "/" );
context.addClassPath( url );
} catch( MalformedURLException ex ) {
}
}
File f = new File(base + "/WEB-INF/lib");
Vector jars = new Vector();
getJars(jars, f);
for(int i=0; i < jars.size(); ++i) {
String jarfile = (String) jars.elementAt(i);
File jf=new File(f, jarfile );
String absPath=jf.getAbsolutePath();
try {
URL url=new URL( "file", null, absPath );
context.addClassPath( url );
} catch( MalformedURLException ex ) {
}
}
// Add servlet.jar and jasper.jar
}
public void contextInit( Context context)
throws TomcatException
{
ContextManager cm = context.getContextManager();
URL classP[]=context.getClassPath();
if( debug > 0 ) {
for( int i=0; i< classP.length ; i++ )
log ( "Set classpath " + classP[i] );
}
DependManager dm=context.getDependManager();
if( dm==null ) {
dm=new DependManager();
context.setDependManager( dm );
}
// XXX Customize this - based on context prefs,
// select the right parent - it may be CM.getParentLoader()
ClassLoader parent=this.getClass().getClassLoader();
SimpleClassLoader loader=new SimpleClassLoader(classP, parent);
DependClassLoader dcl=new DependClassLoader( dm, loader);
context.setClassLoader( dcl );
}
public void reload( Request req, Context context) throws TomcatException {
log( "Reload event " );
ContextManager cm = context.getContextManager();
URL urls[]=context.getClassPath();
DependManager dm=new DependManager();
context.setDependManager( dm );
ClassLoader oldLoader=context.getClassLoader();
int oldLoaderNote=cm.getNoteId( ContextManager.CONTAINER_NOTE,
"oldLoader");
context.getContainer().setNote( oldLoaderNote, oldLoader);
// XXX Customize this - based on context prefs,
// select the right parent - it may be CM.getParentLoader()
ClassLoader parent=this.getClass().getClassLoader();
SimpleClassLoader loader=new SimpleClassLoader(urls, parent);
DependClassLoader dcl=new DependClassLoader( dm, loader);
context.setClassLoader( dcl );
}
private void getJars(Vector v, File f) {
FilenameFilter jarfilter = new FilenameFilter() {
public boolean accept(File dir, String fname) {
if(fname.endsWith(".jar"))
return true;
return false;
}
};
FilenameFilter dirfilter = new FilenameFilter() {
public boolean accept(File dir, String fname) {
File f1 = new File(dir, fname);
if(f1.isDirectory())
return true;
return false;
}
};
if(f.exists() && f.isDirectory() && f.isAbsolute()) {
String[] jarlist = f.list(jarfilter);
for(int i=0; (jarlist != null) && (i < jarlist.length); ++i) {
v.addElement(jarlist[i]);
}
String[] dirlist = f.list(dirfilter);
for(int i=0; (dirlist != null) && (i < dirlist.length); ++i) {
File dir = new File(f, dirlist[i]);
getJars(v, dir);
}
}
}
}
1.1
jakarta-tomcat/src/share/org/apache/tomcat/modules/config/LoaderInterceptor12.java
Index: LoaderInterceptor12.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* [Additional notices, if required by prior licensing conditions]
*
*/
package org.apache.tomcat.modules.config;
import org.apache.tomcat.core.*;
import org.apache.tomcat.request.*;
import org.apache.tomcat.util.*;
import org.apache.tomcat.util.depend.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.security.*;
/**
* Set class loader based on WEB-INF/classes, lib.
* Uses the protection domain - if any, so PolicyInterceptor
* must be called before it.
*
* @author [EMAIL PROTECTED]
*/
public class LoaderInterceptor12 extends BaseInterceptor {
String classLoaderName;
public LoaderInterceptor12() {
}
public void setClassLoaderName( String name ) {
classLoaderName=name;
}
/** The class paths are added when the context is added
*/
public void addContext( ContextManager cm, Context context)
throws TomcatException
{
if( debug>0) log( "Add context " + context.getPath());
String base = context.getAbsolutePath();
// Add "WEB-INF/classes"
File dir = new File(base + "/WEB-INF/classes");
// GS, Fix for the jar@lib directory problem.
// Thanks for Kevin Jones for providing the fix.
if( dir.exists() ) {
try {
URL url=new URL( "file", null, dir.getAbsolutePath() + "/" );
context.addClassPath( url );
} catch( MalformedURLException ex ) {
}
}
File f = new File(base + "/WEB-INF/lib");
Vector jars = new Vector();
getJars(jars, f);
for(int i=0; i < jars.size(); ++i) {
String jarfile = (String) jars.elementAt(i);
File jf=new File(f, jarfile );
String absPath=jf.getAbsolutePath();
try {
URL url=new URL( "file", null, absPath );
context.addClassPath( url );
} catch( MalformedURLException ex ) {
}
}
}
/** The class loader is set when the context us initialized
* or at reload
*/
public void contextInit( Context context)
throws TomcatException
{
if( debug>0 ) log( "Init context " + context.getPath());
ContextManager cm = context.getContextManager();
URL urls[]=context.getClassPath();
DependManager dm=context.getDependManager();
if( dm==null ) {
dm=new DependManager();
context.setDependManager( dm );
}
// XXX Customize this - based on context prefs,
// select the right parent - it may be CM.getParentLoader()
ClassLoader parent=this.getClass().getClassLoader();
URLClassLoader urlLoader=URLClassLoader.newInstance( urls, parent );
DependClassLoader dcl=new DependClassLoader( dm, urlLoader);
context.setClassLoader( dcl );
}
public void reload( Request req, Context context) throws TomcatException {
log( "Reload event " );
ContextManager cm = context.getContextManager();
URL urls[]=context.getClassPath();
ClassLoader oldLoader=context.getClassLoader();
int oldLoaderNote=cm.getNoteId( ContextManager.CONTAINER_NOTE,
"oldLoader");
context.getContainer().setNote( oldLoaderNote, oldLoader);
DependManager dm=new DependManager();
context.setDependManager( dm );
// XXX Customize this - based on context prefs,
// select the right parent - it may be CM.getParentLoader()
ClassLoader parent=this.getClass().getClassLoader();
URLClassLoader urlLoader=URLClassLoader.newInstance( urls , parent);
DependClassLoader dcl=new DependClassLoader( dm, urlLoader);
context.setClassLoader( dcl );
}
private void getJars(Vector v, File f) {
FilenameFilter jarfilter = new FilenameFilter() {
public boolean accept(File dir, String fname) {
if(fname.endsWith(".jar"))
return true;
return false;
}
};
FilenameFilter dirfilter = new FilenameFilter() {
public boolean accept(File dir, String fname) {
File f1 = new File(dir, fname);
if(f1.isDirectory())
return true;
return false;
}
};
if(f.exists() && f.isDirectory() && f.isAbsolute()) {
String[] jarlist = f.list(jarfilter);
for(int i=0; (jarlist != null) && (i < jarlist.length); ++i) {
v.addElement(jarlist[i]);
}
String[] dirlist = f.list(dirfilter);
for(int i=0; (dirlist != null) && (i < dirlist.length); ++i) {
File dir = new File(f, dirlist[i]);
getJars(v, dir);
}
}
}
}
1.1
jakarta-tomcat/src/share/org/apache/tomcat/modules/config/PolicyInterceptor.java
Index: PolicyInterceptor.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* [Additional notices, if required by prior licensing conditions]
*
*/
package org.apache.tomcat.modules.config;
import org.apache.tomcat.core.*;
import org.apache.tomcat.request.*;
import org.apache.tomcat.util.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.security.*;
import org.apache.tomcat.util.log.*;
/**
* Set policy-based access to tomcat.
* Must be hooked before class loader setter.
* The context will have a single protection domain, pointing to the doc root.
* That will include all classes loaded that belong to the context ( jsps,
WEB-INF/classes,
* WEB-INF/lib/
*
* @author Glenn Nielsen
* @author [EMAIL PROTECTED]
*/
public class PolicyInterceptor extends BaseInterceptor {
String securityManagerClass="java.lang.SecurityManager";
String policyFile=null;
public PolicyInterceptor() {
}
public void setSecurityManagerClass(String cls) {
securityManagerClass=cls;
}
public void setPolicyFile( String pf) {
policyFile=pf;
}
/** Set the security manager, so that policy will be used
*/
public void engineInit(ContextManager cm) throws TomcatException {
if( System.getSecurityManager() != null ) return;
try {
if( null == System.getProperty("java.security.policy")) {
if( policyFile==null ) {
// XXX ugly API - change CM
File f= new File(cm.getHome(), "conf/tomcat.policy");
policyFile=f.getPath();
}
log("Setting policy file to " + policyFile);
System.setProperty("java.security.policy",
policyFile);
}
Class c=Class.forName(securityManagerClass);
Object o=c.newInstance();
System.setSecurityManager((SecurityManager)o);
if (debug>0) log("Security Manager set to " +
securityManagerClass, Logger.DEBUG);
} catch( ClassNotFoundException ex ) {
log("SecurityManager Class not found: " +
securityManagerClass, Logger.ERROR);
} catch( Exception ex ) {
log("SecurityManager Class could not be loaded: " +
securityManagerClass, Logger.ERROR);
}
}
/** Add a default set of permissions to the context
*/
protected void addDefaultPermissions( Context context,String base,
Permissions p )
{
// Add default read "-" FilePermission for docBase, classes, lib
// Default per context permissions
FilePermission fp = new FilePermission(base + "/-", "read");
if( fp != null )
p.add((Permission)fp);
// JspFactory.getPageContext() runs in JSP Context and needs the below
// permission during the init of a servlet generated from a JSP.
PropertyPermission pp = new PropertyPermission("line.separator","read");
if( pp != null )
p.add((Permission)pp);
}
public void contextInit( Context context)
throws TomcatException
{
ContextManager cm = context.getContextManager();
String base = context.getAbsolutePath();
try {
File dir = new File(base);
URL url = new URL("file:" + dir.getAbsolutePath());
CodeSource cs = new CodeSource(url,null);
/* We'll construct permissions for Jasper.
Tomcat uses normal policy and URLClassLoader.
We may add fancy config later, if needed
*/
Permissions p = new Permissions();
// // Add global permissions ( from context manager )
// // XXX maybe use imply or something like that
// Permissions perms = (Permissions)cm.getPermissions();
// if( perms!= null ) {
// Enumeration enum=perms.elements();
// while(enum.hasMoreElements()) {
// p.add((Permission)enum.nextElement());
// }
// }
addDefaultPermissions( context, dir.getAbsolutePath(), p);
/** Add whatever permissions are specified in the policy file
*/
Policy.getPolicy().refresh();
PermissionCollection pFileP=Policy.getPolicy().getPermissions(cs);
if( pFileP!= null ) {
Enumeration enum=pFileP.elements();
while(enum.hasMoreElements()) {
p.add((Permission)enum.nextElement());
}
}
// This is used only for Jasper ! Should be replaced by
// a standard URLClassLoader.
ProtectionDomain pd = new ProtectionDomain(cs,p);
// context.setProtectionDomain(pd);
context.setAttribute( Context.ATTRIB_PROTECTION_DOMAIN,
pd);
// new permissions - added context manager and file to whatever was
// specified by default
// context.setPermissions( p );
} catch(Exception ex) {
log("Security init for Context " + base + " failed", ex);
}
}
}
1.1
jakarta-tomcat/src/share/org/apache/tomcat/modules/generators/ErrorHandler.java
Index: ErrorHandler.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* [Additional notices, if required by prior licensing conditions]
*
*/
package org.apache.tomcat.modules.generators;
import org.apache.tomcat.core.*;
import org.apache.tomcat.request.*;
import org.apache.tomcat.util.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.security.*;
import org.apache.tomcat.util.log.*;
/**
* Handle errors - this is the default handler, you can replace it
* with customized versions
*
* @author Costin Manolache
*/
public final class ErrorHandler extends BaseInterceptor {
private Context rootContext=null;
public ErrorHandler() {
}
public void engineInit( ContextManager cm )
throws TomcatException
{
}
public void addContext( ContextManager cm, Context ctx)
throws TomcatException
{
}
/** Add default error handlers
*/
public void contextInit( Context ctx)
throws TomcatException
{
if( ctx.getHost() == null && ctx.getPath().equals(""))
rootContext = ctx;
boolean showDebugInfo=true;
ContextManager cm=ctx.getContextManager();
String dI=cm.getProperty( "showDebugInfo" );
if( dI!=null && ( dI.equalsIgnoreCase("no") ||
dI.equalsIgnoreCase("false"))) {
showDebugInfo=false;
}
// override with per/context setting
dI=ctx.getProperty( "showDebugInfo" );
if( dI!=null && ( dI.equalsIgnoreCase("no") ||
dI.equalsIgnoreCase("false"))) {
showDebugInfo=false;
}
if( dI!=null && ( dI.equalsIgnoreCase("yes") ||
dI.equalsIgnoreCase("true"))) {
showDebugInfo=true;
}
ctx.addServlet( new ExceptionHandler(this, showDebugInfo));
ctx.addServlet( new StatusHandler(this, showDebugInfo));
// Default status handlers
ctx.addServlet( new RedirectHandler(this));
ctx.addErrorPage( "302", "tomcat.redirectHandler");
ctx.addServlet( new NotFoundHandler(this, showDebugInfo));
ctx.addErrorPage( "404", "tomcat.notFoundHandler");
}
public int handleError( Request req, Response res, Throwable t ) {
ContextManager cm=req.getContextManager();
Context ctx = req.getContext();
if(ctx==null) {
// that happens only if the request can't pass contextMap
// hook. The reason for that is a malformed request, or any
// other error.
ctx=rootContext;
}
if( t==null ) {
handleStatusImpl( cm, ctx, req, res, res.getStatus() );
} else {
handleErrorImpl( cm, ctx, req, res, t );
}
return 200;
}
// -------------------- Implementation of handleError
// Originally in ContextManager.
private final void handleStatusImpl( ContextManager cm, Context ctx,
Request req, Response res,
int code )
{
String errorPath=null;
Handler errorServlet=null;
// don't log normal cases ( redirect and need_auth ), they are not
// error
// XXX this log was intended to debug the status code generation.
// it can be removed for all cases.
if( code != 302 && code != 401 && code!=400 ) {// tuneme
ctx.log( "Status code:" + code + " request:" + req + " msg:" +
req.getAttribute("javax.servlet.error.message"));
}
errorPath = ctx.getErrorPage( code );
if( errorPath != null ) {
errorServlet=getHandlerForPath( cm, ctx, errorPath );
// Make sure Jsps will work
req.setAttribute( "javax.servlet.include.request_uri",
ctx.getPath() + "/" + errorPath );
req.setAttribute( "javax.servlet.include.servlet_path", errorPath );
}
boolean isDefaultHandler = false;
if( errorServlet==null ) {
errorServlet=ctx.getServletByName( "tomcat.statusHandler");
isDefaultHandler = true;
}
if (errorServlet == null) {
ctx.log( "Handler errorServlet is null! errorPath:" + errorPath);
return;
}
if (!isDefaultHandler && !res.isBufferCommitted())
res.resetBuffer();
req.setAttribute("javax.servlet.error.status_code",new Integer( code));
req.setAttribute("tomcat.servlet.error.request", req);
if( debug>0 )
ctx.log( "Handler " + errorServlet + " " + errorPath);
errorServlet.service( req, res );
Exception ex=res.getErrorException();
if( ex!=null && ! (ex instanceof IOException) ) {
// we can ignore IOException - probably the user
// has clicked "STOP"
// we need to log any other error - something may be
// broken if the error servlet has errors.
ctx.log( "Error in default status handler", ex);
}
}
// XXX XXX Security - we should log the message, but nothing
// should show up to the user - it gives up information
// about the internal system !
// Developers can/should use the logs !!!
/** General error handling mechanism. It will try to find an error handler
* or use the default handler.
*/
void handleErrorImpl( ContextManager cm, Context ctx,
Request req, Response res , Throwable t )
{
/** The exception must be available to the user.
Note that it is _WRONG_ to send the trace back to
the client. AFAIK the trace is the _best_ debugger.
*/
if( t instanceof IllegalStateException ) {
ctx.log("IllegalStateException in " + req, t);
// Nothing special in jasper exception treatement, no deps
//} else if( t instanceof org.apache.jasper.JasperException ) {
// ctx.log("JasperException in " + req, t);
} else if( t instanceof IOException ) {
if( "Broken pipe".equals(t.getMessage()))
{
ctx.log("Broken pipe in " + req, t, Logger.DEBUG); // tuneme
return;
}
if( "Connection reset by peer".equals(t.getMessage()))
{
ctx.log("Connection reset by peer in " + req, t, Logger.DEBUG); //
tuneme
return;
}
ctx.log("IOException in " + req, t );
} else {
ctx.log("Exception in " + req , t );
}
if(null!=req.getAttribute("tomcat.servlet.error.defaultHandler")){
// we are in handleRequest for the "default" error handler
log("ERROR: can't find default error handler, or error in default error
page", t);
}
String errorPath=null;
Handler errorServlet=null;
// Scan the exception's inheritance tree looking for a rule
// that this type of exception should be forwarded
Class clazz = t.getClass();
while (errorPath == null && clazz != null) {
String name = clazz.getName();
errorPath = ctx.getErrorPage(name);
clazz = clazz.getSuperclass();
}
if( errorPath != null ) {
errorServlet=getHandlerForPath( cm, ctx, errorPath );
// Make sure Jsps will work
req.setAttribute( "javax.servlet.include.request_uri",
ctx.getPath() + "/" + errorPath );
req.setAttribute( "javax.servlet.include.servlet_path", errorPath );
}
boolean isDefaultHandler = false;
if ( errorLoop( ctx, req ) ){
return;
}
if ( errorServlet==null) {
errorServlet = ctx.getServletByName("tomcat.exceptionHandler");
isDefaultHandler = true;
}
if (errorServlet == null) {
ctx.log( "Handler errorServlet is null! errorPath:" + errorPath);
return;
}
if (!isDefaultHandler && !res.isBufferCommitted())
res.resetBuffer();
req.setAttribute("javax.servlet.error.exception_type", t.getClass());
req.setAttribute("javax.servlet.error.message", t.getMessage());
req.setAttribute("javax.servlet.jsp.jspException", t);
req.setAttribute("tomcat.servlet.error.throwable", t);
req.setAttribute("tomcat.servlet.error.request", req);
if( debug>0 )
ctx.log( "Handler " + errorServlet + " " + errorPath);
errorServlet.service( req, res );
Exception ex=res.getErrorException();
if( ! (ex instanceof IOException) ) {
// we can ignore IOException - probably the user
// has clicked "STOP"
// we need to log any other error - something may be
// broken if the error servlet has errors.
ctx.log( "Error in errorServlet", ex);
}
}
public final Handler getHandlerForPath( ContextManager cm,
Context ctx, String path ) {
if( ! path.startsWith( "/" ) ) {
return ctx.getServletByName( path );
}
Request req1=new Request();
Response res1=new Response();
cm.initRequest( req1, res1 );
req1.requestURI().setString( ctx.getPath() + path );
cm.processRequest( req1 );
return req1.getHandler();
}
/** Handle the case of error handler generating an error or special status
*/
private boolean errorLoop( Context ctx, Request req ) {
if( req.getAttribute("javax.servlet.error.status_code") != null
|| req.getAttribute("javax.servlet.error.exception_type")!=null) {
if( ctx.getDebug() > 0 )
ctx.log( "Error: exception inside exception servlet " +
req.getAttribute("javax.servlet.error.status_code") +
" " + req.
getAttribute("javax.servlet.error.exception_type"));
return true;
}
return false;
}
}
class NotFoundHandler extends Handler {
static StringManager sm=StringManager.
getManager("org.apache.tomcat.resources");
int sbNote=0;
boolean showDebugInfo=true;
NotFoundHandler(BaseInterceptor bi, boolean showDebugInfo) {
// setOrigin( Handler.ORIGIN_INTERNAL );
name="tomcat.notFoundHandler";
setModule(bi);
this.showDebugInfo=showDebugInfo;
}
public void doService(Request req, Response res)
throws Exception
{
res.setContentType("text/html"); // ISO-8859-1 default
String requestURI = (String)req.
getAttribute("javax.servlet.include.request_uri");
if (requestURI == null) {
requestURI = req.requestURI().toString();
}
if( sbNote==0 ) {
sbNote=req.getContextManager().getNoteId(ContextManager.REQUEST_NOTE,
"NotFoundHandler.buff");
}
// we can recycle it because
// we don't call toString();
StringBuffer buf=(StringBuffer)req.getNote( sbNote );
if( buf==null ) {
buf = new StringBuffer();
req.setNote( sbNote, buf );
}
boolean bufReset = (res.getBuffer().getBytesWritten() == 0);
// only include <head>...<body> if reset was successful
if (bufReset) {
buf.append("<head><title>")
.append(sm.getString("defaulterrorpage.notfound404"))
.append("</title></head>\r\n<body>");
}
buf.append("<h1>")
.append(sm.getString("defaulterrorpage.notfound404"))
.append("</h1>\r\n");
buf.append(sm.getString("defaulterrorpage.originalrequest"))
.append( requestURI )
.append("\r\n");
if ( null != requestURI && showDebugInfo ) {
buf.append("<br><br>\r\n<b>")
.append(sm.getString("defaulterrorpage.notfoundrequest"))
.append("</b> ")
.append( requestURI )
.append("\r\n");
}
// only add </body> if reset was successful
if ( bufReset )
buf.append("</body>");
buf.append("\r\n");
res.setContentLength(buf.length());
res.getBuffer().write( buf );
buf.setLength(0);
}
}
class ExceptionHandler extends Handler {
static StringManager sm=StringManager.
getManager("org.apache.tomcat.resources");
int sbNote=0;
boolean showDebugInfo=true;
ExceptionHandler(BaseInterceptor bi, boolean showDebugInfo) {
// setOrigin( Handler.ORIGIN_INTERNAL );
name="tomcat.exceptionHandler";
setModule( bi );
this.showDebugInfo=showDebugInfo;
}
public void doService(Request req, Response res)
throws Exception
{
String msg=(String)req.getAttribute("javax.servlet.error.message");
String errorURI = res.getErrorURI();
Throwable e= (Throwable)req.
getAttribute("tomcat.servlet.error.throwable");
if( e==null ) {
log("Exception handler called without an exception", new
Throwable("trace"));
return;
}
res.setContentType("text/html");
res.setStatus( 500 );
if( sbNote==0 ) {
sbNote=req.getContextManager().getNoteId(ContextManager.REQUEST_NOTE,
"ExceptionHandler.buff");
}
// we can recycle it because
// we don't call toString();
StringBuffer buf=(StringBuffer)req.getNote( sbNote );
if( buf==null ) {
buf = new StringBuffer();
req.setNote( sbNote, buf );
}
boolean bufReset = (res.getBuffer().getBytesWritten() == 0);
// only include <head>...<body> if reset was successful
if (bufReset) {
buf.append("<head><title>");
if( null != errorURI && showDebugInfo ) {
buf.append(sm.getString("defaulterrorpage.includedservlet") )
.append(" ");
} else {
buf.append("Error: ");
}
buf.append( 500 )
.append("</title></head>\r\n<body>\r\n");
}
buf.append("<h1>");
if( null != errorURI && showDebugInfo ) {
buf.append(sm.getString("defaulterrorpage.includedservlet") ).
append(" ");
} else {
buf.append("Error: ");
}
buf.append( 500 );
buf.append("</h1>\r\n");
// More info - where it happended"
buf.append("<h2>")
.append(sm.getString("defaulterrorpage.location"))
.append(req.requestURI().toString())
.append("</h2>");
if ( null != errorURI && showDebugInfo ) {
buf.append("\r\n<h2>")
.append(sm.getString("defaulterrorpage.errorlocation"))
.append(" ")
.append(errorURI)
.append("</h2>");
}
if (showDebugInfo) {
buf.append("<b>")
.append(sm.getString("defaulterrorpage.internalservleterror"));
buf.append("</b><br>\r\n<pre>");
// prints nested exceptions too, including SQLExceptions, recursively
String trace = Logger.throwableToString
(e, "<b>" + sm.getString("defaulterrorpage.rootcause") + "</b>");
buf.append(trace);
buf.append("</pre>\r\n");
} else {
buf.append("<b>Error:</b> ")
.append(e.getMessage())
.append("<br><br>\r\n");
}
// only add </body> if reset was successful
if ( bufReset )
buf.append("</body>");
buf.append("\r\n");
res.getBuffer().write( buf );
buf.setLength(0);
}
}
class StatusHandler extends Handler {
static StringManager sm=StringManager.
getManager("org.apache.tomcat.resources");
int sbNote=0;
boolean showDebugInfo=true;
StatusHandler(BaseInterceptor bi, boolean showDebugInfo) {
//setOrigin( Handler.ORIGIN_INTERNAL );
name="tomcat.statusHandler";
setModule( bi );
this.showDebugInfo=showDebugInfo;
}
// We don't want interceptors called for redirect
// handler
public void doService(Request req, Response res)
throws Exception
{
String msg=(String)req.getAttribute("javax.servlet.error.message");
String errorURI = res.getErrorURI();
res.setContentType("text/html");
// res is reset !!!
// status is already set
int sc=res.getStatus();
if( sbNote==0 ) {
sbNote=req.getContextManager().getNoteId(ContextManager.REQUEST_NOTE,
"StatusHandler.buff");
}
// we can recycle it because
// we don't call toString();
StringBuffer buf=(StringBuffer)req.getNote( sbNote );
if( buf==null ) {
buf = new StringBuffer();
req.setNote( sbNote, buf );
}
boolean bufReset = (res.getBuffer().getBytesWritten() == 0);
// only include <head>...<body> if reset was successful
if (bufReset) {
buf.append("<head><title>");
if( null != errorURI && showDebugInfo ) {
buf.append(sm.getString("defaulterrorpage.includedservlet") )
.append(" ");
} else {
buf.append("Error: ");
}
buf.append( sc )
.append("</title></head>\r\n<body>\r\n");
}
buf.append("<h1>");
if( null != errorURI && showDebugInfo ) {
buf.append(sm.getString("defaulterrorpage.includedservlet") )
.append(" ");
} else {
buf.append("Error: ");
}
buf.append( sc );
buf.append("</h1>\r\n");
// More info - where it happended"
buf.append("<h2>")
.append(sm.getString("defaulterrorpage.location"))
.append(req.requestURI().toString())
.append("</h2>");
if ( sc >= 400 && errorURI != null && showDebugInfo) {
buf.append("\r\n<h2>")
.append(sm.getString("defaulterrorpage.errorlocation"))
.append(" ")
.append(errorURI)
.append("</h2>");
}
buf.append("\r\n<b>")
.append(msg)
.append("</b><br>\r\n");
// add unavailable time if present
if ( sc == 503) {
Integer ut =
(Integer)req.getAttribute("tomcat.servlet.error.service.unavailableTime");
if ( ut != null) {
buf.append("<br>");
// if permanent
if (ut.intValue() < 0) {
buf.append(sm.getString("defaulterrorpage.service.permanently.unavailable"));
} else {
buf.append(sm.getString("defaulterrorpage.service.unavailable",ut));
}
buf.append("<br>\r\n");
}
}
// only add </body> if reset was successful
if ( bufReset )
buf.append("</body>");
buf.append("\r\n");
res.setContentLength(buf.length());
res.getBuffer().write( buf );
buf.setLength(0);
}
}
class RedirectHandler extends Handler {
static StringManager sm=StringManager.
getManager("org.apache.tomcat.resources");
int sbNote=0;
RedirectHandler(BaseInterceptor bi) {
//setOrigin( Handler.ORIGIN_INTERNAL );
name="tomcat.redirectHandler";
setModule( bi );
}
// We don't want interceptors called for redirect
// handler
public void doService(Request req, Response res)
throws Exception
{
String location = (String)
req.getAttribute("javax.servlet.error.message");
Context ctx=req.getContext();
location = makeAbsolute(req, location);
if( debug>0) ctx.log("Redirect " + location + " " + req );
res.setContentType("text/html"); // ISO-8859-1 default
res.setHeader("Location", location);
if( sbNote==0 ) {
sbNote=req.getContextManager().getNoteId(ContextManager.REQUEST_NOTE,
"RedirectHandler.buff");
}
// we can recycle it because
// we don't call toString();
StringBuffer buf=(StringBuffer)req.getNote( sbNote );
if( buf==null ) {
buf = new StringBuffer();
req.setNote( sbNote, buf );
}
buf.append("<head><title>").
append(sm.getString("defaulterrorpage.documentmoved")).
append("</title></head>\r\n<body><h1>").
append(sm.getString("defaulterrorpage.documentmoved")).
append("</h1>\r\n").
append(sm.getString("defaulterrorpage.thisdocumenthasmoved")).
append(" <a href=\"").
append(location).
append("\">here</a>.<p>\r\n</body>\r\n");
res.setContentLength(buf.length());
res.getBuffer().write( buf );
buf.setLength(0);
}
// XXX Move it to URLUtil !!!
private String makeAbsolute(Request req, String location) {
URL url = null;
try {
// Try making a URL out of the location
// Throws an exception if the location is relative
url = new URL(location);
} catch (MalformedURLException e) {
String requrl = getRequestURL(req);
try {
url = new URL(new URL(requrl), location);
}
catch (MalformedURLException ignored) {
// Give up
return location;
}
}
return url.toString();
}
static String getRequestURL( Request req ) {
StringBuffer url = new StringBuffer ();
String scheme = req.scheme().toString();
int port = req.getServerPort ();
String urlPath = req.requestURI().toString();
url.append (scheme); // http, https
url.append ("://");
url.append (req.serverName().toString());
if ((scheme.equals ("http") && port != 80)
|| (scheme.equals ("https") && port != 443)) {
url.append (':');
url.append (port);
}
url.append(urlPath);
return url.toString();
}
}
1.1
jakarta-tomcat/src/share/org/apache/tomcat/modules/loggers/LogEvents.java
Index: LogEvents.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* [Additional notices, if required by prior licensing conditions]
*
*/
package org.apache.tomcat.modules.loggers;
import org.apache.tomcat.core.*;
import org.apache.tomcat.util.*;
import java.io.*;
import java.net.*;
import java.util.*;
/** Log all hook events during tomcat execution.
* Use debug>0 to log addContainer ( since this generates a lot of
* output )
*/
public class LogEvents extends BaseInterceptor {
public LogEvents() {
}
// -------------------- Request notifications --------------------
public int requestMap(Request request ) {
log( "requestMap " + request);
return 0;
}
public int contextMap( Request request ) {
log( "contextMap " + request);
return 0;
}
public int preService(Request request, Response response) {
log( "preService " + request);
return 0;
}
public int authenticate(Request request, Response response) {
log( "authenticate " + request);
return 0;
}
public int authorize(Request request, Response response,
String reqRoles[])
{
StringBuffer sb=new StringBuffer();
appendSA( sb, reqRoles, " ");
log( "authorize " + request + " " + sb.toString() );
return 0;
}
public int beforeBody( Request request, Response response ) {
log( "beforeBody " + request);
return 0;
}
public int beforeCommit( Request request, Response response) {
log( "beforeCommit " + request);
return 0;
}
public int afterBody( Request request, Response response) {
log( "afterBody " + request);
return 0;
}
public int postRequest( Request request, Response response) {
log( "postRequest " + request);
return 0;
}
public int handleError( Request request, Response response, Throwable t) {
log( "handleError " + request + " " + t);
return 0;
}
public int postService(Request request, Response response) {
log( "postService " + request);
return 0;
}
public int newSessionRequest( Request req, Response res ) {
log( "newSessionRequest " + req );
return 0;
}
// -------------------- Context notifications --------------------
public void contextInit(Context ctx) throws TomcatException {
log( "contextInit " + ctx);
}
public void contextShutdown(Context ctx) throws TomcatException {
log( "contextShutdown " + ctx);
}
/** Notify when a new servlet is added
*/
public void addServlet( Context ctx, Handler sw) throws TomcatException {
log( "addServlet " + ctx + " " + sw );
}
/** Notify when a servlet is removed from context
*/
public void removeServlet( Context ctx, Handler sw) throws TomcatException {
log( "removeServlet " + ctx + " " + sw);
}
public void addMapping( Context ctx, String path, Handler servlet)
throws TomcatException
{
log( "addMapping " + ctx + " " + path + "->" + servlet);
}
public void removeMapping( Context ctx, String path )
throws TomcatException
{
log( "removeMapping " + ctx + " " + path);
}
private void appendSA( StringBuffer sb, String s[], String sep) {
for( int i=0; i<s.length; i++ ) {
sb.append( sep ).append( s[i] );
}
}
/**
*/
public void addSecurityConstraint( Context ctx, String path[],
String methods[], String transport,
String roles[] )
throws TomcatException
{
StringBuffer sb=new StringBuffer();
sb.append("addSecurityConstraint " + ctx + " " );
if( methods!=null ) {
sb.append("Methods: ");
appendSA( sb, methods, " " );
}
if( path!=null) {
sb.append(" Paths: ");
appendSA( sb, path, " " );
}
if( roles!=null) {
sb.append(" Roles: ");
appendSA( sb, roles, " " );
}
sb.append(" Transport " + transport );
log(sb.toString());
}
public void addInterceptor( ContextManager cm, Context ctx,
BaseInterceptor i )
throws TomcatException
{
if( ctx==null)
log( "addInterceptor " + i );
else {
log( "addInterceptor " + ctx + " " + i);
}
}
/** Called when the ContextManger is started
*/
public void engineInit(ContextManager cm) throws TomcatException {
log( "engineInit ");
}
/** Called before the ContextManager is stoped.
* You need to stop any threads and remove any resources.
*/
public void engineShutdown(ContextManager cm) throws TomcatException {
log( "engineShutdown ");
}
/** Called when a context is added to a CM
*/
public void addContext( ContextManager cm, Context ctx )
throws TomcatException
{
log( "addContext " + ctx );
}
public void addContainer( Container ct )
throws TomcatException
{
if( debug > 0 )
log( "addContainer " + ct.getContext() + " " + ct );
}
public void engineState( ContextManager cm , int state )
throws TomcatException
{
log( "engineState " + state );
}
public void engineStart( ContextManager cm )
throws TomcatException
{
log( "engineStart " );
}
/** Called when a context is removed from a CM
*/
public void removeContext( ContextManager cm, Context ctx )
throws TomcatException
{
log( "removeContext" + ctx);
}
/** Servlet Init notification
*/
public void preServletInit( Context ctx, Handler sw )
throws TomcatException
{
log( "preServletInit " + ctx + " " + sw);
}
public void postServletInit( Context ctx, Handler sw )
throws TomcatException
{
log( "postServletInit " + ctx + " " + sw);
}
/** Servlet Destroy notification
*/
public void preServletDestroy( Context ctx, Handler sw )
throws TomcatException
{
log( "preServletDestroy " + ctx + " " + sw);
}
public void postServletDestroy( Context ctx, Handler sw )
throws TomcatException
{
log( "postServletDestroy " + ctx + " " + sw);
}
}
1.40 +10 -10
jakarta-tomcat/src/share/org/apache/tomcat/startup/EmbededTomcat.java
Index: EmbededTomcat.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/startup/EmbededTomcat.java,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -r1.39 -r1.40
--- EmbededTomcat.java 2000/12/29 01:34:42 1.39
+++ EmbededTomcat.java 2001/01/01 01:58:39 1.40
@@ -254,23 +254,23 @@
// no AutoSetup !
protected String moduleSet1[] = {
- "org.apache.tomcat.context.DefaultCMSetter",
+ "org.apache.tomcat.modules.config.DefaultCMSetter",
"org.apache.tomcat.facade.WebXmlReader",
- "org.apache.tomcat.context.PolicyInterceptor",
- "org.apache.tomcat.context.LoaderInterceptor12",
- "org.apache.tomcat.context.ErrorHandler",
+ "org.apache.tomcat.modules.config.PolicyInterceptor",
+ "org.apache.tomcat.modules.config.LoaderInterceptor12",
+ "org.apache.tomcat.modules.generators.ErrorHandler",
"org.apache.tomcat.modules.config.WorkDirSetup",
"org.apache.tomcat.modules.session.SessionId",
- "org.apache.tomcat.request.SimpleMapper1",
- "org.apache.tomcat.request.InvokerInterceptor",
+ "org.apache.tomcat.modules.mappers.SimpleMapper1",
+ "org.apache.tomcat.modules.generators.InvokerInterceptor",
"org.apache.tomcat.facade.JspInterceptor",
- "org.apache.tomcat.request.StaticInterceptor",
+ "org.apache.tomcat.modules.generators.StaticInterceptor",
"org.apache.tomcat.modules.session.SimpleSessionStore",
"org.apache.tomcat.facade.LoadOnStartupInterceptor",
"org.apache.tomcat.facade.Servlet22Interceptor",
- "org.apache.tomcat.request.AccessInterceptor",
- "org.apache.tomcat.request.CredentialsInterceptor",
- "org.apache.tomcat.request.Jdk12Interceptor"
+ "org.apache.tomcat.modules.aaa.AccessInterceptor",
+ "org.apache.tomcat.modules.aaa.CredentialsInterceptor",
+ "org.apache.tomcat.modules.mappers.Jdk12Interceptor"
};
protected String moduleSet2[] = {
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]