From e816bdd6386b5779a59c67a1343a710ab39f7f10 Mon Sep 17 00:00:00 2001 From: remm Date: Fri, 7 Jul 2006 22:40:04 +0000 Subject: [PATCH] - Add the base webapps and stuff, so they're there (not built yet). git-svn-id: https://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk@420006 13f79535-47bb-0310-9956-ffa450edef68 --- res/welcome.bin.html | 43 + res/welcome.main.html | 43 + webapps/docs/META-INF/context.xml | 12 + webapps/docs/WEB-INF/web.xml | 11 + webapps/docs/api/index.html | 17 + webapps/docs/appdev/build.xml.txt | 503 + webapps/docs/appdev/deployment.xml | 254 + webapps/docs/appdev/index.xml | 63 + webapps/docs/appdev/installation.xml | 89 + webapps/docs/appdev/introduction.xml | 84 + webapps/docs/appdev/processes.xml | 299 + webapps/docs/appdev/project.xml | 29 + webapps/docs/appdev/sample/docs/README.txt | 2 + webapps/docs/appdev/sample/index.html | 30 + webapps/docs/appdev/sample/sample.war | Bin 0 -> 7069 bytes .../docs/appdev/sample/src/mypackage/Hello.java | 95 + webapps/docs/appdev/sample/web/WEB-INF/web.xml | 23 + webapps/docs/appdev/sample/web/hello.jsp | 44 + webapps/docs/appdev/sample/web/images/tomcat.gif | Bin 0 -> 1441 bytes webapps/docs/appdev/sample/web/index.html | 28 + webapps/docs/appdev/source.xml | 306 + webapps/docs/appdev/web.xml.txt | 150 + webapps/docs/apr.xml | 331 + webapps/docs/architecture/index.xml | 53 + webapps/docs/architecture/overview.xml | 123 + webapps/docs/architecture/project.xml | 26 + webapps/docs/architecture/requestProcess.xml | 53 + .../architecture/requestProcess/requestProcess.pdf | Bin 0 -> 32424 bytes .../docs/architecture/requestProcess/roseModel.mdl | 12921 +++++++++++++++++++ webapps/docs/architecture/startup.xml | 57 + .../docs/architecture/startup/serverStartup.pdf | Bin 0 -> 46175 bytes .../docs/architecture/startup/serverStartup.txt | 136 + webapps/docs/balancer-howto.xml | 148 + webapps/docs/build.xml | 240 + webapps/docs/building.xml | 231 + webapps/docs/cgi-howto.xml | 76 + webapps/docs/changelog.xml | 2812 ++++ webapps/docs/class-loader-howto.xml | 271 + webapps/docs/cluster-howto.xml | 1129 ++ webapps/docs/config/ajp.xml | 297 + webapps/docs/config/context.xml | 778 ++ webapps/docs/config/engine.xml | 240 + webapps/docs/config/globalresources.xml | 254 + webapps/docs/config/host.xml | 542 + webapps/docs/config/http.xml | 473 + webapps/docs/config/index.xml | 71 + webapps/docs/config/loader.xml | 149 + webapps/docs/config/manager.xml | 459 + webapps/docs/config/project.xml | 46 + webapps/docs/config/realm.xml | 497 + webapps/docs/config/resources.xml | 100 + webapps/docs/config/server.xml | 97 + webapps/docs/config/service.xml | 91 + webapps/docs/config/valve.xml | 434 + webapps/docs/connectors.xml | 61 + webapps/docs/default-servlet.xml | 298 + webapps/docs/deployer-howto.xml | 330 + webapps/docs/developers.xml | 58 + webapps/docs/funcspecs/fs-admin-apps.xml | 278 + webapps/docs/funcspecs/fs-admin-objects.xml | 481 + webapps/docs/funcspecs/fs-admin-opers.xml | 324 + webapps/docs/funcspecs/fs-default.xml | 252 + webapps/docs/funcspecs/fs-invoker.xml | 247 + webapps/docs/funcspecs/fs-jdbc-realm.xml | 248 + webapps/docs/funcspecs/fs-jndi-realm.xml | 403 + webapps/docs/funcspecs/fs-memory-realm.xml | 239 + webapps/docs/funcspecs/index.xml | 54 + webapps/docs/funcspecs/mbean-names.xml | 870 ++ webapps/docs/funcspecs/project.xml | 39 + webapps/docs/html-manager-howto.xml | 543 + webapps/docs/images/add.gif | Bin 0 -> 1037 bytes webapps/docs/images/asf-logo.gif | Bin 0 -> 7279 bytes webapps/docs/images/code.gif | Bin 0 -> 394 bytes webapps/docs/images/design.gif | Bin 0 -> 608 bytes webapps/docs/images/docs.gif | Bin 0 -> 261 bytes webapps/docs/images/fix.gif | Bin 0 -> 345 bytes webapps/docs/images/printer.gif | Bin 0 -> 438 bytes webapps/docs/images/tomcat.gif | Bin 0 -> 1934 bytes webapps/docs/images/tomcat.svg | 573 + webapps/docs/images/update.gif | Bin 0 -> 627 bytes webapps/docs/images/void.gif | Bin 0 -> 43 bytes webapps/docs/index.xml | 173 + webapps/docs/introduction.xml | 130 + webapps/docs/jasper-howto.xml | 345 + webapps/docs/jndi-datasource-examples-howto.xml | 655 + webapps/docs/jndi-resources-howto.xml | 765 ++ webapps/docs/logging.xml | 272 + webapps/docs/manager-howto.xml | 1295 ++ webapps/docs/mbeans-descriptor-howto.xml | 63 + webapps/docs/monitoring.xml | 1137 ++ webapps/docs/project.xml | 72 + webapps/docs/proxy-howto.xml | 136 + webapps/docs/realm-howto.xml | 1422 ++ webapps/docs/security-manager-howto.xml | 383 + webapps/docs/setup.xml | 135 + webapps/docs/ssi-howto.xml | 373 + webapps/docs/ssl-howto.xml | 539 + webapps/docs/status.xml | 123 + webapps/docs/tomcat-docs.xsl | 436 + webapps/docs/windows-service-howto.xml | 352 + webapps/host-manager/WEB-INF/web.xml | 95 + webapps/host-manager/host-manager.xml | 13 + webapps/host-manager/images/add.gif | Bin 0 -> 1037 bytes webapps/host-manager/images/asf-logo.gif | Bin 0 -> 7279 bytes webapps/host-manager/images/code.gif | Bin 0 -> 394 bytes webapps/host-manager/images/design.gif | Bin 0 -> 608 bytes webapps/host-manager/images/docs.gif | Bin 0 -> 261 bytes webapps/host-manager/images/fix.gif | Bin 0 -> 345 bytes webapps/host-manager/images/tomcat.gif | Bin 0 -> 1934 bytes webapps/host-manager/images/update.gif | Bin 0 -> 627 bytes webapps/host-manager/images/void.gif | Bin 0 -> 43 bytes webapps/host-manager/manager.xml | 13 + webapps/manager/WEB-INF/web.xml | 186 + webapps/manager/images/add.gif | Bin 0 -> 1037 bytes webapps/manager/images/asf-logo.gif | Bin 0 -> 7279 bytes webapps/manager/images/code.gif | Bin 0 -> 394 bytes webapps/manager/images/design.gif | Bin 0 -> 608 bytes webapps/manager/images/docs.gif | Bin 0 -> 261 bytes webapps/manager/images/fix.gif | Bin 0 -> 345 bytes webapps/manager/images/tomcat.gif | Bin 0 -> 1934 bytes webapps/manager/images/update.gif | Bin 0 -> 627 bytes webapps/manager/images/void.gif | Bin 0 -> 43 bytes webapps/manager/manager.xml | 17 + webapps/manager/status.xsd | 63 + webapps/manager/xform.xsl | 96 + 125 files changed, 39847 insertions(+) create mode 100644 res/welcome.bin.html create mode 100644 res/welcome.main.html create mode 100644 webapps/docs/META-INF/context.xml create mode 100644 webapps/docs/WEB-INF/web.xml create mode 100644 webapps/docs/api/index.html create mode 100644 webapps/docs/appdev/build.xml.txt create mode 100644 webapps/docs/appdev/deployment.xml create mode 100644 webapps/docs/appdev/index.xml create mode 100644 webapps/docs/appdev/installation.xml create mode 100644 webapps/docs/appdev/introduction.xml create mode 100644 webapps/docs/appdev/processes.xml create mode 100644 webapps/docs/appdev/project.xml create mode 100644 webapps/docs/appdev/sample/docs/README.txt create mode 100644 webapps/docs/appdev/sample/index.html create mode 100644 webapps/docs/appdev/sample/sample.war create mode 100644 webapps/docs/appdev/sample/src/mypackage/Hello.java create mode 100644 webapps/docs/appdev/sample/web/WEB-INF/web.xml create mode 100644 webapps/docs/appdev/sample/web/hello.jsp create mode 100644 webapps/docs/appdev/sample/web/images/tomcat.gif create mode 100644 webapps/docs/appdev/sample/web/index.html create mode 100644 webapps/docs/appdev/source.xml create mode 100644 webapps/docs/appdev/web.xml.txt create mode 100644 webapps/docs/apr.xml create mode 100644 webapps/docs/architecture/index.xml create mode 100644 webapps/docs/architecture/overview.xml create mode 100644 webapps/docs/architecture/project.xml create mode 100644 webapps/docs/architecture/requestProcess.xml create mode 100644 webapps/docs/architecture/requestProcess/requestProcess.pdf create mode 100644 webapps/docs/architecture/requestProcess/roseModel.mdl create mode 100644 webapps/docs/architecture/startup.xml create mode 100644 webapps/docs/architecture/startup/serverStartup.pdf create mode 100644 webapps/docs/architecture/startup/serverStartup.txt create mode 100644 webapps/docs/balancer-howto.xml create mode 100644 webapps/docs/build.xml create mode 100644 webapps/docs/building.xml create mode 100644 webapps/docs/cgi-howto.xml create mode 100644 webapps/docs/changelog.xml create mode 100644 webapps/docs/class-loader-howto.xml create mode 100644 webapps/docs/cluster-howto.xml create mode 100644 webapps/docs/config/ajp.xml create mode 100644 webapps/docs/config/context.xml create mode 100644 webapps/docs/config/engine.xml create mode 100644 webapps/docs/config/globalresources.xml create mode 100644 webapps/docs/config/host.xml create mode 100644 webapps/docs/config/http.xml create mode 100644 webapps/docs/config/index.xml create mode 100644 webapps/docs/config/loader.xml create mode 100644 webapps/docs/config/manager.xml create mode 100644 webapps/docs/config/project.xml create mode 100644 webapps/docs/config/realm.xml create mode 100644 webapps/docs/config/resources.xml create mode 100644 webapps/docs/config/server.xml create mode 100644 webapps/docs/config/service.xml create mode 100644 webapps/docs/config/valve.xml create mode 100644 webapps/docs/connectors.xml create mode 100644 webapps/docs/default-servlet.xml create mode 100644 webapps/docs/deployer-howto.xml create mode 100644 webapps/docs/developers.xml create mode 100644 webapps/docs/funcspecs/fs-admin-apps.xml create mode 100644 webapps/docs/funcspecs/fs-admin-objects.xml create mode 100644 webapps/docs/funcspecs/fs-admin-opers.xml create mode 100644 webapps/docs/funcspecs/fs-default.xml create mode 100644 webapps/docs/funcspecs/fs-invoker.xml create mode 100644 webapps/docs/funcspecs/fs-jdbc-realm.xml create mode 100644 webapps/docs/funcspecs/fs-jndi-realm.xml create mode 100644 webapps/docs/funcspecs/fs-memory-realm.xml create mode 100644 webapps/docs/funcspecs/index.xml create mode 100644 webapps/docs/funcspecs/mbean-names.xml create mode 100644 webapps/docs/funcspecs/project.xml create mode 100644 webapps/docs/html-manager-howto.xml create mode 100644 webapps/docs/images/add.gif create mode 100644 webapps/docs/images/asf-logo.gif create mode 100644 webapps/docs/images/code.gif create mode 100644 webapps/docs/images/design.gif create mode 100644 webapps/docs/images/docs.gif create mode 100644 webapps/docs/images/fix.gif create mode 100644 webapps/docs/images/printer.gif create mode 100644 webapps/docs/images/tomcat.gif create mode 100644 webapps/docs/images/tomcat.svg create mode 100644 webapps/docs/images/update.gif create mode 100644 webapps/docs/images/void.gif create mode 100644 webapps/docs/index.xml create mode 100644 webapps/docs/introduction.xml create mode 100644 webapps/docs/jasper-howto.xml create mode 100644 webapps/docs/jndi-datasource-examples-howto.xml create mode 100644 webapps/docs/jndi-resources-howto.xml create mode 100644 webapps/docs/logging.xml create mode 100644 webapps/docs/manager-howto.xml create mode 100644 webapps/docs/mbeans-descriptor-howto.xml create mode 100644 webapps/docs/monitoring.xml create mode 100644 webapps/docs/project.xml create mode 100644 webapps/docs/proxy-howto.xml create mode 100644 webapps/docs/realm-howto.xml create mode 100644 webapps/docs/security-manager-howto.xml create mode 100644 webapps/docs/setup.xml create mode 100644 webapps/docs/ssi-howto.xml create mode 100644 webapps/docs/ssl-howto.xml create mode 100644 webapps/docs/status.xml create mode 100644 webapps/docs/tomcat-docs.xsl create mode 100644 webapps/docs/windows-service-howto.xml create mode 100644 webapps/host-manager/WEB-INF/web.xml create mode 100644 webapps/host-manager/host-manager.xml create mode 100644 webapps/host-manager/images/add.gif create mode 100644 webapps/host-manager/images/asf-logo.gif create mode 100644 webapps/host-manager/images/code.gif create mode 100644 webapps/host-manager/images/design.gif create mode 100644 webapps/host-manager/images/docs.gif create mode 100644 webapps/host-manager/images/fix.gif create mode 100644 webapps/host-manager/images/tomcat.gif create mode 100644 webapps/host-manager/images/update.gif create mode 100644 webapps/host-manager/images/void.gif create mode 100644 webapps/host-manager/manager.xml create mode 100644 webapps/manager/WEB-INF/web.xml create mode 100644 webapps/manager/images/add.gif create mode 100644 webapps/manager/images/asf-logo.gif create mode 100644 webapps/manager/images/code.gif create mode 100644 webapps/manager/images/design.gif create mode 100644 webapps/manager/images/docs.gif create mode 100644 webapps/manager/images/fix.gif create mode 100644 webapps/manager/images/tomcat.gif create mode 100644 webapps/manager/images/update.gif create mode 100644 webapps/manager/images/void.gif create mode 100644 webapps/manager/manager.xml create mode 100644 webapps/manager/status.xsd create mode 100644 webapps/manager/xform.xsl diff --git a/res/welcome.bin.html b/res/welcome.bin.html new file mode 100644 index 000000000..5e5c8caf5 --- /dev/null +++ b/res/welcome.bin.html @@ -0,0 +1,43 @@ + +Apache Tomcat @VERSION@ + + + +

+

Apache Tomcat @VERSION@

+

+

Useful references: +

+

+ +

NOTE: The tar files in this distribution use GNU tar extensions, +and must be untarred with a GNU compatible version of tar. The version +of tar on Solaris and Mac OS X will not work with +these files.

+ +

Tomcat 5.5 requires JRE 5.0 by default. Read the +RELEASE-NOTES and the RUNNING.txt file in the distribution for more details. +

+ +

Packaging Details (or "What Should I Download?") +

+

+ +

Thank you for using Tomcat!. +

+

The Apache Tomcat Project
http://tomcat.apache.org/

+

+

diff --git a/res/welcome.main.html b/res/welcome.main.html new file mode 100644 index 000000000..254349080 --- /dev/null +++ b/res/welcome.main.html @@ -0,0 +1,43 @@ + +Apache Tomcat @VERSION@ + + + +

+

Apache Tomcat @VERSION@

+

+

Useful references: +

+

+ +

NOTE: The tar files in this distribution use GNU tar extensions, +and must be untarred with a GNU compatible version of tar. The version +of tar on Solaris and Mac OS X will not work with +these files.

+ +

Tomcat 5.5 requires JRE 5.0 by default. Read the +RELEASE-NOTES and the RUNNING.txt file in the distribution for more details. +

+ +

Packaging Details (or "What Should I Download?") +

+

+ +

Thank you for using Tomcat!. +

+

The Apache Tomcat Project
http://tomcat.apache.org/

+

+

diff --git a/webapps/docs/META-INF/context.xml b/webapps/docs/META-INF/context.xml new file mode 100644 index 000000000..228184cb8 --- /dev/null +++ b/webapps/docs/META-INF/context.xml @@ -0,0 +1,12 @@ + + + + diff --git a/webapps/docs/WEB-INF/web.xml b/webapps/docs/WEB-INF/web.xml new file mode 100644 index 000000000..3cc537d35 --- /dev/null +++ b/webapps/docs/WEB-INF/web.xml @@ -0,0 +1,11 @@ + + + + Tomcat Documentation + + Tomcat Documentation. + + diff --git a/webapps/docs/api/index.html b/webapps/docs/api/index.html new file mode 100644 index 000000000..780a75a6a --- /dev/null +++ b/webapps/docs/api/index.html @@ -0,0 +1,17 @@ + + + + + API docs + + + + +Tomcat's internal javadoc is no longer installed by default. Download and install +the "fulldocs" package to get it. + +You can also access the javadoc online in the Tomcat +documentation bundle. + + + diff --git a/webapps/docs/appdev/build.xml.txt b/webapps/docs/appdev/build.xml.txt new file mode 100644 index 000000000..00d797719 --- /dev/null +++ b/webapps/docs/appdev/build.xml.txt @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapps/docs/appdev/deployment.xml b/webapps/docs/appdev/deployment.xml new file mode 100644 index 000000000..88024134d --- /dev/null +++ b/webapps/docs/appdev/deployment.xml @@ -0,0 +1,254 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Deployment + + + + + +
+ +

Before describing how to organize your source code directories, +it is useful to examine the runtime organization of a web application. +Prior to the Servlet API Specification, version 2.2, there was little +consistency between server platforms. However, servers that conform +to the 2.2 (or later) specification are required to accept a +Web Application Archive in a standard format, which is discussed +further below.

+ +

A web application is defined as a hierarchy of directories and files +in a standard layout. Such a hierarchy can be accessed in its "unpacked" +form, where each directory and file exists in the filesystem separately, +or in a "packed" form known as a Web ARchive, or WAR file. The former format +is more useful during development, while the latter is used when you +distribute your application to be installed.

+ +

The top-level directory of your web application hierarchy is also the +document root of your application. Here, you will place the HTML +files and JSP pages that comprise your application's user interface. When the +system administrator deploys your application into a particular server, he +or she assigns a context path to your application (a later section +of this manual describes deployment on Tomcat). Thus, if the +system administrator assigns your application to the context path +/catalog, then a request URI referring to +/catalog/index.html will retrieve the index.html +file from your document root.

+ +
+ + +
+ +

To facilitate creation of a Web Application Archive file in the required +format, it is convenient to arrange the "executable" files of your web +application (that is, the files that Tomcat actually uses when executing +your app) in the same organization as required by the WAR format itself. +To do this, you will end up with the following contents in your +application's "document root" directory:

+
    +
  • *.html, *.jsp, etc. - The HTML and JSP pages, along + with other files that must be visible to the client browser (such as + JavaScript, stylesheet files, and images) for your application. + In larger applications you may choose to divide these files into + a subdirectory hierarchy, but for smaller apps, it is generally + much simpler to maintain only a single directory for these files. +

  • +
  • /WEB-INF/web.xml - The Web Application Deployment + Descriptor for your application. This is an XML file describing + the servlets and other components that make up your application, + along with any initialization parameters and container-managed + security constraints that you want the server to enforce for you. + This file is discussed in more detail in the following subsection. +

  • +
  • /WEB-INF/classes/ - This directory contains any Java + class files (and associated resources) required for your application, + including both servlet and non-servlet classes, that are not combined + into JAR files. If your classes are organized into Java packages, + you must reflect this in the directory hierarchy under + /WEB-INF/classes/. For example, a Java class named + com.mycompany.mypackage.MyServlet + would need to be stored in a file named + /WEB-INF/classes/com/mycompany/mypackage/MyServlet.class. +

  • +
  • /WEB-INF/lib/ - This directory contains JAR files that + contain Java class files (and associated resources) required for your + application, such as third party class libraries or JDBC drivers.
  • +
+ +

When you install an application into Tomcat (or any other +2.2/2.3-compatible server), the classes in the WEB-INF/classes/ +directory, as well as all classes in JAR files found in the +WEB-INF/lib/ directory, are made visible to other classes +within your particular web application. Thus, if +you include all of the required library classes in one of these places (be +sure to check licenses for redistribution rights for any third party libraries +you utilize), you will simplify the installation of your web application -- +no adjustment to the system class path (or installation of global library +files in your server) will be necessary.

+ +

Much of this information was extracted from Chapter 9 of the Servlet +API Specification, version 2.3, which you should consult for more details.

+ +
+ + +
+ +

Like most servlet containers, Tomcat 5 also supports mechanisms to install +library JAR files (or unpacked classes) once, and make them visible to all +installed web applications (without having to be included inside the web +application itself. The details of how Tomcat locates and shares such +classes are described in the +Class Loader HOW-TO documentation. +For the purposes of our discussion, there are two locations that are commonly +used within a Tomcat 5 installation for shared code:

+
    +
  • $CATALINA_HOME/common/lib - JAR files placed here are + visible both to web applications and internal Tomcat code. This is a + good place to put JDBC drivers that are required for both your application + and internal Tomcat use (such as for a JDBCRealm). +

  • +
  • $CATALINA_HOME/shared/lib - JAR files placed here are + visible to all web applications, but not to internal Tomcat code. This + is the right place for shared libraries that are specific to your + application.

  • +
+ +

Out of the box, a standard Tomcat 5 installation includes a variety +of pre-installed shared library files, including:

+
    +
  • The Servlet 2.4 and JSP 2.0 APIs that are fundamental + to writing servlets and JavaServer Pages.

  • +
  • An XML Parser compliant with the JAXP (version 1.2) APIs, so + your application can perform DOM-based or SAX-based processing of + XML documents.

  • +
+ +
+ + +
+ +
+

The description below uses the variable name $CATALINA_HOME + to refer to the directory into which you have installed Tomcat 5, + and is the base directory against which most relative paths are + resolved. However, if you have configured Tomcat 5 for multiple + instances by setting a CATALINA_BASE directory, you should use + $CATALINA_BASE instead of $CATALINA_HOME for each of these + references.

+
+ +

As mentioned above, the /WEB-INF/web.xml file contains the +Web Application Deployment Descriptor for your application. As the filename +extension implies, this file is an XML document, and defines everything about +your application that a server needs to know (except the context path, +which is assigned by the system administrator when the application is +deployed).

+ +

The complete syntax and semantics for the deployment descriptor is defined +in Chapter 13 of the Servlet API Specification, version 2.3. Over time, it +is expected that development tools will be provided that create and edit the +deployment descriptor for you. In the meantime, to provide a starting point, +a basic web.xml file +is provided. This file includes comments that describe the purpose of each +included element.

+ +

NOTE - The Servlet Specification includes a Document +Type Descriptor (DTD) for the web application deployment descriptor, and +Tomcat 5 enforces the rules defined here when processing your application's +/WEB-INF/web.xml file. In particular, you must +enter your descriptor elements (such as <filter>, +<servlet>, and <servlet-mapping> in +the order defined by the DTD (see Section 13.3).

+ +
+ + +
+ +
+

The description below uses the variable name $CATALINA_HOME + to refer to the directory into which you have installed Tomcat 5, + and is the base directory against which most relative paths are + resolved. However, if you have configured Tomcat 5 for multiple + instances by setting a CATALINA_BASE directory, you should use + $CATALINA_BASE instead of $CATALINA_HOME for each of these + references.

+
+ +

A /META-INF/context.xml file can be used to define Tomcat specific +configuration options, such as loggers, data sources, session manager +configuration and more. This XML file must contain one Context element, which +will be considered as if it was the child of the Host element corresponding +to the Host to which the The Tomcat configuration documentation contains +information on the Context element.

+ +
+ + +
+ +

In order to be executed, a web application must be deployed on +a servlet container. This is true even during development. +We will describe using Tomcat 5 to provide the execution environment. +A web application can be deployed in Tomcat by one of the following +approaches:

+
    +
  • Copy unpacked directory hierarchy into a subdirectory in directory + $CATALINA_HOME/webapps/. Tomcat will assign a + context path to your application based on the subdirectory name you + choose. We will use this technique in the build.xml + file that we construct, because it is the quickest and easiest approach + during development. Be sure to restart Tomcat after installing or + updating your application. +

  • +
  • Copy the web application archive file into directory + $CATALINA_HOME/webapps/. When Tomcat is started, it will + automatically expand the web application archive file into its unpacked + form, and execute the application that way. This approach would typically + be used to install an additional application, provided by a third party + vendor or by your internal development staff, into an existing + Tomcat installation. NOTE - If you use this approach, + and wish to update your application later, you must both replace the + web application archive file AND delete the expanded + directory that Tomcat created, and then restart Tomcat, in order to reflect + your changes. +

  • +
  • Use the Tomcat 5 "Manager" web application to deploy and undeploy + web applications. Tomcat 5 includes a web application, deployed + by default on context path /manager, that allows you to + deploy and undeploy applications on a running Tomcat server without + restarting it. See the administrator documentation (TODO: hyperlink) + for more information on using the Manager web application.

  • +
  • Use "Manager" Ant Tasks In Your Build Script. Tomcat 5 + includes a set of custom task definitions for the Ant + build tool that allow you to automate the execution of commands to the + "Manager" web application. These tasks are used in the Tomcat deployer. +

  • +
  • Use the Tomcat Deployer. Tomcat 5 includes a packaged tool + bundling the Ant tasks, and can be used to automatically precompile JSPs + which are part of the web application before deployment to the server. +

  • +
+ +

Deploying your app on other servlet containers will be specific to each +container, but all containers compatible with the Servlet API Specification +(version 2.2 or later) are required to accept a web application archive file. +Note that other containers are NOT required to accept an +unpacked directory structure (as Tomcat does), or to provide mechanisms for +shared library files, but these features are commonly available.

+ +
+ + + +
diff --git a/webapps/docs/appdev/index.xml b/webapps/docs/appdev/index.xml new file mode 100644 index 000000000..359c5edb9 --- /dev/null +++ b/webapps/docs/appdev/index.xml @@ -0,0 +1,63 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Table of Contents + + + + + +
+ +

This manual includes contributions from many members of the Tomcat Project +developer community. The following authors have provided significant content: +

+ + +
+ + +
+ +

The information presented is divided into the following sections:

+
    +
  • Introduction - + Briefly describes the information covered here, with + links and references to other sources of information.
  • +
  • Installation - + Covers acquiring and installing the required software + components to use Tomcat for web application development.
  • +
  • Deployment Organization - + Discusses the standard directory layout for a web application + (defined in the Servlet API Specification), the Web Application + Deployment Descriptor, and options for integration with Tomcat + in your development environment.
  • +
  • Source Organization - + Describes a useful approach to organizing the source code + directories for your project, and introduces the + build.xml used by Ant to manage compilation.
  • +
  • Development Processes - + Provides brief descriptions of typical development processes + utilizing the recommended deployment and source organizations.
  • +
  • Example Application - + This directory contains a very simple, but functionally complete, + "Hello, World" application built according to the principles + described in this manual. You can use this application to + practice using the described techniques.
  • +
+ +
+ + + +
diff --git a/webapps/docs/appdev/installation.xml b/webapps/docs/appdev/installation.xml new file mode 100644 index 000000000..de9f9b5d6 --- /dev/null +++ b/webapps/docs/appdev/installation.xml @@ -0,0 +1,89 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Yoav Shapira + Installation + + + + + +
+ +

In order to use Tomcat 5 for developing web applications, you must first +install it (and the software it depends on). The required steps are outlined +in the following subsections.

+ + + +

Tomcat 5.5 was designed to run on J2SE 5.0, but it can run on JDK 1.4 +as well, using the compatability package as detailed in the Tomcat +installation instructions. +

+ +

Compatible JDKs for many platforms (or links to where they can be found) +are available at +http://java.sun.com/j2se/.

+ +
+ + + +

Binary downloads of the Tomcat server are available from +http://jakarta.apache.org/binindex.cgi. +This manual assumes you are using the most recent release +of Tomcat 5. Detailed instructions for downloading and installing +Tomcat 5 are available here.

+ +

In the remainder of this manual, example shell scripts assume that you have +set an environment variable CATALINA_HOME that contains the +pathname to the directory in which Tomcat 5 has been installed.

+ +
+ + + + +

Binary downloads of the Ant build tool are available from +http://ant.apache.org/bindownload.cgi. +This manual assumes you are using Ant 1.4 or later. The instructions should +also be compatible with later versions, but this has not been tested.

+ +

Download and install Ant from the distribution directory mentioned above. +Then, add the bin directory of the Ant distribution to your +PATH environment variable, following the standard practices for +your operating system platform. Once you have done this, you will be able to +execute the ant shell command directly.

+ +
+ + + + +

Besides the required tools described above, you are strongly encouraged +to download and install a source code control system, such as the +Concurrent Version System (CVS), to maintain historical +versions of the source files that make up your web application. Besides +the server, you will also need appropriate client +tools to check out source code files, and check in modified versions.

+ +

Detailed instructions for installing and using source code control +applications is beyond the scope of this manual. However, CVS server and +client tools for many platforms (along with documentation) can be downloaded +from http://www.cvshome.org.

+ +
+ + +
+ + + +
diff --git a/webapps/docs/appdev/introduction.xml b/webapps/docs/appdev/introduction.xml new file mode 100644 index 000000000..43b82b788 --- /dev/null +++ b/webapps/docs/appdev/introduction.xml @@ -0,0 +1,84 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Introduction + + + + + +
+ +

Congratulations! You've decided to (or been told to) learn how to +build web applications using servlets and JSP pages, and picked the +Tomcat server to use for your learning and development. But now what +do you do?

+ +

This manual is a primer covering the basic steps of using Tomcat to +set up a development environment, organize your source code, and then +build and test your application. It does not discuss architectures or +recommended coding practices for web application development, +or provide in depth instructions on operating the development +tools that are discussed. References to sources of additional information +are included in the following subsections.

+ +

The discussion in this manual is aimed at developers who will be using +a text editor along with command line tools to develop and debug their +applications. As such, the recommendations are fairly generic -- but you +should easily be able to apply them in either a Windows-based or Unix-based +development environment. If you are utilizing an Interactive Development +Environment (IDE) tool, you will need to adapt the advice given here to +the details of your particular environment.

+ +
+ + +
+ +

The following links provide access to selected sources of online +information, documentation, and software that is useful in developing +web applications with Tomcat.

+
    +
  • http://java.sun.com/products/jsp/download.html - + JavaServer Pages (JSP) Specfication, Version 2.0. Describes + the programming environment provided by standard implementations + of the JavaServer Pages (JSP) technology. In conjunction with + the Servlet API Specification (see below), this document describes + what a portable API page is allowed to contain. Specific + information on scripting (Chapter 6), tag extensions (Chapter 7), + and packaging JSP pages (Appendix A) is useful. The Javadoc + API Documentation is included in the specification, and with the + Tomcat download.

  • +
  • http://java.sun.com/products/servlet/download.html - + Servlet API Specification, Version 2.4. Describes the + programming environment that must be provided by all servlet + containers conforming to this specification. In particular, you + will need this document to understand the web application + directory structure and deployment file (Chapter 9), methods of + mapping request URIs to servlets (Chapter 11), container managed + security (Chapter 12), and the syntax of the web.xml + Web Application Deployment Descriptor (Chapter 13). The Javadoc + API Documentation is included in the specification, and with the + Tomcat download.

  • +
  • http://java.sun.com/j2ee/blueprints/ - + Sun BluePrints (tm) Design Guidelines for J2EE. Comprehensive + advice and examples on application design for the Java2 Enterprise + Edition (J2EE) platform, which includes servlets and JSP pages. The + chapters on servlet and JSP design are useful even when your application + does not require other J2EE platform components. +

  • +
  • TODO -- Add more entries here!
  • +
+ +
+ + + +
diff --git a/webapps/docs/appdev/processes.xml b/webapps/docs/appdev/processes.xml new file mode 100644 index 000000000..e11494eb6 --- /dev/null +++ b/webapps/docs/appdev/processes.xml @@ -0,0 +1,299 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Development Processes + + + + + +
+ +

Although application development can take many forms, this manual proposes +a fairly generic process for creating web applications using Tomcat. The +following sections highlight the commands and tasks that you, as the developer +of the code, will perform. The same basic approach works when you have +multiple programmers involved, as long as you have an appropriate source code +control system and internal team rules about who is working on what parts +of the application at any given time.

+ +

The task descriptions below assume that you will be using CVS for source +code control, and that you have already configured access to the appropriate +CVS repository. Instructions for doing this are beyond the scope of this +manual. If you are using a different source code control environment, you +will need to figure out the corresponding commands for your system.

+ + + + +

In order to take advantage of the special Ant tasks that interact with the +Manager web application, you need to perform the following tasks +once (no matter how many web applications you plan to develop).

+
    +
  • Configure the Ant custom tasks. The implementation code for the + Ant custom tasks is in a JAR file named + $CATALINA_HOME/server/lib/catalina-ant.jar, which must be + copied in to the lib directory of your Ant installation. +

  • +
  • Define one or more Tomcat users. The Manager web + application runs under a security constraint that requires a user to be + logged in, and have the security role manager assigned to + him or her. How such users are defined depends on which Realm you have + configured in Tomcat's conf/server.xml file -- see the + Realm Configuration HOW-TO for more + information. You may define any number of users (with any username + and password that you like) with the manager role. +

  • +
+ +
+ + + + +

The first step is to create a new project source directory, and customize +the build.xml and build.properties files you will +be using. The directory structure is described in the +previous section, or you can use the +sample application as a starting point.

+ +

Create your project source directory, and define it within your CVS +repository. This might be done by a series of commands like this, where +{project} is the name under which your project should be +stored in the CVS repository, and {username} is your login username:

+ +cd {my home directory} +mkdir myapp <-- Assumed "project source directory" +cd myapp +mkdir docs +mkdir src +mkdir web +mkdir web/WEB-INF +cvs import -m "Initial Project Creation" {project} \ + {username} start + + +

Now, to verify that it was created correctly in CVS, we will perform a +checkout of the new project:

+ +cd .. +mv myapp myapp.bu +cvs checkout {project} + + +

Next, you will need to create and check in an initial version of the +build.xml script to be used for development. For getting +started quickly and easily, base your build.xml on the +basic build.xml file, included with this manual, +or code it from scratch.

+ +cd {my home directory} +cd myapp +emacs build.xml <-- if you want a real editor :-) +cvs add build.xml +cvs commit + + +

Until you perform the CVS commit, your changes are local to your own +development directory. Committing makes those changes visible to other +developers on your team that are sharing the same CVS repository.

+ +

The next step is to customize the Ant properties that are +named in the build.xml script. This is done by creating a +file named build.properties in your project's top-level +directory. The supported properties are listed in the comments inside +the sample build.xml script. At a minimum, you will generally +need to define the catalina.home property defining where +Tomcat 5 is installed, and the manager application username and password. +You might end up with something like this:

+ +# Context path to install this application on +app.path=/hello + +# Tomcat 5 installation directory +catalina.home=/usr/local/jakarta-tomcat-5.0 + +# Manager webapp username and password +manager.username=myusername +manager.password=mypassword + + +

In general, you will not want to check the +build.properties file in to the CVS repository, because it +is unique to each developer's environment.

+ +

Now, create the initial version of the web application deployment +descriptor. You can base web.xml on the +basic web.xml file, or code it from scratch.

+ +cd {my home directory} +cd myapp/web/WEB-INF +emacs web.xml +cvs add web.xml +cvs commit + + +Note that this is only an example web.xml file. The full definition +of the deployment descriptor file is in the +Servlet Specification. + +
+ + + + +

The edit/build/test tasks will generally be your most common activities +during development and maintenance. The following general principles apply. +As described in Source Organization, newly created +source files should be located in the appropriate subdirectory, under your +project source directory.

+ +

Whenever you wish to refresh your development directory to reflect the +work performed by other developers, you will ask CVS to do it for you:

+ +cd {my home directory} +cd myapp +cvs update -dP + + +

To create a new file, go to the appropriate directory, create the file, +and register it with CVS. When you are satisfied with it's contents (after +building and testing is successful), commit the new file to the repository. +For example, to create a new JSP page:

+ +cd {my home directory} +cd myapp/web <-- Ultimate destination is document root +emacs mypage.jsp +cvs add mypage.jsp +... build and test the application ... +cvs commit + + +

Java source code that is defined in packages must be organized in a +directory hierarchy (under the src/ subdirectory) that +matches the package names. For example, a Java class named +com.mycompany.mypackage.MyClass.java should be stored in file +src/com/mycompany/mypackage/MyClass.java. +Whenever you create a new subdirectory, don't forget to +register it with CVS.

+ +

To edit an existing source file, you will generally just start editing +and testing, then commit the changed file when everything works. Although +CVS can be configured to required you to "check out" or "lock" a file you +are going to be modifying, this is generally not used.

+ +
+ + + + +

When you are ready to compile the application, issue the following +commands (generally, you will want a shell window open that is set to +the project source directory, so that only the last command is needed):

+ +cd {my home directory} +cd myapp <-- Normally leave a window open here +ant + + +

The Ant tool will be execute the default "compile" target in your +build.xml file, which will compile any new or updated Java +code. If this is the first time you compile after a "build clean", +it will cause everything to be recompiled.

+ +

To force the recompilation of your entire application, do this instead:

+ +cd {my home directory} +cd myapp +ant all + + +

This is a very good habit immediately before checking in changes, to +make sure that you have not introduced any subtle problems that Javac's +conditional checking did not catch.

+ +
+ + + + +

To test your application, you will want to install it under Tomcat. The +quickest way to do that is to use the custom Ant tasks that are included in +the sample build.xml script. Using these commands might follow +a pattern like this:

+
    +
  • Start Tomcat 5 if needed. If Tomcat 5 is not already running, + you will need to start it in the usual way. +

  • +
  • Compile your application. Use the ant compile + command (or just ant, since this is the default). Make + sure that there are no compilation errors. +

  • +
  • Install the application. Use the ant install + command. This tells Tomcat to immediately start running your app on + the context path defined in the app.path build property. + Tomcat does NOT have to be restarted for this to + take effect.

  • +
  • Test the application. Using your browser or other testing + tools, test the functionality of your application. +

  • +
  • Modify and rebuild as needed. As you discover that changes + are required, make those changes in the original source + files, not in the output build directory, and re-issue the + ant compile command. This ensures that your changes will + be available to be saved (via cvs commit) later on -- + the output build directory is deleted and recreated as necessary. +

  • +
  • Reload the application. Tomcat will recognize changes in + JSP pages automatically, but it will continue to use the old versions + of any servlet or JavaBean classes until the application is reloaded. + You can trigger this by executing the ant reload command. +

  • +
  • Remove the application when you re done. When you are through + working on this application, you can remove it from live execution by + running the ant remove command.
  • +
+ +

Do not forget to commit your changes to the source code repository when +you have completed your testing!

+ +
+ + + + +

When you are through adding new functionality, and you've tested everything +(you DO test, don't you :-), it is time to create the distributable version +of your web application that can be deployed on the production server. The +following general steps are required:

+
    +
  • Issue the command ant all from the project source + directory, to rebuild everything from scratch one last time. +

  • +
  • Use the cvs tag command to create an identifier for + all of the source files utilized to create this release. This allows + you to reliably reconstruct a release (from sources) at a later + time.
  • +
  • Issue the command ant dist to create a distributable + web application archive (WAR) file, as well as a JAR file containing + the corresponding source code. +

  • +
  • Package the contents of the dist directory using the + tar or zip utility, according to + the standard release procedures used by your organization.
  • +
+ +
+ + +
+ + +
diff --git a/webapps/docs/appdev/project.xml b/webapps/docs/appdev/project.xml new file mode 100644 index 000000000..7ce8b2487 --- /dev/null +++ b/webapps/docs/appdev/project.xml @@ -0,0 +1,29 @@ + + + + Application Developer's Guide + + + The Tomcat Servlet/JSP Container + + + + + + + + + + + + + + + + + + + + + diff --git a/webapps/docs/appdev/sample/docs/README.txt b/webapps/docs/appdev/sample/docs/README.txt new file mode 100644 index 000000000..641c989a0 --- /dev/null +++ b/webapps/docs/appdev/sample/docs/README.txt @@ -0,0 +1,2 @@ +This is a dummy README file for the sample +web application. diff --git a/webapps/docs/appdev/sample/index.html b/webapps/docs/appdev/sample/index.html new file mode 100644 index 000000000..582c9702a --- /dev/null +++ b/webapps/docs/appdev/sample/index.html @@ -0,0 +1,30 @@ + + + +Sample Application + + +

Sample Application

+

+ The example app has been packaged as a war file and can be downloaded + here (Note: make sure your browser doesn't + change file extension or append a new one). +

+

+ The easiest way to run this application is simply to move the war file + to your CATALINA_HOME/webapps directory. Tomcat will automatically + expand and deploy the application for you. You can view it with the + following URL (assuming that you're running tomcat on port 8080 + as is the default): +
+ http://localhost:8080/sample +

+

+ If you just want to browse the code you can unpack the war file + with the jar command. + + jar -xvf sample.war + +

+ + \ No newline at end of file diff --git a/webapps/docs/appdev/sample/sample.war b/webapps/docs/appdev/sample/sample.war new file mode 100644 index 0000000000000000000000000000000000000000..f43f6c05d285a95980520ca0c1bdd4d86025be17 GIT binary patch literal 7069 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 + */ + +public final class Hello extends HttpServlet { + + + /** + * Respond to a GET request for the content produced by + * this servlet. + * + * @param request The servlet request we are processing + * @param response The servlet response we are producing + * + * @exception IOException if an input/output error occurs + * @exception ServletException if a servlet error occurs + */ + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException { + + response.setContentType("text/html"); + PrintWriter writer = response.getWriter(); + + writer.println(""); + writer.println(""); + writer.println("Sample Application Servlet Page"); + writer.println(""); + writer.println(""); + + writer.println(""); + writer.println(""); + writer.println(""); + writer.println(""); + writer.println(""); + writer.println("
"); + writer.println(""); + writer.println(""); + writer.println("

Sample Application Servlet

"); + writer.println("This is the output of a servlet that is part of"); + writer.println("the Hello, World application. It displays the"); + writer.println("request headers from the request we are currently"); + writer.println("processing."); + writer.println("
"); + + writer.println(""); + Enumeration names = request.getHeaderNames(); + while (names.hasMoreElements()) { + String name = (String) names.nextElement(); + writer.println(""); + writer.println(" "); + writer.println(" "); + writer.println(""); + } + writer.println("
" + name + ":" + request.getHeader(name) + "
"); + + writer.println(""); + writer.println(""); + + } + + +} diff --git a/webapps/docs/appdev/sample/web/WEB-INF/web.xml b/webapps/docs/appdev/sample/web/WEB-INF/web.xml new file mode 100644 index 000000000..95e2974d4 --- /dev/null +++ b/webapps/docs/appdev/sample/web/WEB-INF/web.xml @@ -0,0 +1,23 @@ + + + + Hello, World Application + + This is a simple web application with a source code organization + based on the recommendations of the Application Developer's Guide. + + + + HelloServlet + mypackage.Hello + + + + HelloServlet + /hello + + + diff --git a/webapps/docs/appdev/sample/web/hello.jsp b/webapps/docs/appdev/sample/web/hello.jsp new file mode 100644 index 000000000..bf5957c5b --- /dev/null +++ b/webapps/docs/appdev/sample/web/hello.jsp @@ -0,0 +1,44 @@ + + +Sample Application JSP Page + + + + + + + + +
+ + +

Sample Application JSP Page

+This is the output of a JSP page that is part of the Hello, World +application. It displays several useful values from the request +we are currently processing. +
+ + + + + + + + + + + + + + + + + + + + + + +
Context Path:<%= request.getContextPath() %>
Path Information:<%= request.getPathInfo() %>
Query String:<%= request.getQueryString() %>
Request Method:<%= request.getMethod() %>
Servlet Path:<%= request.getServletPath() %>
+ + diff --git a/webapps/docs/appdev/sample/web/images/tomcat.gif b/webapps/docs/appdev/sample/web/images/tomcat.gif new file mode 100644 index 0000000000000000000000000000000000000000..32f7d809fbf745e814598cae44329394515c4879 GIT binary patch literal 1441 zcmV;S1z!3`Nk%w1VPpVD0J8u9?d|O+B_HU@b7@o+r;}NBZdk3YtNkgMYcdmxvLDB z3k3wE&!9rlKuzGPY8;a- zBi9R*frQ3fG0HGx<2Ev@GR53BXC{m%G)VNLfCm<(3@d!93@{LZo_h$0rKE)ez={AR zgN!_u;fgt_k*ub?wkzoZv`}`Ys26raPFHm$%%BQT?K!Jd*G5{=2gTkKm85a{lvhHM zq%hB6VYfiyxgkqU9BLfq5RU* z2xlq)4&Xs{t#U;v$CFDj&NmWlD78X3I~6kLRd#bsr!75?4-CS74p59TK!KLf(JWu{ zs2v*S6ek^IHWKo4`3Crh2n(HYAT;)8-4N!?Qv zNbi9l1PcSqNrRkkR)i&s4h%q4MFf=5oO?=aIRu&^c=rJw0k{aKqKI;+K%I56kbr3( zT^9|EFF~oypO-Kx)_@a?poNQXGV3h=heLGfTx2gvE6D=$^|mAimqz*Qx6i`q0EiqZ zX{>b0T!2TWRdNdMyA7Df-B5uH!I}}iQP5DR3&J@iyZ|@QpsyT3VN?@)6_TL?|JvGb zsR2JbFnZ>Em8}t9itts#&O#Tl#4NP8&A=BMaR>)2aO~^~Du2x3z~t)k)w%Hy0Wb|N zf17BMQk3jS7A-St-iA4YT*F$sb-+w3wCY?#(cjA3oB($E+yrXkHtlSK1V9}%g5$L? z4jxm=8#ISec@1urM2z!T!(E(>UmR+KtH75H9xTQonZA6CVvE^3jNEGf8?Dt{4bgYM zB8}xx0fgr)FOFfvw|E2Nu^`I-E1+OfSsnpQ6FIyCXB@^}X!r0#Q?Ha1Tqt*iKKj-* zbZu`Hd;Pnc4;4Jdc?Pd1&`RjkM63YE4c>dh0Ym&NF1B{PqBjP@eV!ELIakRle2Onf z!}iJE#RJVc2-}0!;N}Fr2?j5C`v(gnatq2yDd;Sm3ncK%`!KwXpTQ?+TmTTKffX(5 zeh_;T4ald1=DBZMCtzJt5WE%0q#&l0rBXp38ywnN(Lc7mOyr?ig~*8{&%esThK=OkAph3=niSAp+oHso + +Sample "Hello, World" Application + + + + + + + + +
+ + +

Sample "Hello, World" Application

+

This is the home page for a sample application used to illustrate the +source directory organization of a web application utilizing the principles +outlined in the Application Developer's Guide. +

+ +

To prove that they work, you can execute either of the following links: +

+ + + diff --git a/webapps/docs/appdev/source.xml b/webapps/docs/appdev/source.xml new file mode 100644 index 000000000..84e5730c4 --- /dev/null +++ b/webapps/docs/appdev/source.xml @@ -0,0 +1,306 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Source Organization + + + + + +
+ +
+

The description below uses the variable name $CATALINA_HOME + to refer to the directory into which you have installed Tomcat 5, + and is the base directory against which most relative paths are + resolved. However, if you have configured Tomcat 5 for multiple + instances by setting a CATALINA_BASE directory, you should use + $CATALINA_BASE instead of $CATALINA_HOME for each of these + references.

+
+ +

A key recommendation of this manual is to separate the directory +hierarchy containing your source code (described in this section) from +the directory hierarchy containing your deployable application +(described in the preceding section). Maintaining this separation has +the following advantages:

+
    +
  • The contents of the source directories can be more easily administered, + moved, and backed up if the "executable" version of the application + is not intermixed. +

  • +
  • Source code control is easier to manage on directories that contain + only source files. +

  • +
  • The files that make up an installable distribution of your + application are much easier to select when the deployment + hierarchy is separate.
  • +
+ +

As we will see, the ant development tool makes the creation +and processing of such directory hierarchies nearly painless.

+ +

The actual directory and file hierarchy used to contain the source code +of an application can be pretty much anything you like. However, the +following organization has proven to be quite generally applicable, and is +expected by the example build.xml configuration file that +is discussed below. All of these components exist under a top level +project source directory for your application:

+
    +
  • docs/ - Documentation for your application, in whatever + format your development team is using.

  • +
  • src/ - Java source files that generate the servlets, + beans, and other Java classes that are unique to your application. + If your source code is organized in packages (highly + recommended), the package hierarchy should be reflected as a directory + structure underneath this directory.

  • +
  • web/ - The static content of your web site (HTML pages, + JSP pages, JavaScript files, CSS stylesheet files, and images) that will + be accessible to application clients. This directory will be the + document root of your web application, and any subdirectory + structure found here will be reflected in the request URIs required to + access those files.

  • +
  • web/WEB-INF/ - The special configuration files required + for your application, including the web application deployment descriptor + (web.xml, defined in the + Servlet Specification), + tag library descriptors for custom tag libraries + you have created, and other resource files you wish to include within + your web application. Even though this directory appears to be a + subdirectory of your document root, the Servlet Specification + prohibits serving the contents of this directory (or any file it contains) + directly to a client request. Therefore, this is a good place to store + configuration information that is sensitive (such as database connection + usernames and passwords), but is required for your application to + operate successfully.
  • +
+ +

During the development process, two additional directories will be +created on a temporary basis:

+
    +
  • build/ - When you execute a default build + (ant), this directory will contain an exact image + of the files in the web application archive for this application. + Tomcat 5 allows you to deploy an application in an unpacked + directory like this, either by copying it to the + $CATALINA_HOME/webapps directory, or by installing + it via the "Manager" web application. The latter approach is very + useful during development, and will be illustrated below. +

  • +
  • dist/ - When you execute the ant dist + target, this directory will be created. It will create an exact image + of the binary distribution for your web application, including an license + information, documentation, and README files that you have prepared.
  • +
+ +

Note that these two directories should NOT be archived in +your source code control system, because they are deleted and recreated (from +scratch) as needed during development. For that reason, you should not edit +any source files in these directories if you want to maintain a permanent +record of the changes, because the changes will be lost the next time that a +build is performed.

+ + + +

What do you do if your application requires JAR files (or other + resources) from external projects or packages? A common example is that + you need to include a JDBC driver in your web application, in order to + operate.

+ +

Different developers take different approaches to this problem. + Some will encourage checking a copy of the JAR files you depend on into + the source code control archives for every application that requires those + JAR files. However, this can cause significant management issues when you + use the same JAR in many applications - particular when faced with a need + to upgrade to a different version of that JAR file.

+ +

Therefore, this manual recommends that you NOT store + a copy of the packages you depend on inside the source control archives + of your applications. Instead, the external dependencies should be + integrated as part of the process of building your + application. In that way, you can always pick up the appropriate version + of the JAR files from wherever your development system administrator has + installed them, without having to worry about updating your application + every time the version of the dependent JAR file is changed.

+ +

In the example Ant build.xml file, we will demonstrate + how to define build properties that let you configure the locations + of the files to be copied, without having to modify build.xml + when these files change. The build properties used by a particular + developer can be customized on a per-application basis, or defaulted to + "standard" build properties stored in the developer's home directory.

+ +

In many cases, your development system administrator will have already + installed the required JAR files into Tomcat 5's common/lib + or shared/lib directories. If this has been done, you need + to take no actions at all - the example build.xml file + automatically constructs a compile classpath that includes these files.

+ +
+ +
+ + +
+ +

As mentioned earlier, it is highly recommended that you place all of the +source files that comprise your application under the management of a +source code control system like the Concurrent Version System (CVS). If you +elect to do this, every directory and file in the source hierarchy should be +registered and saved -- but none of the generated files. If you register +binary format files (such as images or JAR libraries), be sure to indicate +this to your source code control system.

+ +

We recommended (in the previous section) that you should not store the +contents of the build/ and dist/ directories +created by your development process in the source code control system. An +easy way to tell CVS to ignore these directories is to create a file named +.cvsignore (note the leading period) in your top-level source +directory, with the following contents:

+ +build +dist +build.properties + + +

The reason for mentioning build.properties here will be +explained in the Processes section.

+ +

Detailed instructions for your source code control environment are beyond +the scope of this manual. However, the following steps are followed when +using a command-line CVS client:

+
    +
  • To refresh the state of your source code to that stored in the + the source repository, go to your project source directory, and + execute cvs update -dP. +

  • +
  • When you create a new subdirectory in the source code hierarchy, register + it in CVS with a command like cvs add {subdirname}. +

  • +
  • When you first create a new source code file, navigate to the directory + that contains it, and register the new file with a command like + cvs add {filename}. +

  • +
  • If you no longer need a particular source code file, navigate to the + containing directory and remove the file. Then, deregister it in CVS + with a command like cvs remove {filename}. +

  • +
  • While you are creating, modifying, and deleting source files, changes + are not yet reflected in the server repository. To save your changes in + their current state, go to the project source directory + and execute cvs commit. You will be asked to write a brief + description of the changes you have just completed, which will be stored + with the new version of any updated source file.
  • +
+ +

CVS, like other source code control systems, has many additional features +(such as the ability to tag the files that made up a particular release, and +support for multiple development branches that can later be merged). See the +links and references in the Introduction for +more information.

+ +
+ + +
+ +

We will be using the ant tool to manage the compilation of +our Java source code files, and creation of the deployment hierarchy. Ant +operates under the control of a build file, normally called +build.xml, that defines the processing steps required. This +file is stored in the top-level directory of your source code hierarchy, and +should be checked in to your source code control system.

+ +

Like a Makefile, the build.xml file provides several +"targets" that support optional development activities (such as creating +the associated Javadoc documentation, erasing the deployment home directory +so you can build your project from scratch, or creating the web application +archive file so you can distribute your application. A well-constructed +build.xml file will contain internal documentation describing +the targets that are designed for use by the developer, versus those targets +used internally. To ask Ant to display the project documentation, change to +the directory containing the build.xml flie and type:

+ +ant -projecthelp + + +

To give you a head start, a basic build.xml file +is provided that you can customize and install in the project source directory +for your application. This file includes comments that describe the various +targets that can be executed. Briefly, the following targets are generally +provided:

+
    +
  • clean - This target deletes any existing + build and dist directories, so that they + can be reconstructed from scratch. This allows you to guarantee that + you have not made source code modifications that will result in + problems at runtime due to not recompiling all affected classes. +

  • +
  • compile - This target is used to compile any source code + that has been changed since the last time compilation took place. The + resulting class files are created in the WEB-INF/classes + subdirectory of your build directory, exactly where the + structure of a web application requires them to be. Because + this command is executed so often during development, it is normally + made the "default" target so that a simple ant command will + execute it. +

  • +
  • all - This target is a short cut for running the + clean target, followed by the compile target. + Thus, it guarantees that you will recompile the entire application, to + ensure that you have not unknowingly introduced any incompatible changes. +

  • +
  • javadoc - This target creates Javadoc API documentation + for the Java classes in this web application. The example + build.xml file assumes you want to include the API + documentation with your app distribution, so it generates the docs + in a subdirectory of the dist directory. Because you normally + do not need to generate the Javadocs on every compilation, this target is + usually a dependency of the dist target, but not of the + compile target. +

  • +
  • dist - This target creates a distribution directory for + your application, including any required documentation, the Javadocs for + your Java classes, and a web application archive (WAR) file that will be + delivered to system administrators who wish to install your application. + Because this target also depends on the deploy target, the + web application archive will have also picked up any external dependencies + that were included at deployment time.
  • +
+ +

For interactive development and testing of your web application using +Tomcat 5, the following additional targets are defined:

+
    +
  • install - Tell the currently running Tomcat 5 to make + the application you are developing immediately available for execution + and testing. This action does not require Tomcat 5 to be restarted, but + it is also not remembered after Tomcat is restarted the next time. +

  • +
  • reload - Once the application is installed, you can + continue to make changes and recompile using the compile + target. Tomcat 5 will automatically recognize changes made to JSP pages, + but not to servlet or JavaBean classes - this command will tell Tomcat + to restart the currently installed application so that such changes are + recognized. +

  • +
  • remove - When you have completed your development and + testing activities, you can optionally tell Tomcat 5 to remove this + application from service. +
  • +
+ +

Using the development and testing targets requires some additional +one-time setup that is described on the next page.

+ +
+ + + +
diff --git a/webapps/docs/appdev/web.xml.txt b/webapps/docs/appdev/web.xml.txt new file mode 100644 index 000000000..e75bfba1a --- /dev/null +++ b/webapps/docs/appdev/web.xml.txt @@ -0,0 +1,150 @@ + + + + + + + + + + My Web Application + + This is version X.X of an application to perform + a wild and wonderful task, based on servlets and + JSP pages. It was written by Dave Developer + (dave@mycompany.com), who should be contacted for + more information. + + + + + + + webmaster + myaddress@mycompany.com + + The EMAIL address of the administrator to whom questions + and comments about this application should be addressed. + + + + + + + + controller + + This servlet plays the "controller" role in the MVC architecture + used in this application. It is generally mapped to the ".do" + filename extension with a servlet-mapping element, and all form + submits in the app will be submitted to a request URI like + "saveCustomer.do", which will therefore be mapped to this servlet. + + The initialization parameter namess for this servlet are the + "servlet path" that will be received by this servlet (after the + filename extension is removed). The corresponding value is the + name of the action class that will be used to process this request. + + com.mycompany.mypackage.ControllerServlet + + listOrders + com.mycompany.myactions.ListOrdersAction + + + saveCustomer + com.mycompany.myactions.SaveCustomerAction + + + 5 + + + + graph + + This servlet produces GIF images that are dynamically generated + graphs, based on the input parameters included on the request. + It is generally mapped to a specific request URI like "/graph". + + + + + + + + controller + *.do + + + + graph + /graph + + + + + + + 30 + + + + diff --git a/webapps/docs/apr.xml b/webapps/docs/apr.xml new file mode 100644 index 000000000..ff118874c --- /dev/null +++ b/webapps/docs/apr.xml @@ -0,0 +1,331 @@ + + +]> + + + &project; + + + Apache Portable Runtime and Tomcat + Remy Maucherat + + + + +
+ +

+ Tomcat can use the Apache Portable Runtime to + provide superior scalability, performance, and better integration with native server + technologies. The Apache Portable Runtime is a highly portable library that is at + the heart of Apache HTTP Server 2.x. APR has many uses, including access to advanced IO + functionality (such as sendfile, epoll and OpenSSL), OS level functionality (random number + generation, system status, etc), and native process handling (shared memory, NT + pipes and Unix sockets). +

+ +

+ These features allows making Tomcat a general purpose webserver, will enable much better + integration with other native web technologies, and overall make Java much more viable as + a full fledged webserver platform rather than simply a backend focused technology. +

+ +
+ +
+ +

+ APR support requires three main native components to be installed: +

    +
  • APR library
  • +
  • JNI wrappers for APR used by Tomcat (libtcnative)
  • +
  • OpenSSL libraries
  • +
+

+ + + +

+ Windows binaries are provided for tcnative-1, which is a statically compiled .dll which includes + OpenSSL and APR. It can be downloaded from here + as 32bit or AMD x86-64 binaries. + In security conscious production environments, it is recommended to use separate shared dlls + for OpenSSL, APR, and libtcnative-1, and update them as needed according to security bulletins. + Windows OpenSSL binaries are linked from the Official OpenSSL + website (see related/binaries). +

+ +
+ + + +

+ Most Linux distributions will ship packages for APR and OpenSSL. The JNI wrapper (libtcnative) will + then have to be compiled. It depends on APR, OpenSSL, and the Java headers. +

+ +

+ Requirements: +

    +
  • APR 1.2+ development headers (libapr1-dev package)
  • +
  • OpenSSL 0.9.7+ development headers (libssl-dev package)
  • +
  • JNI headers from Java compatible JDK 1.4+
  • +
  • GNU development environment (gcc, make)
  • +
+

+ +

+ The wrapper library sources are located in the Tomcat binary bundle, in the + bin/tomcat-native.tar.gz archive. + Once the build environment is installed and the source archive is extracted, the wrapper library + can be compiled using (from the folder containing the configure script): + ./configure && make && make install +

+ +
+ +
+ +
+ +

+ Once the libraries are properly installed and available to Java (if loading fails, the library path + will be displayed), the Tomcat connectors will automatically use APR. Configuration of the connectors + is similar to the regular connectors, but have a few extra attributes which are used to configure + APR components. Note that the defaults should be well tuned for most use cases, and additional + tweaking shouldn't be required. +

+ +

+ When APR is enabled, the following features are also enabled in Tomcat: +

    +
  • Secure session ID generation by default on all platforms (platforms other than Linux required + random number generation using a configured entropy)
  • +
  • OS level statistics on memory usage and CPU usage by the Tomcat process are displayed by + the status servlet
  • +
+

+ +
+ +
+ + + +

+ When APR is enabled, the HTTP connector will use sendfile for hadling large static files (all such + files will be sent ansychronously using high performance kernel level calls), and will use + a socket poller for keepalive, increasing scalability of the server. +

+ +

+ The following attributes are supported in the HTTP APR connector in addition to the ones supported + in the regular HTTP connector: +

+ + + + +

The first read of a request will be made using the specified timeout. If no data is available + after the specified time, the socket will be placed in the poller. The value of this attribute is + in ms. Setting this value to 0 or -1 will + increase scalability by always using a poller to handle keepalive, but will have a minor impact + on latency (see the related pollTime attribute). The difference is that with 0, the first read of + a request will be made using a short timeout, while with -1, the first read will be made using the + regular socket timeout that is configured on the connector. Setting this to -2 will cause + the connector to not use the poller for keepalive in most situations, emulating the behavior of + the java.io HTTP connector. + The default value is -1. Note: on Windows, the actual value of firstReadTimeout will + be 500 + the specified value, if the specified value is strictly positive.

+
+ + +

Duration of a poll call. Lowering this value will slightly decrease latency of connections + being kept alive in some cases, but will use more CPU as more poll calls are being made. The + default value is 2000 (5ms).

+
+ + +

Amount of sockets that the poller responsible for polling kept alive connections can hold at a + given time. Extra connections will be closed right away. The default value is 8192, corresponding to + 8192 keepalive connections.

+
+ + +

Use kernel level sendfile for certain static files. The default value is true.

+
+ + +

Amount of sockets that the poller responsible for sending static files asynchronously can hold + at a given time. Extra connections will be closed right away without any data being sent + (resulting in a zero length file on the client side). Note that in most cases, sendfile is a call + that will return right away (being taken care of "synchonously" by the kernel), and the sendfile + poller will not be used, so the amount of static files which can be sent concurrently is much larger + than the specified amount. The default value is 1024.

+
+ +
+ +
+ + + +

+ When APR is enabled, the HTTPS connector will use a socket poller for keepalive, increasing + scalability of the server. It also uses OpenSSL, which may be more optimized than JSSE depending + on the processor being used, and can be complemented with many commercial accelerator components. + Unlike the HTTP connector, the HTTPS connector cannot use sendfile to optimize static file + processing. +

+ +

+ The HTTPS APR connector has the same basic attributes than the HTTP APR connector, but adds + OpenSSL specific ones. For the full details on using OpenSSL, please refer to OpenSSL documentations + and the many books available for it (see the Official OpenSSL + website). The SSL specific attributes for the connector are: +

+ + + + +

+ Name of the SSLEngine to use. off: Do not use SSL, on: Use SSL but no specific ENGINE. + The default value is off. +

+
+ +

+ Protocol which may be used for communicating with clients. The default is "all", with + other acceptable values being "SSLv2", "SSLv3", "TLSv1", and "SSLv2+SSLv3". +

+
+ +

+ Ciphers which may be used for communicating with clients. The default is "ALL", with + other acceptable values being a list of ciphers, with ":" used as the delimiter + (see OpenSSL documentation for the list of ciphers supported). +

+
+ +

+ Name of the file that contains the server certificate. The format is PEM-encoded. +

+
+ +

+ Name of the file that contains the server private key. The format is PEM-encoded. + The default value is the value of "SSLCertificateFile" and in this case both certificate + and private key have to be in this file (NOT RECOMMENDED). +

+
+ +

+ Pass phrase for the encrypted private key. If "SSLPassword" is not provided, the callback fonction + should prompt for the pass phrase. +

+
+ +

+ Ask client for certificate. The default is "none", meaning the client will not have the opportunity + to submit a certificate. Other acceptable values include "optional", "require" and "optionalNoCA". +

+
+ +

+ Maximum verification depth for client certificates. The default is "10". +

+
+ +

+ See the mod_ssl documentation. +

+
+ +

+ See the mod_ssl documentation. +

+
+ +

+ See the mod_ssl documentation. +

+
+ +

+ See the mod_ssl documentation. +

+
+ +

+ See the mod_ssl documentation. +

+
+ +
+ +

+ An example SSL Connector declaration can be: + + <Connector port="443" maxHttpHeaderSize="8192" + maxThreads="150" minSpareThreads="25" maxSpareThreads="75" + enableLookups="false" disableUploadTimeout="true" + acceptCount="100" scheme="https" secure="true" + SSLEngine="on" + SSLCertificateFile="${catalina.base}/conf/localhost.crt" + SSLCertificateKeyFile="${catalina.base}/conf/localhost.key" /> +

+ +
+ + + +

+ When APR is enabled, the AJP connector will use a socket poller for keepalive, increasing + scalability of the server. As AJP is designed around a pool of persistent (or almost + persistent) connections, this will reduce significantly the amount of processing threads + needed by Tomcat. Unlike the HTTP connector, the AJP connector cannot use sendfile to optimize + static file processing. +

+ +

+ The following attributes are supported in the AJP APR connector in addition to the ones supported + in the regular AJP connector: +

+ + + + +

The first read of a request will be made using the specified timeout. If no data is available + after the specified time, the socket will be placed in the poller. The value of this attribute is + in ms. Setting this value to 0 or -1 will + increase scalability by always using a poller to handle keepalive, but will have a minor impact + on latency (see the related pollTime attribute). The difference is that with 0, the first read of + a request will be made using a short timeout, while with -1, the first read will be made using the + regular socket timeout that is configured on the connector. Setting this to -2 will cause + the connector to not use the poller for keepalive in most situations, emulating the behavior of + the java.io HTTP connector. + The default value is -1. Note: on Windows, the actual value of firstReadTimeout will + be 500 + the specified value, if the specified value is strictly positive.

+
+ + +

Duration of a poll call. Lowering this value will slightly decrease latency of connections + being kept alive in some cases, but will use more CPU as more poll calls are being made. The + default value is 2000 (5ms).

+
+ + +

Amount of sockets that the poller responsible for polling kept alive connections can hold at a + given time. Extra connections will be closed right away. The default value is 8192, corresponding to + 8192 keepalive connections.

+
+ +
+ +
+ +
+ + +
diff --git a/webapps/docs/architecture/index.xml b/webapps/docs/architecture/index.xml new file mode 100644 index 000000000..a320ac348 --- /dev/null +++ b/webapps/docs/architecture/index.xml @@ -0,0 +1,53 @@ + + +]> + + + &project; + + + Yoav Shapira + Table of Contents + + + + + +
+ +

This section of the Tomcat documentation attempts to explain +the architecture and design of the Tomcat server. It includes significant +contributions from several tomcat developers: +

+ + +
+ + +
+ +

The information presented is divided into the following sections:

+
    +
  • Overview - + An overview of the Tomcat server architecture with key terms + and concepts.
  • +
  • Server Startup - + A detailed description, with sequence diagrams, of how the Tomcat + server starts up.
  • +
  • Request Process Flow - + A detailed description of how Tomcat handles a request.
  • +
+ +
+ + + +
diff --git a/webapps/docs/architecture/overview.xml b/webapps/docs/architecture/overview.xml new file mode 100644 index 000000000..99b14bcb8 --- /dev/null +++ b/webapps/docs/architecture/overview.xml @@ -0,0 +1,123 @@ + + +]> + + + &project; + + + Yoav Shapira + Architecture Overview + + + + + +
+

+This page provides an overview of the Tomcat server architecture. +

+
+ +
+ + +

+In the Tomcat world, a +Server represents the whole container. +Tomcat provides a default implementation of the +Server interface., +and this is rarely customized by users. +

+
+ + +

+A Service is an intermediate component +which lives inside a Server and ties one or more Connectors to exactly one +Engine. The Service element is rarely customized by users, as the default +implementation is simple and sufficient: +Service interface. +

+
+ + +

+An +Engine represents request processing +pipeline for a specific Service. As a Service may have multiple Connectors, +the Engine received and processes all requests from these connectors, handing +the response back to the appropriate connector for transmission to the client. +The Engine interface +may be implemented to supply custom Engines, though this is uncommon. +

+

+Note that the Engine may be used for Tomcat server clustering via the +jvmRoute parameter. Read the Clustering documentation for more information. +

+
+ + +

+A Host is an association of a network name, +e.g. www.yourcompany.com, to the Tomcat server. An Engine may contain +multiple hosts, and the Host element also supports network aliases such as +yourcompany.com and abc.yourcompany.com. Users rarely create custom +Hosts +because the +StandardHost +implementation provides significant additional functionality. +

+
+ + +

+A Connector handles communications with the client. There are multiple +connectors available with Tomcat, all of which implement the +Connector +interface. These include the +Coyote connector which is used for +most HTTP traffic, especially when running Tomcat as a standalone server, +and the JK2 connector which implements +the AJP procotol used when connecting Tomcat to an Apache HTTPD server. +Creating a customized connector is a significant effort. +

+
+ + +

+A +Context +represents a web application. A Host may contain multiple +contexts, each with a unique path. The +Context +interface may be implemented to create custom Contexts, but +this is rarely the case because the + +StandardContext provides significant additional functionality. +

+
+
+ +
+

+Tomcat is designed to be a fast and efficient implementation of the +Servlet Specification. Tomcat came about as the reference implementation +of this specification, and has remained rigorous in adhering to the +specification. At the same time, significant attention has been paid +to Tomcat's performance and it is now on par with other servlet containers, +including commercial ones. +

+

+In recent releases of Tomcat, mostly starting with Tomcat 5, +we have begun effots to make more aspects of Tomcat managable via +JMX. In addition, the Manager and Admin webapps have been greatly +enhanced and improved. Managability is a primary area of concern +for us as the product matures and the specification becomes more +stable. +

+
+ + +
diff --git a/webapps/docs/architecture/project.xml b/webapps/docs/architecture/project.xml new file mode 100644 index 000000000..b7d25b3af --- /dev/null +++ b/webapps/docs/architecture/project.xml @@ -0,0 +1,26 @@ + + + + Tomcat Architecture + + + The Tomcat Servlet/JSP Container + + + + + + + + + + + + + + + + + + diff --git a/webapps/docs/architecture/requestProcess.xml b/webapps/docs/architecture/requestProcess.xml new file mode 100644 index 000000000..ba359bd2e --- /dev/null +++ b/webapps/docs/architecture/requestProcess.xml @@ -0,0 +1,53 @@ + + +]> + + + &project; + + + Yoav Shapira + Request Process Flow + + + + + +
+ +

+This page describes the process used by Tomcat to handle +an incoming request. This process is largely defined by +the Servlet Specification, which outlines the order +of events that must take place. +

+ + +

+TODO +

+
+ + +

+A UML sequence diagram of the request process is available +here. +

+
+ + +

+The Servlet Specification provides many opportunities for +listening in (using Listeners) or modiying (using Filters) +the request handling process even before the request arrives +at the servlet that will handle it. +

+ +
+ +
+ + + +
diff --git a/webapps/docs/architecture/requestProcess/requestProcess.pdf b/webapps/docs/architecture/requestProcess/requestProcess.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6a171de8708de81100435863977e42904b6f7832 GIT binary patch literal 32424 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 F%vjan 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 literal 0 HcmV?d00001 diff --git a/webapps/docs/architecture/requestProcess/roseModel.mdl b/webapps/docs/architecture/requestProcess/roseModel.mdl new file mode 100644 index 000000000..64ef567cf --- /dev/null +++ b/webapps/docs/architecture/requestProcess/roseModel.mdl @@ -0,0 +1,12921 @@ + +(object Petal + version 45 + _written "Rose 7.6.0109.2314" + charSet 0) + +(object Design "Logical View" + is_unit TRUE + is_loaded TRUE + quid "3DFDF6CE0337" + defaults (object defaults + rightMargin 0.250000 + leftMargin 0.250000 + topMargin 0.250000 + bottomMargin 0.500000 + pageOverlap 0.250000 + clipIconLabels TRUE + autoResize TRUE + snapToGrid TRUE + gridX 16 + gridY 16 + defaultFont (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + showMessageNum 1 + showClassOfObject TRUE + notation "Unified") + root_usecase_package (object Class_Category "Use Case View" + quid "3DFDF6CE0369" + exportControl "Public" + global TRUE + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list + (object UseCaseDiagram "Main" + quid "3DFDF6D201FE" + title "Main" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list)))) + root_category (object Class_Category "Logical View" + quid "3DFDF6CE0338" + exportControl "Public" + global TRUE + subsystem "Component View" + quidu "3DFDF6CE036A" + logical_models (list unit_reference_list + (object Class_Category "org.apache.catalina" + quid "3E42DE8D0082" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E42DEF601EB" + supplier "Logical View::org.apache.tomcat.util" + quidu "3E42DEDF01F2") + (object Visibility_Relationship + quid "3E42DF700060" + supplier "Logical View::org.apache.coyote" + quidu "3E42DE9F0132") + (object Visibility_Relationship + quid "3E43D165039C" + supplier "Logical View::org.apache.naming" + quidu "3E43D1580339")) + exportControl "Public" + logical_models (list unit_reference_list + (object Class_Category "ant" + quid "3E42DFBB037F" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43CFF7020F" + supplier "Logical View::org.apache.catalina::util" + quidu "3E42E0260184")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "authenticator" + quid "3E42DFC702B4" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43D03C0395" + supplier "Logical View::org.apache.catalina::deploy" + quidu "3E42DFDC0340") + (object Visibility_Relationship + quid "3E43D03F01C2" + supplier "Logical View::org.apache.catalina::util" + quidu "3E42E0260184") + (object Visibility_Relationship + quid "3E43D043024A" + supplier "Logical View::org.apache.catalina::valves" + quidu "3E42E02D035B")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "connector" + quid "3E42DFCF036A" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43D07E017D" + supplier "Logical View::org.apache.catalina::session" + quidu "3E42E00C026D")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "core" + quid "3E42DFD603BA" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43D19E01A9" + supplier "Logical View::org.apache.catalina::deploy" + quidu "3E42DFDC0340") + (object Visibility_Relationship + quid "3E43D1A10185" + supplier "Logical View::org.apache.catalina::util" + quidu "3E42E0260184") + (object Visibility_Relationship + quid "3E43D1CE007C" + supplier "Logical View::org.apache.catalina::connector" + quidu "3E42DFCF036A") + (object Visibility_Relationship + quid "3E43D1D800D0" + supplier "Logical View::org.apache.catalina::security" + quidu "3E42E00100D7") + (object Visibility_Relationship + quid "3E43D25C031F" + supplier "Logical View::org.apache.catalina::mbean" + quidu "3E42DFF10188") + (object Visibility_Relationship + quid "3E43D260028E" + supplier "Logical View::org.apache.catalina::startup" + quidu "3E42E01E00EC") + (object Visibility_Relationship + quid "3E43D26A015C" + supplier "Logical View::org.apache.catalina::session" + quidu "3E42E00C026D") + (object Visibility_Relationship + quid "3E43D2830271" + supplier "Logical View::org.apache.catalina::valves" + quidu "3E42E02D035B") + (object Visibility_Relationship + quid "3E43D2C80248" + supplier "Logical View::org.apache.catalina::net" + quidu "3E42DFF70227") + (object Visibility_Relationship + quid "3E43D2D6002B" + supplier "Logical View::org.apache.catalina::loader" + quidu "3E43D2D002D6") + (object Visibility_Relationship + quid "3E43D3D300F7" + supplier "Logical View::org.apache.naming" + quidu "3E43D1580339")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "deploy" + quid "3E42DFDC0340" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43D32001B8" + supplier "Logical View::org.apache.catalina::util" + quidu "3E42E0260184")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "launcher" + quid "3E42DFE2033F" + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "logger" + quid "3E42DFEC0285" + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "mbean" + quid "3E42DFF10188" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43D49101A5" + supplier "Logical View::org.apache.catalina::deploy" + quidu "3E42DFDC0340") + (object Visibility_Relationship + quid "3E43D4C6027D" + supplier "Logical View::org.apache.catalina::core" + quidu "3E42DFD603BA") + (object Visibility_Relationship + quid "3E43D4FB008F" + supplier "Logical View::org.apache.catalina::session" + quidu "3E42E00C026D") + (object Visibility_Relationship + quid "3E43D50000BE" + supplier "Logical View::org.apache.catalina::valves" + quidu "3E42E02D035B") + (object Visibility_Relationship + quid "3E43D5080278" + supplier "Logical View::org.apache.catalina::realm" + quidu "3E42DFFA00AE") + (object Visibility_Relationship + quid "3E43D55A0258" + supplier "Logical View::org.apache.catalina::logger" + quidu "3E42DFEC0285") + (object Visibility_Relationship + quid "3E43D56000D0" + supplier "Logical View::org.apache.catalina::authenticator" + quidu "3E42DFC702B4")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "net" + quid "3E42DFF70227" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43D6390371" + supplier "Logical View::org.apache.catalina::util" + quidu "3E42E0260184")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "realm" + quid "3E42DFFA00AE" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43D69F0133" + supplier "Logical View::org.apache.catalina::core" + quidu "3E42DFD603BA") + (object Visibility_Relationship + quid "3E43D6A10353" + supplier "Logical View::org.apache.catalina::util" + quidu "3E42E0260184") + (object Visibility_Relationship + quid "3E43D70E00E2" + supplier "Logical View::org.apache.naming" + quidu "3E43D1580339") + (object Visibility_Relationship + quid "3E43D72302D7" + supplier "Logical View::org.apache.catalina::deploy" + quidu "3E42DFDC0340")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "security" + quid "3E42E00100D7" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43D74D007F" + supplier "Logical View::org.apache.catalina::startup" + quidu "3E42E01E00EC") + (object Visibility_Relationship + quid "3E43D76B0371" + supplier "Logical View::org.apache.catalina::util" + quidu "3E42E0260184")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "servlets" + quid "3E42E00502DB" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43D82702E5" + supplier "Logical View::org.apache.tomcat.util" + quidu "3E42DEDF01F2") + (object Visibility_Relationship + quid "3E43D82A02CC" + supplier "Logical View::org.apache.catalina::util" + quidu "3E42E0260184") + (object Visibility_Relationship + quid "3E43D82D0244" + supplier "Logical View::org.apache.naming" + quidu "3E43D1580339")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "session" + quid "3E42E00C026D" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43D8770344" + supplier "Logical View::org.apache.catalina::util" + quidu "3E42E0260184")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "ssi" + quid "3E42E01002C3" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43D8F902B5" + supplier "Logical View::org.apache.catalina::util" + quidu "3E42E0260184")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "startup" + quid "3E42E01E00EC" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43D9150251" + supplier "Logical View::org.apache.catalina::logger" + quidu "3E42DFEC0285") + (object Visibility_Relationship + quid "3E43D919018F" + supplier "Logical View::org.apache.catalina::security" + quidu "3E42E00100D7") + (object Visibility_Relationship + quid "3E43D946000D" + supplier "Logical View::org.apache.catalina::core" + quidu "3E42DFD603BA") + (object Visibility_Relationship + quid "3E43D95E012A" + supplier "Logical View::org.apache.catalina::loader" + quidu "3E43D2D002D6") + (object Visibility_Relationship + quid "3E43D9960315" + supplier "Logical View::org.apache.catalina::util" + quidu "3E42E0260184") + (object Visibility_Relationship + quid "3E43D99902BF" + supplier "Logical View::org.apache.catalina::valves" + quidu "3E42E02D035B") + (object Visibility_Relationship + quid "3E43D99C0147" + supplier "Logical View::org.apache.catalina::deploy" + quidu "3E42DFDC0340") + (object Visibility_Relationship + quid "3E43D9DA0114" + supplier "Logical View::org.apache.catalina::net" + quidu "3E42DFF70227") + (object Visibility_Relationship + quid "3E43D9F402F2" + supplier "Logical View::org.apache.catalina::realm" + quidu "3E42DFFA00AE")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "user" + quid "3E42E0220174" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43DB240227" + supplier "Logical View::org.apache.catalina::util" + quidu "3E42E0260184") + (object Visibility_Relationship + quid "3E43DB31009F" + supplier "Logical View::org.apache.naming" + quidu "3E43D1580339")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "util" + quid "3E42E0260184" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43DB85017C" + supplier "Logical View::org.apache.catalina::core" + quidu "3E42DFD603BA") + (object Visibility_Relationship + quid "3E43DB88016C" + supplier "Logical View::org.apache.naming" + quidu "3E43D1580339")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "valves" + quid "3E42E02D035B" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43DC2B0257" + supplier "Logical View::org.apache.catalina::util" + quidu "3E42E0260184") + (object Visibility_Relationship + quid "3E43DD3E0271" + supplier "Logical View::org.apache.catalina::deploy" + quidu "3E42DFDC0340") + (object Visibility_Relationship + quid "3E43DD4102CF" + supplier "Logical View::org.apache.catalina::connector" + quidu "3E42DFCF036A") + (object Visibility_Relationship + quid "3E43DDDE00B8" + supplier "Logical View::org.apache.catalina::core" + quidu "3E42DFD603BA")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "loader" + quid "3E43D2D002D6" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E43D3CF00F2" + supplier "Logical View::org.apache.naming" + quidu "3E43D1580339")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list))) + logical_presentations (list unit_reference_list + (object ClassDiagram "Main" + quid "3E42DFB6010B" + title "Main" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list + (object CategoryView "Logical View::org.apache.catalina::ant" @1 + location (2208, 1504) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @1 + location (2064, 1420) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "ant") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DFBB037F" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::authenticator" @2 + location (192, 2000) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @2 + location (48, 1916) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "authenticator") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DFC702B4" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::connector" @3 + location (464, 1328) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @3 + location (320, 1244) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "connector") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DFCF036A" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::core" @4 + location (2224, 800) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @4 + location (2080, 716) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "core") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DFD603BA" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::deploy" @5 + location (240, 160) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @5 + location (96, 76) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "deploy") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DFDC0340" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::launcher" @6 + location (1776, 2480) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @6 + location (1632, 2396) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "launcher") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DFE2033F" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::logger" @7 + location (752, 128) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @7 + location (608, 44) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "logger") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DFEC0285" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::mbean" @8 + location (2208, 1216) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @8 + location (2064, 1132) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "mbean") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DFF10188" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::net" @9 + location (1056, 2496) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @9 + location (912, 2412) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "net") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DFF70227" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::realm" @10 + location (1248, 112) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @10 + location (1104, 28) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "realm") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DFFA00AE" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::security" @11 + location (304, 2496) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @11 + location (160, 2412) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "security") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42E00100D7" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::servlets" @12 + location (2096, 1888) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @12 + location (1952, 1804) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "servlets") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42E00502DB" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::session" @13 + location (432, 1696) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @13 + location (288, 1612) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "session") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42E00C026D" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::ssi" @14 + location (672, 2480) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @14 + location (528, 2393) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "ssi") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42E01002C3" + width 301 + height 187) + (object CategoryView "Logical View::org.apache.catalina::startup" @15 + location (1088, 832) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @15 + location (944, 748) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "startup") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42E01E00EC" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::user" @16 + location (1424, 2496) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @16 + location (1280, 2412) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "user") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42E0220174" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::util" @17 + location (1312, 1872) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @17 + location (1168, 1788) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "util") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42E0260184" + width 300 + height 180) + (object CategoryView "Logical View::org.apache.catalina::valves" @18 + location (304, 704) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @18 + location (160, 620) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "valves") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42E02D035B" + width 300 + height 180) + (object ImportView "" @19 + stereotype TRUE + line_color 3342489 + quidu "3E43CFF7020F" + client @1 + supplier @17 + line_style 0) + (object ImportView "" @20 + stereotype TRUE + line_color 3342489 + quidu "3E43D07E017D" + client @3 + supplier @13 + line_style 0) + (object CategoryView "Logical View::org.apache.catalina::loader" @21 + location (2240, 416) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @21 + location (2096, 332) + fill_color 13434879 + nlines 2 + max_width 288 + justify 0 + label "loader") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E43D2D002D6" + width 300 + height 180) + (object ImportView "" @22 + stereotype TRUE + line_color 3342489 + quidu "3E43D32001B8" + client @5 + supplier @17 + line_style 0) + (object CategoryView "Logical View::org.apache.naming" @23 + location (1872, 96) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @23 + location (1699, 12) + fill_color 13434879 + nlines 2 + max_width 346 + justify 0 + label "org.apache.naming") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E43D1580339" + width 358 + height 180) + (object ImportView "" @24 + stereotype TRUE + line_color 3342489 + quidu "3E43D3CF00F2" + client @21 + supplier @23 + line_style 0) + (object ImportView "" @25 + stereotype TRUE + line_color 3342489 + quidu "3E43D6390371" + client @9 + supplier @17 + line_style 0) + (object ImportView "" @26 + stereotype TRUE + line_color 3342489 + quidu "3E43D69F0133" + client @10 + supplier @4 + line_style 0) + (object ImportView "" @27 + stereotype TRUE + line_color 3342489 + quidu "3E43D6A10353" + client @10 + supplier @17 + line_style 0) + (object ImportView "" @28 + stereotype TRUE + line_color 3342489 + quidu "3E43D70E00E2" + client @10 + supplier @23 + line_style 0) + (object ImportView "" @29 + stereotype TRUE + line_color 3342489 + quidu "3E43D72302D7" + client @10 + supplier @5 + line_style 0) + (object ImportView "" @30 + stereotype TRUE + line_color 3342489 + quidu "3E43D69F0133" + client @10 + supplier @4 + line_style 0) + (object ImportView "" @31 + stereotype TRUE + line_color 3342489 + quidu "3E43D74D007F" + client @11 + supplier @15 + line_style 0) + (object ImportView "" @32 + stereotype TRUE + line_color 3342489 + quidu "3E43D76B0371" + client @11 + supplier @17 + line_style 0) + (object CategoryView "Logical View::org.apache.tomcat.util" @33 + location (2096, 2224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @33 + location (1923, 2140) + fill_color 13434879 + nlines 2 + max_width 346 + justify 0 + label "org.apache.tomcat.util") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DEDF01F2" + width 358 + height 180) + (object ImportView "" @34 + stereotype TRUE + line_color 3342489 + quidu "3E43D8770344" + client @13 + supplier @17 + line_style 0) + (object ImportView "" @35 + stereotype TRUE + line_color 3342489 + quidu "3E43D8F902B5" + client @14 + supplier @17 + line_style 0) + (object ImportView "" @36 + stereotype TRUE + line_color 3342489 + quidu "3E43DB240227" + client @16 + supplier @17 + line_style 0) + (object ImportView "" @37 + stereotype TRUE + line_color 3342489 + quidu "3E43DB31009F" + client @16 + supplier @23 + line_style 0) + (object ImportView "" @38 + stereotype TRUE + line_color 3342489 + quidu "3E43DB85017C" + client @17 + supplier @4 + line_style 0) + (object ImportView "" @39 + stereotype TRUE + line_color 3342489 + quidu "3E43DB88016C" + client @17 + supplier @23 + line_style 0) + (object ImportView "" @40 + stereotype TRUE + line_color 3342489 + quidu "3E43D82702E5" + client @12 + supplier @33 + line_style 0) + (object ImportView "" @41 + stereotype TRUE + line_color 3342489 + quidu "3E43D82A02CC" + client @12 + supplier @17 + line_style 0) + (object ImportView "" @42 + stereotype TRUE + line_color 3342489 + quidu "3E43D82D0244" + client @12 + supplier @23 + vertices (list Points + (2060, 1743) + (1746, 447) + (1838, 186)) + line_style 0) + (object ImportView "" @43 + stereotype TRUE + line_color 3342489 + quidu "3E43D919018F" + client @15 + supplier @11 + line_style 0) + (object ImportView "" @44 + stereotype TRUE + line_color 3342489 + quidu "3E43D946000D" + client @15 + supplier @4 + line_style 0) + (object ImportView "" @45 + stereotype TRUE + line_color 3342489 + quidu "3E43D95E012A" + client @15 + supplier @21 + line_style 0) + (object ImportView "" @46 + stereotype TRUE + line_color 3342489 + quidu "3E43D95E012A" + client @15 + supplier @21 + line_style 0) + (object ImportView "" @47 + stereotype TRUE + line_color 3342489 + quidu "3E43D9960315" + client @15 + supplier @17 + line_style 0) + (object ImportView "" @48 + stereotype TRUE + line_color 3342489 + quidu "3E43D99902BF" + client @15 + supplier @18 + line_style 0) + (object ImportView "" @49 + stereotype TRUE + line_color 3342489 + quidu "3E43D99C0147" + client @15 + supplier @5 + line_style 0) + (object ImportView "" @50 + stereotype TRUE + line_color 3342489 + quidu "3E43D946000D" + client @15 + supplier @4 + line_style 0) + (object ImportView "" @51 + stereotype TRUE + line_color 3342489 + quidu "3E43D9150251" + client @15 + supplier @7 + line_style 0) + (object ImportView "" @52 + stereotype TRUE + line_color 3342489 + quidu "3E43D9DA0114" + client @15 + supplier @9 + line_style 0) + (object ImportView "" @53 + stereotype TRUE + line_color 3342489 + quidu "3E43D9F402F2" + client @15 + supplier @10 + line_style 0) + (object ImportView "" @54 + stereotype TRUE + line_color 3342489 + quidu "3E43D9960315" + client @15 + supplier @17 + line_style 0) + (object ImportView "" @55 + stereotype TRUE + line_color 3342489 + quidu "3E43D946000D" + client @15 + supplier @4 + line_style 0) + (object ImportView "" @56 + stereotype TRUE + line_color 3342489 + quidu "3E43D99C0147" + client @15 + supplier @5 + line_style 0) + (object ImportView "" @57 + stereotype TRUE + line_color 3342489 + quidu "3E43D49101A5" + client @8 + supplier @5 + line_style 0) + (object ImportView "" @58 + stereotype TRUE + line_color 3342489 + quidu "3E43D4C6027D" + client @8 + supplier @4 + line_style 0) + (object ImportView "" @59 + stereotype TRUE + line_color 3342489 + quidu "3E43D4FB008F" + client @8 + supplier @13 + line_style 0) + (object ImportView "" @60 + stereotype TRUE + line_color 3342489 + quidu "3E43D50000BE" + client @8 + supplier @18 + vertices (list Points + (2057, 1216) + (1278, 1216) + (454, 783)) + line_style 0) + (object ImportView "" @61 + stereotype TRUE + line_color 3342489 + quidu "3E43D5080278" + client @8 + supplier @10 + line_style 0) + (object ImportView "" @62 + stereotype TRUE + line_color 3342489 + quidu "3E43D55A0258" + client @8 + supplier @7 + line_style 0) + (object ImportView "" @63 + stereotype TRUE + line_color 3342489 + quidu "3E43D56000D0" + client @8 + supplier @2 + line_style 0) + (object ImportView "" @64 + stereotype TRUE + line_color 3342489 + quidu "3E43D19E01A9" + client @4 + supplier @5 + line_style 0) + (object ImportView "" @65 + stereotype TRUE + line_color 3342489 + quidu "3E43D1A10185" + client @4 + supplier @17 + line_style 0) + (object ImportView "" @66 + stereotype TRUE + line_color 3342489 + quidu "3E43D1CE007C" + client @4 + supplier @3 + line_style 0) + (object ImportView "" @67 + stereotype TRUE + line_color 3342489 + quidu "3E43D1D800D0" + client @4 + supplier @11 + vertices (list Points + (2081, 890) + (959, 1616) + (409, 2351)) + line_style 0) + (object ImportView "" @68 + stereotype TRUE + line_color 3342489 + quidu "3E43D25C031F" + client @4 + supplier @8 + line_style 0) + (object ImportView "" @69 + stereotype TRUE + line_color 3342489 + quidu "3E43D260028E" + client @4 + supplier @15 + line_style 0) + (object ImportView "" @70 + stereotype TRUE + line_color 3342489 + quidu "3E43D26A015C" + client @4 + supplier @13 + line_style 0) + (object ImportView "" @71 + stereotype TRUE + line_color 3342489 + quidu "3E43D2830271" + client @4 + supplier @18 + line_style 0) + (object ImportView "" @72 + stereotype TRUE + line_color 3342489 + quidu "3E43D2C80248" + client @4 + supplier @9 + line_style 0) + (object ImportView "" @73 + stereotype TRUE + line_color 3342489 + quidu "3E43D2D6002B" + client @4 + supplier @21 + line_style 0) + (object ImportView "" @74 + stereotype TRUE + line_color 3342489 + quidu "3E43D3D300F7" + client @4 + supplier @23 + line_style 0) + (object ImportView "" @75 + stereotype TRUE + line_color 3342489 + quidu "3E43D03C0395" + client @2 + supplier @5 + vertices (list Points + (171, 1855) + (16, 766) + (205, 250)) + line_style 0) + (object ImportView "" @76 + stereotype TRUE + line_color 3342489 + quidu "3E43D03F01C2" + client @2 + supplier @17 + line_style 0) + (object ImportView "" @77 + stereotype TRUE + line_color 3342489 + quidu "3E43D043024A" + client @2 + supplier @18 + line_style 0) + (object ImportView "" @78 + stereotype TRUE + line_color 3342489 + quidu "3E43DC2B0257" + client @18 + supplier @17 + line_style 0) + (object ImportView "" @79 + stereotype TRUE + line_color 3342489 + quidu "3E43DD3E0271" + client @18 + supplier @5 + line_style 0) + (object ImportView "" @80 + stereotype TRUE + line_color 3342489 + quidu "3E43DD4102CF" + client @18 + supplier @3 + line_style 0) + (object ImportView "" @81 + stereotype TRUE + line_color 3342489 + quidu "3E43DDDE00B8" + client @18 + supplier @4 + vertices (list Points + (454, 654) + (1293, 381) + (2073, 731)) + line_style 0))))) + (object Class_Category "org.apache.coyote" + quid "3E42DE9F0132" + visible_categories (list visibility_relationship_list + (object Visibility_Relationship + quid "3E42DEFC00B3" + supplier "Logical View::org.apache.tomcat.util" + quidu "3E42DEDF01F2")) + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "org.apache.tomcat.util" + quid "3E42DEDF01F2" + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "org.apache.jasper" + quid "3E42DEFF0270" + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Class_Category "org.apache.naming" + quid "3E43D1580339" + exportControl "Public" + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list)) + (object Mechanism @82 + logical_models (list unit_reference_list + (object Object "Bootstrap" + quid "3DFDF8FD0345" + collaborators (list link_list + (object Link + quid "3DFDF9210008" + supplier "Bootstrap" + quidu "3DFDF8FD0345" + messages (list Messages + (object Message "initClassLoaders()" + quid "3DFDF9210009" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1" + ordinal 0 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFDF91A010C" + supplier "Catalina" + quidu "3DFDF90A0330" + messages (list Messages + (object Message "newInstance()" + quid "3DFDF91A010D" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2" + ordinal 1 + quidu "000000000000" + creation FALSE) + (object Message "setParentClassLoader()" + quid "3DFDF97900C2" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3" + ordinal 2 + quidu "000000000000" + creation FALSE) + (object Message "load()" + quid "3DFDFA3402F2" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "4" + ordinal 3 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "Digester" + quid "3DFDFAF201A1" + collaborators (list link_list + (object Link + quid "3DFDFB8400A6" + supplier "ServerLifecycleListener" + quidu "3DFDFB4B0217" + messages (list Messages + (object Message "newInstance()" + quid "3DFDFB8400A7" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "9.1" + ordinal 9 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFDFB920147" + supplier "GlobalResourcesLifecycleListener" + quidu "3DFDFB7A02AB" + messages (list Messages + (object Message "newInstance()" + quid "3DFDFB920148" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "9.2" + ordinal 10 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "ServerLifecycleListener" + quid "3DFDFB4B0217" + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "GlobalResourcesLifecycleListener" + quid "3DFDFB7A02AB" + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "SecurityConfig" + quid "3DFDFBD802BA" + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "Catalina" + quid "3DFDF90A0330" + collaborators (list link_list + (object Link + quid "3DFDFA8001D9" + supplier "Catalina" + quidu "3DFDF90A0330" + messages (list Messages + (object Message "initDirs()" + quid "3DFDFA8001DA" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "5" + ordinal 4 + quidu "000000000000" + creation FALSE) + (object Message "initNaming()" + quid "3DFDFA8B0347" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "6" + ordinal 5 + quidu "000000000000" + creation FALSE) + (object Message "initialize()" + quid "3DFDFAAD01AC" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "7" + ordinal 6 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFDFAF800C3" + supplier "Digester" + quidu "3DFDFAF201A1" + messages (list Messages + (object Message "createDigester()" + quid "3DFDFAF800C4" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "8" + ordinal 7 + quidu "000000000000" + creation FALSE) + (object Message "parse()" + quid "3DFDFB0100B2" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "9" + ordinal 8 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFDFBEA00C1" + supplier "SecurityConfig" + quidu "3DFDFBD802BA" + messages (list Messages + (object Message "newInstance()" + quid "3DFDFBEA00C2" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "10" + ordinal 11 + quidu "000000000000" + creation FALSE) + (object Message "setPackageDefinition()" + quid "3DFDFBF401F2" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "11" + ordinal 12 + Operation "setPackageDefinition" + quidu "000000000000" + creation FALSE) + (object Message "setPackageAccess()" + quid "3DFDFC1203C2" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "12" + ordinal 13 + Operation "setPackageAccess" + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE))) + (object Mechanism @83 + logical_models (list unit_reference_list + (object Object "Catalina" + quid "3DFDFC8F015F" + collaborators (list link_list + (object Link + quid "3DFDFD1F0075" + supplier "StandardServer" + quidu "3DFDFCCB006B" + messages (list Messages + (object Message "initialize()" + quid "3DFDFD1F0076" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1" + ordinal 0 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardServer" + quid "3DFDFCCB006B" + collaborators (list link_list + (object Link + quid "3DFDFD3D01C3" + supplier "StandardService" + quidu "3DFDFD370020" + messages (list Messages + (object Message "initialize()" + quid "3DFDFD3D01C4" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2" + ordinal 1 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardService" + quid "3DFDFD370020" + collaborators (list link_list + (object Link + quid "3DFDFE990304" + supplier "CoyoteConnector" + quidu "3DFDFE810313" + messages (list Messages + (object Message "initialize()" + quid "3DFDFE990305" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2.1" + ordinal 2 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "CoyoteConnector" + quid "3DFDFE810313" + collaborators (list link_list + (object Link + quid "3DFE013D0216" + supplier "CoyoteAdapter" + quidu "3DFDFFA00226" + messages (list Messages + (object Message "new()" + quid "3DFE013D0217" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2.1.1" + ordinal 3 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE0183032F" + supplier "Http11Protocol" + quidu "3DFE016601A6" + messages (list Messages + (object Message "new()" + quid "3DFE01830330" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2.1.2" + ordinal 4 + quidu "000000000000" + creation FALSE) + (object Message "init()" + quid "3DFE0188032C" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2.1.3" + ordinal 5 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE01BC038B" + supplier "JkCoyoteAdapter" + quidu "3DFE01AD01A8" + messages (list Messages + (object Message "new()" + quid "3DFE01BC038C" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2.1.4" + ordinal 6 + quidu "000000000000" + creation FALSE) + (object Message "init()" + quid "3DFE01C30164" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2.1.5" + ordinal 7 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "CoyoteAdapter" + quid "3DFDFFA00226" + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "Http11Protocol" + quid "3DFE016601A6" + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "JkCoyoteAdapter" + quid "3DFE01AD01A8" + persistence "Transient" + creationObj FALSE + multi FALSE))) + (object Mechanism @84 + logical_models (list unit_reference_list + (object Object "Bootstrap" + quid "3DFE027700F5" + collaborators (list link_list + (object Link + quid "3DFE02830373" + supplier "Catalina" + quidu "3DFE027D0067" + messages (list Messages + (object Message "start()" + quid "3DFE02830374" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1" + ordinal 0 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "Catalina" + quid "3DFE027D0067" + collaborators (list link_list + (object Link + quid "3DFE02BA0187" + supplier "StandardServer" + quidu "3DFE02B30015" + messages (list Messages + (object Message "start()" + quid "3DFE02BA0188" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1" + ordinal 1 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardServer" + quid "3DFE02B30015" + collaborators (list link_list + (object Link + quid "3DFE02D3006B" + supplier "StandardServer" + quidu "3DFE02B30015" + messages (list Messages + (object Message "fireLifecycleEvent(BEFORE_START_EVENT)" + quid "3DFE02D3006C" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1.1" + ordinal 2 + quidu "000000000000" + creation FALSE) + (object Message "fireLifecycleEvent(START_EVENT)" + quid "3DFE02DF02DF" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1.2" + ordinal 3 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE030C02B2" + supplier "StandardService" + quidu "3DFE030400E3" + messages (list Messages + (object Message "start()" + quid "3DFE030C02B3" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1.3" + ordinal 4 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardService" + quid "3DFE030400E3" + collaborators (list link_list + (object Link + quid "3DFE031D0021" + supplier "StandardService" + quidu "3DFE030400E3" + messages (list Messages + (object Message "fireLifecycleEvent(BEFORE_START_EVENT)" + quid "3DFE031D0022" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1.3.1" + ordinal 5 + quidu "000000000000" + creation FALSE) + (object Message "fireLifecycleEvent(START_EVENT)" + quid "3DFE0330019B" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1.3.2" + ordinal 6 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE03700189" + supplier "StandardEngine" + quidu "3DFE034700C2" + messages (list Messages + (object Message "start()" + quid "3DFE0370018A" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1.3.3" + ordinal 7 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardEngine" + quid "3DFE034700C2" + collaborators (list link_list + (object Link + quid "3DFE03750050" + supplier "StandardEngine" + quidu "3DFE034700C2" + messages (list Messages + (object Message "fireLifecycleEvent(BEFORE_START_EVENT)" + quid "3DFE03750051" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2" + ordinal 8 + quidu "000000000000" + creation FALSE) + (object Message "addDefaultMapper()" + quid "3DFE0389001C" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3" + ordinal 9 + quidu "000000000000" + creation FALSE) + (object Message "logger.start()" + quid "3DFE03980281" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "4" + ordinal 10 + quidu "000000000000" + creation FALSE) + (object Message "realm.start()" + quid "3DFE03A80107" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "5" + ordinal 11 + quidu "000000000000" + creation FALSE) + (object Message "findMappers()" + quid "3DFE03BD000D" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "6" + ordinal 12 + quidu "000000000000" + creation FALSE) + (object Message "findChildren()" + quid "3DFE03E000A4" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "7" + ordinal 13 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE03FB0279" + supplier "StandardHost" + quidu "3DFE03F2035D" + messages (list Messages + (object Message "start()" + quid "3DFE03FB027A" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "8" + ordinal 14 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardHost" + quid "3DFE03F2035D" + collaborators (list link_list + (object Link + quid "3DFE043B02AD" + supplier "StandardHost" + quidu "3DFE03F2035D" + messages (list Messages + (object Message "fireLifecycleEvent(BEFORE_START_EVENT)" + quid "3DFE043B02AE" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "8.1" + ordinal 15 + quidu "000000000000" + creation FALSE) + (object Message "addDefaultMapper()" + quid "3DFE045C021F" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "8.2" + ordinal 16 + quidu "000000000000" + creation FALSE) + (object Message "logger.start()" + quid "3DFE049B000C" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "8.3" + ordinal 17 + quidu "000000000000" + creation FALSE) + (object Message "findMapper()" + quid "3DFE04A303BB" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "8.4" + ordinal 18 + quidu "000000000000" + creation FALSE) + (object Message "findChildren()" + quid "3DFE04A90342" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "8.5" + ordinal 19 + Operation "findChildren" + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE048E00B8" + supplier "StandardPipeline" + quidu "3DFE047D006D" + messages (list Messages + (object Message "start()" + quid "3DFE048E00B9" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "8.6" + ordinal 20 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardPipeline" + quid "3DFE047D006D" + collaborators (list link_list + (object Link + quid "3DFE05780137" + supplier "StandardPipeline" + quidu "3DFE047D006D" + messages (list Messages + (object Message "fireLifecycleEvent(BEFORE_START_EVENT)" + quid "3DFE05780138" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "8.6.1" + ordinal 21 + Operation "fireLifecycleEvent(AFTER_START_EVENT)" + quidu "000000000000" + creation FALSE) + (object Message "fireLifecycleEvent(START_EVENT)" + quid "3DFE05A80398" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "8.6.2" + ordinal 22 + Operation "fireLifecycleEvent(BEFORE_START_EVENT)" + quidu "000000000000" + creation FALSE) + (object Message "fireLifecycleEvent(AFTER_EVENT)" + quid "3DFE05BA0196" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "8.6.3" + ordinal 23 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE))) + (object Mechanism @85 + logical_models (list unit_reference_list + (object Object "StandardHost" + quid "3DFE0538017B" + collaborators (list link_list + (object Link + quid "3DFE066C0340" + supplier "StandardHost" + quidu "3DFE0538017B" + messages (list Messages + (object Message "fireLifecycleEvent(START_EVENT)" + quid "3DFE066C0341" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1" + ordinal 0 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE06D20293" + supplier "HostConfig" + quidu "3DFE06A60131" + messages (list Messages + (object Message "interested[i].lifecycleEvent()" + quid "3DFE06D20294" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2" + ordinal 1 + quidu "000000000000" + creation FALSE) + (object Message "install()" + quid "3DFE078B03BB" + frequency "Aperiodic" + synchronization "Simple" + dir "ToClientFromSupplier" + sequence "2.6" + ordinal 7 + quidu "000000000000" + creation FALSE) + (object Message "install()" + quid "3DFE132D0309" + frequency "Aperiodic" + synchronization "Simple" + dir "ToClientFromSupplier" + sequence "5" + ordinal 13 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE07B100BD" + supplier "StandardHostDeployer" + quidu "3DFE079A0055" + messages (list Messages + (object Message "install()" + quid "3DFE07B100BE" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3" + ordinal 8 + quidu "000000000000" + creation FALSE) + (object Message "install() // same as above" + quid "3DFE133A036C" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "6" + ordinal 17 + Operation "install()" + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "HostConfig" + quid "3DFE06A60131" + collaborators (list link_list + (object Link + quid "3DFE06E9028C" + supplier "HostConfig" + quidu "3DFE06A60131" + messages (list Messages + (object Message "setDeployXML()" + quid "3DFE06E9028D" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2.1" + ordinal 2 + quidu "000000000000" + creation FALSE) + (object Message "setLiveDeploy()" + quid "3DFE06F300FF" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2.2" + ordinal 3 + quidu "000000000000" + creation FALSE) + (object Message "setUnpacksWar()" + quid "3DFE06FB00D9" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2.3" + ordinal 4 + quidu "000000000000" + creation FALSE) + (object Message "setXMLValidation()" + quid "3DFE070C0015" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2.4" + ordinal 5 + quidu "000000000000" + creation FALSE) + (object Message "deployDescriptors()" + quid "3DFE073B0031" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2.5" + ordinal 6 + quidu "000000000000" + creation FALSE) + (object Message "deployApps()" + quid "3DFE131F0327" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "4" + ordinal 12 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardHostDeployer" + quid "3DFE079A0055" + collaborators (list link_list + (object Link + quid "3DFE07D200EC" + supplier "Digester" + quidu "3DFE07C9034C" + messages (list Messages + (object Message "create()" + quid "3DFE07D200ED" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1" + ordinal 9 + quidu "000000000000" + creation FALSE) + (object Message "parse()" + quid "3DFE07D603D7" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.6" + ordinal 16 + quidu "000000000000" + creation FALSE) + (object Message "add(ContextRuleSet)" + quid "3DFE08FA003D" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.3" + ordinal 11 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE087D01E2" + supplier "StandardHostDeployer" + quidu "3DFE079A0055") + (object Link + quid "3DFE08DA029A" + supplier "ContextRuleSet" + quidu "3DFE0834016F" + messages (list Messages + (object Message "new()" + quid "3DFE08DA029B" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.2" + ordinal 10 + quidu "000000000000" + creation FALSE) + (object Message "add(NamingRuleSet())" + quid "3DFE0907015F" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.5" + ordinal 15 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE08E00090" + supplier "NamingRuleSet" + quidu "3DFE08D00173" + messages (list Messages + (object Message "new()" + quid "3DFE08E00091" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.4" + ordinal 14 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "Digester" + quid "3DFE07C9034C" + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "ContextRuleSet" + quid "3DFE0834016F" + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "NamingRuleSet" + quid "3DFE08D00173" + persistence "Transient" + creationObj FALSE + multi FALSE))) + (object Mechanism @86 + logical_models (list unit_reference_list + (object Object "Digester" + quid "3DFE095A0371" + collaborators (list link_list + (object Link + quid "3DFE0E7801DA" + supplier "Digester" + quidu "3DFE095A0371" + messages (list Messages + (object Message "parse" + quid "3DFE0E7801DB" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1" + ordinal 0 + quidu "000000000000" + creation FALSE) + (object Message "startElement()" + quid "3DFE0F2F03D2" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2" + ordinal 1 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE0F400213" + supplier "Rule" + quidu "3DFE0E7400D0" + messages (list Messages + (object Message "begin()" + quid "3DFE0F400214" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3" + ordinal 2 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "Rule" + quid "3DFE0E7400D0" + collaborators (list link_list + (object Link + quid "3DFE0FD30265" + supplier "StandardContext" + quidu "3DFE0FC502A1" + messages (list Messages + (object Message "newInstance()" + quid "3DFE0FD30266" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1" + ordinal 3 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE102002E8" + supplier "SetPropertiesRule" + quidu "3DFE100303A4" + messages (list Messages + (object Message "begin()" + quid "3DFE102002E9" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.2" + ordinal 6 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE127F0024" + supplier "Rule" + quidu "3DFE0E7400D0") + (object Link + quid "3DFE128501C7" + supplier "SetNextRule" + quidu "3DFE12690267" + messages (list Messages + (object Message "end()" + quid "3DFE128501C8" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.3" + ordinal 8 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardContext" + quid "3DFE0FC502A1" + collaborators (list link_list + (object Link + quid "3DFE114A0192" + supplier "StandardPipeline" + quidu "3DFE112F003F" + messages (list Messages + (object Message "setBasic(StandardContextValve)" + quid "3DFE114A0193" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.2" + ordinal 5 + Operation "setBasic" + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE115E001E" + supplier "StandardContextValve" + quidu "3DFE110D0375" + messages (list Messages + (object Message "new()" + quid "3DFE115E001F" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1" + ordinal 4 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "SetPropertiesRule" + quid "3DFE100303A4" + collaborators (list link_list + (object Link + quid "3DFE11D50390" + supplier "StandardContext" + quidu "3DFE0FC502A1" + messages (list Messages + (object Message "//Using BeanUtil, set the object properties (from ex: admin.xml)" + quid "3DFE11D50391" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.2.1" + ordinal 7 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardContextValve" + quid "3DFE110D0375" + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardPipeline" + quid "3DFE112F003F" + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "SetNextRule" + quid "3DFE12690267" + persistence "Transient" + creationObj FALSE + multi FALSE))) + (object Mechanism @87 + logical_models (list unit_reference_list + (object Object "StandardContext" + quid "3DFE196D00D9" + collaborators (list link_list + (object Link + quid "3DFE200603BD" + supplier "WebappLoader" + quidu "3DFE1FFA0347" + messages (list Messages + (object Message "new" + quid "3DFE200603BE" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.1" + ordinal 5 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE200C0299" + supplier "StandardContext" + quidu "3DFE196D00D9" + messages (list Messages + (object Message "setLoader" + quid "3DFE200C029A" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.2" + ordinal 6 + quidu "000000000000" + creation FALSE) + (object Message "setManager" + quid "3DFE2032001C" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.4" + ordinal 8 + quidu "000000000000" + creation FALSE) + (object Message "fireLifecycleEvent(START_EVENT)" + quid "3DFE205B01A2" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.5" + ordinal 9 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE202C024F" + supplier "StandardManager" + quidu "3DFE201F0105" + messages (list Messages + (object Message "new" + quid "3DFE202C0250" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.3" + ordinal 7 + quidu "000000000000" + creation FALSE) + (object Message "start()" + quid "3DFE20B600E5" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.7" + ordinal 12 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE20960002" + supplier "ContextConfig" + quidu "3DFE2087028C" + messages (list Messages + (object Message " // Notify interested LifecycleListeners" + quid "3DFE20960003" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.6" + ordinal 10 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardHostDeployer" + quid "3DFE1D8A02DC" + collaborators (list link_list + (object Link + quid "3DFE1FAF0014" + supplier "StandardHost" + quidu "3DFE1DF20141" + messages (list Messages + (object Message "addChild" + quid "3DFE1FB60277" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1" + ordinal 3 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardHost" + quid "3DFE1DF20141" + collaborators (list link_list + (object Link + quid "3DFE1FC40227" + supplier "StandardContext" + quidu "3DFE196D00D9" + messages (list Messages + (object Message "start()" + quid "3DFE1FC40228" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1" + ordinal 4 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "WebappLoader" + quid "3DFE1FFA0347" + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardManager" + quid "3DFE201F0105" + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "ContextConfig" + quid "3DFE2087028C" + collaborators (list link_list + (object Link + quid "3DFE20CF018B" + supplier "ContextConfig" + quidu "3DFE2087028C" + messages (list Messages + (object Message "start()" + quid "3DFE20CF018C" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.6.1" + ordinal 11 + quidu "000000000000" + creation FALSE) + (object Message "defaultConfig()" + quid "3DFE20E303E2" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.6.2" + ordinal 13 + quidu "000000000000" + creation FALSE) + (object Message "applicationConfig()" + quid "3DFE211D01A1" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.6.3" + ordinal 14 + Operation "applicationConfig" + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE21B60287" + supplier "Digester" + quidu "3DFE13960364" + messages (list Messages + (object Message "create()" + quid "3DFE21B60288" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.6.3.1" + ordinal 15 + quidu "000000000000" + creation FALSE) + (object Message "createWarpper() // Invoked by a WebWrapperRule (not Directly by the Digester)" + quid "3DFE228B03BA" + frequency "Aperiodic" + synchronization "Simple" + dir "ToClientFromSupplier" + sequence "3.1.1.6.3.1.2" + ordinal 17 + Operation "createWarpper() // Invoked by a Rule (not Directly by the Digester)" + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE22560061" + supplier "StandardWrapper" + quidu "3DFE220C0122" + messages (list Messages + (object Message "new" + quid "3DFE229A0004" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.6.3.1.2.1" + ordinal 18 + quidu "000000000000" + creation FALSE) + (object Message "addInstanceListener()" + quid "3DFE22A700C1" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.6.3.2" + ordinal 19 + Operation "addInstanceListener" + quidu "000000000000" + creation FALSE) + (object Message "addLifecycleListener()" + quid "3DFE22C701CC" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.6.3.3" + ordinal 20 + quidu "000000000000" + creation FALSE) + (object Message "addContainerListener()" + quid "3DFE22E80364" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.6.3.4" + ordinal 21 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj TRUE + multi FALSE) + (object Object "Digester" + quid "3DFE13960364" + collaborators (list link_list + (object Link + quid "3DFE19AE0064" + supplier "Digester" + quidu "3DFE13960364" + messages (list Messages + (object Message "parse" + quid "3DFE19AE0065" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1" + ordinal 0 + quidu "000000000000" + creation FALSE) + (object Message "startElement()" + quid "3DFE19B102E9" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2" + ordinal 1 + quidu "000000000000" + creation FALSE) + (object Message "// Process web.xml * tld.xml" + quid "3DFE21BE021B" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1.1.6.3.1.1" + ordinal 16 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE1DFB0021" + supplier "StandardHostDeployer" + quidu "3DFE1D8A02DC" + messages (list Messages + (object Message "addChild" + quid "3DFE1DFB0022" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3" + ordinal 2 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE22190225" + supplier "StandardWrapper" + quidu "3DFE220C0122")) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardWrapper" + quid "3DFE220C0122" + persistence "Transient" + creationObj FALSE + multi FALSE))) + (object Mechanism @88 + logical_models (list unit_reference_list + (object Object "ThreadPool" + quid "3DFE402B02C5" + collaborators (list link_list + (object Link + quid "3DFE40E701AD" + supplier "TcpWorkerThread" + quidu "3DFE403200F8" + messages (list Messages + (object Message "runIt()" + quid "3DFE40E701AE" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1" + ordinal 0 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "TcpWorkerThread" + quid "3DFE403200F8" + collaborators (list link_list + (object Link + quid "3DFE40FC010D" + supplier "Http11Protocol" + quidu "3DFE40750177" + messages (list Messages + (object Message "processConnection" + quid "3DFE40FC010E" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1" + ordinal 1 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "Http11Protocol" + quid "3DFE40750177" + collaborators (list link_list + (object Link + quid "3DFE4111029E" + supplier "Http11Protocol" + quidu "3DFE40750177" + messages (list Messages + (object Message "process()" + quid "3DFE4111029F" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1.1" + ordinal 2 + quidu "000000000000" + creation FALSE) + (object Message "parseHeaders()" + quid "3DFE415C0151" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2" + ordinal 3 + quidu "000000000000" + creation FALSE) + (object Message "prepareRequest()" + quid "3DFE41A60161" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3" + ordinal 4 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE41D60106" + supplier "CoyoteAdapter" + quidu "3DFE410600DF" + messages (list Messages + (object Message "service()" + quid "3DFE41D60107" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "4" + ordinal 5 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "CoyoteAdapter" + quid "3DFE410600DF" + collaborators (list link_list + (object Link + quid "3DFE422C01F0" + supplier "CoyoteAdapter" + quidu "3DFE410600DF" + messages (list Messages + (object Message "postParseRequest()" + quid "3DFE422C01F1" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "5" + ordinal 6 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE42800237" + supplier "StandardEngine" + quidu "3DFE424B0349" + messages (list Messages + (object Message "invoke()" + quid "3DFE42800238" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "6" + ordinal 7 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardEngine" + quid "3DFE424B0349" + collaborators (list link_list + (object Link + quid "3DFE429A002C" + supplier "StandardPipeline" + quidu "3DFE42900045" + messages (list Messages + (object Message "invoke()" + quid "3DFE429A002D" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "6.1" + ordinal 8 + Operation "invoke" + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardPipeline" + quid "3DFE42900045" + collaborators (list link_list + (object Link + quid "3DFE42CE022F" + supplier "StandardValveContext" + quidu "3DFE42C002B1" + messages (list Messages + (object Message "invoke()" + quid "3DFE42CE0230" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "6.1.1" + ordinal 9 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardValveContext" + quid "3DFE42C002B1" + persistence "Transient" + creationObj FALSE + multi FALSE))) + (object Mechanism @89 + logical_models (list unit_reference_list + (object Object "StandardContextValve" + quid "3DFE4307001E" + collaborators (list link_list + (object Link + quid "3DFE434C019A" + supplier "StandardEngineValve" + quidu "3DFE432801F3" + messages (list Messages + (object Message "invoke()" + quid "3DFE434C019B" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1" + ordinal 0 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE43C203A3" + supplier "ErrorReportValve" + quidu "3DFE438C028D" + messages (list Messages + (object Message "invoke()" + quid "3DFE43C203A4" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3" + ordinal 4 + quidu "000000000000" + creation FALSE) + (object Message "invokeNext()" + quid "3DFE46330293" + frequency "Aperiodic" + synchronization "Simple" + dir "ToClientFromSupplier" + sequence "3.2" + ordinal 6 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE46E70025" + supplier "ErrorDispatcherValve" + quidu "3DFE451F01EC" + messages (list Messages + (object Message "invoke()" + quid "3DFE46E70026" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "4" + ordinal 7 + quidu "000000000000" + creation FALSE) + (object Message "invokeNext" + quid "3DFE475D03A0" + frequency "Aperiodic" + synchronization "Simple" + dir "ToClientFromSupplier" + sequence "4.1" + ordinal 8 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE476503C9" + supplier "StandardHostValve" + quidu "3DFE47310130" + messages (list Messages + (object Message "invoke()" + quid "3DFE476503CA" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "5" + ordinal 9 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardEngineValve" + quid "3DFE432801F3" + collaborators (list link_list + (object Link + quid "3DFE436C009C" + supplier "StandardHost" + quidu "3DFE436503BD" + messages (list Messages + (object Message "map()" + quid "3DFE436C009D" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1" + ordinal 1 + quidu "000000000000" + creation FALSE) + (object Message "invoke()" + quid "3DFE43830063" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.2" + ordinal 2 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE437F0143" + supplier "StandardEngineValve" + quidu "3DFE432801F3")) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardHost" + quid "3DFE436503BD" + collaborators (list link_list + (object Link + quid "3DFE43B903BE" + supplier "StandardContextValve" + quidu "3DFE4307001E" + messages (list Messages + (object Message "invoke()" + quid "3DFE43B903BF" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "2" + ordinal 3 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "ErrorReportValve" + quid "3DFE438C028D" + collaborators (list link_list + (object Link + quid "3DFE442501B0" + supplier "ErrorReportValve" + quidu "3DFE438C028D" + messages (list Messages + (object Message "report()" + quid "3DFE442501B1" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "3.1" + ordinal 5 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE452A00F7" + supplier "ErrorDispatcherValve" + quidu "3DFE451F01EC")) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "ErrorDispatcherValve" + quid "3DFE451F01EC" + collaborators (list link_list + (object Link + quid "3DFE47500148" + supplier "StandardHostValve" + quidu "3DFE47310130") + (object Link + quid "3DFE47580335" + supplier "ErrorDispatcherValve" + quidu "3DFE451F01EC")) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardHostValve" + quid "3DFE47310130" + collaborators (list link_list + (object Link + quid "3DFE47CD0166" + supplier "StandardHostValve" + quidu "3DFE47310130" + messages (list Messages + (object Message "map() //Context" + quid "3DFE47CD0167" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "5.1" + ordinal 10 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE47D500B3" + supplier "StandardContext" + quidu "3DFE47C100F1" + messages (list Messages + (object Message "invoke()" + quid "3DFE47D500B4" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "5.2" + ordinal 11 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardContext" + quid "3DFE47C100F1" + persistence "Transient" + creationObj FALSE + multi FALSE))) + (object Mechanism @90 + logical_models (list unit_reference_list + (object Object "StandardContext" + quid "3DFE48B001D1" + collaborators (list link_list + (object Link + quid "3DFE48BE0267" + supplier "StandardPipeline" + quidu "3DFE48B80088" + messages (list Messages + (object Message "invoke()" + quid "3DFE48BE0268" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1" + ordinal 0 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardPipeline" + quid "3DFE48B80088" + collaborators (list link_list + (object Link + quid "3DFE48EA0039" + supplier "StandardValveContext" + quidu "3DFE48D000DC" + messages (list Messages + (object Message "invoke()" + quid "3DFE48EA003A" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1" + ordinal 1 + quidu "000000000000" + creation FALSE) + (object Message "invoke()" + quid "3DFE4976015D" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.2" + ordinal 6 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardValveContext" + quid "3DFE48D000DC" + collaborators (list link_list + (object Link + quid "3DFE491102D5" + supplier "StandardContextValve" + quidu "3DFE490303A7" + messages (list Messages + (object Message "invoke()" + quid "3DFE491102D6" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1.1" + ordinal 2 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE4993023B" + supplier "StandardWrapperValve" + quidu "3DFE49890056" + messages (list Messages + (object Message "invoke()" + quid "3DFE4993023C" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.2.1" + ordinal 7 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardContextValve" + quid "3DFE490303A7" + collaborators (list link_list + (object Link + quid "3DFE492F033C" + supplier "StandardContextValve" + quidu "3DFE490303A7" + messages (list Messages + (object Message "map //return Wrapper" + quid "3DFE492F033D" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1.1.1" + ordinal 3 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE494A0150" + supplier "StandardWrapper" + quidu "3DFE49370351" + messages (list Messages + (object Message "invoke()" + quid "3DFE494A0151" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1.1.2" + ordinal 4 + Operation "invoke" + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardWrapper" + quid "3DFE49370351" + collaborators (list link_list + (object Link + quid "3DFE495F0287" + supplier "StandardPipeline" + quidu "3DFE48B80088" + messages (list Messages + (object Message "invoke()" + quid "3DFE495F0288" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.1.1.2.1" + ordinal 5 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "StandardWrapperValve" + quid "3DFE49890056" + collaborators (list link_list + (object Link + quid "3DFE49DB018A" + supplier "StandardWrapperValve" + quidu "3DFE49890056") + (object Link + quid "3DFE49EC004E" + supplier "StandardWrapper" + quidu "3DFE49370351" + messages (list Messages + (object Message "allocate()" + quid "3DFE49EC004F" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.2.1.1" + ordinal 8 + quidu "000000000000" + creation FALSE) + (object Message "return servlet" + quid "3DFE4A200067" + frequency "Aperiodic" + synchronization "Return" + dir "ToClientFromSupplier" + sequence "1.2.1.1.1" + ordinal 9 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE4A29027D" + supplier "ApplicationFilterChain" + quidu "3DFE4A1500B2" + messages (list Messages + (object Message "createFilterChain()" + quid "3DFE4A29027E" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.2.1.1.1.1" + ordinal 10 + quidu "000000000000" + creation FALSE) + (object Message "doFilter()" + quid "3DFE4A490283" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.2.1.2" + ordinal 11 + Operation "doFilter" + quidu "000000000000" + creation FALSE) + (object Message "return" + quid "3DFE4CB4025B" + frequency "Aperiodic" + synchronization "Return" + dir "ToClientFromSupplier" + sequence "1.2.1.2.3" + ordinal 14 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "ApplicationFilterChain" + quid "3DFE4A1500B2" + collaborators (list link_list + (object Link + quid "3DFE4C2701C2" + supplier "ApplicationFilterChain" + quidu "3DFE4A1500B2" + messages (list Messages + (object Message "internalDoFilter()" + quid "3DFE4C2701C3" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.2.1.2.1" + ordinal 12 + quidu "000000000000" + creation FALSE))) + (object Link + quid "3DFE4CA502BE" + supplier "$UNNAMED$0" + quidu "3DFE4BAE0056" + messages (list Messages + (object Message "service()" + quid "3DFE4CA502BF" + frequency "Aperiodic" + synchronization "Simple" + dir "FromClientToSupplier" + sequence "1.2.1.2.2" + ordinal 13 + quidu "000000000000" + creation FALSE)))) + persistence "Transient" + creationObj FALSE + multi FALSE) + (object Object "$UNNAMED$0" + quid "3DFE4BAE0056" + stereotype "Servlet" + persistence "Transient" + creationObj TRUE + multi FALSE)))) + logical_presentations (list unit_reference_list + (object ClassDiagram "Main" + quid "3DFDF6D2021B" + title "Main" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list)) + (object ClassDiagram "high level packaging" + quid "3E42DE75004B" + title "high level packaging" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list + (object CategoryView "Logical View::org.apache.catalina" @91 + location (1024, 752) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @91 + location (780, 668) + fill_color 13434879 + nlines 2 + max_width 488 + justify 0 + label "org.apache.catalina") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DE8D0082" + width 500 + height 181) + (object CategoryView "Logical View::org.apache.coyote" @92 + location (512, 1184) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @92 + location (237, 1090) + fill_color 13434879 + nlines 2 + max_width 550 + justify 0 + label "org.apache.coyote") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DE9F0132" + width 563 + height 200) + (object CategoryView "Logical View::org.apache.tomcat.util" @93 + location (1920, 1104) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @93 + location (1670, 1020) + fill_color 13434879 + nlines 2 + max_width 500 + justify 0 + label "org.apache.tomcat.util") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DEDF01F2" + width 512 + height 181) + (object ImportView "" @94 + stereotype TRUE + line_color 3342489 + quidu "3E42DEF601EB" + client @91 + supplier @93 + line_style 0) + (object ImportView "" @95 + stereotype TRUE + line_color 3342489 + quidu "3E42DEFC00B3" + client @92 + supplier @93 + line_style 0) + (object CategoryView "Logical View::org.apache.jasper" @96 + location (1728, 624) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @96 + location (1437, 540) + fill_color 13434879 + nlines 2 + max_width 582 + justify 0 + label "org.apache.jasper") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E42DEFF0270" + width 594 + height 181) + (object ImportView "" @97 + stereotype TRUE + line_color 3342489 + quidu "3E42DF700060" + client @91 + supplier @92 + line_style 0) + (object NoteView @98 + location (1200, 208) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @98 + location (847, 143) + fill_color 13434879 + nlines 2 + max_width 671 + label "High Level package dependencies") + line_color 3342489 + fill_color 13434879 + width 731 + height 143) + (object CategoryView "Logical View::org.apache.naming" @99 + location (352, 304) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @99 + location (83, 220) + fill_color 13434879 + nlines 2 + max_width 538 + justify 0 + label "org.apache.naming") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3E43D1580339" + width 550 + height 181) + (object ImportView "" @100 + stereotype TRUE + line_color 3342489 + quidu "3E43D165039C" + client @91 + supplier @99 + line_style 0))) + (object InteractionDiagram "1. catalina_load" + mechanism_ref @82 + quid "3DFDF8EE0267" + title "1. catalina_load" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 519 + items (list diagram_item_list + (object InterObjView "Bootstrap" @101 + location (224, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @101 + location (224, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "Bootstrap") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFDF8FD0345" + width 300 + height 1972 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @102 + location (224, 368) + line_color 3342489 + InterObjView @101 + height 1738 + y_coord 1678 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @103 + location (224, 368) + line_color 3342489 + InterObjView @101 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "Digester" @104 + location (896, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @104 + location (896, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "Digester") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFDFAF201A1" + width 300 + height 1972 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @105 + location (896, 1232) + line_color 3342489 + InterObjView @104 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @106 + location (896, 1312) + line_color 3342489 + InterObjView @104 + height 264 + y_coord 204 + Nested FALSE)) + (object InterObjView "ServerLifecycleListener" @107 + location (1232, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @107 + location (1232, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "ServerLifecycleListener") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFDFB4B0217" + width 300 + height 1972 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @108 + location (1232, 1328) + line_color 3342489 + InterObjView @107 + height 60 + y_coord 0 + Nested FALSE)) + (object InterObjView "GlobalResourcesLifecycleListener" @109 + location (1568, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @109 + location (1568, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 322 + justify 0 + label "GlobalResourcesLifecycleListener") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFDFB7A02AB" + width 340 + height 1972 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @110 + location (1568, 1456) + line_color 3342489 + InterObjView @109 + height 60 + y_coord 0 + Nested FALSE)) + (object InterObjView "SecurityConfig" @111 + location (1920, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @111 + location (1920, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "SecurityConfig") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFDFBD802BA" + width 300 + height 1972 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @112 + location (1920, 1600) + line_color 3342489 + InterObjView @111 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @113 + location (1920, 1680) + line_color 3342489 + InterObjView @111 + height 146 + y_coord 86 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @114 + location (1920, 1760) + line_color 3342489 + InterObjView @111 + height 60 + y_coord 0 + Nested TRUE)) + (object SelfMessView "" @115 + location (16, 368) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @116 + Parent_View @115 + location (315, 324) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDF9210009" + anchor_loc 1 + nlines 1 + max_width 340 + justify 0 + label "initClassLoaders()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @101 + supplier @101 + Focus_Src @102 + Focus_Entry @103 + origin (240, 368) + terminus (390, 368) + ordinal 0) + (object NoteView @117 + location (1152, 1072) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @117 + location (1014, 1012) + fill_color 13434879 + nlines 2 + max_width 240 + label "parse server.xml") + line_color 3342489 + fill_color 13434879 + width 300 + height 132) + (object NoteView @118 + location (1376, 80) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @118 + location (1238, 20) + fill_color 13434879 + nlines 2 + max_width 240 + label "MBeans") + line_color 3342489 + fill_color 13434879 + width 300 + height 132) + (object AttachView "" @119 + stereotype TRUE + line_color 3342489 + client @118 + supplier @107 + line_style 0) + (object AttachView "" @120 + stereotype TRUE + line_color 3342489 + client @109 + supplier @118 + line_style 0) + (object NoteView @121 + location (2160, 2176) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @121 + location (1947, 2113) + fill_color 13434879 + nlines 2 + max_width 390 + label "#1Catalina.load()") + line_color 3342489 + fill_color 13434879 + width 450 + height 138) + (object InterObjView "Catalina" @122 + location (560, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @122 + location (560, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "Catalina") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFDF90A0330" + width 300 + height 1972 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @123 + location (560, 464) + line_color 3342489 + InterObjView @122 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @124 + location (560, 608) + line_color 3342489 + InterObjView @122 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @125 + location (560, 720) + line_color 3342489 + InterObjView @122 + height 1326 + y_coord 1266 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @126 + location (560, 896) + line_color 3342489 + InterObjView @122 + height 194 + y_coord 134 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @127 + location (560, 896) + InterObjView @122 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @128 + location (560, 1024) + line_color 3342489 + InterObjView @122 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @129 + location (560, 1024) + InterObjView @122 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @130 + location (560, 1152) + line_color 3342489 + InterObjView @122 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @131 + location (560, 1152) + InterObjView @122 + height 60 + y_coord 0 + Nested TRUE)) + (object SelfMessView "" @132 + location (16, 896) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @133 + Parent_View @132 + location (651, 852) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFA8001DA" + anchor_loc 1 + nlines 1 + max_width 160 + justify 0 + label "initDirs()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @122 + supplier @122 + Focus_Src @127 + Focus_Entry @126 + origin (576, 896) + terminus (726, 896) + ordinal 4) + (object SelfMessView "" @134 + location (16, 1024) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @135 + Parent_View @134 + location (701, 981) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFA8B0347" + anchor_loc 1 + nlines 1 + max_width 228 + justify 0 + label "initNaming()" + pctDist 0.840000 + height 44 + orientation 0) + line_color 3342489 + client @122 + supplier @122 + Focus_Src @129 + Focus_Entry @128 + origin (576, 1024) + terminus (726, 1024) + ordinal 5) + (object SelfMessView "" @136 + location (16, 1152) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @137 + Parent_View @136 + location (686, 1109) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFAAD01AC" + anchor_loc 1 + nlines 1 + max_width 180 + justify 0 + label "initialize()" + pctDist 0.733333 + height 44 + orientation 0) + line_color 3342489 + client @122 + supplier @122 + Focus_Src @131 + Focus_Entry @130 + origin (576, 1152) + terminus (726, 1152) + ordinal 6) + (object InterMessView "" @138 + location (16, 464) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @139 + Parent_View @138 + location (389, 437) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDF91A010D" + anchor_loc 1 + nlines 1 + max_width 265 + justify 0 + label "newInstance()" + pctDist 0.495082 + height 28 + orientation 0) + line_color 3342489 + client @101 + supplier @122 + Focus_Src @102 + Focus_Entry @123 + origin (239, 464) + terminus (544, 464) + ordinal 1) + (object InterMessView "" @140 + location (16, 608) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @141 + Parent_View @140 + location (456, 565) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDF97900C2" + anchor_loc 1 + nlines 1 + max_width 445 + justify 0 + label "setParentClassLoader()" + pctDist 0.711475 + height 44 + orientation 0) + line_color 3342489 + client @101 + supplier @122 + Focus_Src @102 + Focus_Entry @124 + origin (239, 608) + terminus (544, 608) + ordinal 2) + (object InterMessView "" @142 + location (16, 720) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @143 + Parent_View @142 + location (391, 676) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFA3402F2" + anchor_loc 1 + nlines 1 + max_width 108 + justify 0 + label "load()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @101 + supplier @122 + Focus_Src @102 + Focus_Entry @125 + origin (239, 720) + terminus (544, 720) + ordinal 3) + (object InterMessView "" @144 + location (16, 1232) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @145 + Parent_View @144 + location (727, 1188) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFAF800C4" + anchor_loc 1 + nlines 1 + max_width 302 + justify 0 + label "createDigester()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @122 + supplier @104 + Focus_Src @125 + Focus_Entry @105 + origin (575, 1232) + terminus (880, 1232) + ordinal 7) + (object InterMessView "" @146 + location (16, 1312) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @147 + Parent_View @146 + location (727, 1268) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFB0100B2" + anchor_loc 1 + nlines 1 + max_width 136 + justify 0 + label "parse()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @122 + supplier @104 + Focus_Src @125 + Focus_Entry @106 + origin (575, 1312) + terminus (880, 1312) + ordinal 8) + (object AttachView "" @148 + stereotype TRUE + line_color 3342489 + client @147 + supplier @117 + line_style 0) + (object InterMessView "" @149 + location (16, 1328) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @150 + Parent_View @149 + location (1063, 1284) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFB8400A7" + anchor_loc 1 + nlines 1 + max_width 265 + justify 0 + label "newInstance()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @104 + supplier @107 + Focus_Src @106 + Focus_Entry @108 + origin (911, 1328) + terminus (1216, 1328) + ordinal 9) + (object InterMessView "" @151 + location (16, 1456) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @152 + Parent_View @151 + location (1231, 1412) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFB920148" + anchor_loc 1 + nlines 1 + max_width 265 + justify 0 + label "newInstance()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @104 + supplier @109 + Focus_Src @106 + Focus_Entry @110 + origin (911, 1456) + terminus (1552, 1456) + ordinal 10) + (object InterMessView "" @153 + location (16, 1600) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @154 + Parent_View @153 + location (1239, 1556) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFBEA00C2" + anchor_loc 1 + nlines 1 + max_width 265 + justify 0 + label "newInstance()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @122 + supplier @111 + Focus_Src @125 + Focus_Entry @112 + origin (575, 1600) + terminus (1904, 1600) + ordinal 11) + (object InterMessView "" @155 + location (16, 1680) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @156 + Parent_View @155 + location (1239, 1636) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFBF401F2" + anchor_loc 1 + nlines 1 + max_width 425 + justify 0 + label "setPackageDefinition()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @122 + supplier @111 + Focus_Src @125 + Focus_Entry @113 + origin (575, 1680) + terminus (1904, 1680) + ordinal 12) + (object InterMessView "" @157 + location (16, 1760) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @158 + Parent_View @157 + location (1239, 1716) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFC1203C2" + anchor_loc 1 + nlines 1 + max_width 386 + justify 0 + label "setPackageAccess()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @122 + supplier @111 + Focus_Src @125 + Focus_Entry @114 + origin (575, 1760) + terminus (1904, 1760) + ordinal 13))) + (object InteractionDiagram "2. catalina_initliaze" + mechanism_ref @83 + quid "3DFDFC44002A" + title "2. catalina_initliaze" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 87 + items (list diagram_item_list + (object InterObjView "Catalina" @159 + location (176, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @159 + location (176, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "Catalina") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFDFC8F015F" + width 300 + height 1180 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @160 + location (176, 400) + line_color 3342489 + InterObjView @159 + height 914 + y_coord 854 + Nested FALSE)) + (object InterObjView "StandardServer" @161 + location (496, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @161 + location (496, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardServer") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFDFCCB006B" + width 300 + height 1180 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @162 + location (496, 400) + line_color 3342489 + InterObjView @161 + height 854 + y_coord 794 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @163 + location (496, 480) + line_color 3342489 + InterObjView @161 + height 768 + y_coord 708 + Nested TRUE)) + (object InterObjView "StandardService" @164 + location (832, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @164 + location (832, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardService") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFDFD370020" + width 300 + height 1180 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @165 + location (832, 480) + line_color 3342489 + InterObjView @164 + height 708 + y_coord 648 + Nested FALSE)) + (object InterObjView "CoyoteConnector" @166 + location (1168, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @166 + location (1168, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "CoyoteConnector") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFDFE810313" + width 300 + height 1180 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @167 + location (1168, 528) + line_color 3342489 + InterObjView @166 + height 600 + y_coord 540 + Nested FALSE)) + (object InterObjView "CoyoteAdapter" @168 + location (1504, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @168 + location (1504, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "CoyoteAdapter") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFDFFA00226" + width 300 + height 1180 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @169 + location (1504, 576) + line_color 3342489 + InterObjView @168 + height 60 + y_coord 0 + Nested FALSE)) + (object InterObjView "Http11Protocol" @170 + location (1808, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @170 + location (1808, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "Http11Protocol") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE016601A6" + width 300 + height 1180 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @171 + location (1808, 704) + line_color 3342489 + InterObjView @170 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @172 + location (1808, 832) + line_color 3342489 + InterObjView @170 + height 60 + y_coord 0 + Nested FALSE)) + (object InterObjView "JkCoyoteAdapter" @173 + location (2144, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @173 + location (2144, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "JkCoyoteAdapter") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE01AD01A8" + width 300 + height 1180 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @174 + location (2144, 928) + line_color 3342489 + InterObjView @173 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @175 + location (2144, 1008) + line_color 3342489 + InterObjView @173 + height 60 + y_coord 0 + Nested FALSE)) + (object InterMessView "" @176 + location (16, 400) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @177 + Parent_View @176 + location (335, 356) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFD1F0076" + anchor_loc 1 + nlines 1 + max_width 180 + justify 0 + label "initialize()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @159 + supplier @161 + Focus_Src @160 + Focus_Entry @162 + origin (191, 400) + terminus (480, 400) + ordinal 0) + (object InterMessView "" @178 + location (16, 480) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @179 + Parent_View @178 + location (663, 436) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFD3D01C4" + anchor_loc 1 + nlines 1 + max_width 180 + justify 0 + label "initialize()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @161 + supplier @164 + Focus_Src @163 + Focus_Entry @165 + origin (511, 480) + terminus (816, 480) + ordinal 1) + (object InterMessView "" @180 + location (16, 528) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @181 + Parent_View @180 + location (999, 484) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFDFE990305" + anchor_loc 1 + nlines 1 + max_width 180 + justify 0 + label "initialize()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @164 + supplier @166 + Focus_Src @165 + Focus_Entry @167 + origin (847, 528) + terminus (1152, 528) + ordinal 2) + (object InterMessView "" @182 + location (16, 576) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @183 + Parent_View @182 + location (1335, 532) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE013D0217" + anchor_loc 1 + nlines 1 + max_width 106 + justify 0 + label "new()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @166 + supplier @168 + Focus_Src @167 + Focus_Entry @169 + origin (1183, 576) + terminus (1488, 576) + ordinal 3) + (object InterMessView "" @184 + location (1504, 704) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @185 + Parent_View @184 + location (1487, 660) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE01830330" + anchor_loc 1 + nlines 1 + max_width 106 + justify 0 + label "new()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @166 + supplier @170 + Focus_Src @167 + Focus_Entry @171 + origin (1183, 704) + terminus (1792, 704) + ordinal 4) + (object InterMessView "" @186 + location (1504, 832) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @187 + Parent_View @186 + location (1487, 788) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE0188032C" + anchor_loc 1 + nlines 1 + max_width 80 + justify 0 + label "init()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @166 + supplier @170 + Focus_Src @167 + Focus_Entry @172 + origin (1183, 832) + terminus (1792, 832) + ordinal 5) + (object InterMessView "" @188 + location (16, 928) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @189 + Parent_View @188 + location (1655, 884) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE01BC038C" + anchor_loc 1 + nlines 1 + max_width 106 + justify 0 + label "new()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @166 + supplier @173 + Focus_Src @167 + Focus_Entry @174 + origin (1183, 928) + terminus (2128, 928) + ordinal 6) + (object InterMessView "" @190 + location (16, 1008) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @191 + Parent_View @190 + location (1655, 964) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE01C30164" + anchor_loc 1 + nlines 1 + max_width 80 + justify 0 + label "init()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @166 + supplier @173 + Focus_Src @167 + Focus_Entry @175 + origin (1183, 1008) + terminus (2128, 1008) + ordinal 7) + (object NoteView @192 + location (2144, 2016) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @192 + location (1947, 1957) + fill_color 13434879 + nlines 2 + max_width 359 + label "#2 Catalina.initialize()") + line_color 3342489 + fill_color 13434879 + width 419 + height 131))) + (object InteractionDiagram "3. catalina_start" + mechanism_ref @84 + quid "3DFE026D02D1" + title "3. catalina_start" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 2481 + items (list diagram_item_list + (object InterObjView "Bootstrap" @193 + location (192, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @193 + location (192, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "Bootstrap") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE027700F5" + width 300 + height 2912 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @194 + location (192, 384) + line_color 3342489 + InterObjView @193 + height 2662 + y_coord 2602 + Nested FALSE)) + (object InterObjView "Catalina" @195 + location (480, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @195 + location (480, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "Catalina") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE027D0067" + width 300 + height 2912 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @196 + location (480, 384) + line_color 3342489 + InterObjView @195 + height 2602 + y_coord 2542 + Nested FALSE)) + (object InterObjView "StandardServer" @197 + location (784, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @197 + location (784, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardServer") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE02B30015" + width 300 + height 2912 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @198 + location (784, 416) + line_color 3342489 + InterObjView @197 + height 2510 + y_coord 2450 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @199 + location (784, 480) + line_color 3342489 + InterObjView @197 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @200 + location (784, 592) + line_color 3342489 + InterObjView @197 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "StandardService" @201 + location (1088, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @201 + location (1088, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardService") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE030400E3" + width 300 + height 2912 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @202 + location (1088, 704) + line_color 3342489 + InterObjView @201 + height 2162 + y_coord 2102 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @203 + location (1088, 752) + line_color 3342489 + InterObjView @201 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @204 + location (1088, 864) + line_color 3342489 + InterObjView @201 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "StandardEngine" @205 + location (1424, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @205 + location (1424, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 332 + justify 0 + label "StandardEngine") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE034700C2" + width 350 + height 2912 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @206 + location (1424, 976) + line_color 3342489 + InterObjView @205 + height 1830 + y_coord 1770 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @207 + location (1424, 1056) + line_color 3342489 + InterObjView @205 + height 1744 + y_coord 1684 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @208 + location (1424, 1056) + line_color 3342489 + InterObjView @205 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @209 + location (1424, 1168) + line_color 3342489 + InterObjView @205 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @210 + location (1424, 1296) + line_color 3342489 + InterObjView @205 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @211 + location (1424, 1408) + line_color 3342489 + InterObjView @205 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @212 + location (1424, 1536) + line_color 3342489 + InterObjView @205 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @213 + location (1424, 1648) + line_color 3342489 + InterObjView @205 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "StandardHost" @214 + location (1760, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @214 + location (1760, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardHost") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE03F2035D" + width 300 + height 2912 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @215 + location (1760, 1760) + line_color 3342489 + InterObjView @214 + height 980 + y_coord 920 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @216 + location (1760, 1808) + line_color 3342489 + InterObjView @214 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @217 + location (1760, 1920) + line_color 3342489 + InterObjView @214 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @218 + location (1760, 2032) + line_color 3342489 + InterObjView @214 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @219 + location (1760, 2144) + line_color 3342489 + InterObjView @214 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @220 + location (1760, 2256) + line_color 3342489 + InterObjView @214 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "StandardPipeline" @221 + location (2080, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @221 + location (2080, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 326 + justify 0 + label "StandardPipeline") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE047D006D" + width 344 + height 2912 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @222 + location (2080, 2368) + line_color 3342489 + InterObjView @221 + height 312 + y_coord 252 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @223 + location (2080, 2416) + line_color 3342489 + InterObjView @221 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @224 + location (2080, 2480) + line_color 3342489 + InterObjView @221 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @225 + location (2080, 2560) + line_color 3342489 + InterObjView @221 + height 60 + y_coord 0 + Nested TRUE)) + (object InterMessView "" @226 + location (16, 384) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @227 + Parent_View @226 + location (335, 340) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE02830374" + anchor_loc 1 + nlines 1 + max_width 110 + justify 0 + label "start()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @193 + supplier @195 + Focus_Src @194 + Focus_Entry @196 + origin (207, 384) + terminus (464, 384) + ordinal 0) + (object InterMessView "" @228 + location (16, 416) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @229 + Parent_View @228 + location (631, 372) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE02BA0188" + anchor_loc 1 + nlines 1 + max_width 110 + justify 0 + label "start()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @195 + supplier @197 + Focus_Src @196 + Focus_Entry @198 + origin (495, 416) + terminus (768, 416) + ordinal 1) + (object SelfMessView "" @230 + location (16, 480) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @231 + Parent_View @230 + location (1244, 437) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE02D3006C" + anchor_loc 1 + nlines 1 + max_width 854 + justify 0 + label "fireLifecycleEvent(BEFORE_START_EVENT)" + pctDist 2.960000 + height 44 + orientation 0) + line_color 3342489 + client @197 + supplier @197 + Focus_Src @198 + Focus_Entry @199 + origin (800, 480) + terminus (950, 480) + ordinal 2) + (object SelfMessView "" @232 + location (16, 592) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @233 + Parent_View @232 + location (1146, 549) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE02DF02DF" + anchor_loc 1 + nlines 1 + max_width 658 + justify 0 + label "fireLifecycleEvent(START_EVENT)" + pctDist 2.313333 + height 44 + orientation 0) + line_color 3342489 + client @197 + supplier @197 + Focus_Src @198 + Focus_Entry @200 + origin (800, 592) + terminus (950, 592) + ordinal 3) + (object InterMessView "" @234 + location (16, 704) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @235 + Parent_View @234 + location (935, 660) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE030C02B3" + anchor_loc 1 + nlines 1 + max_width 110 + justify 0 + label "start()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @197 + supplier @201 + Focus_Src @198 + Focus_Entry @202 + origin (799, 704) + terminus (1072, 704) + ordinal 4) + (object SelfMessView "" @236 + location (16, 752) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @237 + Parent_View @236 + location (1531, 708) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE031D0022" + anchor_loc 1 + nlines 1 + max_width 854 + justify 0 + label "fireLifecycleEvent(BEFORE_START_EVENT)" + pctDist 2.853333 + height 45 + orientation 0) + line_color 3342489 + client @201 + supplier @201 + Focus_Src @202 + Focus_Entry @203 + origin (1104, 752) + terminus (1254, 752) + ordinal 5) + (object SelfMessView "" @238 + location (16, 864) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @239 + Parent_View @238 + location (1449, 821) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE0330019B" + anchor_loc 1 + nlines 1 + max_width 658 + justify 0 + label "fireLifecycleEvent(START_EVENT)" + pctDist 2.306667 + height 44 + orientation 0) + line_color 3342489 + client @201 + supplier @201 + Focus_Src @202 + Focus_Entry @204 + origin (1104, 864) + terminus (1254, 864) + ordinal 6) + (object InterMessView "" @240 + location (16, 976) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @241 + Parent_View @240 + location (1255, 932) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE0370018A" + anchor_loc 1 + nlines 1 + max_width 110 + justify 0 + label "start()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @201 + supplier @205 + Focus_Src @202 + Focus_Entry @206 + origin (1103, 976) + terminus (1408, 976) + ordinal 7) + (object SelfMessView "" @242 + location (16, 1056) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @243 + Parent_View @242 + location (1865, 1014) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE03750051" + anchor_loc 1 + nlines 1 + max_width 854 + justify 0 + label "fireLifecycleEvent(BEFORE_START_EVENT)" + pctDist 2.840000 + height 43 + orientation 0) + line_color 3342489 + client @205 + supplier @205 + Focus_Src @207 + Focus_Entry @208 + origin (1440, 1056) + terminus (1590, 1056) + ordinal 8) + (object SelfMessView "" @244 + location (16, 1168) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @245 + Parent_View @244 + location (1639, 1141) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE0389001C" + anchor_loc 1 + nlines 1 + max_width 373 + justify 0 + label "addDefaultMapper()" + pctDist 1.326667 + height 28 + orientation 0) + line_color 3342489 + client @205 + supplier @205 + Focus_Src @207 + Focus_Entry @209 + origin (1440, 1168) + terminus (1590, 1168) + ordinal 9) + (object SelfMessView "" @246 + location (16, 1296) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @247 + Parent_View @246 + location (1592, 1268) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE03980281" + anchor_loc 1 + nlines 1 + max_width 238 + justify 0 + label "logger.start()" + pctDist 1.020000 + height 29 + orientation 0) + line_color 3342489 + client @205 + supplier @205 + Focus_Src @207 + Focus_Entry @210 + origin (1440, 1296) + terminus (1590, 1296) + ordinal 10) + (object SelfMessView "" @248 + location (16, 1408) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @249 + Parent_View @248 + location (1593, 1380) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE03A80107" + anchor_loc 1 + nlines 1 + max_width 226 + justify 0 + label "realm.start()" + pctDist 1.026667 + height 29 + orientation 0) + line_color 3342489 + client @205 + supplier @205 + Focus_Src @207 + Focus_Entry @211 + origin (1440, 1408) + terminus (1590, 1408) + ordinal 11) + (object SelfMessView "" @250 + location (16, 1536) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @251 + Parent_View @250 + location (1608, 1508) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE03BD000D" + anchor_loc 1 + nlines 1 + max_width 259 + justify 0 + label "findMappers()" + pctDist 1.120000 + height 29 + orientation 0) + line_color 3342489 + client @205 + supplier @205 + Focus_Src @207 + Focus_Entry @212 + origin (1440, 1536) + terminus (1590, 1536) + ordinal 12) + (object SelfMessView "" @252 + location (16, 1648) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @253 + Parent_View @252 + location (1515, 1604) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE03E000A4" + anchor_loc 1 + nlines 1 + max_width 251 + justify 0 + label "findChildren()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @205 + supplier @205 + Focus_Src @207 + Focus_Entry @213 + origin (1440, 1648) + terminus (1590, 1648) + ordinal 13) + (object InterMessView "" @254 + location (1664, 1760) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @255 + Parent_View @254 + location (1591, 1716) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE03FB027A" + anchor_loc 1 + nlines 1 + max_width 110 + justify 0 + label "start()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @205 + supplier @214 + Focus_Src @207 + Focus_Entry @215 + origin (1439, 1760) + terminus (1744, 1760) + ordinal 14) + (object SelfMessView "" @256 + location (16, 1808) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @257 + Parent_View @256 + location (1606, 1784) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE043B02AE" + anchor_loc 1 + nlines 1 + max_width 854 + justify 0 + label "fireLifecycleEvent(BEFORE_START_EVENT)" + pctDist -1.133333 + height 24 + orientation 0) + line_color 3342489 + client @214 + supplier @214 + Focus_Src @215 + Focus_Entry @216 + origin (1776, 1808) + terminus (1926, 1808) + ordinal 15) + (object SelfMessView "" @258 + location (16, 1920) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @259 + Parent_View @258 + location (1963, 1877) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE045C021F" + anchor_loc 1 + nlines 1 + max_width 373 + justify 0 + label "addDefaultMapper()" + pctDist 1.253333 + height 44 + orientation 0) + line_color 3342489 + client @214 + supplier @214 + Focus_Src @215 + Focus_Entry @217 + origin (1776, 1920) + terminus (1926, 1920) + ordinal 16) + (object InterMessView "" @260 + location (2000, 2368) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @261 + Parent_View @260 + location (1919, 2324) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE048E00B9" + anchor_loc 1 + nlines 1 + max_width 110 + justify 0 + label "start()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @214 + supplier @221 + Focus_Src @215 + Focus_Entry @222 + origin (1775, 2368) + terminus (2064, 2368) + ordinal 20) + (object SelfMessView "" @262 + location (16, 2032) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @263 + Parent_View @262 + location (1916, 2004) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE049B000C" + anchor_loc 1 + nlines 1 + max_width 238 + justify 0 + label "logger.start()" + pctDist 0.933333 + height 29 + orientation 0) + line_color 3342489 + client @214 + supplier @214 + Focus_Src @215 + Focus_Entry @218 + origin (1776, 2032) + terminus (1926, 2032) + ordinal 17) + (object SelfMessView "" @264 + location (16, 2144) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @265 + Parent_View @264 + location (1916, 2117) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE04A303BB" + anchor_loc 1 + nlines 1 + max_width 238 + justify 0 + label "findMapper()" + pctDist 0.933333 + height 28 + orientation 0) + line_color 3342489 + client @214 + supplier @214 + Focus_Src @215 + Focus_Entry @219 + origin (1776, 2144) + terminus (1926, 2144) + ordinal 18) + (object SelfMessView "" @266 + location (16, 2256) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @267 + Parent_View @266 + location (1916, 2228) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE04A90342" + anchor_loc 1 + nlines 1 + max_width 251 + justify 0 + label "findChildren()" + pctDist 0.933333 + height 29 + orientation 0) + line_color 3342489 + client @214 + supplier @214 + Focus_Src @215 + Focus_Entry @220 + origin (1776, 2256) + terminus (1926, 2256) + ordinal 19) + (object NoteView @268 + location (2128, 1488) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @268 + location (1915, 1422) + fill_color 13434879 + nlines 2 + max_width 390 + label "#1 Catalina.start()") + line_color 3342489 + fill_color 13434879 + width 450 + height 144) + (object SelfMessView "" @269 + location (16, 2416) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @270 + Parent_View @269 + location (1644, 2498) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE05780138" + anchor_loc 1 + nlines 1 + max_width 854 + justify 0 + label "fireLifecycleEvent(BEFORE_START_EVENT)" + pctDist -3.020000 + height 45 + orientation 0) + line_color 3342489 + client @221 + supplier @221 + Focus_Src @222 + Focus_Entry @223 + origin (2096, 2416) + terminus (2246, 2416) + ordinal 21) + (object SelfMessView "" @271 + location (16, 2480) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @272 + Parent_View @271 + location (1705, 2582) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE05A80398" + anchor_loc 1 + nlines 1 + max_width 658 + justify 0 + label "fireLifecycleEvent(START_EVENT)" + pctDist -2.613333 + height 45 + orientation 0) + line_color 3342489 + client @221 + supplier @221 + Focus_Src @222 + Focus_Entry @224 + origin (2096, 2480) + terminus (2246, 2480) + ordinal 22) + (object SelfMessView "" @273 + location (16, 2560) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @274 + Parent_View @273 + location (1737, 2423) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE05BA0196" + anchor_loc 1 + nlines 1 + max_width 658 + justify 0 + label "fireLifecycleEvent(AFTER_EVENT)" + pctDist -2.393333 + height 138 + orientation 0) + line_color 3342489 + client @221 + supplier @221 + Focus_Src @222 + Focus_Entry @225 + origin (2096, 2560) + terminus (2246, 2560) + ordinal 23) + (object NoteView @275 + location (960, 1680) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @275 + location (635, 1571) + fill_color 13434879 + nlines 4 + max_width 615 + label "All StandardX will fire these events.") + line_color 3342489 + fill_color 13434879 + width 675 + height 231) + (object AttachView "" @276 + stereotype TRUE + line_color 3342489 + client @275 + supplier @272 + line_style 0) + (object AttachView "" @277 + stereotype TRUE + line_color 3342489 + client @275 + supplier @270 + line_style 0) + (object AttachView "" @278 + stereotype TRUE + line_color 3342489 + client @275 + supplier @274 + line_style 0))) + (object InteractionDiagram "4. catalina_start_2" + mechanism_ref @85 + quid "3DFE050900BF" + title "4. catalina_start_2" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 1087 + items (list diagram_item_list + (object InterObjView "StandardHost" @279 + location (208, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @279 + location (208, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardHost") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE0538017B" + width 300 + height 2114 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @280 + location (208, 384) + line_color 3342489 + InterObjView @279 + height 1864 + y_coord 1804 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @281 + location (208, 384) + line_color 3342489 + InterObjView @279 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @282 + location (208, 1088) + line_color 3342489 + InterObjView @279 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @283 + location (208, 1616) + line_color 3342489 + InterObjView @279 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "HostConfig" @284 + location (544, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @284 + location (544, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "HostConfig") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE06A60131" + width 300 + height 2114 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @285 + location (544, 512) + line_color 3342489 + InterObjView @284 + height 696 + y_coord 636 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @286 + location (544, 576) + line_color 3342489 + InterObjView @284 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @287 + location (544, 688) + line_color 3342489 + InterObjView @284 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @288 + location (544, 784) + line_color 3342489 + InterObjView @284 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @289 + location (544, 896) + line_color 3342489 + InterObjView @284 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @290 + location (544, 1008) + line_color 3342489 + InterObjView @284 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @291 + location (544, 1536) + line_color 3342489 + InterObjView @284 + height 200 + y_coord 140 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @292 + location (544, 1536) + line_color 3342489 + InterObjView @284 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "StandardHostDeployer" @293 + location (944, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @293 + location (944, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 426 + justify 0 + label "StandardHostDeployer") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE079A0055" + width 444 + height 2114 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @294 + location (944, 1280) + line_color 3342489 + InterObjView @293 + height 824 + y_coord 764 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @295 + location (944, 2128) + line_color 3342489 + InterObjView @293 + height 60 + y_coord 0 + Nested FALSE)) + (object InterObjView "Digester" @296 + location (1328, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @296 + location (1328, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "Digester") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE07C9034C" + width 300 + height 2114 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @297 + location (1328, 1280) + line_color 3342489 + InterObjView @296 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @298 + location (1328, 1488) + line_color 3342489 + InterObjView @296 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @299 + location (1328, 1984) + line_color 3342489 + InterObjView @296 + height 60 + y_coord 0 + Nested FALSE)) + (object InterObjView "ContextRuleSet" @300 + location (1648, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @300 + location (1648, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "ContextRuleSet") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE0834016F" + width 300 + height 2114 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @301 + location (1648, 1408) + line_color 3342489 + InterObjView @300 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @302 + location (1648, 1888) + line_color 3342489 + InterObjView @300 + height 60 + y_coord 0 + Nested FALSE)) + (object InterObjView "NamingRuleSet" @303 + location (1968, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @303 + location (1968, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "NamingRuleSet") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE08D00173" + width 300 + height 2114 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @304 + location (1968, 1792) + line_color 3342489 + InterObjView @303 + height 60 + y_coord 0 + Nested FALSE)) + (object SelfMessView "" @305 + location (0, 384) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @306 + Parent_View @305 + location (555, 342) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE066C0341" + anchor_loc 1 + nlines 1 + max_width 651 + justify 0 + label "fireLifecycleEvent(START_EVENT)" + pctDist 2.206667 + height 43 + orientation 0) + line_color 3342489 + client @279 + supplier @279 + Focus_Src @280 + Focus_Entry @281 + origin (224, 384) + terminus (374, 384) + ordinal 0) + (object InterMessView "" @307 + location (384, 512) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @308 + Parent_View @307 + location (486, 468) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE06D20294" + anchor_loc 1 + nlines 1 + max_width 507 + justify 0 + label "interested[i].lifecycleEvent()" + pctDist 0.865574 + height 45 + orientation 0) + line_color 3342489 + client @279 + supplier @284 + Focus_Src @280 + Focus_Entry @285 + origin (223, 512) + terminus (528, 512) + ordinal 1) + (object SelfMessView "" @309 + location (16, 576) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @310 + Parent_View @309 + location (713, 537) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE06E9028D" + anchor_loc 1 + nlines 1 + max_width 297 + justify 0 + label "setDeployXML()" + pctDist 1.026667 + height 40 + orientation 0) + line_color 3342489 + client @284 + supplier @284 + Focus_Src @285 + Focus_Entry @286 + origin (560, 576) + terminus (710, 576) + ordinal 2) + (object SelfMessView "" @311 + location (16, 688) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @312 + Parent_View @311 + location (714, 645) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE06F300FF" + anchor_loc 1 + nlines 1 + max_width 288 + justify 0 + label "setLiveDeploy()" + pctDist 1.033333 + height 44 + orientation 0) + line_color 3342489 + client @284 + supplier @284 + Focus_Src @285 + Focus_Entry @287 + origin (560, 688) + terminus (710, 688) + ordinal 3) + (object SelfMessView "" @313 + location (16, 784) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @314 + Parent_View @313 + location (732, 756) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE06FB00D9" + anchor_loc 1 + nlines 1 + max_width 326 + justify 0 + label "setUnpacksWar()" + pctDist 1.153333 + height 29 + orientation 0) + line_color 3342489 + client @284 + supplier @284 + Focus_Src @285 + Focus_Entry @288 + origin (560, 784) + terminus (710, 784) + ordinal 4) + (object SelfMessView "" @315 + location (16, 896) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @316 + Parent_View @315 + location (747, 868) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE070C0015" + anchor_loc 1 + nlines 1 + max_width 350 + justify 0 + label "setXMLValidation()" + pctDist 1.246667 + height 29 + orientation 0) + line_color 3342489 + client @284 + supplier @284 + Focus_Src @285 + Focus_Entry @289 + origin (560, 896) + terminus (710, 896) + ordinal 5) + (object SelfMessView "" @317 + location (16, 1008) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @318 + Parent_View @317 + location (762, 980) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE073B0031" + anchor_loc 1 + nlines 1 + max_width 359 + justify 0 + label "deployDescriptors()" + pctDist 1.346667 + height 29 + orientation 0) + line_color 3342489 + client @284 + supplier @284 + Focus_Src @285 + Focus_Entry @290 + origin (560, 1008) + terminus (710, 1008) + ordinal 6) + (object InterMessView "" @319 + location (16, 1088) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @320 + Parent_View @319 + location (376, 1044) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE078B03BB" + anchor_loc 1 + nlines 1 + max_width 136 + justify 0 + label "install()" + pctDist 0.500000 + height 45 + orientation 1) + line_color 3342489 + client @284 + supplier @279 + Focus_Src @285 + Focus_Entry @282 + origin (528, 1088) + terminus (224, 1088) + ordinal 7) + (object InterMessView "" @321 + location (576, 1280) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @322 + Parent_View @321 + location (575, 1236) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE07B100BE" + anchor_loc 1 + nlines 1 + max_width 136 + justify 0 + label "install()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @279 + supplier @293 + Focus_Src @280 + Focus_Entry @294 + origin (223, 1280) + terminus (928, 1280) + ordinal 8) + (object InterMessView "" @323 + location (1152, 1280) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @324 + Parent_View @323 + location (1135, 1236) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE07D200ED" + anchor_loc 1 + nlines 1 + max_width 144 + justify 0 + label "create()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @293 + supplier @296 + Focus_Src @294 + Focus_Entry @297 + origin (959, 1280) + terminus (1312, 1280) + ordinal 9) + (object InterMessView "" @325 + location (1136, 1984) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @326 + Parent_View @325 + location (1135, 1940) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE07D603D7" + anchor_loc 1 + nlines 1 + max_width 136 + justify 0 + label "parse()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @293 + supplier @296 + Focus_Src @294 + Focus_Entry @299 + origin (959, 1984) + terminus (1312, 1984) + ordinal 16) + (object InterMessView "" @327 + location (1296, 1408) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @328 + Parent_View @327 + location (1295, 1364) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE08DA029B" + anchor_loc 1 + nlines 1 + max_width 106 + justify 0 + label "new()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @293 + supplier @300 + Focus_Src @294 + Focus_Entry @301 + origin (959, 1408) + terminus (1632, 1408) + ordinal 10) + (object InterMessView "" @329 + location (1456, 1792) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @330 + Parent_View @329 + location (1455, 1748) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE08E00091" + anchor_loc 1 + nlines 1 + max_width 106 + justify 0 + label "new()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @293 + supplier @303 + Focus_Src @294 + Focus_Entry @304 + origin (959, 1792) + terminus (1952, 1792) + ordinal 14) + (object InterMessView "" @331 + location (16, 1488) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @332 + Parent_View @331 + location (1182, 1445) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE08FA003D" + anchor_loc 1 + nlines 1 + max_width 387 + justify 0 + label "add(ContextRuleSet)" + pctDist 0.631728 + height 44 + orientation 0) + line_color 3342489 + client @293 + supplier @296 + Focus_Src @294 + Focus_Entry @298 + origin (959, 1488) + terminus (1312, 1488) + ordinal 11) + (object InterMessView "" @333 + location (1296, 1888) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @334 + Parent_View @333 + location (1295, 1844) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE0907015F" + anchor_loc 1 + nlines 1 + max_width 416 + justify 0 + label "add(NamingRuleSet())" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @293 + supplier @300 + Focus_Src @294 + Focus_Entry @302 + origin (959, 1888) + terminus (1632, 1888) + ordinal 15) + (object NoteView @335 + location (2096, 2384) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @335 + location (1893, 2315) + fill_color 13434879 + nlines 2 + max_width 371 + label "#2 Catalina.start()") + line_color 3342489 + fill_color 13434879 + width 431 + height 150) + (object SelfMessView "" @336 + location (16, 1536) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @337 + Parent_View @336 + location (697, 1493) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE131F0327" + anchor_loc 1 + nlines 1 + max_width 244 + justify 0 + label "deployApps()" + pctDist 0.913333 + height 43 + orientation 0) + line_color 3342489 + client @284 + supplier @284 + Focus_Src @291 + Focus_Entry @292 + origin (560, 1536) + terminus (710, 1536) + ordinal 12) + (object InterMessView "" @338 + location (16, 1616) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @339 + Parent_View @338 + location (376, 1572) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE132D0309" + anchor_loc 1 + nlines 1 + max_width 136 + justify 0 + label "install()" + pctDist 0.500000 + height 45 + orientation 1) + line_color 3342489 + client @284 + supplier @279 + Focus_Src @291 + Focus_Entry @283 + origin (528, 1616) + terminus (224, 1616) + ordinal 13) + (object InterMessView "" @340 + location (576, 2128) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @341 + Parent_View @340 + location (575, 2084) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE133A036C" + anchor_loc 1 + nlines 1 + max_width 463 + justify 0 + label "install() // same as above" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @279 + supplier @293 + Focus_Src @280 + Focus_Entry @295 + origin (223, 2128) + terminus (928, 2128) + ordinal 17))) + (object InteractionDiagram "5. catalina_start_3" + mechanism_ref @86 + quid "3DFE094A0346" + title "5. catalina_start_3" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list + (object InterObjView "Digester" @342 + location (176, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @342 + location (176, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "Digester") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE095A0371" + width 300 + height 1214 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @343 + location (176, 352) + line_color 3342489 + InterObjView @342 + height 996 + y_coord 936 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @344 + location (176, 352) + line_color 3342489 + InterObjView @342 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @345 + location (176, 448) + line_color 3342489 + InterObjView @342 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "Rule" @346 + location (480, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @346 + location (480, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "Rule") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE0E7400D0" + width 300 + height 1214 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @347 + location (480, 560) + line_color 3342489 + InterObjView @346 + height 728 + y_coord 668 + Nested FALSE)) + (object InterObjView "StandardContext" @348 + location (816, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @348 + location (816, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 332 + justify 0 + label "StandardContext") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE0FC502A1" + width 350 + height 1214 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @349 + location (816, 592) + line_color 3342489 + InterObjView @348 + height 264 + y_coord 204 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @350 + location (816, 1008) + line_color 3342489 + InterObjView @348 + height 60 + y_coord 0 + Nested FALSE)) + (object InterObjView "StandardPipeline" @351 + location (1184, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @351 + location (1184, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 363 + justify 0 + label "StandardPipeline") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE112F003F" + width 381 + height 1214 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @352 + location (1184, 736) + line_color 3342489 + InterObjView @351 + height 60 + y_coord 0 + Nested FALSE)) + (object InterObjView "StandardContextValve" @353 + location (1552, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @353 + location (1552, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 300 + justify 0 + label "StandardContextValve") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE110D0375" + width 318 + height 1214 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @354 + location (1552, 624) + line_color 3342489 + InterObjView @353 + height 60 + y_coord 0 + Nested FALSE)) + (object InterObjView "SetPropertiesRule" @355 + location (1920, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @355 + location (1920, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 363 + justify 0 + label "SetPropertiesRule") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE100303A4" + width 381 + height 1214 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @356 + location (1920, 928) + line_color 3342489 + InterObjView @355 + height 200 + y_coord 140 + Nested FALSE)) + (object InterObjView "SetNextRule" @357 + location (2272, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @357 + location (2272, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "SetNextRule") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE12690267" + width 300 + height 1214 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @358 + location (2272, 1168) + line_color 3342489 + InterObjView @357 + height 60 + y_coord 0 + Nested FALSE)) + (object SelfMessView "" @359 + location (0, 352) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @360 + Parent_View @359 + location (267, 308) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE0E7801DB" + anchor_loc 1 + nlines 1 + max_width 108 + justify 0 + label "parse" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @342 + supplier @342 + Focus_Src @343 + Focus_Entry @344 + origin (192, 352) + terminus (342, 352) + ordinal 0) + (object SelfMessView "" @361 + location (16, 448) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @362 + Parent_View @361 + location (345, 420) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE0F2F03D2" + anchor_loc 1 + nlines 1 + max_width 267 + justify 0 + label "startElement()" + pctDist 1.020000 + height 28 + orientation 0) + line_color 3342489 + client @342 + supplier @342 + Focus_Src @343 + Focus_Entry @345 + origin (192, 448) + terminus (342, 448) + ordinal 1) + (object InterMessView "" @363 + location (336, 560) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @364 + Parent_View @363 + location (327, 516) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE0F400214" + anchor_loc 1 + nlines 1 + max_width 132 + justify 0 + label "begin()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @342 + supplier @346 + Focus_Src @343 + Focus_Entry @347 + origin (191, 560) + terminus (464, 560) + ordinal 2) + (object InterMessView "" @365 + location (16, 592) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @366 + Parent_View @365 + location (647, 548) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE0FD30266" + anchor_loc 1 + nlines 1 + max_width 265 + justify 0 + label "newInstance()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @346 + supplier @348 + Focus_Src @347 + Focus_Entry @349 + origin (495, 592) + terminus (800, 592) + ordinal 3) + (object InterMessView "" @367 + location (864, 928) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @368 + Parent_View @367 + location (1199, 884) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE102002E9" + anchor_loc 1 + nlines 1 + max_width 132 + justify 0 + label "begin()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @346 + supplier @355 + Focus_Src @347 + Focus_Entry @356 + origin (495, 928) + terminus (1904, 928) + ordinal 6) + (object InterMessView "" @369 + location (1008, 736) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @370 + Parent_View @369 + location (1139, 693) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE114A0193" + anchor_loc 1 + nlines 1 + max_width 610 + justify 0 + label "setBasic(StandardContextValve)" + pctDist 0.915014 + height 44 + orientation 0) + line_color 3342489 + client @348 + supplier @351 + Focus_Src @349 + Focus_Entry @352 + origin (831, 736) + terminus (1168, 736) + ordinal 5) + (object InterMessView "" @371 + location (16, 624) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @372 + Parent_View @371 + location (1183, 580) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE115E001F" + anchor_loc 1 + nlines 1 + max_width 106 + justify 0 + label "new()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @348 + supplier @353 + Focus_Src @349 + Focus_Entry @354 + origin (831, 624) + terminus (1536, 624) + ordinal 4) + (object InterMessView "" @373 + location (1440, 1008) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @374 + Parent_View @373 + location (1368, 964) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE11D50391" + anchor_loc 1 + nlines 1 + max_width 1190 + justify 0 + label "//Using BeanUtil, set the object properties (from ex: admin.xml)" + pctDist 0.500000 + height 45 + orientation 1) + line_color 3342489 + client @355 + supplier @348 + Focus_Src @356 + Focus_Entry @350 + origin (1904, 1008) + terminus (832, 1008) + ordinal 7) + (object InterMessView "" @375 + location (1392, 1168) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @376 + Parent_View @375 + location (1375, 1124) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE128501C8" + anchor_loc 1 + nlines 1 + max_width 99 + justify 0 + label "end()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @346 + supplier @357 + Focus_Src @347 + Focus_Entry @358 + origin (495, 1168) + terminus (2256, 1168) + ordinal 8) + (object NoteView @377 + location (1216, 80) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @377 + location (900, 15) + fill_color 13434879 + nlines 2 + max_width 596 + label "HostConfig.deployDescriptor()") + line_color 3342489 + fill_color 13434879 + width 656 + height 143) + (object NoteView @378 + location (2128, 1888) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @378 + location (1947, 1822) + fill_color 13434879 + nlines 2 + max_width 327 + label "#3 Catalina.start()") + line_color 3342489 + fill_color 13434879 + width 387 + height 144))) + (object InteractionDiagram "6. catalina_start_4" + mechanism_ref @87 + quid "3DFE13890008" + title "6. catalina_start_4" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 1818 + items (list diagram_item_list + (object InterObjView "Digester" @379 + location (176, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @379 + location (176, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "Digester") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE13960364" + width 300 + height 2446 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @380 + location (176, 336) + line_color 3342489 + InterObjView @379 + height 1228 + y_coord 1168 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @381 + location (176, 336) + line_color 3342489 + InterObjView @379 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @382 + location (176, 480) + line_color 3342489 + InterObjView @379 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @383 + location (176, 1616) + line_color 3342489 + InterObjView @379 + height 580 + y_coord 520 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @384 + location (176, 1728) + line_color 3342489 + InterObjView @379 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "StandardHostDeployer" @385 + location (480, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @385 + location (480, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 301 + justify 0 + label "StandardHostDeployer") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE1D8A02DC" + width 319 + height 2446 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @386 + location (480, 576) + line_color 3342489 + InterObjView @385 + height 928 + y_coord 868 + Nested FALSE)) + (object InterObjView "StandardHost" @387 + location (800, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @387 + location (800, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardHost") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE1DF20141" + width 300 + height 2446 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @388 + location (800, 592) + line_color 3342489 + InterObjView @387 + height 852 + y_coord 792 + Nested FALSE)) + (object InterObjView "StandardContext" @389 + location (1120, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @389 + location (1120, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 295 + justify 0 + label "StandardContext") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE196D00D9" + width 313 + height 2446 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @390 + location (1120, 624) + line_color 3342489 + InterObjView @389 + height 760 + y_coord 700 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @391 + location (1120, 800) + line_color 3342489 + InterObjView @389 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @392 + location (1120, 976) + line_color 3342489 + InterObjView @389 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @393 + location (1120, 1072) + line_color 3342489 + InterObjView @389 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "WebappLoader" @394 + location (1440, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @394 + location (1440, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 295 + justify 0 + label "WebappLoader") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE1FFA0347" + width 313 + height 2446 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @395 + location (1440, 640) + line_color 3342489 + InterObjView @394 + height 60 + y_coord 0 + Nested FALSE)) + (object InterObjView "StandardManager" @396 + location (1760, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @396 + location (1760, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 301 + justify 0 + label "StandardManager") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE201F0105" + width 319 + height 2446 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @397 + location (1760, 832) + line_color 3342489 + InterObjView @396 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @398 + location (1760, 1264) + line_color 3342489 + InterObjView @396 + height 60 + y_coord 0 + Nested FALSE)) + (object InterObjView "ContextConfig" @399 + location (1952, 352) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @399 + location (1952, 352) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "ContextConfig") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE2087028C" + width 300 + height 2318 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @400 + location (1952, 412) + InterObjView @399 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @401 + location (1952, 1136) + line_color 3342489 + InterObjView @399 + height 1444 + y_coord 1384 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @402 + location (1952, 1264) + line_color 3342489 + InterObjView @399 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @403 + location (1952, 1456) + line_color 3342489 + InterObjView @399 + height 1070 + y_coord 1010 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @404 + location (1952, 1568) + line_color 3342489 + InterObjView @399 + height 952 + y_coord 892 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @405 + location (1952, 1984) + line_color 3342489 + InterObjView @399 + height 152 + y_coord 92 + Nested TRUE)) + (object SelfMessView "" @406 + location (16, 336) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @407 + Parent_View @406 + location (267, 292) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE19AE0065" + anchor_loc 1 + nlines 1 + max_width 108 + justify 0 + label "parse" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @379 + supplier @379 + Focus_Src @380 + Focus_Entry @381 + origin (192, 336) + terminus (342, 336) + ordinal 0) + (object SelfMessView "" @408 + location (16, 480) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @409 + Parent_View @408 + location (328, 437) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE19B102E9" + anchor_loc 1 + nlines 1 + max_width 267 + justify 0 + label "startElement()" + pctDist 0.906667 + height 44 + orientation 0) + line_color 3342489 + client @379 + supplier @379 + Focus_Src @380 + Focus_Entry @382 + origin (192, 480) + terminus (342, 480) + ordinal 1) + (object InterMessView "" @410 + location (16, 576) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @411 + Parent_View @410 + location (327, 552) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE1DFB0022" + anchor_loc 1 + nlines 1 + max_width 165 + justify 0 + label "addChild" + pctDist 0.498645 + height 25 + orientation 0) + line_color 3342489 + client @379 + supplier @385 + Focus_Src @380 + Focus_Entry @386 + origin (191, 576) + terminus (464, 576) + ordinal 2) + (object InterMessView "" @412 + location (16, 592) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @413 + Parent_View @412 + location (639, 548) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE1FB60277" + anchor_loc 1 + nlines 1 + max_width 165 + justify 0 + label "addChild" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @385 + supplier @387 + Focus_Src @386 + Focus_Entry @388 + origin (495, 592) + terminus (784, 592) + ordinal 3) + (object InterMessView "" @414 + location (16, 624) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @415 + Parent_View @414 + location (959, 580) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE1FC40228" + anchor_loc 1 + nlines 1 + max_width 110 + justify 0 + label "start()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @387 + supplier @389 + Focus_Src @388 + Focus_Entry @390 + origin (815, 624) + terminus (1104, 624) + ordinal 4) + (object InterMessView "" @416 + location (16, 640) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @417 + Parent_View @416 + location (1279, 596) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE200603BE" + anchor_loc 1 + nlines 1 + max_width 82 + justify 0 + label "new" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @389 + supplier @394 + Focus_Src @390 + Focus_Entry @395 + origin (1135, 640) + terminus (1424, 640) + ordinal 5) + (object SelfMessView "" @418 + location (16, 800) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @419 + Parent_View @418 + location (1224, 756) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE200C029A" + anchor_loc 1 + nlines 1 + max_width 186 + justify 0 + label "setLoader" + pctDist 0.593333 + height 45 + orientation 0) + line_color 3342489 + client @389 + supplier @389 + Focus_Src @390 + Focus_Entry @391 + origin (1136, 800) + terminus (1286, 800) + ordinal 6) + (object InterMessView "" @420 + location (16, 832) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @421 + Parent_View @420 + location (1439, 788) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE202C0250" + anchor_loc 1 + nlines 1 + max_width 82 + justify 0 + label "new" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @389 + supplier @396 + Focus_Src @390 + Focus_Entry @397 + origin (1135, 832) + terminus (1744, 832) + ordinal 7) + (object SelfMessView "" @422 + location (16, 976) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @423 + Parent_View @422 + location (1260, 933) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE2032001C" + anchor_loc 1 + nlines 1 + max_width 221 + justify 0 + label "setManager" + pctDist 0.833333 + height 44 + orientation 0) + line_color 3342489 + client @389 + supplier @389 + Focus_Src @390 + Focus_Entry @392 + origin (1136, 976) + terminus (1286, 976) + ordinal 8) + (object SelfMessView "" @424 + location (16, 1072) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @425 + Parent_View @424 + location (1481, 1043) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE205B01A2" + anchor_loc 1 + nlines 1 + max_width 658 + justify 0 + label "fireLifecycleEvent(START_EVENT)" + pctDist 2.306667 + height 30 + orientation 0) + line_color 3342489 + client @389 + supplier @389 + Focus_Src @390 + Focus_Entry @393 + origin (1136, 1072) + terminus (1286, 1072) + ordinal 9) + (object InterMessView "" @426 + location (16, 1136) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @427 + Parent_View @426 + location (1535, 1092) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE20960003" + anchor_loc 1 + nlines 1 + max_width 745 + justify 0 + label " // Notify interested LifecycleListeners" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @389 + supplier @399 + Focus_Src @390 + Focus_Entry @401 + origin (1135, 1136) + terminus (1936, 1136) + ordinal 10) + (object SelfMessView "" @428 + location (16, 1264) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @429 + Parent_View @428 + location (2043, 1220) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE20CF018C" + anchor_loc 1 + nlines 1 + max_width 110 + justify 0 + label "start()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @399 + supplier @399 + Focus_Src @401 + Focus_Entry @402 + origin (1968, 1264) + terminus (2118, 1264) + ordinal 11) + (object SelfMessView "" @430 + location (16, 1456) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @431 + Parent_View @430 + location (2027, 1413) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE20E303E2" + anchor_loc 1 + nlines 1 + max_width 275 + justify 0 + label "defaultConfig()" + pctDist 0.393333 + height 44 + orientation 0) + line_color 3342489 + client @399 + supplier @399 + Focus_Src @401 + Focus_Entry @403 + origin (1968, 1456) + terminus (2118, 1456) + ordinal 13) + (object SelfMessView "" @432 + location (16, 1568) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @433 + Parent_View @432 + location (2043, 1524) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE211D01A1" + anchor_loc 1 + nlines 1 + max_width 349 + justify 0 + label "applicationConfig()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @399 + supplier @399 + Focus_Src @401 + Focus_Entry @404 + origin (1968, 1568) + terminus (2118, 1568) + ordinal 14) + (object InterMessView "" @434 + location (1664, 1264) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @435 + Parent_View @434 + location (1439, 1220) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE20B600E5" + anchor_loc 1 + nlines 1 + max_width 110 + justify 0 + label "start()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @389 + supplier @396 + Focus_Src @390 + Focus_Entry @398 + origin (1135, 1264) + terminus (1744, 1264) + ordinal 12) + (object InterMessView "" @436 + location (16, 1616) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @437 + Parent_View @436 + location (1064, 1572) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE21B60288" + anchor_loc 1 + nlines 1 + max_width 145 + justify 0 + label "create()" + pctDist 0.500000 + height 45 + orientation 1) + line_color 3342489 + client @399 + supplier @379 + Focus_Src @404 + Focus_Entry @383 + origin (1936, 1616) + terminus (192, 1616) + ordinal 15) + (object SelfMessView "" @438 + location (16, 1728) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @439 + Parent_View @438 + location (457, 1701) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE21BE021B" + anchor_loc 1 + nlines 1 + max_width 530 + justify 0 + label "// Process web.xml * tld.xml" + pctDist 1.773333 + height 28 + orientation 0) + line_color 3342489 + client @379 + supplier @379 + Focus_Src @383 + Focus_Entry @384 + origin (192, 1728) + terminus (342, 1728) + ordinal 16) + (object InterObjView "StandardWrapper" @440 + location (2208, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @440 + location (2208, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardWrapper") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE220C0122" + width 300 + height 2446 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @441 + location (2208, 2016) + line_color 3342489 + InterObjView @440 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @442 + location (2208, 2176) + line_color 3342489 + InterObjView @440 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @443 + location (2208, 2288) + line_color 3342489 + InterObjView @440 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @444 + location (2208, 2400) + line_color 3342489 + InterObjView @440 + height 60 + y_coord 0 + Nested FALSE)) + (object InterMessView "" @445 + location (16, 1984) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @446 + Parent_View @445 + location (1063, 1940) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE228B03BA" + anchor_loc 1 + nlines 1 + max_width 1478 + justify 0 + label "createWarpper() // Invoked by a WebWrapperRule (not Directly by the Digester)" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @379 + supplier @399 + Focus_Src @383 + Focus_Entry @405 + origin (191, 1984) + terminus (1936, 1984) + ordinal 17) + (object InterMessView "" @447 + location (16, 2016) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @448 + Parent_View @447 + location (2079, 1972) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE229A0004" + anchor_loc 1 + nlines 1 + max_width 82 + justify 0 + label "new" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @399 + supplier @440 + Focus_Src @405 + Focus_Entry @441 + origin (1967, 2016) + terminus (2192, 2016) + ordinal 18) + (object InterMessView "" @449 + location (16, 2176) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @450 + Parent_View @449 + location (2116, 2134) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE22A700C1" + anchor_loc 1 + nlines 1 + max_width 405 + justify 0 + label "addInstanceListener()" + pctDist 0.662295 + height 43 + orientation 0) + line_color 3342489 + client @399 + supplier @440 + Focus_Src @404 + Focus_Entry @442 + origin (1967, 2176) + terminus (2192, 2176) + ordinal 19) + (object InterMessView "" @451 + location (2496, 2288) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @452 + Parent_View @451 + location (2116, 2245) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE22C701CC" + anchor_loc 1 + nlines 1 + max_width 410 + justify 0 + label "addLifecycleListener()" + pctDist 0.662295 + height 44 + orientation 0) + line_color 3342489 + client @399 + supplier @440 + Focus_Src @404 + Focus_Entry @443 + origin (1967, 2288) + terminus (2192, 2288) + ordinal 20) + (object InterMessView "" @453 + location (16, 2400) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @454 + Parent_View @453 + location (2124, 2357) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE22E80364" + anchor_loc 1 + nlines 1 + max_width 428 + justify 0 + label "addContainerListener()" + pctDist 0.701639 + height 44 + orientation 0) + line_color 3342489 + client @399 + supplier @440 + Focus_Src @404 + Focus_Entry @444 + origin (1967, 2400) + terminus (2192, 2400) + ordinal 21) + (object NoteView @455 + location (1216, 80) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @455 + location (825, 14) + fill_color 13434879 + nlines 2 + max_width 746 + label "Deploy App.") + line_color 3342489 + fill_color 13434879 + width 806 + height 144) + (object NoteView @456 + location (2144, 2704) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @456 + location (1953, 2641) + fill_color 13434879 + nlines 2 + max_width 347 + label "#4 Catalina.start()") + line_color 3342489 + fill_color 13434879 + width 407 + height 138))) + (object InteractionDiagram "1. catalina_request" + mechanism_ref @88 + quid "3DFE3B5001C3" + title "1. catalina_request" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list + (object InterObjView "ThreadPool" @457 + location (176, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @457 + location (176, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "ThreadPool") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE402B02C5" + width 300 + height 1276 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @458 + location (176, 384) + line_color 3342489 + InterObjView @457 + height 304 + y_coord 244 + Nested FALSE)) + (object InterObjView "TcpWorkerThread" @459 + location (512, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @459 + location (512, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 332 + justify 0 + label "TcpWorkerThread") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE403200F8" + width 350 + height 1276 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @460 + location (512, 384) + line_color 3342489 + InterObjView @459 + height 244 + y_coord 184 + Nested FALSE)) + (object InterObjView "Http11Protocol" @461 + location (848, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @461 + location (848, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "Http11Protocol") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE40750177" + width 300 + height 1276 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @462 + location (848, 400) + line_color 3342489 + InterObjView @461 + height 168 + y_coord 108 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @463 + location (848, 448) + line_color 3342489 + InterObjView @461 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @464 + location (848, 592) + line_color 3342489 + InterObjView @461 + height 120 + y_coord 60 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @465 + location (848, 592) + line_color 3342489 + InterObjView @461 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @466 + location (848, 736) + line_color 3342489 + InterObjView @461 + height 674 + y_coord 614 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @467 + location (848, 736) + line_color 3342489 + InterObjView @461 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "CoyoteAdapter" @468 + location (1168, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @468 + location (1168, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "CoyoteAdapter") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE410600DF" + width 300 + height 1276 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @469 + location (1168, 848) + line_color 3342489 + InterObjView @468 + height 502 + y_coord 442 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @470 + location (1168, 944) + line_color 3342489 + InterObjView @468 + height 352 + y_coord 292 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @471 + location (1168, 944) + line_color 3342489 + InterObjView @468 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "StandardEngine" @472 + location (1520, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @472 + location (1520, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 363 + justify 0 + label "StandardEngine") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE424B0349" + width 381 + height 1276 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @473 + location (1520, 1008) + line_color 3342489 + InterObjView @472 + height 228 + y_coord 168 + Nested FALSE)) + (object InterObjView "StandardPipeline" @474 + location (1872, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @474 + location (1872, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardPipeline") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE42900045" + width 300 + height 1276 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @475 + location (1872, 1040) + line_color 3342489 + InterObjView @474 + height 136 + y_coord 76 + Nested FALSE)) + (object InterObjView "StandardValveContext" @476 + location (2192, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @476 + location (2192, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardValveContext") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE42C002B1" + width 300 + height 1276 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @477 + location (2192, 1056) + line_color 3342489 + InterObjView @476 + height 60 + y_coord 0 + Nested FALSE)) + (object InterMessView "" @478 + location (16, 384) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @479 + Parent_View @478 + location (343, 340) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE40E701AE" + anchor_loc 1 + nlines 1 + max_width 112 + justify 0 + label "runIt()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @457 + supplier @459 + Focus_Src @458 + Focus_Entry @460 + origin (191, 384) + terminus (496, 384) + ordinal 0) + (object InterMessView "" @480 + location (16, 400) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @481 + Parent_View @480 + location (679, 356) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE40FC010E" + anchor_loc 1 + nlines 1 + max_width 359 + justify 0 + label "processConnection" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @459 + supplier @461 + Focus_Src @460 + Focus_Entry @462 + origin (527, 400) + terminus (832, 400) + ordinal 1) + (object SelfMessView "" @482 + location (16, 448) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @483 + Parent_View @482 + location (969, 405) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE4111029F" + anchor_loc 1 + nlines 1 + max_width 175 + justify 0 + label "process()" + pctDist 0.706667 + height 44 + orientation 0) + line_color 3342489 + client @461 + supplier @461 + Focus_Src @462 + Focus_Entry @463 + origin (864, 448) + terminus (1014, 448) + ordinal 2) + (object SelfMessView "" @484 + location (16, 592) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @485 + Parent_View @484 + location (1048, 549) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE415C0151" + anchor_loc 1 + nlines 1 + max_width 291 + justify 0 + label "parseHeaders()" + pctDist 1.226667 + height 44 + orientation 0) + line_color 3342489 + client @461 + supplier @461 + Focus_Src @464 + Focus_Entry @465 + origin (864, 592) + terminus (1014, 592) + ordinal 3) + (object SelfMessView "" @486 + location (16, 736) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @487 + Parent_View @486 + location (1052, 692) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE41A60161" + anchor_loc 1 + nlines 1 + max_width 328 + justify 0 + label "prepareRequest()" + pctDist 1.253333 + height 44 + orientation 0) + line_color 3342489 + client @461 + supplier @461 + Focus_Src @466 + Focus_Entry @467 + origin (864, 736) + terminus (1014, 736) + ordinal 4) + (object InterMessView "" @488 + location (992, 848) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @489 + Parent_View @488 + location (1007, 804) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE41D60107" + anchor_loc 1 + nlines 1 + max_width 162 + justify 0 + label "service()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @461 + supplier @468 + Focus_Src @466 + Focus_Entry @469 + origin (863, 848) + terminus (1152, 848) + ordinal 5) + (object SelfMessView "" @490 + location (16, 944) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @491 + Parent_View @490 + location (1372, 916) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE422C01F1" + anchor_loc 1 + nlines 1 + max_width 373 + justify 0 + label "postParseRequest()" + pctDist 1.253333 + height 28 + orientation 0) + line_color 3342489 + client @468 + supplier @468 + Focus_Src @470 + Focus_Entry @471 + origin (1184, 944) + terminus (1334, 944) + ordinal 6) + (object InterMessView "" @492 + location (1344, 1008) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @493 + Parent_View @492 + location (1343, 964) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE42800238" + anchor_loc 1 + nlines 1 + max_width 149 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @468 + supplier @472 + Focus_Src @470 + Focus_Entry @473 + origin (1183, 1008) + terminus (1504, 1008) + ordinal 7) + (object InterMessView "" @494 + location (16, 1040) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @495 + Parent_View @494 + location (1695, 996) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE429A002D" + anchor_loc 1 + nlines 1 + max_width 149 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @472 + supplier @474 + Focus_Src @473 + Focus_Entry @475 + origin (1535, 1040) + terminus (1856, 1040) + ordinal 8) + (object InterMessView "" @496 + location (16, 1056) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @497 + Parent_View @496 + location (2031, 1012) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE42CE0230" + anchor_loc 1 + nlines 1 + max_width 149 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @474 + supplier @476 + Focus_Src @475 + Focus_Entry @477 + origin (1887, 1056) + terminus (2176, 1056) + ordinal 9) + (object NoteView @498 + location (2000, 2016) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @498 + location (1862, 1956) + fill_color 13434879 + nlines 2 + max_width 240 + label "See next diagram") + line_color 3342489 + fill_color 13434879 + width 300 + height 132) + (object AttachView "" @499 + stereotype TRUE + line_color 3342489 + client @498 + supplier @476 + line_style 0))) + (object InteractionDiagram "2. catalina_request_2" + mechanism_ref @89 + quid "3DFE42F7024C" + title "2. catalina_request_2" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list + (object InterObjView "StandardContextValve" @500 + location (224, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @500 + location (224, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 401 + justify 0 + label "StandardContextValve") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE4307001E" + width 419 + height 1678 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @501 + location (224, 384) + line_color 3342489 + InterObjView @500 + height 386 + y_coord 326 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @502 + location (224, 704) + line_color 3342489 + InterObjView @500 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @503 + location (224, 896) + line_color 3342489 + InterObjView @500 + height 916 + y_coord 856 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @504 + location (224, 1024) + line_color 3342489 + InterObjView @500 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @505 + location (224, 1280) + line_color 3342489 + InterObjView @500 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "StandardEngineValve" @506 + location (592, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @506 + location (592, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardEngineValve") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE432801F3" + width 300 + height 1678 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @507 + location (592, 384) + line_color 3342489 + InterObjView @506 + height 264 + y_coord 204 + Nested FALSE)) + (object InterObjView "StandardHost" @508 + location (912, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @508 + location (912, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardHost") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE436503BD" + width 300 + height 1678 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @509 + location (912, 416) + line_color 3342489 + InterObjView @508 + height 431 + y_coord 371 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @510 + location (912, 528) + line_color 3342489 + InterObjView @508 + height 60 + y_coord 0 + Nested TRUE) + Focus_Of_Control (object Focus_Of_Control "" @511 + location (912, 704) + line_color 3342489 + InterObjView @508 + height 120 + y_coord 60 + Nested TRUE)) + (object InterObjView "ErrorReportValve" @512 + location (1264, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @512 + location (1264, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 294 + justify 0 + label "ErrorReportValve") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE438C028D" + width 312 + height 1678 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @513 + location (1264, 896) + line_color 3342489 + InterObjView @512 + height 248 + y_coord 188 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @514 + location (1264, 944) + line_color 3342489 + InterObjView @512 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "ErrorDispatcherValve" @515 + location (1584, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @515 + location (1584, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 295 + justify 0 + label "ErrorDispatcherValve") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE451F01EC" + width 313 + height 1678 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @516 + location (1584, 1168) + line_color 3342489 + InterObjView @515 + height 232 + y_coord 172 + Nested FALSE)) + (object InterObjView "StandardHostValve" @517 + location (1904, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @517 + location (1904, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 295 + justify 0 + label "StandardHostValve") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE47310130" + width 313 + height 1678 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @518 + location (1904, 1472) + line_color 3342489 + InterObjView @517 + height 280 + y_coord 220 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @519 + location (1904, 1536) + line_color 3342489 + InterObjView @517 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "StandardContext" @520 + location (2224, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @520 + location (2224, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardContext") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE47C100F1" + width 300 + height 1678 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @521 + location (2224, 1632) + line_color 3342489 + InterObjView @520 + height 60 + y_coord 0 + Nested FALSE)) + (object InterMessView "" @522 + location (16, 384) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @523 + Parent_View @522 + location (407, 340) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE434C019B" + anchor_loc 1 + nlines 1 + max_width 146 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @500 + supplier @506 + Focus_Src @501 + Focus_Entry @507 + origin (239, 384) + terminus (576, 384) + ordinal 0) + (object InterMessView "" @524 + location (16, 416) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @525 + Parent_View @524 + location (751, 372) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE436C009D" + anchor_loc 1 + nlines 1 + max_width 107 + justify 0 + label "map()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @506 + supplier @508 + Focus_Src @507 + Focus_Entry @509 + origin (607, 416) + terminus (896, 416) + ordinal 1) + (object InterMessView "" @526 + location (800, 528) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @527 + Parent_View @526 + location (751, 484) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE43830063" + anchor_loc 1 + nlines 1 + max_width 146 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @506 + supplier @508 + Focus_Src @507 + Focus_Entry @510 + origin (607, 528) + terminus (896, 528) + ordinal 2) + (object InterMessView "" @528 + location (608, 704) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @529 + Parent_View @528 + location (568, 660) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE43B903BF" + anchor_loc 1 + nlines 1 + max_width 146 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 1) + line_color 3342489 + client @508 + supplier @500 + Focus_Src @511 + Focus_Entry @502 + origin (896, 704) + terminus (240, 704) + ordinal 3) + (object InterMessView "" @530 + location (752, 896) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @531 + Parent_View @530 + location (743, 852) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE43C203A4" + anchor_loc 1 + nlines 1 + max_width 146 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @500 + supplier @512 + Focus_Src @503 + Focus_Entry @513 + origin (239, 896) + terminus (1248, 896) + ordinal 4) + (object SelfMessView "" @532 + location (16, 944) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @533 + Parent_View @532 + location (1355, 900) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE442501B1" + anchor_loc 1 + nlines 1 + max_width 135 + justify 0 + label "report()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @512 + supplier @512 + Focus_Src @513 + Focus_Entry @514 + origin (1280, 944) + terminus (1430, 944) + ordinal 5) + (object InterMessView "" @534 + location (16, 1024) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @535 + Parent_View @534 + location (744, 980) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE46330293" + anchor_loc 1 + nlines 1 + max_width 230 + justify 0 + label "invokeNext()" + pctDist 0.500000 + height 45 + orientation 1) + line_color 3342489 + client @512 + supplier @500 + Focus_Src @513 + Focus_Entry @504 + origin (1248, 1024) + terminus (240, 1024) + ordinal 6) + (object InterMessView "" @536 + location (944, 1168) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @537 + Parent_View @536 + location (903, 1124) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE46E70026" + anchor_loc 1 + nlines 1 + max_width 146 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @500 + supplier @515 + Focus_Src @503 + Focus_Entry @516 + origin (239, 1168) + terminus (1568, 1168) + ordinal 7) + (object InterMessView "" @538 + location (16, 1280) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @539 + Parent_View @538 + location (904, 1236) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE475D03A0" + anchor_loc 1 + nlines 1 + max_width 206 + justify 0 + label "invokeNext" + pctDist 0.500000 + height 45 + orientation 1) + line_color 3342489 + client @515 + supplier @500 + Focus_Src @516 + Focus_Entry @505 + origin (1568, 1280) + terminus (240, 1280) + ordinal 8) + (object InterMessView "" @540 + location (1184, 1472) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @541 + Parent_View @540 + location (1063, 1428) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE476503CA" + anchor_loc 1 + nlines 1 + max_width 146 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @500 + supplier @517 + Focus_Src @503 + Focus_Entry @518 + origin (239, 1472) + terminus (1888, 1472) + ordinal 9) + (object SelfMessView "" @542 + location (16, 1536) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @543 + Parent_View @542 + location (1995, 1492) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE47CD0167" + anchor_loc 1 + nlines 1 + max_width 295 + justify 0 + label "map() //Context" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @517 + supplier @517 + Focus_Src @518 + Focus_Entry @519 + origin (1920, 1536) + terminus (2070, 1536) + ordinal 10) + (object InterMessView "" @544 + location (16, 1632) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @545 + Parent_View @544 + location (2063, 1588) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE47D500B4" + anchor_loc 1 + nlines 1 + max_width 146 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @517 + supplier @520 + Focus_Src @518 + Focus_Entry @521 + origin (1919, 1632) + terminus (2208, 1632) + ordinal 11))) + (object InteractionDiagram "3. catalina_request_3" + mechanism_ref @90 + quid "3DFE48A202AD" + title "3. catalina_request_3" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 612 + origin_y 938 + items (list diagram_item_list + (object InterObjView "StandardContext" @546 + location (160, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @546 + location (160, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardContext") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE48B001D1" + width 300 + height 2226 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @547 + location (160, 400) + line_color 3342489 + InterObjView @546 + height 1960 + y_coord 1900 + Nested FALSE)) + (object InterObjView "StandardPipeline" @548 + location (480, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @548 + location (480, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardPipeline") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE48B80088" + width 300 + height 2226 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @549 + location (480, 400) + line_color 3342489 + InterObjView @548 + height 1900 + y_coord 1840 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @550 + location (480, 1088) + line_color 3342489 + InterObjView @548 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "StandardValveContext" @551 + location (800, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @551 + location (800, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardValveContext") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE48D000DC" + width 300 + height 2226 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @552 + location (800, 736) + line_color 3342489 + InterObjView @551 + height 1510 + y_coord 1450 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @553 + location (800, 1168) + line_color 3342489 + InterObjView @551 + height 1072 + y_coord 1012 + Nested TRUE)) + (object InterObjView "StandardContextValve" @554 + location (1104, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @554 + location (1104, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardContextValve") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE490303A7" + width 300 + height 2226 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @555 + location (1104, 800) + line_color 3342489 + InterObjView @554 + height 468 + y_coord 408 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @556 + location (1104, 848) + line_color 3342489 + InterObjView @554 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "StandardWrapper" @557 + location (1424, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @557 + location (1424, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 288 + justify 0 + label "StandardWrapper") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE49370351" + width 306 + height 2226 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @558 + location (1424, 944) + line_color 3342489 + InterObjView @557 + height 264 + y_coord 204 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @559 + location (1424, 1520) + line_color 3342489 + InterObjView @557 + height 340 + y_coord 280 + Nested FALSE)) + (object InterObjView "StandardWrapperValve" @560 + location (1744, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @560 + location (1744, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "StandardWrapperValve") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE49890056" + width 300 + height 2226 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @561 + location (1744, 1440) + line_color 3342489 + InterObjView @560 + height 740 + y_coord 680 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @562 + location (1744, 1616) + line_color 3342489 + InterObjView @560 + height 184 + y_coord 124 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @563 + location (1744, 2000) + line_color 3342489 + InterObjView @560 + height 60 + y_coord 0 + Nested TRUE)) + (object InterObjView "ApplicationFilterChain" @564 + location (2064, 224) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @564 + location (2064, 224) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "ApplicationFilterChain") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE4A1500B2" + width 300 + height 2226 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @565 + location (2064, 1680) + line_color 3342489 + InterObjView @564 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @566 + location (2064, 1808) + line_color 3342489 + InterObjView @564 + height 312 + y_coord 252 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @567 + location (2064, 1872) + line_color 3342489 + InterObjView @564 + height 60 + y_coord 0 + Nested TRUE)) + (object InterMessView "" @568 + location (336, 400) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @569 + Parent_View @568 + location (319, 356) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE48BE0268" + anchor_loc 1 + nlines 1 + max_width 147 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @546 + supplier @548 + Focus_Src @547 + Focus_Entry @549 + origin (175, 400) + terminus (464, 400) + ordinal 0) + (object InterMessView "" @570 + location (16, 736) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @571 + Parent_View @570 + location (639, 692) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE48EA003A" + anchor_loc 1 + nlines 1 + max_width 147 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @548 + supplier @551 + Focus_Src @549 + Focus_Entry @552 + origin (495, 736) + terminus (784, 736) + ordinal 1) + (object InterMessView "" @572 + location (16, 800) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @573 + Parent_View @572 + location (951, 756) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE491102D6" + anchor_loc 1 + nlines 1 + max_width 147 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @551 + supplier @554 + Focus_Src @552 + Focus_Entry @555 + origin (815, 800) + terminus (1088, 800) + ordinal 2) + (object SelfMessView "" @574 + location (16, 848) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @575 + Parent_View @574 + location (1322, 821) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE492F033D" + anchor_loc 1 + nlines 1 + max_width 437 + justify 0 + label "map //return Wrapper" + pctDist 1.346667 + height 28 + orientation 0) + line_color 3342489 + client @554 + supplier @554 + Focus_Src @555 + Focus_Entry @556 + origin (1120, 848) + terminus (1270, 848) + ordinal 3) + (object InterMessView "" @576 + location (1264, 944) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @577 + Parent_View @576 + location (1262, 901) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE494A0151" + anchor_loc 1 + nlines 1 + max_width 147 + justify 0 + label "invoke()" + pctDist 0.498270 + height 44 + orientation 0) + line_color 3342489 + client @554 + supplier @557 + Focus_Src @555 + Focus_Entry @558 + origin (1119, 944) + terminus (1408, 944) + ordinal 4) + (object InterMessView "" @578 + location (960, 1088) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @579 + Parent_View @578 + location (952, 1044) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE495F0288" + anchor_loc 1 + nlines 1 + max_width 147 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 1) + line_color 3342489 + client @557 + supplier @548 + Focus_Src @558 + Focus_Entry @550 + origin (1408, 1088) + terminus (496, 1088) + ordinal 5) + (object InterMessView "" @580 + location (16, 1168) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @581 + Parent_View @580 + location (639, 1124) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE4976015D" + anchor_loc 1 + nlines 1 + max_width 147 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @548 + supplier @551 + Focus_Src @549 + Focus_Entry @553 + origin (495, 1168) + terminus (784, 1168) + ordinal 6) + (object InterMessView "" @582 + location (1296, 1440) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @583 + Parent_View @582 + location (1271, 1396) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE4993023C" + anchor_loc 1 + nlines 1 + max_width 147 + justify 0 + label "invoke()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @551 + supplier @560 + Focus_Src @553 + Focus_Entry @561 + origin (815, 1440) + terminus (1728, 1440) + ordinal 7) + (object InterMessView "" @584 + location (1616, 1520) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @585 + Parent_View @584 + location (1584, 1476) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE49EC004F" + anchor_loc 1 + nlines 1 + max_width 175 + justify 0 + label "allocate()" + pctDist 0.500000 + height 45 + orientation 1) + line_color 3342489 + client @560 + supplier @557 + Focus_Src @561 + Focus_Entry @559 + origin (1728, 1520) + terminus (1440, 1520) + ordinal 8) + (object InterMessView "" @586 + location (1616, 1616) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @587 + Parent_View @586 + location (1583, 1572) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE4A200067" + anchor_loc 1 + nlines 1 + max_width 242 + justify 0 + label "return servlet" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @557 + supplier @560 + Focus_Src @559 + Focus_Entry @562 + origin (1439, 1616) + terminus (1728, 1616) + ordinal 9) + (object InterMessView "" @588 + location (1936, 1680) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @589 + Parent_View @588 + location (1937, 1636) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE4A29027E" + anchor_loc 1 + nlines 1 + max_width 343 + justify 0 + label "createFilterChain()" + pctDist 0.619377 + height 45 + orientation 0) + line_color 3342489 + client @560 + supplier @564 + Focus_Src @562 + Focus_Entry @565 + origin (1759, 1680) + terminus (2048, 1680) + ordinal 10) + (object InterMessView "" @590 + location (16, 1808) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @591 + Parent_View @590 + location (1902, 1764) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE4A490283" + anchor_loc 1 + nlines 1 + max_width 170 + justify 0 + label "doFilter()" + pctDist 0.498270 + height 45 + orientation 0) + line_color 3342489 + client @560 + supplier @564 + Focus_Src @561 + Focus_Entry @566 + origin (1759, 1808) + terminus (2048, 1808) + ordinal 11) + (object InterObjView "$UNNAMED$0" @592 + location (2240, 368) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline TRUE + strike FALSE + color 0 + default_color TRUE) + label (object ItemLabel + Parent_View @592 + location (2240, 368) + fill_color 13434879 + anchor_loc 1 + nlines 2 + max_width 282 + justify 0 + label "") + stereotype (object ItemLabel + Parent_View @592 + location (2240, 368) + fill_color 13434879 + anchor 10 + anchor_loc 1 + nlines 1 + max_width 222 + justify 0 + label "<>") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3DFE4BAE0056" + width 300 + height 2082 + icon_height 0 + icon_width 0 + icon_y_offset 0 + annotation 1 + Focus_Of_Control (object Focus_Of_Control "" @593 + location (2240, 428) + InterObjView @592 + height 60 + y_coord 0 + Nested FALSE) + Focus_Of_Control (object Focus_Of_Control "" @594 + location (2240, 1984) + line_color 3342489 + InterObjView @592 + height 60 + y_coord 0 + Nested FALSE)) + (object SelfMessView "" @595 + location (16, 1872) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @596 + Parent_View @595 + location (2155, 1828) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE4C2701C3" + anchor_loc 1 + nlines 1 + max_width 308 + justify 0 + label "internalDoFilter()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @564 + supplier @564 + Focus_Src @566 + Focus_Entry @567 + origin (2080, 1872) + terminus (2230, 1872) + ordinal 12) + (object InterMessView "" @597 + location (2144, 1984) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @598 + Parent_View @597 + location (2151, 1940) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE4CA502BF" + anchor_loc 1 + nlines 1 + max_width 162 + justify 0 + label "service()" + pctDist 0.500000 + height 45 + orientation 0) + line_color 3342489 + client @564 + supplier @592 + Focus_Src @566 + Focus_Entry @594 + origin (2079, 1984) + terminus (2224, 1984) + ordinal 13) + (object InterMessView "" @599 + location (16, 2000) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + label (object SegLabel @600 + Parent_View @599 + location (1904, 1956) + font (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + quidu "3DFE4CB4025B" + anchor_loc 1 + nlines 1 + max_width 113 + justify 0 + label "return" + pctDist 0.500000 + height 45 + orientation 1) + line_color 3342489 + client @564 + supplier @560 + Focus_Src @566 + Focus_Entry @563 + origin (2048, 2000) + terminus (1760, 2000) + ordinal 14))))) + root_subsystem (object SubSystem "Component View" + quid "3DFDF6CE036A" + physical_models (list unit_reference_list) + physical_presentations (list unit_reference_list + (object Module_Diagram "Main" + quid "3DFDF6D201FD" + title "Main" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list)))) + process_structure (object Processes + quid "3DFDF6CE0373" + ProcsNDevs (list + (object Process_Diagram "Deployment View" + quid "3DFDF6CE0387" + title "Deployment View" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list)))) + properties (object Properties + attributes (list Attribute_Set + (object Attribute + tool "Data Modeler" + name "propertyId" + value "809135966") + (object Attribute + tool "Data Modeler" + name "default__Project" + value (list Attribute_Set + (object Attribute + tool "Data Modeler" + name "project" + value "") + (object Attribute + tool "Data Modeler" + name "TableCounter" + value 0) + (object Attribute + tool "Data Modeler" + name "ViewCounter" + value 0) + (object Attribute + tool "Data Modeler" + name "DomainCounter" + value 0) + (object Attribute + tool "Data Modeler" + name "SPPackageCounter" + value 0) + (object Attribute + tool "Data Modeler" + name "TriggerCounter" + value 0) + (object Attribute + tool "Data Modeler" + name "IndexCounter" + value 0) + (object Attribute + tool "Data Modeler" + name "ConstraintCounter" + value 0) + (object Attribute + tool "Data Modeler" + name "StoreProcedureCounter" + value 0) + (object Attribute + tool "Data Modeler" + name "PrimaryKeyCounter" + value 0) + (object Attribute + tool "Data Modeler" + name "ForeignKeyCounter" + value 0) + (object Attribute + tool "Data Modeler" + name "JoinCounter" + value 0) + (object Attribute + tool "Data Modeler" + name "TableSpaceCounter" + value 0) + (object Attribute + tool "Data Modeler" + name "cONTAINERCounter" + value 0) + (object Attribute + tool "Data Modeler" + name "TablePrefix" + value "") + (object Attribute + tool "Data Modeler" + name "ViewPrefix" + value "") + (object Attribute + tool "Data Modeler" + name "DomainPrefix" + value "") + (object Attribute + tool "Data Modeler" + name "TriggerPrefix" + value "") + (object Attribute + tool "Data Modeler" + name "IndexPrefix" + value "") + (object Attribute + tool "Data Modeler" + name "ConstraintPrefix" + value "") + (object Attribute + tool "Data Modeler" + name "StoreProcedurePrefix" + value "") + (object Attribute + tool "Data Modeler" + name "PrimaryKeyPrefix" + value "") + (object Attribute + tool "Data Modeler" + name "ForeignKeyPrefix" + value "") + (object Attribute + tool "Data Modeler" + name "TableSpacePrefix" + value ""))) + (object Attribute + tool "Data Modeler" + name "default__Module-Spec" + value (list Attribute_Set + (object Attribute + tool "Data Modeler" + name "dmItem" + value FALSE) + (object Attribute + tool "Data Modeler" + name "DMName" + value "") + (object Attribute + tool "Data Modeler" + name "IsDatabase" + value FALSE) + (object Attribute + tool "Data Modeler" + name "TargetDatabase" + value "") + (object Attribute + tool "Data Modeler" + name "Location" + value "") + (object Attribute + tool "Data Modeler" + name "IsTableSpace" + value FALSE) + (object Attribute + tool "Data Modeler" + name "TableSpaceType" + value "") + (object Attribute + tool "Data Modeler" + name "IsDeault" + value FALSE) + (object Attribute + tool "Data Modeler" + name "BufferPool" + value "") + (object Attribute + tool "Data Modeler" + name "ExtentSize" + value 1) + (object Attribute + tool "Data Modeler" + name "PrefetchSize" + value 1) + (object Attribute + tool "Data Modeler" + name "PageSize" + value 4) + (object Attribute + tool "Data Modeler" + name "ManagedBy" + value "") + (object Attribute + tool "Data Modeler" + name "ContainerList" + value ""))) + (object Attribute + tool "Data Modeler" + name "default__Category" + value (list Attribute_Set + (object Attribute + tool "Data Modeler" + name "dmItem" + value FALSE) + (object Attribute + tool "Data Modeler" + name "DMName" + value "") + (object Attribute + tool "Data Modeler" + name "dmSchema" + value "") + (object Attribute + tool "Data Modeler" + name "dmDomainPackage" + value "") + (object Attribute + tool "Data Modeler" + name "IsSchema" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsDomainPackage" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsRootSchema" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsRootDomainPackage" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsSchemaPackage" + value FALSE) + (object Attribute + tool "Data Modeler" + name "DatabaseID" + value "") + (object Attribute + tool "Data Modeler" + name "DBMS" + value ""))) + (object Attribute + tool "Data Modeler" + name "default__Class" + value (list Attribute_Set + (object Attribute + tool "Data Modeler" + name "dmItem" + value FALSE) + (object Attribute + tool "Data Modeler" + name "DMName" + value "") + (object Attribute + tool "Data Modeler" + name "IsTable" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsView" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsDomain" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsSPPackage" + value FALSE) + (object Attribute + tool "Data Modeler" + name "Synonymns" + value "") + (object Attribute + tool "Data Modeler" + name "TableSpaceID" + value "") + (object Attribute + tool "Data Modeler" + name "SourceId" + value "") + (object Attribute + tool "Data Modeler" + name "SourceType" + value "") + (object Attribute + tool "Data Modeler" + name "CorrelationName" + value "") + (object Attribute + tool "Data Modeler" + name "SelectClause" + value "") + (object Attribute + tool "Data Modeler" + name "IsUpdateable" + value TRUE) + (object Attribute + tool "Data Modeler" + name "CheckOption" + value "None") + (object Attribute + tool "Data Modeler" + name "IsSnapShot" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsDistinct" + value FALSE) + (object Attribute + tool "Data Modeler" + name "PersistToServer" + value "") + (object Attribute + tool "Data Modeler" + name "IsPackage" + value FALSE))) + (object Attribute + tool "Data Modeler" + name "default__Attribute" + value (list Attribute_Set + (object Attribute + tool "Data Modeler" + name "dmItem" + value FALSE) + (object Attribute + tool "Data Modeler" + name "DMName" + value "") + (object Attribute + tool "Data Modeler" + name "Ordinal" + value 0) + (object Attribute + tool "Data Modeler" + name "IsIdentity" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsUnique" + value FALSE) + (object Attribute + tool "Data Modeler" + name "NullsAllowed" + value FALSE) + (object Attribute + tool "Data Modeler" + name "Length" + value 0) + (object Attribute + tool "Data Modeler" + name "Scale" + value 0) + (object Attribute + tool "Data Modeler" + name "ColumnType" + value "Native") + (object Attribute + tool "Data Modeler" + name "ForBitData" + value FALSE) + (object Attribute + tool "Data Modeler" + name "DefaultValueType" + value "") + (object Attribute + tool "Data Modeler" + name "DefaultValue" + value "") + (object Attribute + tool "Data Modeler" + name "SourceId" + value "") + (object Attribute + tool "Data Modeler" + name "SourceType" + value "") + (object Attribute + tool "Data Modeler" + name "OID" + value FALSE))) + (object Attribute + tool "Data Modeler" + name "default__Association" + value (list Attribute_Set + (object Attribute + tool "Data Modeler" + name "dmItem" + value FALSE) + (object Attribute + tool "Data Modeler" + name "DMName" + value "") + (object Attribute + tool "Data Modeler" + name "IsRelationship" + value FALSE) + (object Attribute + tool "Data Modeler" + name "SourceId" + value "") + (object Attribute + tool "Data Modeler" + name "SourceType" + value "") + (object Attribute + tool "Data Modeler" + name "RIMethod" + value "") + (object Attribute + tool "Data Modeler" + name "ParentUpdateRule" + value "") + (object Attribute + tool "Data Modeler" + name "ParentUpdateRuleName" + value "") + (object Attribute + tool "Data Modeler" + name "ParentDeleteRule" + value "") + (object Attribute + tool "Data Modeler" + name "ParentDeleteRuleName" + value "") + (object Attribute + tool "Data Modeler" + name "ChildInsertRestrict" + value FALSE) + (object Attribute + tool "Data Modeler" + name "ChildInsertRestrictName" + value "") + (object Attribute + tool "Data Modeler" + name "ChildMultiplicity" + value FALSE) + (object Attribute + tool "Data Modeler" + name "ChildMultiplicityName" + value ""))) + (object Attribute + tool "Data Modeler" + name "default__Role" + value (list Attribute_Set + (object Attribute + tool "Data Modeler" + name "dmItem" + value FALSE) + (object Attribute + tool "Data Modeler" + name "DMName" + value "") + (object Attribute + tool "Data Modeler" + name "ConstraintName" + value ""))) + (object Attribute + tool "Data Modeler" + name "default__Operation" + value (list Attribute_Set + (object Attribute + tool "Data Modeler" + name "dmItem" + value FALSE) + (object Attribute + tool "Data Modeler" + name "DMName" + value "") + (object Attribute + tool "Data Modeler" + name "IsConstraint" + value FALSE) + (object Attribute + tool "Data Modeler" + name "ConstraintType" + value "") + (object Attribute + tool "Data Modeler" + name "IsIndex" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsTrigger" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsStoredProcedure" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsCluster" + value FALSE) + (object Attribute + tool "Data Modeler" + name "TableSpace" + value "") + (object Attribute + tool "Data Modeler" + name "FillFactor" + value 0) + (object Attribute + tool "Data Modeler" + name "KeyList" + value "") + (object Attribute + tool "Data Modeler" + name "CheckPredicate" + value "") + (object Attribute + tool "Data Modeler" + name "IsUnique" + value FALSE) + (object Attribute + tool "Data Modeler" + name "DeferalMode" + value "") + (object Attribute + tool "Data Modeler" + name "InitialCheckTime" + value "") + (object Attribute + tool "Data Modeler" + name "TriggerType" + value "") + (object Attribute + tool "Data Modeler" + name "IsInsertEvent" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsUpdateEvent" + value FALSE) + (object Attribute + tool "Data Modeler" + name "IsDeleteEvent" + value FALSE) + (object Attribute + tool "Data Modeler" + name "RefOldTable" + value "") + (object Attribute + tool "Data Modeler" + name "RefNewTable" + value "") + (object Attribute + tool "Data Modeler" + name "RefOldRow" + value "") + (object Attribute + tool "Data Modeler" + name "RefNewRow" + value "") + (object Attribute + tool "Data Modeler" + name "IsRow" + value FALSE) + (object Attribute + tool "Data Modeler" + name "WhenClause" + value "") + (object Attribute + tool "Data Modeler" + name "Language" + value "SQL") + (object Attribute + tool "Data Modeler" + name "ProcType" + value "Procedure") + (object Attribute + tool "Data Modeler" + name "IsDeterministic" + value FALSE) + (object Attribute + tool "Data Modeler" + name "ParameterStyle" + value "") + (object Attribute + tool "Data Modeler" + name "ReturnedNull" + value FALSE) + (object Attribute + tool "Data Modeler" + name "ExternalName" + value "") + (object Attribute + tool "Data Modeler" + name "Length" + value "") + (object Attribute + tool "Data Modeler" + name "Scale" + value "") + (object Attribute + tool "Data Modeler" + name "ForBitData" + value FALSE) + (object Attribute + tool "Data Modeler" + name "DefaultValue" + value "") + (object Attribute + tool "Data Modeler" + name "DefaultValueType" + value ""))) + (object Attribute + tool "Data Modeler" + name "default__Parameter" + value (list Attribute_Set + (object Attribute + tool "Data Modeler" + name "dmItem" + value FALSE) + (object Attribute + tool "Data Modeler" + name "DMName" + value "") + (object Attribute + tool "Data Modeler" + name "IsInParameter" + value TRUE) + (object Attribute + tool "Data Modeler" + name "IsOutParameter" + value FALSE) + (object Attribute + tool "Data Modeler" + name "Ordinal" + value "") + (object Attribute + tool "Data Modeler" + name "Length" + value "") + (object Attribute + tool "Data Modeler" + name "Scale" + value "") + (object Attribute + tool "Data Modeler" + name "ForBitData" + value FALSE) + (object Attribute + tool "Data Modeler" + name "DefaultValueType" + value "") + (object Attribute + tool "Data Modeler" + name "DefaultValue" + value "") + (object Attribute + tool "Data Modeler" + name "OperationID" + value ""))) + (object Attribute + tool "Data Modeler" + name "HiddenTool" + value FALSE) + (object Attribute + tool "Data Modeler Communicator" + name "HiddenTool" + value FALSE) + (object Attribute + tool "Deploy" + name "HiddenTool" + value FALSE) + (object Attribute + tool "Rose Model Integrator" + name "HiddenTool" + value FALSE) + (object Attribute + tool "Rose Web Publisher" + name "HiddenTool" + value FALSE) + (object Attribute + tool "Web Modeler" + name "HiddenTool" + value FALSE)) + quid "3DFDF6CE0374")) diff --git a/webapps/docs/architecture/startup.xml b/webapps/docs/architecture/startup.xml new file mode 100644 index 000000000..69a7741d1 --- /dev/null +++ b/webapps/docs/architecture/startup.xml @@ -0,0 +1,57 @@ + + +]> + + + &project; + + + Yoav Shapira + Startup + + + + + +
+ +

+This page describes how the Tomcat server starts up. There are several +different ways to start tomcat, including: +

    +
  • From the command line.
  • +
  • From a Java program as an embedded server.
  • +
  • Automatically as a Windows service.
  • +
+

+ + +

+A text description of the startup procedure is available +here. +

+
+ + +

+A UML sequence diagram of the startup procedure is available +here. +

+
+ + +

+The startup process can be customized in many ways, both +by modifying Tomcat code and by implementing your own +LifecycleListeners which are then registered in the server.xml +configuration file. +

+ +
+ +
+ + + +
diff --git a/webapps/docs/architecture/startup/serverStartup.pdf b/webapps/docs/architecture/startup/serverStartup.pdf new file mode 100644 index 0000000000000000000000000000000000000000..34aa59808b3a7bdf36d07278bdbfe8d9750b68c0 GIT binary patch literal 46175 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

System Loader + sharedLoader (shared)-> commonLoader -> System Loader + catalinaLoader(server) -> commonLoader -> System Loader + b) Load startup class (reflection) + org.apache.catalina.startup.Catalina + setParentClassloader -> sharedLoader + Thread.contextClassloader -> catalinaLoader + c) Bootstrap.daemon.init() complete + +Sequence 2. Process command line argument (start, startd, stop, stopd) +Class: org.apache.catalina.startup.Bootstrap (assume command->start) +What it does: + a) Catalina.setAwait(true); + b) Catalina.load() + b1) initDirs() -> set properties like + catalina.home + catalina.base == catalina.home (most cases) + b2) initNaming + setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, + org.apache.naming.java.javaURLContextFactory ->default) + b3) createStartDigester() + Configures a digester for the main server.xml elements like + org.apache.catalina.core.StandardServer (can change of course :) + org.apache.catalina.deploy.NamingResources + Stores naming resources in the J2EE JNDI tree + org.apache.catalina.LifecycleListener + implements events for start/stop of major components + org.apache.catalina.core.StandardService + The single entry for a set of connectors, + so that a container can listen to multiple connectors + ie, single entry + org.apache.coyote.tomcat5.CoyoteConnector + Connectors to listen for incoming requests only + It also adds the following rulesets to the digester + NamingRuleSet + EngineRuleSet + HostRuleSet + ContextRuleSet + b4) Load the server.xml and parse it using the digester + Parsing the server.xml using the digester is an automatic + XML-object mapping tool, that will create the objects defined in server.xml + Startup of the actual container has not started yet. + b5) Assigns System.out and System.err to the SystemLogHandler class + b6) Calls intialize on all components, this makes each object register itself with the + JMX agent. + During the process call the Connectors also initialize the adapters. + The adapters are the components that do the request pre-processing. + Typical adapters are HTTP1.1 (default if no protocol is specified, + org.apache.coyote.http11.Http11Protocol) + AJP1.3 for mod_jk etc. + + c) Catalina.start() + c1) Starts the NamingContext and binds all JNDI references into it + c2) Starts the services under which are: + StandardService -> starts Engine (ContainerBase ->Logger,Loader,Realm,Cluster etc) + c3) StandardHost (started by the service) + Configures a ErrorReportValvem to do proper HTML output for different HTTP + errors codes + Starts the Valves in the pipeline (at least the ErrorReportValve) + Configures the StandardHostValve, + this valves ties the Webapp Class loader to the thread context + it also finds the session for the request + and invokes the context pipeline + Starts the HostConfig component + This component deploys all the webapps + (webapps & conf/Catalina/localhost/*.xml) + Webapps are installed using the deployer (StandardHostDeployer) + The deployer will create a Digester for your context, this digester + will then invoke ContextConfig.start() + The ContextConfig.start() will process the default web.xml (conf/web.xml) + and then process the applications web.xml (WEB-INF/web.xml) + + c4) During the lifetime of the container (StandardEngine) there is a background thread that + keeps checking if the context has changed. If a context changes (timestamp of war file, + context xml file, web.xml) then a reload is issued (stop/remove/deploy/start) + + d) Tomcat receives a request on an HTTP port + d1) The request is received by a separate thread which is waiting in the PoolTcpEndPoint + class. It is waiting for a request in a regular ServerSocket.accept() method. + When a request is received, this thread wakes up. + d2) The PoolTcpEndPoint assigns the a TcpConnection to handle the request. + It also supplies a JMX object name to the catalina container (not used I believe) + d3) The processor to handle the request in this case is Coyote Http11Processor, + and the process method is invoked. + This same processor is also continuing to check the input stream of the socket + until the keep alive point is reached or the connection is disconnected. + d4) The HTTP request is parsed using an internal buffer class (Coyote Http11 Internal Buffer) + The buffer class parses the request line, the headers, etc and store the result in a + Coyote request (not an HTTP request) This request contains all the HTTP info, such + as servername, port, scheme, etc. + d5) The processor contains a reference to an Adapter, in this case it is the + Coyote Tomcat 5 Adapter. Once the request has been parsed, the Http11 processor + invokes service() on the adapter. In the service method, the Request contains a + CoyoteRequest and CoyoteRespons (null for the first time) + The CoyoteRequest(Response) implements HttpRequest(Response) and HttpServletRequest(Response) + The adapter parses and associates everything with the request, cookies, the context through a + Mapper, etc + d6) When the parsing is finished, the CoyoteAdapter invokes its container (StandardEngine) + and invokes the invoke(request,response) method. + This initiates the HTTP request into the Catalina container starting at the engine level + d7) The StandardEngine.invoke() simply invokes the container pipeline.invoke() + d8) By default the engine only has one valve the StandardEngineValve, this valve simply + invokes the invoke() method on the Host pipeline (StandardHost.getPipeLine()) + d9) the StandardHost has two valves by default, the StandardHostValve and the ErrorReportValve + d10) The standard host valve associates the correct class loader with the current thread + It also retrives the Manager and the session associated with the request (if there is one) + If there is a session access() is called to keep the session alive + d11) After that the StandardHostValve invokes the pipeline on the context associated + with the request. + d12) The first valve that gets invoked by the Context pipeline is the FormAuthenticator + valve. Then the StandardContextValve gets invoke. + The StandardContextValve invokes any context listeners associated with the context. + Next it invokes the pipeline on the Wrapper component (StandardWrapperValve) + d13) During the invokation of the StandardWrapperValve, the JSP wrapper (Jasper) gets invoked + This results in the actual compilation of the JSP. + And then invokes the actual servlet. + e) Invokation of the servlet class + + + + + + + + + + + + + \ No newline at end of file diff --git a/webapps/docs/balancer-howto.xml b/webapps/docs/balancer-howto.xml new file mode 100644 index 000000000..88d33a989 --- /dev/null +++ b/webapps/docs/balancer-howto.xml @@ -0,0 +1,148 @@ + + +]> + + + &project; + + + Yoav Shapira + Remy Maucherat + Andy Oliver + Load Balancer HOW-TO + + + + +

+ +
+ +Please refer to the JK 1.2.x documentation. + +
+ +
+ +Please refer to the mod_proxy documentation for Apache HTTP Server 2.2. This supports either +HTTP or AJP load balancing. This new version of mod_proxy is also useable with +Apache HTTP Server 2.0, but mod_proxy will have to be compiled separately using the code +from Apache HTTP Server 2.2. + +
+ +
+ + + +

+Tomcat 5.0.15 and later ships with a webapp named balancer. This is +a simple implemention of a rules-based load balancer. It was not designed +as a replacement for other load-balancing mechanisms used for high traffic +environments. Rather, it is a simple, pure Java, easily extensible, and fast +way to direct traffic among multiple servers. +

+

+Although balancer ships with Tomcat, it is not Tomcat-specific and runs +on other containers without any modification. The balancer webapp +requires a Servlet Specification 2.3 or later container if you wish +to use a filter to redirect traffic. If you wish to redirect traffic +using a servlet, you may use any servlet container. +

+
+ + +

+The default balancer installation uses a single filter, BalancerFilter, +mapped to all requests (url-pattern /*). The filter reads its rules +from the location specified in the balancer deployment descriptor +(web.xml file). The default rules are: +

    +
  • Redirect requests with News in the URL to www.cnn.com
  • +
  • Redirect requests with a parameter named paramName whose +value is paramValue to www.yahoo.com.
  • +
  • Redirect all other requests to jakarta.apache.org.
  • +
+ +Therefore, when you install tomcat, start it, and point your +browser to http://localhost:8080/balancer, you will be redirected +to http://jakarta.apache.org. If you point your browser to +http://localhost:8080/balancer/News you will be redirected to +http://www.cnn.com. The request for +http://localhost:8080/balancer/BlahBlah?paramName=paramValue will +be redirected to http://www.yahoo.com. +

+
+ + +

+A Rule in the balancer system is a combination of +a request matching criterion and a redirection URL for +matching requests. Rules implement the +org.apache.webapp.balancer.Rule interface. +

+ +

+The balancer distribution contains a number of useful +rules. The framework is also designed for easy extensibility +so that you can write your own rules quickly. Rules +should be JavaBeans (public no-args constructor, public +setter method setXXX for property xxx), as they are +instantiated by Jakarta Commons Digester. Feel free +to inquire on the tomcat-user mailing list regarding +the availability of rules or the inclusion of your rules +in the distribution. +

+ +

+Rules are assembled into RuleChains. Each BalancerFilter +(or Servlet/JSP) refers to one RuleChain when making its +redirection decisions. Note that you are not restricted +to having one filter mapped to /* as done in the sample +configuration. You can configure as many filters as +desired, using the full filter mapping possibilities defined +in the Servlet Specification. Each filter will have +its own RuleChain. +

+
+ + +

+

    +
  1. You write a rules configuration file containing various +rules and redirection locations.
  2. +
  3. You define the balancer filter in your web.xml, mapping +it as desired (/* is a common use-case) and configuring it +with your rules configuration file.
  4. +
  5. The server is started, initializing the filter.
  6. +
  7. A request comes into the server. The filter consults +its rule chain to determine where to redirect the request. Rules +are consulted in the order in which they are defined in the rules +configuration file. The first matching rule will stop the +evaluation and cause the request to be redirected.
  8. +
+

+ +
+ + +

+Please direct questions, comments, suggestions, etc. to the +tomcat-user mailing list. Thank you. +

+
+ +
+ + + + diff --git a/webapps/docs/build.xml b/webapps/docs/build.xml new file mode 100644 index 000000000..1fae53ed3 --- /dev/null +++ b/webapps/docs/build.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapps/docs/building.xml b/webapps/docs/building.xml new file mode 100644 index 000000000..c260884ec --- /dev/null +++ b/webapps/docs/building.xml @@ -0,0 +1,231 @@ + + +]> + + + &project; + + + Remy Maucherat + Building Tomcat + + + + +
+ +

+Building Tomcat from SVN is very easy, and is the first step to contributing to +Tomcat. The following is a step by step TODO list. +

+ +
+ +
+ +

+The default distribution of Tomcat 5.5.x requires a 5.0 or later JDK. Tomcat +can be built using a 1.4.x JDK but you will need to copy the contents of the +compat directory (created by the build process) to your build directory before +Tomcat will start. +

+ +

+The Sun JDK can be downloaded here. +

+ +

+IMPORTANT: Set an environment variable JAVA_HOME to the pathname of the +directory into which you installed the JDK release. +

+ +
+ +
+ +

+Download a binary distribution of Ant 1.6.2 or later from +here. +

+ +

+Unpack the binary distribution into a convenient location so that the +Ant release resides in its own directory (conventionally named +"apache-ant-1.6.x"). For the purposes of the remainder of this document, +the symbolic name "${ant.home}" is used to refer to the full pathname of + the release directory. +

+ +

+Create an ANT_HOME environment variable to point the directory ${ant.home}, +and modify the PATH environment variable to include directory +"${ant.home}/bin" in its list. This makes the "ant" command line script +available, which will be used to actually perform the build. +

+ +
+ +
+ +

+Download the main build.xml script from here. +

+ +

+Create a new directory, and copy the newly download build.xml to it. This + directory will be referred to as the ${tomcat.source} directory in the rest + of this document. +

+ +

+Go to that directory, and do: +
+ cd ${tomcat.source}
+ ant
+
+

+ +

+NOTE: Users accessing the Internet through a proxy must use a properties + file to indicate to Ant the proxy configuration. Read below. +

+ +

+WARNING: Running this command will checkout the Tomcat 5 sources from SVN, as + well as download binaries to the /usr/share/java directory. + Make sure this is appropriate to do so on your computer. On Windows, + this usually corresponds to the C:\usr\share\java directory, + unless Cygwin is used. Read below to customize the directory used + to download the binaries. +

+ +

+The build can be controlled by creating a ${tomcat.source}/build.properties + file, and adding the following content to it: +
+ # ----- Proxy setup -----
+ # Uncomment if using a proxy server.
+ #proxy.host=proxy.domain
+ #proxy.port=8080
+ #proxy.use=on
+
+ # ----- Default Base Path for Dependent Packages -----
+ # Replace this path with the directory path where
+ # dependencies binaries should be downloaded.
+ base.path=/usr/share/java
+
+

+ +
+ +
+ +

+It is recommended to regularly update the downloaded Tomcat 5 sources. +To do this, execute the following commands: + +
+ cd ${tomcat.source}
+ ant checkout
+
+

+ +

+For a quick rebuild of only modified code you can use: +
+ cd ${tomcat.source}
+ ant build
+
+ +

+ +
+ +
+ +

+Important: +This is not a supported means of building Tomcat; this information is +provided without warranty :-). +The only supported means of building Tomcat is with the "ant build" +described above. +However, some developers like to work on Java code with a Java IDE, +and the following steps have been used by some developers. +

+ +

+Note that you must complete all the above steps to fetch +the repositories and build some JAR files the first time. +After you have completed the above steps, you can set up a +series of Eclipse 4 projects. +Note that this will not let you build everything under Eclipse; +the build process requires use of Ant for the many stages that aren't +simple Java compilations. +However, it will allow you to view and edit the Java code, +get warnings, reformat code, perform refactorings, run Tomcat +under the IDE, and so on. +

+ +

+Use Windows->Preferences and then Java->Build Path->Classpath +Variables to add two new Classpath variables: +

+ +

+ + + +
TOMCAT_LIBS_BASEthe base path where the binary dependencies have been downloaded
ANT_HOMEthe base path of Ant 1.6.2 or later
+

+ +

+Use File->New Project to create a new Java project +for each of the binaries repository (e.g., /usr/share/java), +container, connectors, jasper, servletapi. +Unless you thought ahead to make the ${tomcat.source} directory be under +your Workspace folder, tell Eclipse the external location using "Import/Export...", +General->Existing Project into Workspace. +

+ +

+Eclipse .project and .classpath files are provided in each of these +directories so Eclipse should find all source trees and jars, and +hopefully compile without problems. Note that these +files assume you are using Eclipse with a 5.0 or later JDK; also, the +connectors module must be built with a compiler compliance level of 5.0. +

+ +

+To run Tomcat without a special IDE plug-in, you can simply use Run->Run... +enter "org.apache.catalina.startup.Catalina" as the main class, +"start" as program arguments, and +"-Dcatalina.home=..." (with the name of your build directory) +as VM arguments. +

+ +

+Note also that due to the way the Tomcat source is assembled +from several SVN projects, you may not be able to use the Eclipse +SVN client to update (nor to commit, if you are a committer). +Use the external SVN client of your choice, then use the +Eclipse PackageExplorer or Navigator "Refresh" context menu item +to tell Eclipse that you've updated the files. +

+ +
+ +
+

+The same caveats apply as for Eclipse, above. +

+ +

+The same general idea should work in most IDEs; it has been reported +to work in Idea, for example. +

+ +
+ + +
diff --git a/webapps/docs/cgi-howto.xml b/webapps/docs/cgi-howto.xml new file mode 100644 index 000000000..6c720b350 --- /dev/null +++ b/webapps/docs/cgi-howto.xml @@ -0,0 +1,76 @@ + + +]> + + + &project; + + + Glenn L. Nielsen + CGI How To + + + + +
+ +

The CGI (Common Gateway Interface) defines a way for a web server to +interact with external content-generating programs, which are often +referred to as CGI programs or CGI scripts. +

+ +

Within Tomcat, CGI support can be added when you are using Tomcat as your +HTTP server and require CGI support. Typically this is done +during development when you don't want to run a web server like +Apache httpd. +Tomcat's CGI support is largely compatible with Apache httpd's, +but there are some limitations (e.g., only one cgi-bin directory). +

+ +

CGI support is implemented using the servlet class +org.apache.catalina.servlets.CGIServlet. Traditionally, +this servlet is mapped to the URL pattern "/cgi-bin/*".

+ +

By default CGI support is disabled in Tomcat.

+
+ +
+ +

CAUTION - CGI scripts are used to execute programs +external to the Tomcat JVM. If you are using the Java SecurityManager this +will bypass your security policy configuration in catalina.policy.

+ +

Rename $CATALINA_BASE/server/lib/servlets-cgi.renametojar +to $CATALINA_BASE/server/lib/servlets-cgi.jar.

+ +

Remove the XML comments from around the CGI servlet and servlet-mapping +configuration in $CATALINA_BASE/conf/web.xml.

+
+ +
+ +

There are several servlet init parameters which can be used to +configure the behaviour of the CGI servlet. +

    +
  • cgiPathPrefix - The CGI search path will start at +the web application root directory + File.separator + this prefix. +The default cgiPathPrefix is WEB-INF/cgi
  • +
  • debug - Debugging detail level for messages logged +by this servlet. Default 0.
  • +
  • executable - The of the executable to be used to +run the script. Default is perl.
  • +
  • parameterEncoding - Name of the parameter encoding +to be used with the GCI servlet. Default is +System.getProperty("file.encoding","UTF-8").
  • +
  • passShellEnvironment - Should the shell environment +variables (if any) be passed to the CGI script? Default is +false.
  • +
+

+ +
+ + + +
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml new file mode 100644 index 000000000..4a303ff33 --- /dev/null +++ b/webapps/docs/changelog.xml @@ -0,0 +1,2812 @@ + + +]> + + + &project; + + + Remy Maucherat + Yoav Shapira + Changelog + + + + +
+ + + + Update to Xerces 2.8.0 (remm) + + + Update to tcnative 1.1.3 (remm) + + + + + + + Fix SingleSignOn Valve and add Session.getLastAccessTimeInternal() without session invalidation test. (pero) + + + 38814: CGIServlet correctly handles Shift_JIS output. (markt) + + + Add missing REQUEST_URI environment variable to CGI environment. (markt) + + + 27617: Sync existing mime types with httpd. (keith) + + + 38761: Handle relative symlinks to shell scripts as suggested by Adam Murray (keith) + + + 38795: Associate more closely bind with a finally unbind in StandardContext start and + stop, based on a patch by Darryl Miles (remm) + + + Improve undeployment robustness (remm) + + + Expand the semaphore valve (remm) + + + 39021: Add back support for authentication only, submitted by Scott Stark (remm) + + + Revert fix for 38113, which does not seem a legitimate problem, and causes + regressions (remm) + + + Correctly reset listeners when reloading a webapp (remm) + + + 38194: Don't fail silently if -force is used without CATALINA_PID, submitted by Matthew Buckett. (yoavs) + + + 38154: Avoid NPE in FileDirContext after webapp undeploy, reported by Jamie Maher. (yoavs) + + + 38217: Added cautionary note about keystore password to SSL HowTo, as suggested by Ralf Hauser. (yoavs) + + + 38262: Cleared ambiguity in host documentation, as suggested by Jeffrey Bennett. (yoavs) + + + 38476: Modified check for null TLD stream, as suggested by Fabrizio Giustina. (yoavs) + + + 38052: Use userName as userField default. User is at many databases a + reserved keyword, as suggested by rik. (pero) + + + Fix handling of non matching if-range header (remm) + + + 37848: Only output catalina.sh diagnostic messages if we have a TTY, submitted by + David Shaw. (yoavs) + + + 38596: Minor performance optimization in DataSourceRealm, suggested by Sandy + McArthur. (yoavs) + + + + + + + Make the default cipher suites available for SSL the same as the set of cipher + suites enabled by default rather than the set of all cipher suites. This prevents + ciphers suites that do not provide confidentiality protection and/or server + authentication being used by default. (markt) + + + Move AprEndpoint.getWorkerThread inside the try/catch for the main accept loop, to guard + about an OOM (which would most likely doom the server anyway) (remm) + + + As exhibited in the ASF's JIRA installation, it seems EINTR is a status code that should + be ignored as a result to a poll call (remm) + + + New APR connectors defaults (remm) + + + Add multiple threads for APR pollers, to work around Windows limitations (performance degrades + very rapidly if poller sizes over 1024 are allowed when compiling APR) (remm) + + + New modes for firstReadTimeout (-1 being the new default) (remm) + + + Replace java.util.Stack usage with a simple array in the APR endpoint (remm) + + + tcnative jnilib.c now report correct compile flags for runtime + Library.java checks like sendfile support default true/false (pero) + + + + + + + 38015: Remove misleading warnings logged in TagLibraryInfoImpl, as suggested by Andrew Houghton. (yoavs) + + + 38376: Make sure body content stack is always properly aligned, as submitted by Tony Deigh. (yoavs) + + + Compatibility with JDT 3.2 (remm) + + + + + + + 39292: Update catalina.policy at demo balancer app. Fix provided by Kerry Sainsbury (pero) + + + 36847: Fixed the manager app copy function to not overwrite fileA with fileB when fileA==fileB. + Fix provided by Haroon Rafique (fhanik) + + + 38508: Several enhancements to Host Manager application, including configurable + manager app support and dialog box enhancements. Thanks to George Sexton for the patch. (yoavs) + + + 37781: Make sure context config file is writeable, suggested by George Sexton. (yoavs,pero) + + + + + + + Add at PooledSocketSender the jmx attributes inPoolSize and inUsePoolSize. (pero) + + + DeltaManager set session creationTime at backup node. (pero) + + + Add JvmRouteBinderValve documentation at cluster-howto.xml. (pero) + + + JvmRouteBinderValve now supports now sessionid's from request and cookies. + Thanks to Brian Stansberry for reporting it. (pero) + + + 38779 Fix wrong jmx message arg at SimpleTcpCluster + at o.a.c.cluster.tcp.mbeans-descriptors.xml, submitted by Pawel Tucholski (pero) + + + Fix that not after every "Keep Alive Socket close" a log warning is generated at TcpReplicationThread (pero) + + + 39178: Now ROOT.war deployment with FarmWarDeployer is possible (pero) + + + ReplicationValve not set primarySession flag when all backup nodes gone (pero) + + + Add DeltaSession.getLastAccessTimeInternal() without session invalidation test. (pero) + + + +
+ +
+ + + + Updated / enhanced docs to remove old FIXME references. (yoavs) + + + Required tcnative library version upgraded to 1.1.2 (remm) + + + Update to Eclipse JDT 3.1.2 (remm) + + + + + + + 23950: Context.listBindings() should return objects not + references. (markt) + + + 38124: Add support for Windows 20xx when reading environment + variables in CGIServlet. (markt) + + + 29214: response.containsHeader() now returns the correct + value for Content-Type and Content-Length headers. (markt) + + + Allow using a custom ContextConfig when using JMX embedding of Tomcat, as + is doen by the regular deployer. (remm) + + + Add JMX serverInfo attribute to Server MBean, that we can identify + the tomcat release remotely. (pero) + + + Fix the JMX MBeanFactory.createStandardHost signature at mbean-descriptors.xml (pero) + + + Fix some cases (for example with realm usage) where the container logger for a context + would be retrieved using the wrong classloader (remm) + + + HttpSession.getId will no longer throw an ISE when the session is invalid (remm) + + + ore detailed errors for naming issues (remm) + + + Add documentation for the Transaction element (remm) + + + Add getContextPath to the internal servlet context implementation (remm) + + + Only null instances loaded by the webapp CL, submitted by Matt Jensen (remm) + + + Deploy folders which don't have a WEB-INF, and return an error when a context + file does not contain a Context element (remm) + + + 38653: Fix property name (remm) + + + Slightly modify the timing of the manager start, so that it is not started by a + listener (remm) + + + Refresh loggers used by the digester (remm) + + + Use sendError instead of setStatus to send the 401 code. (billbarker) + + + Don't append the port for an SSL redirect if it is the default port. (billbarker) + + + + + + + Log errors when setting socket options with debug priority rather than error. (remm) + + + 38100: Make certain that a valid Host name is set, or none at all. (billbarker) + + + 38485: Fix minor regression setting connection timeout (as well as linger and + no delay) where the default value was always used when using the regular + HTTP connector (remm) + + + Pass along more of the SSL related fields to OpenSSL (remm) + + + CharChunk now implements CharSequence (remm) + + + Fix coding error which could cause a rare crash when a poller error occurred and sockets + where pending being added to the keepalive poller (remm) + + + Fix potential sync issues when restarting a poller (remm) + + + Update APR error reports, including the error codes (remm) + + + 38726: Remove duplicate request group field causing blank statistics for the + HTTP connector (remm) + + + Fix invalid length used by some AJP packets for the AJP APR connector, which could cause + corruption, submitted by Rudiger Plum (jim) + + + 38346: Fix problems with request.getReader().readLine(). + Patch by Rainer Jung (billbarker) + + + Local address reuse for APR Endpoints (via APR_SO_REUSEADDR) now enabled (jim) + + + Don't write out the shutdown secret file if shutdown is disabled (the default) (billbarker) + + + Fix NPE when no sink is supplied. (billbarker) + + + APR Endpoints now IPv6 aware (jim) + + + Downgrade "Response already committed" logging entry to DEBUG. (billbarker) + + + 38113: Return the empty String for an empty query-string instead of null. (billbarker) + + + + + + + 38389: Set correct JDT Compiler option to java 1.5 compliance. + Patch from Olivier Thomann and Paul Hamer (pero) + + + Add some useful hints to jasper-howto. (pero). + + + 38776: Fix source file attribute, submitted by Olivier Thomann (remm) + + + + + + + Update DeltaManager session access stats (pero) + + + DeltaSession getId will no longer throw an ISE when the session is invalid (pero) + + + Resurrected the "suspect" property so that the logs don't fill + up with errors when member disappears or a connection is lost. Only useful for pooled mode (fhanik) + + + 35710: Add session replication for cross context session changes. + The portlet api need this support, see refactored ReplicationValve. (pero) + + + ReplicationValve reset DeltaSession when cluster node has no backup node. (pero) + + + DataSender close connection and throw exception also even if waitForAck is false. (pero) + + + Active cluster junit test again. (pero) + + + + + + + Fix some XSS issues in the JSP examples. (markt) + + + Fix logos in the manager webapp (remm) + + + +
+ +
+ + + + 32081: Remove the JDK requirement from the Win32 scripts. (keith) + + + + + + + 37852: Fix regression where the magic role '*' was denying all access. Patch by xrcat (billbarker) + + + 37934: Don't ask for authentication if deny-from-all is in effect. (billbarker) + + + 15570: auth-constraint of * was interpretted as all + authenticated users rather than as all roles defined in web.xml. (markt) + + + Remove leftover static logger which was used to log application level messages in + ApplicationContextFacade (remm) + + + 38012: Where a CGI script sets a response code, use it. (markt) + + + 37854: Extension-List checking was too strict. (markt) + + + + + + + Report binding errors in the APR endpoint as strings rather than platform specific + status codes (remm) + + + 37934: Don't ask for authentication if deny-from-all is in effect. (billbarker) + + 38047: Handle the case where the Servlet attempts to read + the Request body from the AJP/1.3 Connector, in the case that no + body was sent. (billbarker) + + 38030: Unconditionally return EOS for an attempt to read + the body of any request that doesn't send CL or TE. + (remm, billbarker). + + + + + + + 35351: Fix problem using an inner class for a <jsp:useBean />. (kinman). + + + 37929: Don't stop on the generic attribute methods just because the session is invalid. Patch by Pierre Delisle. (billbarker) + + + Add system properties org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER and + org.apache.jasper.runtime.JspFactoryImpl.USE_POOL to allow configuring Jasper + memory usage (remm) + + + 37933: Restrict <jsp:getAttribute /> to only look in PAGE_SCOPE. (billbarker) + + + + + + + 37808: Fix ArrayIndexOutOfBoundsException inside XByteBuffer. Reported by Dietmar Mueller (pero) + + + 37896DataSender starts new Socket after IOException. (pero) + + + Reduce memory usage at membership service. (pero) + + + +
+ +
+ + + + Update optional native APR connector version to 1.1.1. (mturk) + + + Update build.properties.default to get native connector from new location. (yoavs) + + + + + + + + 13040: Fix getContext() when used to obtain a context that is a sub-context + of the current context. Ported from TC4. (markt) + + + + + + + + 37746: Remove extra space from StringTokenizer pattern in JspC, as suggested by + Eric Hedstrom. (yoavs) + + + + + + + 36863: Strip quotes when parsing Cookie values, even for v0 Cookies. (billbarker) + + + 37803: Don't claim that we have a string value in MessageBytes until we actually do. + Patch by Doug Rand (billbarker) + + + +
+ +
+ + + + 36711: Unused line of code. (yoavs) + + + Removed unused SAXPath, Jaxen dependencies. (yoavs) + + + Update log4j dependency to version 1.2.12, Struts to 1.2.7. (yoavs) + + + Removed JDBC 2.0 StdExt dependency (only class from there is javax.sql.XADataSource, which is + present in JDK 1.4 and later. (yoavs) + + + 37039: typo on JK Quick configuration how-to. (yoavs) + + + 37035: Add a placeholder file in the temp directory for WinZip tar.gz handling. (yoavs) + + + Update JAF dependency to 1.0.2, JTA to 1.0.1b and JavaMail to 1.3.3_01. (markt) + + + Added Eclipse .project, .classpath, and associated files to make building Tomcat from + Eclipse significantly easier. (markt) + + + 37284: Guess JSE 5.0 location on Mac OS X, patch by Stepan Koltsov. (yoavs) + + + : Wrong class name in antlib.xml for JkStatusUpdateTask. (yoavs) + + + + + + + 36802: Fix problem of double-init when JMX-deploying a + Context into a started Host. (billbarker) + + + 36840: Provide information as to which web.xml is being processed on startup to + help debug parsing errors. (yoavs) + + + 34724: Ability to set domain for Single-Sign-On cookie. Patch by Oliver + Rossmueller. (yoavs) + + + 37044: RealmBase.hasResourcePermission needs to access the GenericPrincipal as + set by the realm unless hasRole is overriden, which was no longer being done properly for + the JAAS realm (remm) + + + 37264: JNDI resources were no longer available when stopping listeners, + submitted by Bogdan Calmac (remm) + + + 37150: Turn off directory listing by default and add a warning + regarding enabling listing of directories with many entries. (markt) + + + Add configurability for the amount of time that the container will wait for requests + to complete when unloading servlets, using the unloadDelay property. (remm) + + + Add code to set to null fields in loaded classes when stopping a web application, as a + possible workaround for suspicious garbage collection behavior. (remm) + + + Update messages and stack traces for classloading errors which may occur when removing + a web application, and for stopped web applications. (remm) + + + 37319: Fix catalina.bat reference to CATALINA_BASE for logging.properties. Thanks + to Pierre-Yves Benzaken. (yoavs) + + + 36852: Custom classloaders don't honor Contet privileged attribute. Thanks to + Matt Brinkley for the analysis and patch. (yoavs) + + Fix for a couple of (mostly silly) edge-cases in testing auth. + Thanks to Nam T. Nguyen for the report. (billbarker) + + + 37060: Actually copy the Request headers when replaying after Form auth. (billbarker) + + + 37591: Typo in Engine configuration reference. (yoavs) + + + 37668: Added note about JSP recompilation to Context configuration documentation. (yoavs) + + + 37132: Have DigestAuthenticator Handle user names with commas. Thanks to + Robert Wille for the patch. (yoavs) + + + 37212: Better error reporting in Connector.java. Thanks to Ralf Hauser for + the patch. (yoavs) + + + + + + + Gracefully handle the case where some Socket options are disabled at + the OS level for the AJP/1.3 Connector. (billbarker) + + + 36366: Use rewritten deployer-howto page by Allistair Crossley. (remm) + + + 36630: Added extra log output for class instantiation failure. (yoavs) + + + 37121: Sendfile always needs to be given the length of data to write, + which fixes ranged requests. (remm) + + + Optimized direct byte buffers association with the socket for APR connectors. (mturk) + + + Fix hidden NPEs when using the APR connectors and there's no host header. (pero, remm) + + + Http11Protocol now register RequestProcessor at JMX and show current usage inside manager app. (pero) + + + JkStatus Ant tasks for mod_jk 1.2.15. (pero) + + Connection Timeout is normal, so reduce logging to DEBUG (billbarker) + + + Fix crash which could occur with the HTTP APR connector when accessing request JMX objects + outside of the processing of the said request (remm) + + + 37627: Fix buffering issue in the HTTP APR connector when a large buffer size was + used for servlets (remm) + + + 37673: Fix implementation of getLocalPort and getLocalAddr in the HTTP APR connector + (remm) + + + + + + + 35252: Jasper PageDataImpl outputs malformed XML. Patch by Rahul Akolkar. (yoavs) + + + 37062: Helpful JSP exception message containing file, line numbers. Patch by + Tim Fennell at http://www.tfenne.com/jasper/. (yoavs) + + + 37407: File descriptor leak in JspReader. Thanks to Fred for the patch. I also + did some minor cleanup in the class. (yoavs) + + + 37612: Add file location to JSP Validator error message. Thanks to Renaud Bruyeron + for the patch. (yoavs) + + + + + + + Fix that session replace messages are logged after node recovery get all session from master node. (pero) + + + 37896 Fix that sendMessage signature at all DataSender subclasses must be changed. + Now pooled and async modes working as expected. (pero) + + + Fix that socket at o.a.c.cluster.tcp.FastAsyncSocketSender can be disconnect/connect. (pero) + + + Fix cluster module build.xml script for new svn repository structure (pero) + + + Fix closed socket exceptions at normal server shutdown, reported by Olve Hansen (pero) + + + Fix closed socket exceptions inside async message transfer modes (pero) + + + 34984: HttpSessionBindingEvent.getValue() get correct value (pero) + + + 35916: send sessionCreated to SessionListener after cluster node recovery (pero) + + + 36541: Used also Hashtable at DeltaSession (pero) + + + Better support cluster at engine level. (pero) + + + 36866: Correct attribute name in conf/server.xml documentation for Cluster element. (yoavs) + + + 37261: Allow xerces to know where the web.xml file is so that relative entities can be resolved. + + + 37529: Fixed race condition in ReplicationLister#stopListening. Thanks to + Chris Walker for the patch. (yoavs) + + + + + + Remove obsolete TagPlugin file from JSP examples (billbarker) + + 36019: Made clear the Host-Manager HowTo is coming soon, not ready yet. (yoavs) + + + 36336: Check WAR extension in both upper and lower case, as suggested by + A. Grasoff. (yoavs) + + + 35982: Can't delete mail sessions in admin webapp. (yoavs) + + + 36673: Similar to the one above, for data sources. (yoavs) + + + +
+ +
+ + + + Remove uneeded files in conf. (remm) + + + Change distribution file names from jakarta-* to apache-*. (remm) + + + + + + + + Add JMX Remote create and unregister ant tasks (pero) + + + 36343: Only normalize out backslash on Windows platforms. (billbarker) + + + Allow configuring standard stream redirection. (remm) + + + 36088: Add RUNNING.txt and RELEASE-NOTES.txt to fulldocs distro. (yoavs) + + + 36534: fix equals for URLs returned by ServletContext.getResource() (luehe) + + + 36558: Clear IntrospectionUtils cache when stopping a webapp, as it + could leak to keeping a reference to the classloader (remm) + + + 36113: Session persistence for objects with primitive types could fail in + some rare cases (remm) + + + 36541: Full synchronization for session objects attributes collections (remm) + + + 35609: service.bat echo command when wrong arguments given [patch by Robert + Longson] (yoavs) + + + 34749: jsessionid dropped on trailing slash (/) redirect (remm) + + + + + + + + Add support for secret for AJP APR (remm) + + + + + + + + Fix NPE with an error message when no Java compiler is available (remm) + + + Restrict System err stream capture to the Ant compiler, as the Eclipse compiler + does not need it (remm) + + + JSP compilation speed improvement using tag library information caching, + submitted by Xingbo Gao (remm) + + + Initial contribution of JSTL tag plugins supporting the core tag library of + JSTL, submitted by Jing Li (remm) + + + + + + + + 36541: Sync all session attribute access (read and write) at DeltaSession (pero) + + + 36518: Classname typos for senders, submitted by Christoph Bachhuber-Haller (remm) + + + 35613: Added FAQ question and answer about tcpListenAddress="auto" and /etc/hosts (yoavs) + + + Moved FAQ section for Clustering from Clustering HowTo page to its own FAQ page. (yoavs) + + + + + + + + 36319: Fix broken link to DBCP docs, submitted by Xavier Poinsard (remm) + + + Brand new deployer specs, submitted by Allistair Crossley (remm) + + + +
+ +
+ + + + Update to Xerces 2.7.1 (remm) + + + Add ready to build bin/tomcat-native.tar.gz for the APR JNI wrapper library (remm) + + + 35930: Bad logging config used by the Tomcat Windows service (remm) + + + 33261: Windows installer now checks the user type and warns non-admins as needed. (yoavs) + + + The Windows installer will now optionally download a (32bit) Windows .dll for Tomcat native + from HEAnet (remm) + + + Declaration of jspc Ant task to fix the deployer package (remm) + + + + + + + + Add concurrency control valve (o.a.c.valves.SemaphoreValve). As the Tomcat distribution + is not built for Java 5, the valve will have to be compiled from the sources + using Java 5 (remm) + + + 35880: Ignore JSSE15SocketFactory when generating JavaDoc, as it breaks + the JDK 1.4 JavaDoc tool. (yoavs) + + + 35865: setclasspath.sh cannot be excutive under cygwin. (funkman) + + + 33267: Set working path in service installer, as suggested by Dominik + Drzewiecki. (yoavs) + + + 34794: Update connector documentation to include clientAuth attribute. (yoavs) + + + 35894, 36228: Fix CNFE when starting in a sandbox. (billbarker, remm) + + + Add version check for Tomcat native so that incompatible API changes are detected early (remm) + + + 36020: Allow MemoryUserDatabase to work better on write protected mediums, + submitted by Rainer Jung (remm) + + + 35978: Bad handling of single range requests greater than 2GB in the DefaultServlet + (remm) + + + 35984: Client abort exceptions will now use getCause (remm) + + + Fix handling of non-file based includes with SSI, submitted by David Becker (markt) + + + + + + + + Fix default ports for http and https which are set in the request when the parsed + hostname does not specify the port, and which were inverted (https was set as 80 + and http as 443). (remm) + + + Add missing tomcatAuthentication attribute to the AJP APR implementation. (remm) + + + Check filename sendfile attribute only if sendfile is enabled. (remm) + + + Fix output buffering for APR AJP implementation. (remm) + + + 35941: Fix getRemoteAddr for APR AJP implementation. (remm) + + + 35942: Fix NPE retriving cipher suite attribute when no certificate + was submitted (for example with no SSL). (remm) + + + Internationalization and code cleanups for APR AJP implementation. (remm) + + + Security exception in APR AJP implementation when running with the security + manager enabled. (remm) + + + 36173: Add missing sync in FastHttpDateFormat.formatDate, submitted + by Alexei Krainiouk (remm) + + + Disable HTTP compression when sendfile is used for a resource (remm) + + + AJP secret attribute report only at trace level. (pero) + + + + + + + + 36127: Validation compatibility with Xerces 2.7.1, submitted + by Florent Benoit (remm) + + + + + + + + Fix NPE when cluster stops (pero) + + + 36218: MemoryRealm now support also GenericPrincipal, but + JAASRealm with cluster replication still has a problem, detected by Dirk Dekok (pero) + + + + + + + + +
+ +
+ + + + Add JMX remote ant task to control tomcat MBeanserver via ant scripts. + Ant lib is included at "server/lib/catalina-ant-jmx.jar" and documentation + is added to Monitoring and Managing Tomcat How-To (pero) + + + 34361: Integrate better antlib and import support for + catalina manager tasks [Modified patch from Daniel Santos] (pero) + + + StoreConfig save now the Connector.sslProtocol attribute. (pero) + + + Change log dir at service.bat to "$CATALINA_BASE/logs" for better multi instance support. (pero) + + + 34237: Added note and links to context and host configuration + references in JNDI DataSources HowTo to aid the clueless. (yoavs) + + + 34248: Update JavaMail download instructions to include JAF. (yoavs) + + + Update to JDT from Eclipse 3.1, with support for Java 5 (remm) + + + Refactoring, redesign and extend the cluster module + - Cluster can be configured as subelement from Engine and Host. + - Optimized performance and reduce memory usage + - Better JMX support + - add a lot of JMX stats attribute for better monitoring + - add a single element default cluster configuration + - more config options + LifecycleListener + ClusterListener + more than one cluster valves + - better subclass support + - change a lot of existing cluster API's (pero) + + + Add Apache Portable Runtime JNI wrapper and helper API (mturk) + + + Update JULI to provide support for taking over java.util.logging bootstrap configuration, + and move the default properties file to ${catalina.base}/conf/logging.properties (remm) + + + 34746: Updated catalina.properties instructions per Bill Edwards' suggestion. (yoavs) + + + 35090: Minor documentation typo fix. (yoavs) + + + 34931: Rewrote ROOT/index.jsp to be XHTML strict compliant, per Richard + Beton's patch. (yoavs) + + + + + + + + 20380: Access log timestamps now take account of Daylight Saving + Time (DST). (markt) + + + 34220: Provide better error message when server.xml can't be located. + [Modified patch from Ralf Hauser] (yoavs) + + + Add MessageListener and LifecylceListener cluster saving to storeconfig module + (<Cluster ... ><ClusterListener className="org.apache.catalina.cluster.session.JvmRouteSessionIDBinderListener" >) (pero) + + + 33743: Add additional synchronization in webapp classloader to avoid + possible race condition when defining a class (remm) + + + 33711: Add events on passivate and activate to cleanup SSO, and recycle + session objects when removing them from a manager (so that anyone keeping references + to it would leak a minimal amount of memory) (remm) + + + Re-add patch causing Session.getId to throw an ISE, and make all internal components + use a safe getIdInternal method (remm) + + + Store principal to be exposed for Request.getUserPrincipal inside the GenericPrincipal, + to remove hacks from the JAAS realm (remm) + + + 10385: SSI Servlet now includes better support for files that use character + encodings other than the platform default.(markt) + + + Remove CopyParentClassLoader rule, which doesn't seem to be doing anything useful + anymore. (remm) + + + Provide an ServletFilter implementation of Server Side Includes (SSI). This was + submitted by David Becker under 33106. (markt) + + + Add sendfile support to default servlet, with a sendfileSize configuration attribute. + (remm) + + + If APR as well as Tomcat's JNI wrapper for APR are present, use APRized protocol handlers + instead of the regular ones (remm) + + + 22617: When used with an EJB container and a realm that supports the concept + of an unauthenticated user (J2EE.3.4.3) BASIC authentication was always authenticating + users as the unauthenticated user without giving them a chance to supply a username and + password. (markt) + + + Prevent facade objects cloning (remm) + + + Add missing CGI variables to SSI servlet. Patch submitted by Fritz Schneider. (markt) + + + 34578: Updated JNDIRealm comment. (yoavs) + + + 34273: Better Bootstrap warning message. [Path from Ralf Hauser] (yoavs) + + + 34675: Updated Proxy-HowTo page with Servlet API calls. (yoavs) + + + 34546: Fix problem where the "first" Valve couldn't be removed from a Pipeline. (billbarker) + + + Fix NPE when POST size exceeds limit defined by maxPostSize. (markt) + + + Fix FORM authentication so POSTed parameters are not assumed to be encoded with platform + default encoding. A side effect of this fix is that the bodies of POST requests that + require FORM authentication are now buffered and made available after a sucessful login. (markt) + + + 34840: Better handling of external WARs redeployment, and ignore docBase specified + in context file if within the Host appBase (remm) + + + Fix handling of symbolic links when the DefaultServlet is generating directory + listings. (markt) + + + 35769: Correct implementation of javax.naming.Context.composeName( Name, Name) + in multiple places. Patch provided by Laurent Simon. (markt) + + + 34805: Add warning for suspicious security patterns, as suggested by Ralf Hauser. (yoavs) + + + 35819: Use getWorkPath for deleting work directory on context destroy, as suggested + by Rob Steele. (yoavs) + + + + + + + + Add support for using "Smart Cards" as trust/keyStore. (billbarker) + + + Add some Mbean attributes and operations to ChannelSocket (pero) + + + Apache Portable Runtime based HTTP/1.1 protocol handler, with SSL support (remm) + + + Add support for simple file-based CRLs under JDK 1.5 (billbarker) + + + Add experimental NIO-Socket channel for the AJP/1.3 Connector (billbarker) + + + 34648: Add configuration option to enable IP-based Virtual Hosts. (billbarker) + + + Refactor the AJP/1.3 Connector to be able to handle more advanced Actions. (billbarker) + + + Fix connector initialisation so sslProtocol is not required for SSL. (markt) + + + Add bufferSize option to the AJP/1.3 Java connector to control output buffering. (billbarker) + + + Apache Portable Runtime based AJP/1.3 protocol handler (remm) + + + Delay reading the inital request body packet by default for the AJP/1.3 Java connector. (billbarker) + + + + + + + + 18477: Allow symbolic links when precompiling JSPs (markt) + + + 34727: Allow specifying the Option class used by the Jasper engine, + submitted by Scott Stark (remm) + + + Support for Java 5.0 in JSPs (remm) + + + Java 5 will be the source and target for JSPs when running on Java 5 (remm) + + + 34652: Add the ability to get SMAPs when precompiling, submitted by + Daryl Robbins (remm) + + + 34465: Jspc failure if there is no web.xml (remm) + + + 35696: Make certain that release is called for custom tags + when tag-pooling is disabled. (billbarker) + + + 35386: Make useBean resources use consistent spelling, from Kurt Huwig. (yoavs) + + + 33522: Update jasper-howto to reflect use of javac switch. (yoavs) + + + 35114: Add failOnError flag to JspC, by ziweth. (yoavs) + + + 35410: Fixed NPE in JspWriterImpl. (yoavs) + + + 35571: JspC resolved uriRoot relative to Ant project basedir, if any, as suggested + by Jason Pettiss. (yoavs) + + + + + + + + Add that cluster can configure as Engine and Host element. (pero) + + + Add single cluster default configuration element - discussed at JAX 2005 conference Cluster Workshop. (pero) + + + Fix resend GET_ALL_SESSIONS when wait ACK failed at receiver side (pero) + + + ClusterValve now remove from container element when cluster stops and added with next start again. (pero) + + + Set timestamp only at first time inside SessionMessageImpl (pero) + + + Set timestamp from findsessions method call, when handling GET_ALL_SESSION + to all SEND_SESSION_DATA and TRANSFER complete messages. (pero> + + + Drop all received message inside GET_ALL_SESSION message queue before state + transfer message timestamp. (pero) + + + Cluster ping now transfer cluster domain information and DeltaManager only + send and receive message from same domain members (pero) + + + JMX Support for McastService (Membership) (pero) + + + Redesign SimpleTcpCluster message receiving to ClusterReceiverBase (pero) + + + Cluster transfer all attributes to the generate session manager at addManager. + Remove some unused attributes at SimpleTcpCluster and ReplicationTransmitter (pero) + + + Refactor DeltaManager: + - createSession call now ManagerBase super class method + - extract some long methods + - send GET_ALL_SESSION with session blocks + - don't sync sessions map when send all sessions (pero) + + + Add developer actions at to-do.txt (Proposal of changes) (pero) + + + Small refactorings at FastAsyncSocketSender (pero) + + + Redesign cluster message sending to lesser cpu and memory usage. + Set at ReplicationTransmitter#compress=false as default. Change API from + ClusterSender, ReplicaitonTransmitter, DataSender, SimpleTcpCluster (pero) + + + DeltaManager has now JMX expireAllLocalSessions and processExipre operation + for better cluster node shutdown handling (usefull for testing only) (pero) + + + DataSender doWaitAckStats for better understanding wait ack problems (pero) + + + Refactor DeltaManager and add counter for cluster message send/receive message (pero) + + + 34389:Porting Clustering fix pack to 5.5.10 code base. + Remove synchonized from DataSender.pushMessage(). Very offen the + complete cluster blocking after replicated a bulk of new session messages under heavy load. + All cluster node standing for a lot of time and made nothing. + Fix it for pooled, asynchronous and fastasyncqueue replication mode. Very bad thing, sorry! (pero) + + + Add notifySessionListenersOnReplication attribute to SimpleTcpCluster to stop notify + event to SessionListener at backup nodes from create and destroy replicated session (pero) + + + Add compress attribute to ClusterSender and ClusterReceiver interface. Now compress config + transfer from sender to receiver at SimpleTcpCluster. (pero) + + + Add ClusterValve interface and implement it as ReplicationValve and JvmRouteBinderValve. Now both + Valves can be directly configured at server.xml Host/Cluster/Valve subelements. + Also this configuration are correctly handled with the StoreConfig module. (pero) + + + Deactivate DataSender keepAliveMaxRequestCount change default to -1. + Cluster replication sockets are fast and very stable! (pero) + + + Setup JvmRouteBinderValve as host valve instead context valve. Refactor the API a little bit. (pero) + + + Don't increment open socket counter before socket is really open. Add socket open failures counter (pero) + + + Add MessageListener support to cluster server.xml element (ClusterListener) to + register your own cluster message receiver (pero) + + + Add LifecycleListener support to cluster server.xml element (Listener) + and notify those listener from start/stop cluster, + add/remove session manager, sending fault and start/stop member (pero) + + + Add active backgroundProcess keepAlive timeout and request count socket close check + at ReplicationTransmitter. Check frequency can be change with attribute + processSenderFrequency (default 2). (pero) + + + Remove useless Jdk13ReplicationListener,Jdk13ObjectReader. + Add SocketReplicationListener and SocketObjectReader to have nativ socket ClusterReceiver. + Also extract ClusterReceiverBase superclass for SocketReplicationListener and ReplicationListener (pero) + + + Add and update some API and the cluster howto documentation (pero) + + + Refactor ReplicationValve for better understanding and small optimization (pero) + + + Starting a unit test suite for cluster module - very much todo (pero) + + + Fix ant build.xml to direct compile at cluster module directory (pero) + + + Fix some I18N messages, but a lot of work is waiting for fix (pero) + + + Add ReplicationValve Mbeans stats attribute getter and resetStatistics operation (pero) + + + + + + + + 35758: Admin webapp mishandling digest attribute of JDBCDataSourceRealm. (yoavs) + + + 34250: Admin webapp Commit Changes button now asks for confirmation. (yoavs) + + + 34818: Alternating row for apps in HTML manager, as suggested by Jeff + Domeyer. (yoavs) + + + 35379: Added commons-logging to build path of manager and host-manager apps, + to make them build with Jikes, as suggested by Aaron Isotton. (yoavs) + + + +
+ +
+ + + + Add JULI, a java.util.logging implementation, used to provide sane defaults and + configurability equivalent to Tomcat 4.0 for Tomcat 5.5 logging (remm) + + + Add JULI documentation to the logging page (remm) + + + Add host manager webapp (remm) + + + Add ant JkStatusUpdateTask for remote status worker handling ( >=mod_jk 1.2.9) (pero) + + + 33739: Add reference to RUNNING.txt in setup.html. (yoavs) + + + 33719: Update reference to Ant download page. (yoavs) + + + 33883: Bad options in SSL-HowTo. (yoavs) + + + Update to MX4J 3.0.1 (pero) + + + 34139: Updated Realm-HowTo to specify JMX, Commons-Logging jars for RealmBase. (yoavs) + + + 33325: Added top-level clean target to Netbuild build.xml file. (yoavs) + + + 33755: Clarified Postgresql JNDI datasource example. [patch submitted by + Tom Witmer] (yoavs) + + + + + + + + Remove some instances of expanded folder removal (remm) + + + Don't call mkdirs if we're not going to save the configuration in StandardContext (remm) + + + Fix context classloader binding during loader initialization (it was set to null before) (remm) + + + The webapp logger should only be retrieved when the context classloader is set to the + webapp's classloader (remm) + + + 34170: Add back retry logic in JDBC realm in case of a connection failure (remm) + + + 22041: Support dynamic proxies as session objects. (markt) + + + Fix logger names for wrappers (remm) + + + 34006: If antiResourceLocking was used, HostConfig considered the path as external, + and web application resources were not correctly removed or tacked; also simplify the code a lot + (remm) + + + 34016: Save and restore docBase when using antiResourceLocking, for compatibility with + the admin webapp (remm) + + + 33636: Set lastModified attribute when expanding WAR files. (yoavs) + + + 32938: Allow Salted SHA (SSHA) passwords in JNDIRealm. (yoavs) + + + 31288: Allow SMTP authentication for JNDI MailSessionFactory. (yoavs) + + + Harmonize processing of the context.xml defaults with the way web.xml is processed + (remm) + + + Ignore ';' if it is in the query string (remm) + + + private to protected for the webapp classloader (remm) + + + Improve logging of filters and listeners startup errors (remm) + + + 33774: Retry once in JNDI realm authenticate failure regardless of the + exception message (remm) + + + 33961: Don't encode '~' in context paths (remm) + + + 32866: Propagate distributable property from context to manager (yoavs) + + + 32867: Reset distributable attribute in context for clean reload handling (yoavs) + + + Fix some RealmBase/JNDIRealm log.isXXXEnabled (pero) + + + 34161: Harmonize StandardContext.stop with ContainerBase.stop (remm) + + + + + + + + 33971: Set remoteHost to null when Apache doesn't send one. (billbarker) + + + Fix calculation of threadRatio for the ms thread pool, and fix setting the updated + timeout value (remm) + + + Update the ms thread pool so that we allocate a worker before accepting a new socket, + and wait a little if the pool is exhausted; this should make low maxThreads values work a + lot better (remm) + + + 33857: Update information on automatic mod_jk configuration in Apache-HowTo (yoavs) + + + Fix sync block placement in Mapper.addContext (remm) + + + 32741: Fix spelling of "committed" [patch from Ben Souther] (yoavs) + + + 34133: Make setHeader clear multi-valued headers (billbarker) + + + + + + + + 34034: Jasper does not respect external entities (billbarker) + + + 33810: Incorrect recycling of BodyContent if close is called (remm) + + + Per instance loggers in Jasper (remm) + + + + + + + + Fix JvmRouteBinderValve primary failover attribute to + org.apache.catalina.cluster.session.JvmRouteOrignalSessionID (pero) + + + Change attribute name waitForAck to sendAck at ReplicationListener (pero) + + + Integrate new fastasyncqueue cluster sender mode. + Support queue size limitation, + get all queued objects and send it to the backup node, + no queue thread lock contention under high replication load, + submitted by Rainer Jung (pero) + + + Add compress attribute to Sender and Receiver to transfer data uncompressed. + At high cluster load this option consume lesser cpu and memory. + Implement the compress handling to ReplicationTransmitter, ReplicationListener, + XByteBuffer and Jdk13ReplicationListener (pero) + + + Add doProcessingStats to synchronous, asynchronous and fastqueueasync sender modes + to get min, avg, max processing times as IDataSender JMX MBeans (pero) + + + TcpThreadPool use constant ACK byte array instead create + new 3 byte buffer for every message ack (pero) + + + Refactor ReplicationTransmitter and ReplicationListener (pero) + + + add getCatalinaCluster() to ClusterReceiver and SimpleTcpCluster (pero) + + + Update the Api documentation (pero) + + + + + + + Use the standard struts taglib URIs in admin JSPs. (billbarker) + + + Add more host parameters to create new host with host-manager (pero) + + + 34033: Fix quoting related bugs (remm) + + + 33713: Add Struts init code in frameset.jsp as well (remm) + + + +
+ +
+ + + + 33204: Fixed SSL HowTo page. (yoavs) + + + 33351: Fix silent uninstallation. (remm) + + + 33489: Missing space in uninstaller message. (yoavs) + + + + + + + + Unregister host mbean and all context mbeans at remove a host, s. StandardHost.destroy() and MBeanFactory.createStandardHost/removeHost(,) detected by Thorsten Kamann (pero) + + + make it possible to restart connector, now serversocket recreated after stop,start (pero) + + + change mbean names from Mapper and ProtocolHandler to connector naming style (pero) + + + Add some log.isXXXEnabled (pero) + + + Deregister MapperListener after remove connector (pero) + + + Remove host only at own domain with same name at all services, detected by Thorsten Kamann (pero) + + + 33187: Remove any logging of the password in the JAAS realm, + submitted by Andrew Jaquith (remm) + + + 33033: Don't do anything to the response in the ErrorReportValve + if data has already been written (remm) + + + Add charset support for the URLs used by the tasks, to remove deprecation (remm) + + + 26135: Workaround for memory leak when reloading Struts + based web applications by clearing the bean instrospector cache of the JVM on + classloader stop, submitted by Tobias Lofstrand. (remm) + + + Ensure that if CLASSPATH is declared on startup - it is not used. (funkman) + + + Add back use of deployOnStartup in HostConfig (remm) + + + Ant tasks docs patches, submitted by Gabriele Garuglieri. (remm) + + + Use NIO for the raw copying operation, as it is faster (a little under 30%), + and decreases a little the impact of antiResourceLocking. (remm) + + + 33357: Fix connection leaks with the DataSourceRealm, as well + as improve efficiency, submitted by Dominik Drzewiecki. (remm) + + + Improve a little logging of servlet exceptions, which should all log the root cause. (remm) + + + Add new Manager.createSession(sessionId) method, allowing the client to "specify" the session id which should be used using a cookie + when using emptySessionPath="true". This fixes session tracking in this case. (remm) + + + 33368: Fix memory leak in swallowOutput feature which occurred when the thread pool size is + reduced, submitted by Rainer Jung. (remm) + + + StoreConfig: can't save cluster Membership element (pero) + + + StoreConfig: suppress default jkHome attribute at connector (pero) + + + StoreConfig: Save new dymanic properties from ReplicationTransmitter (pero) + + + 33463: Remove attributes after context destroy. (remm) + + + 33572: context.xml should be a redeploy resource, and add prioritization for + redeploy resources. (remm) + + + + + + + + PoolTcpEndpoint recreate ServerSocket after start,stop,start connector (pero) + + + Add some log.isXXXEnabled (pero) + + + JkMX: make log4j mbean configurable with attribute log4jEnabled (pero) + + + When Tomcat runs on Windows and IE is uploading data to the server, the first read + must be at least 8KB, otherwise upload speed is extremely low, submitted by Noel + Rocher (remm) + + + + + + + + 33223: pageContext.forward and jsp:include result + in StringIndexOutOfBoundsException (luehe) + + + 33373: Fix handling of context classloader in jspc (remm) + + + 33538: Ignore example and tag-extension elements in TagLibraryInfoImpl. (yoavs) + + + 33539: Better error message when an unknown element is encountered in the tag file. (yoavs) + + + 33219: Minor JspServletWrapper code cleanup. (yoavs) + + + + + + + + Add instance based ReplicationValve statistics to Mbean descriptor (pero) + + + Better I18N support to cluster session and tcp classes (pero) + + + Support optional primaryIndicator at ReplicationValve to mark that + request processing to existing session is at primary cluster node. + Easy failover detection, when mark is not at + configurable primaryIndicator attribute, submitted by Rainer Jung (pero) + + + Refactor all implementation from interface IDataSenders (pero) + + + Add some usefull attributes and operations to the all sender MBeans. (pero) + + + Add keepAlive and waitForAck handling to AsyncSocketSender and factor out a DataSender base class.(pero) + + + ReplicationTransmitter: Enable and Disable autoreconnect sender and waitForAck. (pero) + + + ReplicationTransmitter: transfer all properties to socket sender from server.xml configuration. (pero) + + + + + + + + Fix create and remove Host for Admin app. (pero) + + + +
+ +
+ + + + Add installer for mod_jk on IIS. (mturk) + + + New store config module for better server.xml saving support.
+ Add <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener" /> to your server.xml (pero) +
+ + 32081: Remove the JDK requirement from the Unix scripts, submitted + by Ben Souther (remm) + + + 32953: SERVLETAPI: XSS Issues, submitted by Mark Thomas (jfarcand) + + + Update to commons-digester 1.6, JDT 3.0.1, MX4J 2.1.0, Struts 1.2.6 (remm) + +
+
+ + + + + First integration at StoreConfig to StandardServer (pero) + + + 32714 : Don't make the AccessLogValve final (funkman) + + + 32694: Fix bad code to make docBase path aboslute in antiLocking + method. (remm) + + + 32713: Fix resource-env-ref handling. (remm) + + + 31201: Improve i18n support in DefaultServlet. This was causing + problems with JSP include actions and static files. (markt) + + + Add some log.isXXXEnabled to o.a.c.core.StandardHost StandardEngine, StandardService (pero) + + + Feature addition to add Redirector and failOnError support for all Catalina Ant tasks, + submitted by Gabriele Garuglieri (remm) + + + 31198: Fix FORM and DIGEST authentication for non-ASCII + usernames and passwords. (markt) + + + Reimplement charset mapper (remm) + + + Add logging of exception which could occur when retrieving the password in JDBCRealm (remm) + + + 25889: Don't execute queries twice, submitted by Tom Anderson (remm) + + + 32832: request.getSession(false) fails to return null (luehe) + + + 28222: request.getRequestURL() in forwarded jsp/servlet returns + original url rather than new url as per SRV8.4 (markt) + + + 33157: Fix handling of the buffer length for basic authentication parsing (remm) + + + + + + + + 32708: Better handling of bad encoding with the string cache. (remm) + + + 32781: Fix bad initialization of the "scheme" field of the request + object, which would cause getScheme to return "http" for the first request. (remm) + + + Content length should be ignored if there is chunking (remm) + + + Remove most deprecation problems for the AJP connector (remm) + + + + + + + + 32746: Avoid JAR locking when loading classes and improve loading + performance by taking advantage of caching, submitted by Dominik Drzewiecki. (remm) + + + + + + + + correct JvmRouteSessionIDBinderListener MBean name to <domain>:type=Listener,name=JvmRouteSessionIDBinderListener,host=<host> (pero) + + + JMX support to SimpleTcpCluster, ReplicationTransmitter and all senders (pero) + + + + + + + + Fix the webDAV servlet so it can be used via any arbitrary mapping + (eg /webdav/*) to edit the contents of a web application. (markt) + + + 32729: Stop is optional and may fail, so it needs to be in a separate try/catch (remm) + + + Remove the remove method of the manager servlet, and use the undeploy method instead (remm) + + + 32777: Fail if application isn't configured properly, submitted by Gabriele Garuglieri + (remm) + + + 32771: Cannot undeploy/deploy misconfigured app after tomcat startup, + submitted by Gabriele Garuglieri (remm) + + + 28867: Correct manager documentation to document correct way to + reference the ROOT context. Submitted by Stephane Bailliez. (markt) + + + 33085: Add support for setting privileged attribute of context + to admin webapp. (markt) + + + 33117: Fix Open bugs link broken on default homepage. + Patch supplied by Sander Temme. (markt) + + + Improve javadoc generation for Catalina. (remm) + + + +
+ +
+ + + + 32532: updated logging documentation. (yoavs) + + + 32382: Index page and packaed WAR for sample webapp. (yoavs) + + + 32603: Updated host.xml to reflect appBase resolution. (yoavs) + + + + + + + + Add child to the map of the parent before starting it. (remm) + + + Decouple usage of the scheme and secure attributes from enabling SSL. (remm) + + + 32502: memory leak in DigestAuthenticator. (yoavs) + + + 28709: javax.servlet.http.HttpServletRequest.isRequestedSessionIdValid() returns true for an invalidated session. (luehe) + + + 32137: Possible thread-safety issue in RealmBase. (yoavs) + + + + + + + + 32585: Better handling for content length greater than Integer.MAX_VALUE in response. (markt) + + + Allow ApacheConfig and friends to live under an Engine. (billbarker) + + + Syncronize access to the Jk Request registration count. (billbarker) + + + Speed the MsgContext on its way to GC. (billbarker) + + + Keep correct thread counts in Thread pool when thread ends in an exception (billbarker) + + + + + + + + Updated Jasper-HowTo section on using Jikes, changed conf/web.xml JSPServlet to refer people to Jasper-HowTo so that we don't have these instructions in two places. (yoavs) + + + + + + + + 32505: Fix handling of an empty context parameter (which occurred every time the HTML + manager was used to deploy a local war without specifying also a context file). (remm) + + + +
+ +
+ + + + 32235: Sync conf/web.xml MIME types with Apache httpd. (yoavs) + + + 31132: Better -x/-r support for OS/400 in startup scripts. (yoavs) + + + 22679: Added misc note on accessing session ID to SSL-HowTo. (yoavs) + + + + 32249: Updated logging documentation. (yoavs) + + + 32282: Modify Windows Uninstaller to only remove webapps/ROOT and webapps if user asks to remove everything. (yoavs) + + + 32371: outdated introduction.xml page. (yoavs) + + + 32373: outdated installation.xml page. (yoavs) + + + 32454: amended JNDI documentation for JavaMail/JavaActivationFramework usage. (yoavs) + + + + + + + + 32130: Add safety check to FileStore#keys method. (yoavs) + + + 32276: Add developer info to Realm How-To. (yoavs) + + + 32082: Added protected getPrincipals method to MemoryRealm for easier extension. (yoavs) + + + 32023: CGIServlet fails to handle post message with multipart/form data. (yoavs) + + + 32269: JNDIRealm fails with InvalidNameException to authenticate users if LDAP distinguished name (DN) contains slash or double quote character(s). (yoavs) + + + Move processExpiresFrequency check to ManagerBase and reflect change to all subclasses (StandardManager, PersientManagerBase, DeltaManager). (pero) + + + Add DIGEST authentication support to the JDBC and DataSource realms. Supports both digested and cleartext passwords. (markt) + + + 32429: CGIServlet calculates number of lines received on stderr incorrectly. (markt) + + + 32431: Fix typo in code that passes data to CGI script. (markt) + + + 32430: Class cast exception in toString() method within CGI servlet. (markt) + + + Add some log.isXXXEnabled checks at StandardContext and HostConfig (pero) + + + Remove the last DefaultContext artifacts (pero) + + + 32031: using createConnector with "http" protocol (remm) + + + Add configFile attribute in JMX descriptors (remm) + + + Fix autodeployer handling of a war which includes a /META-INF/context.xml, so that it is + correctly registered and can be reloaded correctly (remm) + + + 32137: Use of MessageDigest should be synced in DIGEST (remm) + + + Add info log when the autodeployer reloads a context (remm) + + + + + + + + Small HTTP/1.1 optimizations: replace usage of Strings with constant byte arrays, and + simplify the code converting Strings to bytes (remm) + + + Greatly reduce the amount of recycle method calls on the buffers (remm) + + Add null OName check for Request unregistration in Jk, to remove + exception under JDK 1.5. (billbarker) + + 32292: Don't send keep-alive header when the protocol + can't be parsed. (billbarker) + + + + + + + + Updated JspC usage messages to include recently added configurable parameters. (yoavs) + + + 32330: JspC changes context classloader. (yoavs) + + + + + + + + JvmRouteBinderValve/JvmRouteSessionIDBinderListener to bind cluster session after primary node failure at first calling backup node. + This was an option to have session stickyness after cluster node crashed. Work only with JESSIONID cookies. (pero) + + + Better log support to DeltaManager to see detail information at debug level. (pero) + + + Fix FarmWarDeployer based on new HostConfig deployer. (pero) + + + FarmWarDeployer controlled WarWatcher with engine backgroundProcess call. + Added processDeployFrequency attribute to Deployer server.xml element. (pero) + + + + + + + + 32019: Remove maxlength=64 restriction on env entry values in admin webapp. (yoavs) + + + Fix various problems in realm docs, submitted by Phil Mocek. (remm) + + + Add log4j docs submitted by Allistair Crossley. (remm) + + 32381: Fix problem where EL expression is used as a + place holder in the admin webapp. + Submitted by Allistair Crossley. (billbarker) + + + +
+ +
+ + + + 31671: Update web.xml files to 2.4 schema where applicable. (yoavs) + + + 31912: Add PNG and CSS file types to replication filter default. (yoavs) + + + + + + + + Add processExpiresFrequency to PersistentManagerBase and made some small JDBCStore optimizations (pero) + + + Register JSP monitoring mbean for each servlet that declares a jsp-file in web.xml. (luehe) + + + 31578: Update Manager configuration documentation. (yoavs) + + + 31273: Add support for derefaliases in JNDIRealm. (markt) + + + 31623: Better OS400 support in setclasspath.sh. (yoavs) + + + Extend background processing to most container components. (remm) + + + Remove all MX4J related code. (remm) + + + Update JAR list in TldConfig. (remm) + + + Register datasources with JMX. With DBCP, this is enough to provide JMX management and monitoring. + It might work well with many other data sources which might not register themselves in JMX + but do expose their stuff in a java bean fashion. (remm) + + + Add the ability to force session cookies to be set to the root path "/". This should not be used + on large servers, otherwise tons of cookies may be sent. (remm) + + + Workaround for client socket exceptions occurring while running a CGI, which could cause + the external process to hang. (remm) + + + Optimize session cookie IDs conversion to String, since this is an unavoidable and uncacheable + operation. (remm) + + + Add explicit error message if temp dir does not exist, and remove useless calls to initDirs. (remm) + + + Add an optimized access log valve, supporting hardcoded support for the common and combined patterns, + and doing a majority of its write-to-logfile operations asynchronously. (remm) + + + Register an MBean to monitor and manage the StringCache, and allow invoking the reset operation. (remm) + + + 31677: Log warning if work dir for context can't be determined. (yoavs) + + + 31903: Fix condition which seems to not have been properly updated after adding + entry.binaryContent = null a little below, submitted by Joe Zhou. (remm) + + + Prevent silent NPEs during StandardContext.start dealing with JMX registration of realm, submitted + by Keith Wannamaker. (remm) + + + 31592: Support other encodings for digests. (yoavs) + + + 31739: Minor realm-howto and AJP connector doc updates. (yoavs) + + + 31753: Minor inconsistency between JDBC and DataSourceRealm#authenticate. (yoavs) + + + 31683: Minor clarifications to realm documentation. (yoavs) + + + + + + + + Improve i18n in TCP endpoint, and add a better error message when an exception occurs + in setSocketOptions. (remm) + + + 31663: Use interval field as the delay for monitor thread. (remm) + + + Remove bad shutdown logic for ms pool strategy. (remm) + + + Sync with Cookie, by adding ' ' as a special char. If a special char is present, + the string will be quoted. If the client doesn't support it, the String will no be quoted anyway + and no IAE will be thrown. (remm) + + + Add an optional String cache for ByteChunk.toString and CharChunk.toString. The cache is + unsynchronized during most of its operation, and is static after a training period. An operation + is provided to allow resetting the cache. (remm) + + + String caching is enabled by default for ByteChunk. (remm) + + + 31090: Use a URL encoded path when setting session cookies. (remm) + + + Add getAttributeName() to ProtocolHandler to get all attributes at runtime (pero) + + + + + + + + Exposed compilerSourceVM and compilerTargetVM options to JspC. (yoavs) + + + + + + + + DeltaManager and SimpleTcpReplicationManager generate double jvmRoute (pero) + + + Add some missing Getters and log.isXXXEnableds (pero) + + + + + + + + 31707: Broken JavaScript confirmation in HTML manager. (yoavs) + + + Remove hard-coded admin context path from admin's banner.jsp. (yoavs) + + + Major connector docs update. (remm) + + + 31732: Fix Japanese localization of Manager's list output. (yoavs) + + + + +
+ +
+ + + + + 30568: Incomplete setup.html documentation for launching jsvc. (yoavs) + + + Repackage naming features. (remm) + + + Fix deployer packaging. (remm) + + + Fix embed packaging. (remm) + + + + + + + + Fix memory leak when Security Manager is turned on. (jfarcand) + + + When checking status codes for error handling, only check if + Response.isError() is true. This way, users may use setStatus() to set their own + error status without having the error page invoked. (in which case, the user should've + use sendError()) (funkman) + + + Remove Digester code for Xerces workaround. (jfarcand) + + + Give proper permission to the balancer app when running under the security manager. (jfarcand) + + + 30869: Make sure JAAS realm name is legal. (yoavs) + + + md5Helper, md5Encoder, and normalize are used by WebdavServlet, + not DefaultServelt so move them into WebdavServlet. + + + 31277: Clarified automatic application deployment section of Host configuration page. (yoavs) + + + 28631: JAASRealm enhancements to support custom user and role classes use Commons-Logging. (yoavs) + + + 31364: Missing resource in org.apache.catalina.core.LocalString.properties. (yoavs) + + + 31362: Missing -Xdebug in catalina.bat when launching with JPDA and Security. (yoavs) + + + 31356: Duplicates not counted in session generation. (yoavs) + + + 30949: Make sure ApplicationDispatcher unwraps request/response even if include error occurs. (yoavs) + + + Fixed StandardContext.getStartTime() to return actual start time/date instead of time (startupTime) it took to start context. (luehe) + + + getRequest/getResponse should return the most relevant interface, to avoid casts. (remm) + + + Add check for directory before considering something is a compressed WAR. (remm) + + + Update the connector documentation. (remm) + + + When parsing a context file, ignore the "path" attribute: + the only place where it is acceptable is in server.xml. (remm) + + + Digester handling fixes: always call reset in a finally block after using a digester. (remm) + + + Remove many fields from Connector, and tie the creation of the Connector to the + creation of the protocol handler. (remm) + + + Remove package triggers from the classloader, which seem useless when using Java 5. (remm) + + + Realms will now use set attribute to set themselves in their container when using JMX. (remm) + + + Fix JMX related operations with the Connector. (remm) + + + Fix save-to-XML for naming resources. (remm) + + + Remove authenticator "debug" attributes from the descriptors. (remm) + + + Refactor org.apache.catalina.deploy.ContextXXX to use new super class ResourceBase. (pero) + + + Enable Connector.findLifecycleListener that we can listen start/stop Connector events and save the listener to xml. (pero) + + + Remove Watchdog references, as it is no longer used. (yoavs) + + + 31511: Don't call setenv.bat if not found, in *using-launcher scripts. (yoavs) + + + 31549: Add name to WebappClassLoader's stopped message. (yoavs) + + + + + + + + Allow customized server header for Standalone. (funkman) + + + Digester.reset now removes the error handler, the root and calls clear, to prevent + any memory leak. (remm) + + + Remove useless stuff in digester. (remm) + + + In HTTP, add a utility method to convert strings to byte arrays, and output the server header + directly as bytes. (remm) + + + Add a master slave thread pool based on the code from Tomcat 4.0. It is less exotic than the + default one, and might fare better on some picky systems, such as Redhat 9. The two threadpools + will likely be removed once we use the Java 5 API, although more investigation is needed. (remm) + + + Fix issue with getProperty in IntrospectionUtils. (remm) + + + Remove attribute translation for SSL in the HTTP protocol handler: it will now be done in the + Catalina Connector class. (remm) + + + Fix handling of the "timeout" attribute of the HTTP protocol handler. (remm) + + + + + + + + 31171: Wrap to avoid ClassCastException in PageContextImpl. (yoavs) + + + 31257: Added specification of endorsed dirs if forking. Note that this is fairly useless for now in 5.5 since it uses JDT and not javac by default. (yoavs) + + + Document new Jasper defaults, and update the production configuration. (remm) + + + Copied XML encoding detection logic into JASPER, so we're no longer dependent on Xerces. (luehe) + + + Fix cosmetic issue where extra CRLF would be inserted during each precompilation in web.xml. (remm) + + + Allow configuring the interval following a compilation during which a JSP will not be checked + for modifications. (remm) + + + 31465: Ensure that the compiler reads the .java file using the same encoding as that with which it was written. (markt) + + + 31510: Null out response in JspWriterImpl#recycle to aid in JBoss memory leak. (yoavs) + + + + + + + + Added flag to the cluster (notifyListenersOnReplication) to enable/disable the + notifications of attribute/context listeners upon replication of a session delta + Works only with the DeltaManager (fhanik) + + + Added flag to the cluster (Cluster/Sender/ackTimeout) to set the timeout in milliseconds + for a synchronous request to go through, defaults to 15000ms (fhanik) + + + + + + + + 29485: I broke the HTML manager when adding JavaScript confirmation, fixed now ;) (yoavs) + + + 31058: Ensure StatusTransformer escapes query string for XML. (yoavs) + + + Added contexts' start time (available from 'startTime' MBean attribute of StandardContext) to status page (luehe) + + + 31264: the deploy task should now behave correctly. (remm) + + + Refactor the manager servlet to make calls to the deployer more robust. (remm) + + + Use the more robust String.valueOf in the form edit action of the connector. (remm) + + + +
+ + +
+ + + + The installer will now use the system's JRE. (remm) + + + + + + + + Fix URL generation for classloaders on Windows, causing common/classes and shared/classes + to be unusable (remm) + + + 31110: Fix resource packaging bug for servlets (remm) + + + Fix 5.5 regression where going through the authenticator would create a session each time. (remm) + + + Fix classname of the connector in Embedded, and remove the socket factory. (remm) + + + + + + + + Redo server header handling again. (remm) + + + Cleanup a little access to the headers using a local variable and + use setValue for Server and Date headers. (remm) + + + + + + + + Remove maxTagNesting and curTagNesting since they are unused. (funkman) + + + Fix tag files handling with JDT, which were ususable, and refactor the lifecycle handling of + the page loader. (remm) + + + + + + + + + + + + + +
+ +
+ + + + Tomcat 5.5 can be built on JDK 5.0. (yoavs) + + + Windows installer polish. (mladen, remm) + + + Remove dependency on Jakarta regexp. (remm) + + + + + + + + Allow overriding the location of the default context file, similar to the default + web.xml. (remm) + + + Backport if-else logic for SSI servlet from 4.1 (funkman) + + + Remove DefaultContext elements from the digester rules. (remm) + + + Fix ResourceLink handling. (remm) + + + Modify the auto deployer to get along with contexts which are statically defined in server.xml. (remm) + + + Externalize constant strings defining the location of deployment related resources. (remm) + + + 31052: BeanFactory swallows root cause of exception. (yoavs) + + + Allow using deploy Ant task with just config attribute, submitted by Michael Schuerig. (remm) + + + Added longest time an expired session had been alive to set of monitorable session manager attributes. (luehe) + + + Added average time an expired session had been alive to set of monitorable session manager attributes. (luehe) + + + Clear a reference in the digester where a context would be referenced for more time than it + needed, until the next context deployment operation. (remm) + + + + + + + + 31018: Race condition in SystemLogHandler. (yoavs) + + + + + + + + Use the "compiler" parameter to allow specifying that Ant should be used. (remm) + + + Ignore JDT compiler warnings. (remm) + + + Added compilerTargetVM option support, "1.4" default. (yoavs) + + + + + + + + Fix adding the clustering valve, so that session replication actually occurs. (fhanik) + + + + + + + + Major documentation update with current Tomcat 5.5 changes. (remm) + + + Added JavaScript confirmation dialog to "dangerous" Manager servler links. (yoavs) + + + +
+ +
+ + + + Many updated and fixed JavaDocs. (yoavs) + + + Designed and tested Tomcat on J2SE 5.0 (aka JDK 1.5). (everyone) + + + Bundled Eclipse JDT (new dependency) to allow Tomcat to run on a JRE only, i.e. no JDK required. (remm) + + + Repackage commons-dbcp and its dependencies as a sigle smaller WAR, with renamed packages. (remm) + + + Removed dependencies on commons-digester, commons-beanutils, and commons-collections. + The relevant digester functionality is now merged in tomcat-util. (remm) + + + + + + + + Removed usage of org.apache.catalina.Logger, increased usage of commons-logging everywhere. (remm) + + + Refactored classloader code to better handle JAR and general resource locking. (remm) + + + Written JMX-related code to play nicely with J2SE 5.0 built-in JMX abilities. (remm, costin) + + + Extensively profiled and optimized the server startup performance as well as the request mapping and processing pipeline. (remm) + + + The container will now always process a /META-INF/context.xml resource, unless the webapp has a specified external context file. (remm) + + + New default configuration mechanism for web applications, replacing DefaultContext. This uses a + shared context file located in conf/context.xml. (remm) + + + Revamped deployer, alloying full hotdeploy (note: on Windows, this requires the anti file locking + features). (remm) + + + Remove verbosity from the JNDI resources configuration, by allowing arbitrary attributes on the Resource element. (remm) + + + Simpler Valve interface, to allow smaller stack traces and reducing the amount of method calls. (remm) + + + + + + + + + + + Eclipse JDT is now the default Java compiler in Jasper. Source dependencies are now loaded from + the container classloader, and compilation times are much faster. (remm) + + + Jasper development mode should now have acceptable performance for heavily accessed pages. + Precompiling JSPs is still significantly more efficient, however. (remm) + + + + + + + + + + + +
+ + +
diff --git a/webapps/docs/class-loader-howto.xml b/webapps/docs/class-loader-howto.xml new file mode 100644 index 000000000..62a24edac --- /dev/null +++ b/webapps/docs/class-loader-howto.xml @@ -0,0 +1,271 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Yoav Shapira + Class Loader HOW-TO + + + + + +
+ +

The following rules cover about 95% of the decisions that application +developers and deployers must make about where to place class and resource +files to make them available to web applications:

+
    +
  • For classes and resources specific to a particular web application, + place unpacked classes and resources under /WEB-INF/classes + of your web application archive, or place JAR files containing those + classes and resources under /WEB-INF/lib of your web + application archive.
  • +
  • For classes and resources that must be shared across all web applications, + place unpacked classes and resources under + $CATALINA_BASE/shared/classes, or place JAR files + containing those classes and resources under + $CATALINA_BASE/shared/lib.
  • +
+ +
+ + +
+ +

Like many server applications, Tomcat 5 installs a variety of class loaders +(that is, classes that implement java.lang.ClassLoader) to allow +different portions of the container, and the web applications running on the +container, to have access to different repositories of available classes and +resources. This mechanism is used to provide the functionality defined in the +Servlet Specification, version 2.4 -- in particular, Sections 9.4 and 9.6.

+ +

In a J2SE 2 (that is, J2SE 1.2 or later) environment, class loaders are +arranged in a parent-child tree. Normally, when a class loader is asked to +load a particular class or resource, it delegates the request to a parent +class loader first, and then looks in its own repositories only if the parent +class loader(s) cannot find the requested class or resource. The model for +web application class loaders differs slightly from this, as discussed below, +but the main principles are the same.

+ +

When Tomcat 5 is started, it creates a set of class loaders that are +organized into the following parent-child relationships, where the parent +class loader is above the child class loader:

+ + + Bootstrap + | + System + | + Common + / \ + Catalina Shared + / \ + Webapp1 Webapp2 ... + + +

The characteristics of each of these class loaders, including the source +of classes and resources that they make visible, are discussed in detail in +the following section.

+ +
+ +
+ +

As indicated in the diagram above, Tomcat 5 creates the following class +loaders as it is initialized:

+
    +
  • Bootstrap - This class loader contains the basic runtime + classes provided by the Java Virtual Machine, plus any classes from JAR + files present in the System Extensions directory + ($JAVA_HOME/jre/lib/ext). NOTE - Some JVMs may + implement this as more than one class loader, or it may not be visible + (as a class loader) at all.
  • +
  • System - This class loader is normally initialized from + the contents of the CLASSPATH environment variable. All such + classes are visible to both Tomcat internal classes, and to web + applications. However, the standard Tomcat 5 startup scripts + ($CATALINA_HOME/bin/catalina.sh or + %CATALINA_HOME%\bin\catalina.bat) totally ignore the contents + of the CLASSPATH environment variable itself, and instead + build the System class loader from the following repositories: +
      +
    • $CATALINA_HOME/bin/bootstrap.jar - Contains the main() method + that is used to initialize the Tomcat 5 server, and the class loader + implementation classes it depends on.
    • +
    • $JAVA_HOME/lib/tools.jar - Contains the "javac" compiler used + to convert JSP pages into servlet classes.
    • +
    • $CATALINA_HOME/bin/commons-logging-api.jar - Jakarta commons + logging API.
    • +
    • $CATALINA_HOME/bin/commons-daemon.jar - Jakarta commons + daemon API.
    • +
    • jmx.jar - The JMX 1.2 implementation.
    • +
  • +
  • Common - This class loader contains additional classes + that are made visible to both Tomcat internal classes and to all web + applications. Normally, application classes should NOT + be placed here. All unpacked classes and resources in + $CATALINA_HOME/common/classes, as well as classes and + resources in JAR files under the + $CATALINA_HOME/commons/endorsed, + $CATALINA_HOME/commons/i18n and + $CATALINA_HOME/common/lib directories, + are made visible through this + class loader. By default, that includes the following: +
      +
    • commons-el.jar - Jakarta commons el, implementing the + expression language used by Jasper.
    • +
    • jasper-compiler.jar - The JSP 2.0 compiler.
    • +
    • jasper-compiler-jdt.jar - The Eclipse JDT Java compiler.
    • +
    • jasper-runtime.jar - The JSP 2.0 runtime.
    • +
    • jsp-api.jar - The JSP 2.0 API.
    • +
    • naming-common.jar - The JNDI implementation used by Tomcat 5 + to represent in-memory naming contexts.
    • +
    • naming-factory.jar - The JNDI implementation used by Tomcat 5 + to resolve references to enterprise resources (EJB, connection + pools).
    • +
    • naming-factory-dbcp.jar - Jakarta commons DBCP, providing a + JDBC connection pool to web applications. The classes have been moved + out of their default org.apache.commons package.
    • +
    • naming-java.jar - Handler for the java: namespace.
    • +
    • naming-resources.jar - The specialized JNDI naming context + implementation used to represent the static resources of a web + application. This is not related to the support of the J2EE ENC, and + cannot be removed.
    • +
    • servlet-api.jar - The Servlet 2.4 API.
    • +
    • tomcat-i18n-**.jar - Optional JARs containing resource bundles + for other languages. As default bundles are also included in each + individual JAR, they can be safely removed if no internationalization + of messages is needed.
    • +
  • +
  • Catalina - This class loader is initialized to include + all classes and resources required to implement Tomcat 5 itself. These + classes and resources are TOTALLY invisible to web + applications. All unpacked classes and resources in + $CATALINA_HOME/server/classes, as well as classes and + resources in JAR files under + $CATALINA_HOME/server/lib, are made visible through + this class loader. By default, that includes the following: +
      +
    • catalina.jar - Implementation of the Catalina servlet + container portion of Tomcat 5.
    • +
    • catalina-ant.jar - Some Ant tasks which can be used to + manage Tomcat using the manager web application.
    • +
    • catalina-optional.jar - Some optional components of + Catalina.
    • +
    • commons-modeler.jar - A model MBeans implementation used + by Tomcat to expose its internal objects through JMX.
    • +
    • servlets-xxxxx.jar - The classes associated with each + internal servlet that provides part of Tomcat's functionality. + These are separated so that they can be completely removed if the + corresponding service is not required, or they can be subject to + specialized security manager permissions.
    • +
    • tomcat-coyote.jar - Coyote API.
    • +
    • tomcat-http.jar - Standalone Java HTTP/1.1 + connector.
    • +
    • tomcat-ajp.jar - Classes for the Java portion of the + AJP web server connector, which allows Tomcat to + run behind web servers such as Apache and iPlanet iAS and iWS.
    • +
    • tomcat-util.jar - Utility classes required by some + Tomcat connectors.
    • +
  • +
  • Shared - This class loader is the place to put classes + and resources that you wish to share across ALL + web applications (unless Tomcat internal classes also need access, + in which case you should put them in the Common + class loader instead). All unpacked classes and resources in + $CATALINA_BASE/shared/classes, as well as classes and + resources in JAR files under $CATALINA_BASE/shared/lib, are + made visible through this class loader. If multiple Tomcat instances are + run from the same binary using the $CATALINA_BASE environment variable, + then this classloader repositories are relative to $CATALINA_BASE rather + than $CATALINA_HOME.
  • +
  • WebappX - A class loader is created for each web + application that is deployed in a single Tomcat 5 instance. All unpacked + classes and resources in the /WEB-INF/classes directory of + your web application archive, plus classes and resources in JAR files + under the /WEB-INF/lib directory of your web application + archive, are made visible to the containing web application, but to + no others.
  • +
+ +

As mentioned above, the web application class loader diverges from the +default Java 2 delegation model (in accordance with the recommendations in the +Servlet Specification, version 2.3, section 9.7.2 Web Application Classloader). +When a request to load a +class from the web application's WebappX class loader is processed, +this class loader will look in the local repositories first, +instead of delegating before looking. There are exceptions. Classes which are +part of the JRE base classes cannot be overriden. For some classes (such as +the XML parser components in J2SE 1.4+), the J2SE 1.4 endorsed feature can be +used +(see the common classloader definition above). +Last, any JAR containing servlet API classes will be ignored by the +classloader. +All other class loaders in Tomcat 5 follow the usual delegation pattern.

+ +

Therefore, from the perspective of a web application, class or resource +loading looks in the following repositories, in this order:

+
    +
  • Bootstrap classes of your JVM
  • +
  • System class loader classses (described above)
  • +
  • /WEB-INF/classes of your web application
  • +
  • /WEB-INF/lib/*.jar of your web application
  • +
  • $CATALINA_HOME/common/classes
  • +
  • $CATALINA_HOME/common/endorsed/*.jar
  • +
  • $CATALINA_HOME/common/i18n/*.jar
  • +
  • $CATALINA_HOME/common/lib/*.jar
  • +
  • $CATALINA_BASE/shared/classes
  • +
  • $CATALINA_BASE/shared/lib/*.jar
  • +
+ +
+ + +
+ +

Among many other changes, the J2SE 1.4 release packages the JAXP APIs, and +a version of Xerces, inside the JRE. This has impacts on applications that +wish to use their own XML parser.

+ +

In previous versions of Tomcat 5, you could simply replace the XML parser +in the $CATALINA_HOME/common/lib directory to change the parser +used by all web applications. However, this technique will not be effective +when you are running on J2SE 1.4, because the usual class loader delegation +process will always choose the implementation inside the JDK in preference +to this one.

+ +

JDK 1.4 supports a mechanism called the "Endorsed Standards Override +Mechanism" to allow replacement of APIs created outside of the JCP (i.e. +DOM and SAX from W3C). It can also be used to update the XML parser +implementation. For more information, see: + +http://java.sun.com/j2se/1.4/docs/guide/standards/index.html.

+ +

Tomcat utilizes this mechanism by including the system property setting +-Djava.endorsed.dirs=$CATALINA_HOME/common/endorsed in the +command line that starts the container. Therefore, you can replace the +parser that is installed in this directory, and it will get used even on a +JDK 1.4 system.

+ +
+ + +
+ +

When running under a security manager the locations from which classes +are permitted to be loaded will also depend on the contents of your policy +file. See Security Manager HOW-TO +for further information.

+ +
+ + + + +
diff --git a/webapps/docs/cluster-howto.xml b/webapps/docs/cluster-howto.xml new file mode 100644 index 000000000..b8d67b657 --- /dev/null +++ b/webapps/docs/cluster-howto.xml @@ -0,0 +1,1129 @@ + + +]> + + + &project; + + + Filip Hanik + Peter Rossbach + Clustering/Session Replication HOW-TO + + + + + +
+ +

To run session replication in your Tomcat 5.5 container, the following steps +should be completed:

+
    +
  • All your session attributes must implement java.io.Serializable
  • +
  • Uncomment the Cluster element in server.xml
  • +
  • Uncomment the Valve(ReplicationValve) element in server.xml
  • +
  • If your Tomcat instances are running on the same machine, make sure the tcpListenPort + attribute is unique for each instance.
  • +
  • Make sure your web.xml has the <distributable/> element + or set at your <Context distributable="true" />
  • +
  • Make sure that jvmRoute attribute is set at your Engine <Engine name="Catalina" jvmRoute="node01" >
  • +
  • Make sure that all nodes have the same time and sync with NTP service!
  • +
  • Make sure that your loadbalancer is configured for sticky session mode.
  • +
+

Load balancing can be achieved through many techniques, as seen in the +Load Balancing chapter.

+

Note: Remember that your session state is tracked by a cookie, so your URL must look the same from the out + side otherwise, a new session will be created.

+

Note: Clustering support currently requires the JDK version 1.4 or later.

+
+ + +
+ +

To enable session replication in Tomcat, three different paths can be followed to achieve the exact same thing:

+
    +
  1. Using session persistence, and saving the session to a shared file system (PersistenceManager + FileStore)
  2. +
  3. Using session persistence, and saving the session to a shared database (PersistenceManager + JDBCStore)
  4. +
  5. Using in-memory-replication, using the SimpleTcpCluster that ships with Tomcat 5 (server/lib/catalina-cluster.jar)
  6. +
+ +

In this release of session replication, Tomcat performs an all-to-all replication of session state. + + This is an algorithm that is only efficient when the clusters are small. For large clusters, the next + release will support a primary-secondary session replication where the session will only be stored at one + or maybe two backup servers. + Currently you can use the domain worker attribute (mod_jk > 1.2.8) to build cluster partitions + with the potential of very scaleable cluster solution. + In order to keep the network traffic down in an all-to-all environment, you can split your cluster + into smaller groups. This can be easily achieved by using different multicast addresses for the different groups. + A very simple setup would look like this: +

+ + + DNS Round Robin + | + Load Balancer + / \ + Cluster1 Cluster2 + / \ / \ + Tomcat1 Tomcat2 Tomcat3 Tomcat4 + + +

What is important to mention here, is that session replication is only the beginning of clustering. + Another popular concept used to implement clusters is farming, ie, you deploy your apps only to one + server, and the cluster will distribute the deployments across the entire cluster. + This is all capabilities that can go into with the FarmWarDeployer (s. cluster example at server.xml)

+

In the next section will go deeper into how session replication works and how to configure it.

+ +
+ +
+

To make it easy to understand how clustering works, We are gonna take you through a series of scenarios. + In the scenario we only plan to use two tomcat instances TomcatA and TomcatB. + We will cover the following sequence of events:

+ +
    +
  1. TomcatA starts up
  2. +
  3. TomcatB starts up (Wait that TomcatA start is complete)
  4. +
  5. TomcatA receives a request, a session S1 is created.
  6. +
  7. TomcatA crashes
  8. +
  9. TomcatB receives a request for session S1
  10. +
  11. TomcatA starts up
  12. +
  13. TomcatA receives a request, invalidate is called on the session (S1)
  14. +
  15. TomcatB receives a request, for a new session (S2)
  16. +
  17. TomcatA The session S2 expires due to inactivity.
  18. +
+ +

Ok, now that we have a good sequence, we will take you through exactly what happens in the session repliction code

+ +
    +
  1. TomcatA starts up +

    + Tomcat starts up using the standard start up sequence. When the Host object is created, a cluster object is associated with it. + When the contexts are parsed, if the distributable element is in place in web.xml + Tomcat asks the Cluster class (in this case SimpleTcpCluster) to create a manager + for the replicated context. So with clustering enabled, distributable set in web.xml + Tomcat will create a DeltaManager for that context instead of a StandardManager. + The cluster class will start up a membership service (multicast) and a replication service (tcp unicast). + More on the architecture further down in this document. +

    +
  2. +
  3. TomcatB starts up +

    + When TomcatB starts up, it follows the same sequence as TomcatA did with one exception. + The cluster is started and will establish a membership (TomcatA,TomcatB). + TomcatB will now request the session state from a server that already exists in the cluster, + in this case TomcatA. TomcatA responds to the request, and before TomcatB starts listening + for HTTP requests, the state has been transferred from TomcatA to TomcatB. + In case TomcatA doesn't respond, TomcatB will time out after 60 seconds, and issue a log + entry. The session state gets transferred for each web application that has distributable in + its web.xml. Note: To use session replication efficiently, all your tomcat instances should be + configured the same. +

    +
  4. +
  5. TomcatA receives a request, a session S1 is created. +

    + The request coming in to TomcatA is treated exactly the same way as without session replication. + The action happens when the request is completed, the ReplicationValve will intercept + the request before the response is returned to the user. + At this point it finds that the session has been modified, and it uses TCP to replicata the + session to TomcatB. Once the serialized data has been handed off to the operating systems TCP logic, + the request returns to the user, back through the valve pipeline. + For each request the entire session is replicated, this allows code that modifies attributes + in the session without calling setAttribute or removeAttribute to be replicated. + a useDirtyFlag configuration parameter can be used to optimize the number of times + a session is replicated. +

    + +
  6. +
  7. TomcatA crashes +

    + When TomcatA crashes, TomcatB receives a notification that TomcatA has dropped out + of the cluster. TomcatB removes TomcatA from its membership list, and TomcatA will no longer + be notified of any changes that occurs in TomcatB. + The load balancer will redirect the requests from TomcatA to TomcatB and all the sessions + are current. +

    +
  8. +
  9. TomcatB receives a request for session S1 +

    Nothing exciting, TomcatB will process the request as any other request. +

    +
  10. +
  11. TomcatA starts up +

    Upon start up, before TomcatA starts taking new request and making itself + available to it will follow the start up sequence described above 1) 2). + It will join the cluster, contact TomcatB for the current state of all the sessions. + And once it receives the session state, it finishes loading and opens its HTTP/mod_jk ports. + So no requests will make it to TomcatA until it has received the session state from TomcatB. +

    +
  12. +
  13. TomcatA receives a request, invalidate is called on the session (S1) +

    The invalidate is call is intercepted, and the session is queued with invalidated sessions. + When the request is complete, instead of sending out the session that has changed, it sends out + an "expire" message to TomcatB and TomcatB will invalidate the session as well. +

    + +
  14. +
  15. TomcatB receives a request, for a new session (S2) +

    Same scenario as in step 3) +

    + + +
  16. +
  17. TomcatA The session S2 expires due to inactivity. +

    The invalidate is call is intercepted the same was as when a session is invalidated by the user, + and the session is queued with invalidated sessions. + At this point, the invalidet session will not be replicated across until + another request comes through the system and checks the invalid queue. +

    +
  18. +
+ +

Phuuuhh! :)

+ +

Membership + Clustering membership is established using very simple multicast pings. + Each Tomcat instance will periodically send out a multicast ping, + in the ping message the instance will broad cast its IP and TCP listen port + for replication. + If an instance has not received such a ping within a given timeframe, the + member is considered dead. Very simple, and very effective! + Of course, you need to enable multicasting on your system. +

+ +

TCP Replication + Once a multicast ping has been received, the member is added to the cluster + Upon the next replication request, the sending instance will use the host and + port info and establish a TCP socket. Using this socket it sends over the serialized data. + The reason I choose TCP sockets is because it has built in flow control and guaranteed delivery. + So I know, when I send some data, it will make it there :) +

+ +

Distributed locking and pages using frames + Tomcat does not keep session instances in sync across the cluster. + The implementation of such logic would be to much overhead and cause all + kinds of problems. If your client accesses the same session + simultanously using multiple requests, then the last request + will override the other sessions in the cluster. +

+ +
+ +
+ +

Component Levels: + + Server + | + Service + | + Engine + | \ + | --- Cluster --* + | + Host + | + ------ + / \ + Cluster Context(1-N) + | \ + | -- Manager + | \ + | -- DeltaManager + | + ----------------------------- + | | | \ + Receiver Sender Membership \ + \ -- Valve + -- SocketReplicationListener | \ + -- ReplicationListener | -- ReplicationValve + | -- JvmRouteBinderValve + | + -- LifecycleListener + | + -- ClusterListener + | \ + | -- ClusterSessionListener + | -- JvmRouteSessionIDBinderListener + | + -- Deployer + \ + -- FarmWarDeployer + + + + + Sender + \ + -- ReplicationTransmitter + | + --------- + \ + IDataSender + \ + | + --- (sync) + | \ + | -- PooledSocketSender (pooled) + | -- SockerSender (synchronous) + | + --- (async) + \ + -- AsyncSocketSender (asynchronous) + -- FastAsyncSocketSender (fastasyncqueue) + +

+ +
+ + +
+

The cluster configuration is described in the sample server.xml file. +What is worth to mention is that the attributes starting with mcastXXX +are for the membership multicast ping, and the attributes starting with tcpXXX +are for the actual TCP replication. +

+

+ The membership is established by all the tomcat instances are sending broadcast messages + on the same multicast IP and port. + The TCP listen port, is the port where the session replication is received from other members. +

+

+ The replication valve is used to find out when the request has been completed and initiate the + replication. +

+

+ One of the most important performance considerations is the synchronous (pooled or not pooled) versus asynchronous replication + mode. In a synchronous replication mode the request doesn't return until the replicated session has been + sent over the wire and reinstantiated on all the other cluster nodes. + There are two settings for synchronous replication. Pooled or not pooled. + Not pooled (ie replicationMode="fastasnycqueue" or "synchronous") means that all the replication request are sent over a single + socket. + Using synchronous mode can potentially becomes a bottleneck when a lot of messages generated, + You can overcome this bottleneck by setting replicationMode="pooled" but then you worker threads blocks with replication . + What is recommended here is to increase the number of threads that handle + incoming replication request. This is the tcpThreadCount property in the cluster + section of server.xml. The pooled setting means that we are using multiple sockets, hence increases the performance. + Asynchronous replication, should be used if you have sticky sessions until fail over, then + your replicated data is not time crucial, but the request time is, at this time leave the tcpThreadCount to + be number-of-nodes-1. + During async replication, the request is returned before the data has been replicated. async replication yields shorter + request times, and synchronous replication guarantees the session to be replicated before the request returns. +

+

+ The parameter "replicationMode" has four different settings: "pooled", "synchronous", "asynchronous" and "fastasyncqueue" +

+ +
+

+Simple one line configuration
+ + <Server port="8011" + shutdown="SHUTDOWN" > + <GlobalNamingResources> + <Resource name="UserDatabase" auth="Container" + type="org.apache.catalina.UserDatabase" + description="User database that can be updated and saved" + factory="org.apache.catalina.users.MemoryUserDatabaseFactory" + pathname="conf/tomcat-users.xml" /> + </GlobalNamingResources> + <Service name="Catalina"> + <Connector port="9012" + protocol="AJP/1.3" + <Connector port="9013" + maxThreads="100" + minSpareThreads="4" + maxSpareThreads="4" + /> + <Engine name="Catalina" + defaultHost="localhost" + jvmRoute="node1"> + <Realm className="org.apache.catalina.realm.UserDatabaseRealm" + resourceName="UserDatabase" /> + <Host name="localhost" + appBase="webapps"> + <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"/> + </Host> + </Engine> + </Service> +</Server> + +
+The default mode configuration setup a fastasyncqueue mode cluster configuration with following +parameters: +

    +
  • Open Membership receiver at 228.0.0.4 and send to multicast udp port 8012
  • +
  • Send membership every 1 sec and drop member after 30sec.
  • +
  • Open message receiver at default ip interface at first free port between 8015 and 8019.
  • +
  • Receiver message with SocketReplicationListener
  • +
  • Configure a ReplicationTransmitter with fastasyncqueue sender mode.
  • +
  • Add ClusterSessionListener and ReplicationValve.
  • +
+

+

+NOTE: Use this configuration when you need very quick a test cluster with +at your developer machine. You can change the default attributes from cluster sub elements. +Use following cluster attribute prefixes sender., +receiver., service., manager., valve. and listener.. +
Example configure cluster at windows laptop with network connection and +change receiver port range
+ +<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster" + service.mcastBindAddress="127.0.0.1" + receiver.tcpListenPort="9070" + receiver.tcpListenMaxPort="9075" /> + +
+WARNING: When you add you sub elements, there overwrite the defaults complete. +
Example configure cluster with cluster failover jsessionid support. In this +case you need also the defaultmode Cluster listener ClusterSessionListener and ReplicationValve.
+ +<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster" + service.mcastBindAddress="127.0.0.1" + receiver.tcpListenPort="9070" + receiver.tcpListenMaxPort="9075" > + <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener" /> + <ClusterListener className="org.apache.catalina.cluster.session.JvmRouteSessionIDBinderListener" /> + <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve" + filter=".*\.gif;.*\.js;.*\.css;.*\.png;.*\.jpeg;.*\.jpg;.*\.htm;.*\.html;.*\.txt;" + primaryIndicator="true" /> + <Valve className="org.apache.catalina.cluster.session.JvmRouteBinderValve" + enabled="true" /> +<Cluster/> + +

+
+ +
+

+Simple one line engine configuration
+ + <Server port="8011" + shutdown="SHUTDOWN" > + <GlobalNamingResources> + <Resource name="UserDatabase" auth="Container" + type="org.apache.catalina.UserDatabase" + description="User database that can be updated and saved" + factory="org.apache.catalina.users.MemoryUserDatabaseFactory" + pathname="conf/tomcat-users.xml" /> + </GlobalNamingResources> + <Service name="Catalina"> + <Connector port="9012" + protocol="AJP/1.3" + <Connector port="9013" + maxThreads="100" + minSpareThreads="4" + maxSpareThreads="4" + /> + <Engine name="Catalina" + defaultHost="localhost" + jvmRoute="node01"> + <Realm className="org.apache.catalina.realm.UserDatabaseRealm" + resourceName="UserDatabase" /> + <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"/> + <Host name="localhost" + appBase="webapps"/> + </Engine> + </Service> +</Server> + +
+See default mode configuration description as simple host cluster example before. +

+
+ +
+

+
Example Configure cluster with complete sub elements. Activate this node +as master farm delopyer. Message receiver is NIO based ReplicationListener with six parallel +worker threads. +
+ + <Server port="8011" + shutdown="SHUTDOWN" > + <GlobalNamingResources> + <Resource name="UserDatabase" auth="Container" + type="org.apache.catalina.UserDatabase" + description="User database that can be updated and saved" + factory="org.apache.catalina.users.MemoryUserDatabaseFactory" + pathname="conf/tomcat-users.xml" /> + </GlobalNamingResources> + <Service name="Catalina"> + <Connector port="9012" + protocol="AJP/1.3" + <Connector port="9013" + maxThreads="100" + minSpareThreads="4" + maxSpareThreads="4" + /> + <Engine name="Catalina" + defaultHost="localhost" + jvmRoute="node01"> + <Realm className="org.apache.catalina.realm.UserDatabaseRealm" + resourceName="UserDatabase" /> + <Host name="localhost" + appBase="webapps"> + <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster" + doClusterLog="true" + clusterLogName="clusterlog" + manager.className="org.apache.catalina.cluster.session.DeltaManager" + manager.expireSessionsOnShutdown="false" + manager.notifyListenersOnReplication="false" + manager.notifySessionListenersOnReplication="false" + manager.sendAllSessions="false" + manager.sendAllSessionsSize="500" + manager.sendAllSessionsWaitTime="20"> + <Membership + className="org.apache.catalina.cluster.mcast.McastService" + mcastAddr="228.0.0.4" + mcastBindAddress="127.0.0.1" + mcastClusterDomain="d10" + mcastPort="45564" + mcastFrequency="1000" + mcastDropTime="30000"/> + <Receiver + className="org.apache.catalina.cluster.tcp.ReplicationListener" + tcpListenAddress="auto" + tcpListenPort="9015" + tcpSelectorTimeout="100" + tcpThreadCount="6" + <Sender + className="org.apache.catalina.cluster.tcp.ReplicationTransmitter" + replicationMode="fastasyncqueue" + doTransmitterProcessingStats="true" + doProcessingStats="true" + doWaitAckStats="true" + queueTimeWait="true" + queueDoStats="true" + queueCheckLock="true" + ackTimeout="15000" + waitForAck="true" + keepAliveTimeout="80000" + keepAliveMaxRequestCount="-1"/> + <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve" + filter=".*\.gif;.*\.js;.*\.css;.*\.png;.*\.jpeg;.*\.jpg;.*\.htm;.*\.html;.*\.txt;" + primaryIndicator="true" /> + <Valve className="org.apache.catalina.cluster.session.JvmRouteBinderValve" + enabled="true" /> + <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener" /> + <ClusterListener className="org.apache.catalina.cluster.session.JvmRouteSessionIDBinderListener" /> + <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer" + tempDir="${catalina.base}/war-temp" + deployDir="${catalina.base}/war-deploy/" + watchDir="${catalina.base}/war-listen/" + watchEnabled="true"/> + </Cluster> + </Host> + </Engine> + </Service> +</Server> + +

+
+ +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
replicationModereplication mode (synchronous, pooled, asynchronous or fastasyncqueue) + pooled
processSenderFrequencyControl the sender keepalive status and drop sender socket connection after timeout is reached. + Check every processSenderFrequency value engine background ticks. + 2
compresscompress bytes before sending (consume memory, but reduce network traffic - GZIP)false
ackTimeoutacknowledge timeout and only usefull it waitForAck is true15000
waitForAckWait for ack after data sendfalse
autoConnectis sender disabled, fork a new socketfalse
doTransmitterProcessingStatscreate processing time statsfalse
+

+

+Example to get statistic information, wait for ack at every message send and transfer at compressed mode
+ + <Sender + className="org.apache.catalina.cluster.tcp.ReplicationTransmitter" + replicationMode="fastasyncqueue" + compress="true" + doTransmitterProcessingStats="true" + ackTimeout="15000" + waitForAck="true" + autoConnect="false"/> + +

+
+ +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
keepAliveTimeoutactive socket keep alive timeout60000
keepAliveMaxRequestCountmax request over this socket-1
doProcessingStatscreate Processing time statsfalse
doWaitAckStatscreate waitAck time statsfalse
resendresend message after failure, can overwrite at messagefalse
queueDoStatsactivated queue statsfalse
queueCheckLockcheck to lost locksfalse
queueAddWaitTimeoutqueue add wait time (tomcat connector thread waits)10000
queueRemoveWaitTimeoutqueue remove wait time (queue thread waits)30000
maxQueueLengthmax queue length (default without limit)-1
threadPrioritychange queue thread priority (1-10 ; 5 is normal)5
+ +

+

+Example to get a lot of statistic information and no wait for ACK
+ + <Sender + className="org.apache.catalina.cluster.tcp.ReplicationTransmitter" + replicationMode="fastasyncqueue" + doTransmitterProcessingStats="true" + doProcessingStats="true" + queueTimeWait="true" + queueDoStats="true" + queueCheckLock="true" + waitForAck="false" + autoConnect="false" + keepAliveTimeout="320000" + keepAliveMaxRequestCount="-1"/> + +

+
+ +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
keepAliveTimeoutactive socket keep alive timeout60000
keepAliveMaxRequestCountmax request over this socket-1
doProcessingStatscreate Processing time statsfalse
doWaitAckStatscreate waitAck time statsfalse
resendresend message after failure, can overwrite at messagefalse
+

+

+Example to get a processing statistic information, resend after failure and wait for ACK
+ + <Sender + className="org.apache.catalina.cluster.tcp.ReplicationTransmitter" + replicationMode="asynchronous" + doProcessingStats="true" + doWaitAckStats="true" + waitForAck="true" + ackTimeout="30000" + resend="true" + keepAliveTimeout="320000" + keepAliveMaxRequestCount="-1"/> + +

+
+ +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
keepAliveTimeoutactive socket keep alive timeout60000
keepAliveMaxRequestCountmax request over this socket-1
doProcessingStatscreate Processing time statsfalse
doWaitAckStatscreate waitAck time statstrue
resendresend message after failure, can overwrite at messagefalse
+ +

+

+Example to get a no processing statistic information, no wait for ACK, after 10000 request renew socket and autoconnect before first request is send.
+ + <Sender + className="org.apache.catalina.cluster.tcp.ReplicationTransmitter" + replicationMode="synchronous" + autoConnect="true" + keepAliveTimeout="-1" + keepAliveMaxRequestCount="100000"/> + +

+
+ +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
keepAliveTimeoutactive socket keep alive timeout60000
keepAliveMaxRequestCountmax request over this socket-1
maxPoolSocketLimitmax pooled sockets (Sender Sockets)25
resendresend message after failure, can overwrite at messagefalse
+ +

+

+Example to get a no processing statistic information, wait for ACK, after 10000 request renew socket, only 10 SockerSender available and autoconnect before first request is send.
+ + <Sender + className="org.apache.catalina.cluster.tcp.ReplicationTransmitter" + replicationMode="pooled" + autoConnect="true" + maxPoolSocketLimit="10" + keepAliveTimeout="-1" + keepAliveMaxRequestCount="10000" + waitForAck="true" /> + +

+
+ +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
expireSessionsOnShutdownWhen server stopped, expire all sessions also at backup nodes (only for testing)false
maxActiveSessionsNumber of active sessions. (Default is no limit)-1
notifyListenersOnReplicationNotify application session listener to session creation + and expiring events at backup nodestrue
notifySessionListenersOnReplicationNotify application session listener to attribute changes at backup nodestrue
stateTransferTimeoutTimeout that session state transfer is complete. Is attribute stateTransferTimeout == -1 + then application wait that other node send the complete session state60
sendAllSessionsFlag to send sessions as splited blockstrue
sendAllSessionsSizeNumber of serialize sessions inside a send block session message. Only useful when sendAllSessions==false1000
sendAllSessionsWaitTimewait time between two session send blocks.2000
sendClusterDomainOnlySend all session messages only to member inside same cluster domain + (value od Membership attribute mcastClusterDomain). Also don't handle + session messages from other domains.true
stateTimestampDropDeltaManager queued Sessions messages when send GET_ALL_SESSION to other node. + with stateTimestampDrop all messages before state transfer message creation date (find session) are dropped. + Only other GET_ALL_SESSION events are handle with date before state transfer message.true
+ +

+

+Example send all sessions at separate blocks. Serialize and send 100 session inside one block. +Wait maximale two minutes before the complete backup sessions are loaded inside tomcat boot process. +Between send blocks wait 5 secs to transfers the session block to other node. This save memory +when you use the async modes with queues.
+ + <Cluster className="org.apache.catalina.tcp.SimpleTcpCluster" + managerClassName="org.apache.catalina.cluster.session.DeltaManager" + manager.stateTransferTimeout="120" + manager.sendAllSessions="false" + manager.sendAllSessionsSize="100" + manager.sendAllSessionsWaitTime="5000" + "/> + +

+

+Note:
+As Cluster.defaultMode=true you can configure the manager attributes with prefix manager.. +
+Note:
+With Cluster.setProperty(<String>,<String>) you can modify +attributes for all register managers. The method exists as MBeans operation. +

+
+ +
+

+As you configure more then two nodes at same cluster for backup, most loadbalancer +send don't all your requests after failover to the same node. +

+

+The JvmRouteBinderValve handle tomcat jvmRoute takeover using mod_jk module after node +failure. After a node crashed the next request going to other cluster node. The JvmRouteBinderValve +now detect the takeover and rewrite the jsessionid +information to the backup cluster node. After the next response all client +request goes direct to the backup node. The change sessionid send also to all +other cluster nodes. Well, now the session stickyness work directly to the +backup node, but traffic don't go back too restarted cluster nodes!
+As jsessionid was created by cookie, the change JSESSIONID cookie resend with next response. +

+

+You must add JvmRouteBinderValve and the corresponding cluster message listener JvmRouteSessionIDBinderListener. +As you add the new listener you must also add the default ClusterSessionListener that receiver the normal cluster messages. + + +<Cluster className="org.apache.catalina.tcp.SimpleTcpCluster" > +... + <Valve className="org.apache.catalina.cluster.session.JvmRouteBinderValve" + enabled="true" sessionIdAttribute="takeoverSessionid"/> + <ClusterListener className="org.apache.catalina.cluster.session.JvmRouteSessionIDBinderListener" /> + <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener" /> +... +<Cluster> + +

+

+Hint:
+With attribute sessionIdAttribute you can change the request attribute name that included the old session id. +Default attribuite name is org.apache.catalina.cluster.session.JvmRouteOrignalSessionID. +

+

+Trick:
+You can enable this mod_jk turnover mode via JMX before you drop a node to all backup nodes! +Set enable true on all JvmRouteBinderValve backups, disable worker at mod_jk +and then drop node and restart it! Then enable mod_jk Worker and disable JvmRouteBinderValves again. +This use case means that only requested session are migrated. +

+ +
+ +
+ + +
+

Monitoring is a very important question when you use a cluster. Some of the cluster objects are JMX MBeans

+

Add the following parameter to your startup script with Java 5: + +set CATALINA_OPTS=\ +-Dcom.sun.management.jmxremote \ +-Dcom.sun.management.jmxremote.port=%my.jmx.port% \ +-Dcom.sun.management.jmxremote.ssl=false \ +-Dcom.sun.management.jmxremote.authenticate=false + +

+

Activate JMX with JDK 1.4: +

    +
  1. Install the compat package
  2. +
  3. Install the mx4j-tools.jar at common/lib (use the same mx4j version as your tomcat release)
  4. +
  5. Configure a MX4J JMX HTTP Adaptor at your AJP Connector

    + +<Connector port="${AJP.PORT}" + handler.list="mx" + mx.enabled="true" + mx.httpHost="${JMX.HOST}" + mx.httpPort="${JMX.PORT}" + protocol="AJP/1.3" /> + +
  6. +
  7. Start your tomcat and look with your browser to http://${JMX.HOST}:${JMX.PORT}
  8. +
  9. With the connector parameter mx.authMode="basic" mx.authUser="tomcat" mx.authPassword="strange" you can control the access!
  10. +
+

+

+List of Cluster Mbeans
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionMBean ObjectName - EngineMBean ObjectName - Host
ClusterThe complete cluster elementtype=Clustertype=Cluster,host=${HOST}
ClusterSenderConfiguration and stats of the sender infrastructuretype=ClusterSendertype=ClusterSender,host=${HOST}
ClusterReceiverConfiguration and stats of the recevier infrastructuretype=ClusterReceivertype=ClusterReceiver,host=${HOST}
ClusterMembershipConfiguration and stats of the membership infrastructuretype=ClusterMembershiptype=ClusterMembership,host=${HOST}
IDataSenderFor every cluster member it exist a sender mbeans. + It exists speziall MBeans to all replication modestype=IDataSender, + senderAddress=${MEMBER.SENDER.IP}, + senderPort=${MEMBER.SENDER.PORT}type=IDataSender,host=${HOST}, + senderAddress=${MEMBER.SENDER.IP}, + senderPort=${MEMBER.SENDER.PORT}
DeltaManagerThis manager control the sessions and handle session replication type=Manager,path=${APP.CONTEXT.PATH}, host=${HOST}type=Manager,path=${APP.CONTEXT.PATH}, host=${HOST}
ReplicationValveThis valve control the replication to the backup nodestype=Valve,name=ReplicationValvetype=Valve,name=ReplicationValve,host=${HOST}
JvmRouteBinderValveThis is a cluster fallback valve to change the Session ID to the current tomcat jvmroute.type=Valve,name=JvmRouteBinderValve, + path=${APP.CONTEXT.PATH}type=Valve,name=JvmRouteBinderValve,host=${HOST}, + path=${APP.CONTEXT.PATH}
+

+
+ +
+

Please see the clustering section of the FAQ.

+
+ + + +
diff --git a/webapps/docs/config/ajp.xml b/webapps/docs/config/ajp.xml new file mode 100644 index 000000000..707152622 --- /dev/null +++ b/webapps/docs/config/ajp.xml @@ -0,0 +1,297 @@ + + +]> + + + &project; + + + Remy Maucherat + Yoav Shapira + Andrew R. Jaquith + The AJP Connector + + + + + +
+ +

The AJP Connector element represents a + Connector component that communicates with a web + connector via the AJP protocol. This is used for cases + where you wish to invisibly integrate Tomcat 5 into an existing (or new) + Apache installation, and you want Apache to handle the static content + contained in the web application, and/or utilize Apache's SSL + processing.

+ +

This connector supports load balancing when used in conjunction with + the jvmRoute attribute of the + Engine.

+ +

The native connectors supported with this Tomcat release are: +

    +
  • JK 1.2.x with any of the supported servers
  • +
  • mod_proxy on Apache httpd 2.x (included by default in Apache HTTP Server 2.2), +with AJP enabled
  • +
+

+ +

Other native connectors supporting AJP may work, but are no longer supported.

+ +
+ + +
+ + + +

All implementations of Connector + support the following attributes:

+ + + + +

A boolean value which can be used to enable or disable the TRACE + HTTP method. If not specified, this attribute is set to false.

+
+ + +

If set to true, all paths for session cookies will be set + to /. This can be useful for portlet specification implementations, + but will greatly affect performance if many applications are accessed on a given + server by the client. + If not specified, this attribute is set to false.

+
+ + +

Set to true if you want calls to + request.getRemoteHost() to perform DNS lookups in + order to return the actual host name of the remote client. Set + to false to skip the DNS lookup and return the IP + address in String form instead (thereby improving performance). + By default, DNS lookups are enabled.

+
+ + +

The maximum size in bytes of the POST which will be handled by + the container FORM URL parameter parsing. The feature can be disabled by + setting this attribute to a value less than or equal to 0. + If not specified, this attribute is set to 2097152 (2 megabytes).

+
+ + +

The maximum size in bytes of the POST which will be saved/buffered by + the container during FORM or CLIENT-CERT authentication. For both types + of authentication, the POST will be saved/buffered before the user is + authenticated. For CLIENT-CERT authentication, the POST is buffered for + the duration of the SSL handshake and the buffer emptied when the request + is processed. For FORM authentication the POST is saved whilst the user + is re-directed to the login form and is retained until the user + successfully authenticates or the session associated with the + authentication request expires. The limit can be disabled by setting this + attribute to -1. Setting the attribute to zero will disable the saving of + POST data during authentication. If not specified, this attribute is set + to 4096 (4 kilobytes).

+
+ + +

This attribute value must be AJP/1.3 to use the AJP + handler.

+
+ + +

If this Connector is being used in a proxy + configuration, configure this attribute to specify the server name + to be returned for calls to request.getServerName(). + See Proxy Support for more + information.

+
+ + +

If this Connector is being used in a proxy + configuration, configure this attribute to specify the server port + to be returned for calls to request.getServerPort(). + See Proxy Support for more + information.

+
+ + +

If this Connector is supporting non-SSL + requests, and a request is received for which a matching + <security-constraint> requires SSL transport, + Catalina will automatically redirect the request to the port + number specified here.

+
+ + +

This attribute controls request registration for JMX monitoring + of the Connector. It is enabled by default, but may be turned + it off to save a bit of memory.

+
+ + +

Set this attribute to the name of the protocol you wish to have + returned by calls to request.getScheme(). For + example, you would set this attribute to "https" + for an SSL Connector. The default value is "http". + See SSL Support for more information.

+
+ + +

Set this attribute to true if you wish to have + calls to request.isSecure() to return true + for requests received by this Connector (you would want this on an + SSL Connector). The default value is false.

+
+ + +

This specifies the character encoding used to decode the URI bytes, + after %xx decoding the URL. If not specified, ISO-8859-1 will be used. +

+
+ + +

This specifies if the encoding specified in contentType should be used + for URI query parameters, instead of using the URIEncoding. This + setting is present for compatibility with Tomcat 4.1.x, where the + encoding specified in the contentType, or explicitely set using + Request.setCharacterEncoding method was also used for the parameters from + the URL. The default value is false. +

+
+ + +

Set this attribute to true to cause Tomcat to use + the ServerName passed by the native web server to determine the Host + to send the request to. The default value is false.

+
+ + +

Set this attribute to true to cause Tomcat to advertise + support for the Srevlet specification using the header recommended in the + specification. The default value is false.

+
+ +
+ +
+ + + +

To use AJP, you + must specify the protocol attribute (see above).

+ +

This implementation supports the AJP 1.3 protocol.

+ +

It supports the following additional attributes (in addition to the + common attributes listed above):

+ + + + +

For servers with more than one IP address, this attribute + specifies which address will be used for listening on the specified + port. By default, this port will be used on all IP addresses + associated with the server. A value of 127.0.0.1 + indicates that the Connector will only listen on the loopback + interface.

+
+ + +

The maximum queue length for incoming connection requests when + all possible request processing threads are in use. Any requests + received when the queue is full will be refused. The default + value is 10.

+
+ + +

The size of the output buffer to use. If less than or equal to zero, + then output buffering is disabled. The default value is -1 + (i.e. buffering disabled)

+
+ + +

The number of milliseconds this Connector will wait, + after accepting a connection, for the request URI line to be + presented. The default value is infinite (i.e. no timeout).

+
+ + + deprecated +

The minimum number of processors to start at initialization time. + If not specified, this atttribute is set to 5.

+
+ + + deprecated +

The maximum number of processors allowed. This should be + set to a value that is greater than or equal to the maximum number + of concurrent connections the remote web server can open to Tomcat + simultaneously. For example, if the web server is Apache 1.x or 2.x + Tomcat's maxProcessors should be set to the + value of Apache's maxClients directive.

+

A maxProcessors value of zero (0) signifies that + the number of processors is unlimited. If not specified, this + atttribute defaults to 20.

+
+ + +

The maximum number of unused request processing threads that + will be allowed to exist until the thread pool starts stopping the + unnecessary threads. The default value is 50.

+
+ + +

The maximum number of request processing threads to be created + by this Connector, which therefore determines the + maximum number of simultaneous requests that can be handled. If + not specified, this attribute is set to 200.

+
+ + +

The number of request processing threads that will be created + when this Connector is first started. The connector + will also make sure it has the specified number of idle processing + threads available. This attribute should be set to a value smaller + than that set for maxThreads. The default value is 4.

+
+ + +

The TCP port number on which this Connector + will create a server socket and await incoming connections. Your + operating system will allow only one server application to listen + to a particular port number on a particular IP address.

+
+ + +

If set to true, the TCP_NO_DELAY option will be + set on the server socket, which improves performance under most + circumstances. This is set to true by default.

+
+ + +

If set to true, the authetication will be done in Tomcat. + Otherwise, the authenticated principal will be propagated from the native + webaserver and used for authorization in Tomcat. + The default value is true.

+
+ +
+ +
+ +
+ + +
+ +

None at this time.

+ +
+ + + + +
diff --git a/webapps/docs/config/context.xml b/webapps/docs/config/context.xml new file mode 100644 index 000000000..77857ebb2 --- /dev/null +++ b/webapps/docs/config/context.xml @@ -0,0 +1,778 @@ + + +]> + + + &project; + + + Craig R. McClanahan + The Context Container + + + + + +
+ +

The Context element represents a web + application, which is run within a particular virtual host. + Each web application is based on a Web Application Archive + (WAR) file, or a corresponding directory containing the corresponding + unpacked contents, as described in the Servlet Specification (version + 2.2 or later). For more information about web application archives, + you can download the + Servlet + Specification, and review the Tomcat + Application Developer's Guide.

+ +

The web application used to process each HTTP request is selected + by Catalina based on matching the longest possible prefix of the + Request URI against the context path of each defined Context. + Once selected, that Context will select an appropriate servlet to + process the incoming request, according to the servlet mappings defined + in the web application deployment descriptor file (which MUST + be located at /WEB-INF/web.xml within the web app's + directory hierarchy).

+ +

You may define as many Context elements as you + wish. Each such Context MUST have a unique + context path, which is defined by the path attribute. + In addition, you MUST define a Context with a context path equal to + a zero-length string. This Context becomes the default + web application for this virtual host, and is used to process all + requests that do not match any other Context's context path.

+ +

In addition to nesting Context elements inside a + Host element, you can also store them:

+
    +
  • in the individual $CATALINA_HOME/conf/context.xml file: + the Context element information will be loaded by all webapps
  • +
  • in the individual + $CATALINA_HOME/conf/[enginename]/[hostname]/context.xml.default + file: the Context element information will be loaded by all webapps of that + host
  • +
  • in individual files (with a ".xml" extension) in the + $CATALINA_HOME/conf/[enginename]/[hostname]/ directory
  • +
  • if the previous file was not found for this application, in individual file + at /META-INF/context.xml inside the application files
  • +
+

See + Automatic + Application Deployment for more information. This method allows dynamic + reconfiguration of the web application, since the main + conf/server.xml file cannot be reloaded without restarting + Tomcat. Please note that for tomcat 5, unlike tomcat 4.x, it is NOT + recommended to place <Context> elements directly in the server.xml file. + Instead, put them in the META-INF/context.xml directory of your WAR file or + the conf directory as described above. +

+ +

In addition to explicitly specified Context elements, there are + several techniques by which Context elements can be created automatically + for you. See + Automatic Application Deployment and + User Web Applications + for more information.

+ +
+

The description below uses the variable name $CATALINA_HOME + to refer to the directory into which you have installed Tomcat 5, + and is the base directory against which most relative paths are + resolved. However, if you have configured Tomcat 5 for multiple + instances by setting a CATALINA_BASE directory, you should use + $CATALINA_BASE instead of $CATALINA_HOME for each of these + references.

+
+ +
+ + +
+ + + +

All implementations of Context + support the following attributes:

+ + + + +

This value represents the delay in seconds between the + invocation of the backgroundProcess method on this context and + its child containers, including all wrappers. + Child containers will not be invoked if their delay value is not + negative (which would mean they are using their own processing + thread). Setting this to a positive value will cause + a thread to be spawn. After waiting the specified amount of time, + the thread will invoke the backgroundProcess method on this host + and all its child containers. A context will use background + processing to perform session expiration and class monitoring for + reloading. If not specified, the default value for this attribute is + -1, which means the context will rely on the background processing + thread of its parent host.

+
+ + +

Java class name of the implementation to use. This class must + implement the org.apache.catalina.Context interface. + If not specified, the standard value (defined below) will be used.

+
+ + +

Set to true if you want cookies to be used for + session identifier communication if supported by the client (this + is the default). Set to false if you want to disable + the use of cookies for session identifier communication, and rely + only on URL rewriting by the application.

+
+ + +

Set to true if you want calls within this application + to ServletContext.getContext() to successfully return a + request dispatcher for other web applications running on this virtual + host. Set to false (the default) in security + conscious environments, to make getContext() always + return null.

+
+ + +

The Document Base (also known as the Context + Root) directory for this web application, or the pathname + to the web application archive file (if this web application is + being executed directly from the WAR file). You may specify + an absolute pathname for this directory or WAR file, or a pathname + that is relative to the appBase directory of the + owning Host.

+
+ + +

Set to true to have explicit settings in this + Context element override any corresponding settings in the + DefaultContext element associated + with our owning Host. By default, settings + in the DefaultContext element will be used.

+
+ + +

Set to true to allow this context to use container + servlets, like the manager servlet.

+
+ + +

The context path of this web application, which is + matched against the beginning of each request URI to select the + appropriate web application for processing. All of the context paths + within a particular Host must be unique. + If you specify a context path of an empty string (""), you are + defining the default web application for this Host, which + will process all requests not assigned to other Contexts. The value of + this field must not be set except when statically defining a Context in + server.xml, as it will be infered from the filenames used for either the + .xml context file or the docBase.

+
+ + +

Set to true if you want Catalina to monitor classes in + /WEB-INF/classes/ and /WEB-INF/lib for + changes, and automatically reload the web application if a change + is detected. This feature is very useful during application + development, but it requires significant runtime overhead and is + not recommended for use on deployed production applications. That's + why the default setting for this attribute is false. You + can use the Manager web + application, however, to trigger reloads of deployed applications + on demand.

+
+ + +

Java class name of the org.apache.catalina.Wrapper + implementation class that will be used for servlets managed by this + Context. If not specified, a standard default value will be used.

+
+ +
+ +
+ + + + +

The standard implementation of Context is + org.apache.catalina.core.StandardContext. + It supports the following additional attributes (in addition to the + common attributes listed above):

+ + + + +

If the value of this flag is true, symlinks will be + allowed inside the web application, pointing to resources outside the + web application base path. If not specified, the default value + of the flag is false.

+

NOTE: This flag MUST NOT be set to true on the Windows platform + (or any other OS which does not have a case sensitive filesystem), + as it will disable case sensitivity checks, allowing JSP source code + disclosure, among other security problems.

+
+ + +

If true, the Tomcat classloader will take extra measures to avoid + JAR file locking when resources are accessed inside JARs through URLs. + This will impact startup time of applications, but could prove to be useful + on platforms or configurations where file locking can occur. + If not specified, the default value is false.

+
+ + +

If true, Tomcat will prevent any file locking. + This will significantly impact startup time of applications, + but allows full webapp hot deploy and undeploy on platforms + or configurations where file locking can occur. + If not specified, the default value is false.

+ +

Please note that setting this to true has some side effects, + including the disabling of JSP reloading in a running server: see + Bugzilla 37668. +

+
+ + +

Maximum size of the static resource cache in kilobytes. + If not specified, the default value is 10240 + (10 megabytes).

+
+ + +

Amount of time in milliseconds between cache entries revalidation. + If not specified, the default value is 5000 + (5 seconds).

+
+ + +

If the value of this flag is true, the cache for static + resources will be used. If not specified, the default value + of the flag is true.

+
+ + +

If the value of this flag is true, all case sensitivity + checks will be disabled. If not + specified, the default value of the flag is true.

+

NOTE: This flag MUST NOT be set to false on the Windows platform + (or any other OS which does not have a case sensitive filesystem), + as it will disable case sensitivity checks, allowing JSP source code + disclosure, among other security problems.

+
+ + +

Whether the context should process TLDs on startup. The default + is true. The false setting is intended for special cases + that know in advance TLDs are not part of the webapp.

+
+ + +

If the value of this flag is true, the bytes output to + System.out and System.err by the web application will be redirected to + the web application logger. If not specified, the default value + of the flag is false.

+
+ + +

If the value of this flag is true, the TLD files + XML validation will be namespace-aware. If you turn this flag on, + you should probably also turn tldValidation on. The + default value for this flag is false, and setting it + to true will incur a performance penalty. +

+
+ + +

If the value of this flag is true, the TLD files + will be XML validated on context startup. The default value for + this flag is false, and setting it to true will incur + a performance penalty.

+
+ + +

Amount of ms that the container will wait for servlets to unload. + If not specified, the default value of the flag is 2000 + ms.

+
+ + +

If true, Tomcat will unpack all compressed web applications before + running them. + If not specified, the default value is true.

+
+ + +

Set to true (the default) to have Catalina enable a + JNDI InitialContext for this web application that is + compatible with Java2 Enterprise Edition (J2EE) platform + conventions.

+
+ + +

Pathname to a scratch directory to be provided by this Context + for temporary read-write use by servlets within the associated web + application. This directory will be made visible to servlets in the + web application by a servlet context attribute (of type + java.io.File) named + javax.servlet.context.tempdir as described in the + Servlet Specification. If not specified, a suitable directory + underneath $CATALINA_HOME/work will be provided.

+
+ +
+ +
+ + +
+ + +
+ +

You can nest at most one instance of the following utility components + by nesting a corresponding element inside your Context + element:

+
    +
  • Loader - + Configure the web application class loader that will be used to load + servlet and bean classes for this web application. Normally, the + default configuration of the class loader will be sufficient.
  • +
  • Manager - + Configure the session manager that will be used to create, destroy, + and persist HTTP sessions for this web application. Normally, the + default configuration of the session manager will be sufficient.
  • +
  • Realm - + Configure a realm that will allow its + database of users, and their associated roles, to be utilized solely + for this particular web application. If not specified, this web + application will utilize the Realm associated with the owning + Host or Engine.
  • +
  • Resources - + Configure the resource manager that will be used to access the static + resources associated with this web application. Normally, the + default configuration of the resource manager will be sufficient.
  • +
  • WatchedResource - The auto deployer will monitor the + specified static resource of the web application for updates, and will + reload the web application if is is updated. The content of this element + must be a string.
  • +
+ +
+ + +
+ + + + +

A context is associated with the + org.apache.catalina.core.ContainerBase.[enginename].[hostname].[path] + log category. Note that the brackets are actually part of the name, don't omit them.

+ +
+ + + + +

When you run a web server, one of the output files normally generated + is an access log, which generates one line of information for + each request processed by the server, in a standard format. Catalina + includes an optional Valve implementation that + can create access logs in the same standard format created by web servers, + or in any number of custom formats.

+ +

You can ask Catalina to create an access log for all requests + processed by an Engine, + Host, or Context + by nesting a Valve element like this:

+ + +<Context path="/examples" ...> + ... + <Valve className="org.apache.catalina.valves.AccessLogValve" + prefix="localhost_access_log." suffix=".txt" + pattern="common"/> + ... +</Context> + + +

See Access Log Valve + for more information on the configuration attributes that are + supported.

+ +
+ + + + +

If you use the standard Context implementation, + the following configuration steps occur automtically when Catalina + is started, or whenever this web application is reloaded. No special + configuration is required to enable this feature.

+ +
    +
  • If you have not declared your own Loader + element, a standard web application class loader will be configured. +
  • +
  • If you have not declared your own Manager + element, a standard session manager will be configured.
  • +
  • If you have not declared your own Resources + element, a standard resources manager will be configured.
  • +
  • The web application properties listed in conf/web.xml + will be processed as defaults for this web application. This is used + to establish default mappings (such as mapping the *.jsp + extension to the corresponding JSP servlet), and other standard + features that apply to all web applications.
  • +
  • The web application properties listed in the + /WEB-INF/web.xml resource for this web application + will be processed (if this resource exists).
  • +
  • If your web application has specified security constraints that might + require user authentication, an appropriate Authenticator that + implements the login method you have selected will be configured.
  • +
+ +
+ + + + +

You can configure named values that will be made visible to the + web application as servlet context initialization parameters by nesting + <Parameter> elements inside this element. For + example, you can create an initialization parameter like this:

+ +<Context ...> + ... + <Parameter name="companyName" value="My Company, Incorporated" + override="false"/> + ... +</Context> + + +

This is equivalent to the inclusion of the following element in the + web application deployment descriptor (/WEB-INF/web.xml): +

+ +<context-param> + <param-name>companyName</param-name> + <param-value>My Company, Incorporated</param-value> +</context-param> + +

but does not require modification of the deployment descriptor + to customize this value.

+ +

The valid attributes for a <Parameter> element + are as follows:

+ + + + +

Optional, human-readable description of this context + initialization parameter.

+
+ + +

The name of the context initialization parameter to be created.

+
+ + +

Set this to false if you do not want + a <context-param> for the same parameter name, + found in the web application deployment descriptor, to override the + value specified here. By default, overrides are allowed.

+
+ + +

The parameter value that will be presented to the application + when requested by calling + ServletContext.getInitParameter().

+
+ +
+ +
+ + + + +

You can configure named values that will be made visible to the + web application as environment entry resources, by nesting + <Environment> entries inside this element. For + example, you can create an environment entry like this:

+ +<Context ...> + ... + <Environment name="maxExemptions" value="10" + type="java.lang.Integer" override="false"/> + ... +</Context> + + +

This is equivalent to the inclusion of the following element in the + web application deployment descriptor (/WEB-INF/web.xml): +

+ +<env-entry> + <env-entry-name>maxExemptions</param-name> + <env-entry-value>10</env-entry-value> + <env-entry-type>java.lang.Integer</env-entry-type> +</env-entry> + +

but does not require modification of the deployment descriptor + to customize this value.

+ +

The valid attributes for an <Environment> element + are as follows:

+ + + + +

Optional, human-readable description of this environment entry.

+
+ + +

The name of the environment entry to be created, relative to the + java:comp/env context.

+
+ + +

Set this to false if you do not want + an <env-entry> for the same environment entry name, + found in the web application deployment descriptor, to override the + value specified here. By default, overrides are allowed.

+
+ + +

The fully qualified Java class name expected by the web application + for this environment entry. Must be one of the legal values for + <env-entry-type> in the web application deployment + descriptor: java.lang.Boolean, + java.lang.Byte, java.lang.Character, + java.lang.Double, java.lang.Float, + java.lang.Integer, java.lang.Long, + java.lang.Short, or java.lang.String.

+
+ + +

The parameter value that will be presented to the application + when requested from the JNDI context. This value must be convertable + to the Java type defined by the type attribute.

+
+ +
+ +
+ + + + +

If you have implemented a Java object that needs to know when this + Context is started or stopped, you can declare it by + nesting a Listener element inside this element. The + class name you specify must implement the + org.apache.catalina.LifecycleListener interface, and + it will be notified about the occurrence of the coresponding + lifecycle events. Configuration of such a listener looks like this:

+ + +<Context path="/examples" ...> + ... + <Listener className="com.mycompany.mypackage.MyListener" ... > + ... +</Context> + + +

Note that a Listener can have any number of additional properties + that may be configured from this element. Attribute names are matched + to corresponding JavaBean property names using the standard property + method naming patterns.

+ +
+ + + + +

You can ask Catalina to check the IP address, or host name, on every + incoming request directed to the surrounding + Engine, Host, or + Context element. The remote address or name + will be checked against a configured list of "accept" and/or "deny" + filters, which are defined using the Regular Expression syntax supported + by the Jakarta Regexp + regular expression library. Requests that come from locations that are + not accepted will be rejected with an HTTP "Forbidden" error. + Example filter declarations:

+ + +<Context path="/examples" ...> + ... + <Valve className="org.apache.catalina.valves.RemoteHostValve" + allow="*.mycompany.com,www.yourcompany.com"/> + <Valve className="org.apache.catalina.valves.RemoteAddrValve" + deny="192.168.1.*"/> + ... +</Context> + + +

See Remote Address Filter + and Remote Host Filter for + more information about the configuration options that are supported.

+ +
+ + + + +

You can declare the characteristics of the resource + to be returned for JNDI lookups of <resource-ref> and + <resource-env-ref> elements in the web application + deployment descriptor. You MUST also define + the needed resource parameters as attributes of the Resource + element, to configure the object factory to be used (if not known to Tomcat + already), and the properties used to configure that object factory.

+ +

For example, you can create a resource definition like this:

+ +<Context ...> + ... + <Resource name="jdbc/EmployeeDB" auth="Container" + type="javax.sql.DataSource" + description="Employees Database for HR Applications"/> + ... +</Context> + + +

This is equivalent to the inclusion of the following element in the + web application deployment descriptor (/WEB-INF/web.xml):

+ +<resource-ref> + <description>Employees Database for HR Applications</description> + <res-ref-name>jdbc/EmployeeDB</res-ref-name> + <res-ref-type>javax.sql.DataSource</res-ref-type> + <res-auth>Container</res-auth> +</resource-ref> + + +

but does not require modification of the deployment + descriptor to customize this value.

+ +

The valid attributes for a <Resource> element + are as follows:

+ + + + +

Specify whether the web Application code signs on to the + corresponding resource manager programatically, or whether the + Container will sign on to the resource manager on behalf of the + application. The value of this attribute must be + Application or Container. This + attribute is required if the web application + will use a <resource-ref> element in the web + application deployment descriptor, but is optional if the + application uses a <resource-env-ref> instead.

+
+ + +

Optional, human-readable description of this resource.

+
+ + +

The name of the resource to be created, relative to the + java:comp/env context.

+
+ + +

Specify whether connections obtained through this resource + manager can be shared. The value of this attribute must be + Shareable or Unshareable. By default, + connections are assumed to be shareable.

+
+ + +

The fully qualified Java class name expected by the web + application when it performs a lookup for this resource.

+
+ +
+ + +
+ + + + +

This element is used to create a link to a global JNDI resource. Doing + a JNDI lookup on the link name will then return the linked global + resource.

+ +

For example, you can create a resource link like this:

+ +<Context ...> + ... + <ResourceLink name="linkToGlobalResource" + global="simpleValue" + type="java.lang.Integer" + ... +</Context> + + +

The valid attributes for a <ResourceLink> element + are as follows:

+ + + + +

The name of the linked global resource in the + global JNDI context.

+
+ + +

The name of the resource link to be created, relative to the + java:comp/env context.

+
+ + +

The fully qualified Java class name expected by the web + application when it performs a lookup for this resource link.

+
+ +
+ +
+ + + +

You can declare the characteristics of the UserTransaction + to be returned for JNDI lookup for java:comp/UserTransaction. + You MUST define an object factory class to instantiate + this object as well as the needed resource parameters as attributes of the + Transaction + element, and the properties used to configure that object factory.

+ +

The valid attributes for the <Transaction> element + are as follows:

+ + + + +

The class name for the JNDI object factory.

+
+ +
+ +
+ +
+ + + + + +
diff --git a/webapps/docs/config/engine.xml b/webapps/docs/config/engine.xml new file mode 100644 index 000000000..ac4e0073e --- /dev/null +++ b/webapps/docs/config/engine.xml @@ -0,0 +1,240 @@ + + +]> + + + &project; + + + Craig R. McClanahan + The Engine Container + + + + + +
+ +

The Engine element represents the entire request + processing machinery associated with a particular Catalina + Service. It receives and processes + all requests from one or more Connectors, + and returns the completed response to the Connector for ultimate + transmission back to the client.

+ +

Exactly one Engine element MUST be nested inside + a Service element, following all of the + corresponding Connector elements associated with this Service.

+ +
+ + +
+ + + +

All implementations of Engine + support the following attributes:

+ + + + +

This value represents the delay in seconds between the + invocation of the backgroundProcess method on this engine and + its child containers, including all hosts and contexts. + Child containers will not be invoked if their delay value is not + negative (which would mean they are using their own processing + thread). Setting this to a positive value will cause + a thread to be spawn. After waiting the specified amount of time, + the thread will invoke the backgroundProcess method on this engine + and all its child containers. If not specified, the default value for + this attribute is 10, which represent a 10 seconds delay.

+
+ + +

Java class name of the implementation to use. This class must + implement the org.apache.catalina.Engine interface. + If not specified, the standard value (defined below) will be used.

+
+ + +

The default host name, which identifies the + Host that will process requests directed + to host names on this server, but which are not configured in + this configuration file. This name MUST match the name + attributes of one of the Host elements + nested immediately inside.

+
+ + +

Identifier which must be used in load balancing scenarios to enable + session affinity. The identifier, which must be unique across all + Tomcat 5 servers which participate in the cluster, will be appended to + the generated session identifier, therefore allowing the front end + proxy to always forward a particular session to the same Tomcat 5 + instance.

+
+ + +

Logical name of this Engine, used in log and error messages.

+
+ +
+ +
+ + + + +

The standard implementation of Engine is + org.apache.catalina.core.StandardEngine. + It supports the following additional attributes (in addition to the + common attributes listed above):

+ + + + + +
+ + +
+ + +
+ +

You can nest one or more Host elements inside + this Engine element, each representing a different virtual + host associated with this server. At least one Host + is required, and one of the nested Hosts MUST + have a name that matches the name specified for the + defaultHost attribute, listed above.

+ +

You can optional nest a DefaultContext + element inside this Engine element, to define the default + characteristics of web applications that are automatically deployed.

+ +

You can nest at most one instance of the following utility components + by nesting a corresponding element inside your Engine + element:

+
    +
  • Realm - + Configure a realm that will allow its + database of users, and their associated roles, to be shared across all + Hosts and Contexts + nested inside this Engine, unless overridden by a + Realm configuration at a lower level.
  • +
+ +
+ + +
+ + + + +

An engine is associated with the + org.apache.catalina.core.ContainerBase.[enginename] + log category. Note that the brackets are actually part of the name, + don't omit them.

+ +
+ + + + +

When you run a web server, one of the output files normally generated + is an access log, which generates one line of information for + each request processed by the server, in a standard format. Catalina + includes an optional Valve implementation that + can create access logs in the same standard format created by web servers, + or in any number of custom formats.

+ +

You can ask Catalina to create an access log for all requests + processed by an Engine, + Host, or Context + by nesting a Valve element like this:

+ + +<Engine name="Standalone" ...> + ... + <Valve className="org.apache.catalina.valves.AccessLogValve" + prefix="catalina_access_log." suffix=".txt" + pattern="common"/> + ... +</Engine> + + +

See Access Log Valve + for more information on the configuration attributes that are + supported.

+ +
+ + + + +

If you have implemented a Java object that needs to know when this + Engine is started or stopped, you can declare it by + nesting a Listener element inside this element. The + class name you specify must implement the + org.apache.catalina.LifecycleListener interface, and + it will be notified about the occurrence of the coresponding + lifecycle events. Configuration of such a listener looks like this:

+ + +<Engine name="Standalone" ...> + ... + <Listener className="com.mycompany.mypackage.MyListener" ... > + ... +</Engine> + + +

Note that a Listener can have any number of additional properties + that may be configured from this element. Attribute names are matched + to corresponding JavaBean property names using the standard property + method naming patterns.

+ +
+ + + + +

You can ask Catalina to check the IP address, or host name, on every + incoming request directed to the surrounding + Engine, Host, or + Context element. The remote address or name + will be checked against a configured list of "accept" and/or "deny" + filters, which are defined using the Regular Expression syntax supported + by the Jakarta Regexp + regular expression library. Requests that come from locations that are + not accepted will be rejected with an HTTP "Forbidden" error. + Example filter declarations:

+ + +<Engine name="Standalone" ...> + ... + <Valve className="org.apache.catalina.valves.RemoteHostValve" + allow="*.mycompany.com,www.yourcompany.com"/> + <Valve className="org.apache.catalina.valves.RemoteAddrValve" + deny="192.168.1.*"/> + ... +</Engine> + + +

See Remote Address Filter + and Remote Host Filter for + more information about the configuration options that are supported.

+ +
+ + +
+ + + + + +
diff --git a/webapps/docs/config/globalresources.xml b/webapps/docs/config/globalresources.xml new file mode 100644 index 000000000..2e2078665 --- /dev/null +++ b/webapps/docs/config/globalresources.xml @@ -0,0 +1,254 @@ + + +]> + + + &project; + + + Remy Maucherat + Yoav Shapira + The GlobalNamingResources Component + + + + + +
+ +

The GlobalNamingResources element defines the global + JNDI resources for the Server.

+ +

These resources are listed in the server's global JNDI resource context. + This context is distinct from the per-web-application JNDI contexts + described in + the JNDI Resources HOW-TO. + The resources defined in this element are not visible in + the per-web-application contexts unless you explicitly link them with + <ResourceLink> elements. +

+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + + +

You can configure named values that will be made visible to all + web applications as environment entry resources by nesting + <Environment> entries inside this element. For + example, you can create an environment entry like this:

+ +<GlobalNamingResources ...> + ... + <Environment name="maxExemptions" value="10" + type="java.lang.Integer" override="false"/> + ... +</GlobalNamingResources> + + +

This is equivalent to the inclusion of the following element in the + web application deployment descriptor (/WEB-INF/web.xml): +

+ +<env-entry> + <env-entry-name>maxExemptions</env-entry-name> + <env-entry-value>10</env-entry-value> + <env-entry-type>java.lang.Integer</env-entry-type> +</env-entry> + +

but does not require modification of the deployment descriptor + to customize this value.

+ +

The valid attributes for an <Environment> element + are as follows:

+ + + + +

Optional, human-readable description of this environment entry.

+
+ + +

The name of the environment entry to be created, relative to the + java:comp/env context.

+
+ + +

Set this to false if you do not want + an <env-entry> for the same environment entry name, + found in the web application deployment descriptor, to override the + value specified here. By default, overrides are allowed.

+
+ + +

The fully qualified Java class name expected by the web application + for this environment entry. Must be one of the legal values for + <env-entry-type> in the web application deployment + descriptor: java.lang.Boolean, + java.lang.Byte, java.lang.Character, + java.lang.Double, java.lang.Float, + java.lang.Integer, java.lang.Long, + java.lang.Short, or java.lang.String.

+
+ + +

The parameter value that will be presented to the application + when requested from the JNDI context. This value must be convertable + to the Java type defined by the type attribute.

+
+ +
+ +
+ + + + +

You can declare the characteristics of resources + to be returned for JNDI lookups of <resource-ref> and + <resource-env-ref> elements in the web application + deployment descriptor by defining them in this element and then linking + them with <ResourceLink> + elements + in the <Context> element. + + You MUST also define any other needed parameters using + attributes on the Resource element, to configure + the object factory to be used (if not known to Tomcat already), and + the properties used to configure that object factory.

+ +

For example, you can create a resource definition like this:

+ +<GlobalNamingResources ...> + ... + <Resource name="jdbc/EmployeeDB" auth="Container" + type="javax.sql.DataSource" + description="Employees Database for HR Applications"/> + ... +</GlobalNamingResources> + + +

This is equivalent to the inclusion of the following element in the + web application deployment descriptor (/WEB-INF/web.xml):

+ +<resource-ref> + <description>Employees Database for HR Applications</description> + <res-ref-name>jdbc/EmployeeDB</res-ref-name> + <res-ref-type>javax.sql.DataSource</res-ref-type> + <res-auth>Container</res-auth> +</resource-ref> + + +

but does not require modification of the deployment + descriptor to customize this value.

+ +

The valid attriutes for a <Resource> element + are as follows:

+ + + + +

Specify whether the web Application code signs on to the + corresponding resource manager programatically, or whether the + Container will sign on to the resource manager on behalf of the + application. The value of this attribute must be + Application or Container. This + attribute is required if the web application + will use a <resource-ref> element in the web + application deployment descriptor, but is optional if the + application uses a <resource-env-ref> instead.

+
+ + +

Optional, human-readable description of this resource.

+
+ + +

The name of the resource to be created, relative to the + java:comp/env context.

+
+ + +

Specify whether connections obtained through this resource + manager can be shared. The value of this attribute must be + Shareable or Unshareable. By default, + connections are assumed to be shareable.

+
+ + +

The fully qualified Java class name expected by the web + application when it performs a lookup for this resource.

+
+ +
+ + +
+ + +

Use <ResourceLink> + elements to link resources from the global context into + per-web-application contexts. Here is an example of making a custom + factory available to all applications in the server, based on the example + definition in the + + JNDI Resource HOW-TO: +

+ + + + + + ]]> + + +
+ + + +

You can declare the characteristics of the UserTransaction + to be returned for JNDI lookup for java:comp/UserTransaction. + You MUST define an object factory class to instantiate + this object as well as the needed resource parameters as attributes of the + Transaction + element, and the properties used to configure that object factory.

+ +

The valid attributes for the <Transaction> element + are as follows:

+ + + + +

The class name for the JNDI object factory.

+
+ +
+ +
+ +
+ + + + + +
diff --git a/webapps/docs/config/host.xml b/webapps/docs/config/host.xml new file mode 100644 index 000000000..9fd51e2f4 --- /dev/null +++ b/webapps/docs/config/host.xml @@ -0,0 +1,542 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Remy Maucherat + Yoav Shapira + The Host Container + + + + + +
+ +

The Host element represents a virtual host, + which is an association of a network name for a server (such as + "www.mycompany.com" with the particular server on which Catalina is + running. In order to be effective, this name must be registered in the + Domain Name Service (DNS) server that manages the Internet + domain you belong to - contact your Network Administrator for more + information.

+ +

In many cases, System Administrators wish to associate more than + one network name (such as www.mycompany.com and + company.com) with the same virtual host and applications. + This can be accomplished using the Host + Name Aliases feature discussed below.

+ +

One or more Host elements are nested inside an + Engine element. Inside the Host element, you + can nest Context elements for the web + applications associated with this virtual host. Exactly one of the Hosts + associated with each Engine MUST have a name matching the + defaultHost attribute of that Engine.

+ +
+

The description below uses the variable name $CATALINA_HOME + to refer to the directory into which you have installed Tomcat 5, + and is the base directory against which most relative paths are + resolved. However, if you have configured Tomcat 5 for multiple + instances by setting a CATALINA_BASE directory, you should use + $CATALINA_BASE instead of $CATALINA_HOME for each of these + references.

+
+ +
+ + +
+ + + +

All implementations of Host + support the following attributes:

+ + + + +

The Application Base directory for this virtual host. + This is the pathname of a directory that may contain web applications + to be deployed on this virtual host. You may specify an + absolute pathname for this directory, or a pathname that is relative + to the $CATALINA_BASE directory. See + Automatic Application + Deployment for more information on automatic recognition and + deployment of web applications to be deployed automatically.

+
+ + +

This flag value indicates if new web applications, dropped in to + the appBase directory while Tomcat is running, should + be automatically deployed. The flag's value defaults to true. See + Automatic Application + Deployment for more information.

+
+ + +

This value represents the delay in seconds between the + invocation of the backgroundProcess method on this host and + its child containers, including all contexts. + Child containers will not be invoked if their delay value is not + negative (which would mean they are using their own processing + thread). Setting this to a positive value will cause + a thread to be spawn. After waiting the specified amount of time, + the thread will invoke the backgroundProcess method on this host + and all its child containers. A host will use background processing to + perform live web application deployment related tasks. If not + specified, the default value for this attribute is -1, which means + the host will rely on the background processing thread of its parent + engine.

+
+ + +

Java class name of the implementation to use. This class must + implement the org.apache.catalina.Host interface. + If not specified, the standard value (defined below) will be used.

+
+ + +

This flag value indicates if web applications from this host should + be automatically deployed by the host configurator. + The flag's value defaults to true. See + Automatic Application + Deployment for more information.

+
+ + +

Network name of this virtual host, as registered in your + Domain Name Service server. One of the Hosts nested within + an Engine MUST have a name that matches the + defaultHost setting for that Engine. See + Host Name Aliases for information + on how to assign more than one network name to the same + virtual host.

+
+ +
+ +
+ + + + +

The standard implementation of Host is + org.apache.catalina.core.StandardHost. + It supports the following additional attributes (in addition to the + common attributes listed above):

+ + + + +

Set to false if you want to disable parsing the context.xml + file embedded inside the application (located at /META-INF/context.xml). + Security consious environments should set this to false to prevent + applications from interacting with the container's configuration. The + administrator will then be responsible for providing an external context + configuration file, and put it in + $CATALINA_HOME/conf/[enginename]/[hostname]/. + The flag's value defaults to true.

+
+ + +

Java class name of the error reporting valve which will be used + by this Host. The responsability of this valve is to output error + reports. Setting this property allows to customize the look of the + error pages which will be generated by Tomcat. This class must + implement the + org.apache.catalina.Valve interface. If none is specified, + the value org.apache.catalina.valves.ErrorReportValve + will be used by default.

+
+ + +

Set to true if you want web applications that are + placed in the appBase directory as web application + archive (WAR) files to be unpacked into a corresponding disk directory + structure, false to run such web applications directly + from a WAR file. See + Automatic Application + Deployment for more information.

+
+ + +

Pathname to a scratch directory to be used by applications for + this Host. Each application will have its own sub directory with + temporary read-write use. Configuring a Context workDir will override + use of the Host workDir configuration. This directory will be made + visible to servlets in the web application by a servlet context + attribute (of type java.io.File) named + javax.servlet.context.tempdir as described in the + Servlet Specification. If not specified, a suitable directory + underneath $CATALINA_HOME/work will be provided.

+
+ +
+ +
+ + +
+ + +
+ +

You can nest one or more Context elements + inside this Host element, each representing a different web + application associated with this virtual host. In addition, you can nest a + single DefaultContext element that defines + default values for subsequently deployed web applications.

+ +

You can optional nest a DefaultContext + element inside this Host element, to define the default + characteristics of web applications that are automatically deployed.

+ +

You can nest at most one instance of the following utility components + by nesting a corresponding element inside your Host + element:

+
    +
  • Realm - + Configure a realm that will allow its + database of users, and their associated roles, to be shared across all + Contexts nested inside this Host (unless + overridden by a Realm configuration + at a lower level).
  • +
+ +
+ + +
+ + + + +

A host is associated with the + org.apache.catalina.core.ContainerBase.[enginename].[hostname] + log category. Note that the brackets are actuall part of the name, + don't omit them.

+ +
+ + + + +

When you run a web server, one of the output files normally generated + is an access log, which generates one line of information for + each request processed by the server, in a standard format. Catalina + includes an optional Valve implementation that + can create access logs in the same standard format created by web servers, + or in any number of custom formats.

+ +

You can ask Catalina to create an access log for all requests + processed by an Engine, + Host, or Context + by nesting a Valve element like this:

+ + +<Host name="localhost" ...> + ... + <Valve className="org.apache.catalina.valves.AccessLogValve" + prefix="localhost_access_log." suffix=".txt" + pattern="common"/> + ... +</Host> + + +

See Access Log Valve + for more information on the configuration attributes that are + supported.

+ +
+ + + + +

If you are using the standard Host implementation, + the following actions take place automatically when Catalina is first + started, if the deployOnStartup property is set to + true (which is the default value):

+
    +
  • Any XML file in the + $CATALINA_HOME/conf/[engine_name]/[host_name] directory is + assumed to contain a + Context element (and its associated + subelements) for a single web application. The docBase + attribute of this <Context> element will typically + be the absolute pathname to a web application directory, or the + absolute pathname of a web application archive (WAR) file (which + will not be expanded).
  • +
  • Any web application archive file within the application base (appBase) + directory that does not have a corresponding + directory of the same name (without the ".war" extension) will be + automatically expanded, unless the unpackWARs property + is set to false. If you redeploy an updated WAR file, + be sure to delete the expanded directory when restarting Tomcat, so + that the updated WAR file will be re-expanded (note that the auto + deployer, if enabled, will automatically expand the updated WAR file + once the previously expanded directory is removed).
  • +
  • Any subdirectory within the application base directory + that appears to be an unpacked web application (that is, it contains + a /WEB-INF/web.xml file) will receive an automatically + generated Context element, even if this + directory is not mentioned in the conf/server.xml file. + This generated Context entry will be configured according to the + properties set in any DefaultContext + element nested in this Host element. The context path for this + deployed Context will be a slash character ("/") followed by the + directory name, unless the directory name is ROOT, in which case + the context path will be an empty string ("").
  • +
+ +

In addition to the automatic deployment that occurs at startup time, + you can also request that new XML configuration files, WAR files, or + subdirectories (containing web applications) that are dropped in to the + appBase (or + $CATALINA_HOME/conf/[engine_name]/[host_name] in the case of + an XML configuration file) directory while Tomcat is running will be + automatically deployed, according to the rules described above. The + auto deployer will also track web applications for the following changes: +

    +
  • An update to the WEB-INF/web.xml file will trigger a reload of the + web application
  • +
  • An update to a WAR which has been expanded will trigger + an undeploy (with a removal of the expanded webapp), + followed by a deployment
  • +
  • An update to a XML configuration file will trigger an undeploy + (without the removal of any expanded directory), followed by + a deployment of the associated web application
  • +
+

+ +

When using automatic deployment, the docBase defined by + an XML Context file should be outside of the + appBase directory. If this is not the case difficulties + may be experienced deploying the web application or the application may + be deployed twice.

+ +

Finally, note that if you are defining contexts explicitly, you should + probably turn off automatic application deployment. Otherwise, your context + will be deployed twice each, and that may cause problems for your app. +

+ +
+ + + + +

In many server environments, Network Administrators have configured + more than one network name (in the Domain Name Service (DNS) + server), that resolve to the IP address of the same server. Normally, + each such network name would be configured as a separate + Host element in conf/server.xml, each + with its own set of web applications.

+ +

However, in some circumstances, it is desireable that two or more + network names should resolve to the same virtual host, + running the same set of applications. A common use case for this + scenario is a corporate web site, where it is desireable that users + be able to utilize either www.mycompany.com or + company.com to access exactly the same content and + applications.

+ +

This is accomplished by utilizing one or more Alias + elements nested inside your Host element. For + example:

+ +<Host name="www.mycompany.com" ...> + ... + <Alias>mycompany.com</Alias> + ... +</Host> + + +

In order for this strategy to be effective, all of the network names + involved must be registered in your DNS server to resolve to the + same computer that is running this instance of Catalina.

+ +
+ + + + +

If you have implemented a Java object that needs to know when this + Host is started or stopped, you can declare it by + nesting a Listener element inside this element. The + class name you specify must implement the + org.apache.catalina.LifecycleListener interface, and + it will be notified about the occurrence of the coresponding + lifecycle events. Configuration of such a listener looks like this:

+ + +<Host name="localhost" ...> + ... + <Listener className="com.mycompany.mypackage.MyListener" ... > + ... +</Host> + + +

Note that a Listener can have any number of additional properties + that may be configured from this element. Attribute names are matched + to corresponding JavaBean property names using the standard property + method naming patterns.

+ +
+ + + + +

You can ask Catalina to check the IP address, or host name, on every + incoming request directed to the surrounding + Engine, Host, or + Context element. The remote address or name + will be checked against a configured list of "accept" and/or "deny" + filters, which are defined using the Regular Expression syntax supported + by the Jakarta Regexp + regular expression library. Requests that come from locations that are + not accepted will be rejected with an HTTP "Forbidden" error. + Example filter declarations:

+ + +<Host name="localhost" ...> + ... + <Valve className="org.apache.catalina.valves.RemoteHostValve" + allow="*.mycompany.com,www.yourcompany.com"/> + <Valve className="org.apache.catalina.valves.RemoteAddrValve" + deny="192.168.1.*"/> + ... +</Host> + + +

See Remote Address Filter + and Remote Host Filter for + more information about the configuration options that are supported.

+ +
+ + + + +

In many environments, but particularly in portal environments, it + is desireable to have a user challenged to authenticate themselves only + once over a set of web applications deployed on a particular virtual + host. This can be accomplished by nesting an element like this inside + the Host element for this virtual host:

+ + +<Host name="localhost" ...> + ... + <Valve className="org.apache.catalina.authenticator.SingleSignOn" + debug="0"/> + ... +</Host> + + +

The Single Sign On facility operates according to the following rules: +

+
    +
  • All web applications configured for this virtual host must share the + same Realm. In practice, that means you can + nest the Realm element inside this Host element (or the surrounding + Engine element), but not inside a + Context element for one of the involved + web applications.
  • +
  • As long as the user accesses only unprotected resources in any of the + web applications on this virtual host, they will not be challenged + to authenticate themselves.
  • +
  • As soon as the user accesses a protected resource in + any web application associated with this virtual + host, the user will be challenged to authenticate himself or herself, + using the login method defined for the web application currently + being accessed.
  • +
  • Once authenticated, the roles associated with this user will be + utilized for access control decisions across all + of the associated web applications, without challenging the user + to authenticate themselves to each application individually.
  • +
  • As soon as the user logs out of one web application (for example, + by invalidating the corresponding session if form + based login is used), the user's sessions in all + web applications will be invalidated. Any subsequent attempt to + access a protected resource in any application will require the + user to authenticate himself or herself again.
  • +
  • The Single Sign On feature utilizes HTTP cookies to transmit a token + that associates each request with the saved user identity, so it can + only be utilized in client environments that support cookies.
  • +
+ +
+ + + + +

Many web servers can automatically map a request URI starting with + a tilde character ("~") and a username to a directory (commonly named + public_html) in that user's home directory on the server. + You can accomplish the same thing in Catalina by using a special + Listener element like this (on a Unix system that + uses the /etc/passwd file to identify valid users):

+ + +<Host name="localhost" ...> + ... + <Listener className="org.apache.catalina.startup.UserConfig" + directoryName="public_html" + userClass="org.apache.catalina.startup.PasswdUserDatabase"/> + ... +</Host> + + +

On a server where /etc/passwd is not in use, you can + request Catalina to consider all directories found in a specified base + directory (such as c:\Homes in this example) to be + considered "user home" directories for the purposes of this directive:

+ + +<Host name="localhost" ...> + ... + <Listener className="org.apache.catalina.startup.UserConfig" + directoryName="public_html" + homeBase=c:\Homes" + userClass="org.apache.catalina.startup.HomesUserDatabase"/> + ... +</Host> + + +

If a user home directory has been set up for a user named + craigmcc, then its contents will be visible from a + client browser by making a request to a URL like:

+ + +http://www.mycompany.com:8080/~craigmcc + + +

Successful use of this feature requires recognition of the following + considerations:

+
    +
  • Each user web application will be deployed with characteristics + established by any DefaultContext + element you have configured for this Host.
  • +
  • It is legal to include more than one instance of this Listener + element. This would only be useful, however, in circumstances + where you wanted to configure more than one "homeBase" directory.
  • +
  • The operating system username under which Catalina is executed + MUST have read access to each user's web application directory, + and all of its contents.
  • +
+ +
+ + +
+ + + + + +
diff --git a/webapps/docs/config/http.xml b/webapps/docs/config/http.xml new file mode 100644 index 000000000..5837471f5 --- /dev/null +++ b/webapps/docs/config/http.xml @@ -0,0 +1,473 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Yoav Shapira + The HTTP Connector + + + + + +
+ +

The HTTP Connector element represents a + Connector component that supports the HTTP/1.1 protocol. + It enables Catalina to function as a stand-alone web server, in addition + to its ability to execute servlets and JSP pages. A particular instance + of this component listens for connections on a specific TCP port number + on the server. One or more such Connectors can be + configured as part of a single Service, each + forwarding to the associated Engine to perform + request processing and create the response.

+ +

If you wish to configure the Connector that is used + for connections to web servers using the AJP protocol (such as the + mod_jk 1.2.x connector for Apache 1.3), see + here instead.

+ +

At server startup time, this Connector will create a + number of request processing threads (based on the value configured for + the minSpareThreads attribute). Each incoming request requires + a thread for the duration of that request. If more simultaneous requests + are received than can be handled by the currently available request + processing threads, additional threads will be created up to the + configured maximum (the value of the maxThreads attribute). + If still more simultaneous requests are received, they are stacked up + inside the server socket created by the Connector, up to + the configured maximum (the value of the acceptCount + attribute. Any further simultaneous requests will receive "connection + refused" errors, until resources are available to process them.

+ +
+ + +
+ + + +

All implementations of Connector + support the following attributes:

+ + + + +

A boolean value which can be used to enable or disable the TRACE + HTTP method. If not specified, this attribute is set to false.

+
+ + +

If set to true, all paths for session cookies will be set + to /. This can be useful for portlet specification implementations, + but will greatly affect performance if many applications are accessed on a given + server by the client. + If not specified, this attribute is set to false.

+
+ + +

Set to true if you want calls to + request.getRemoteHost() to perform DNS lookups in + order to return the actual host name of the remote client. Set + to false to skip the DNS lookup and return the IP + address in String form instead (thereby improving performance). + By default, DNS lookups are enabled.

+
+ + +

The maximum size in bytes of the POST which will be handled by + the container FORM URL parameter parsing. The limit can be disabled by + setting this attribute to a value less than or equal to 0. + If not specified, this attribute is set to 2097152 (2 megabytes).

+
+ + +

The maximum size in bytes of the POST which will be saved/buffered by + the container during FORM or CLIENT-CERT authentication. For both types + of authentication, the POST will be saved/buffered before the user is + authenticated. For CLIENT-CERT authentication, the POST is buffered for + the duration of + the SSL handshake and the buffer emptied when the request + is processed. For FORM authentication the POST is + saved whilst the user + is re-directed to the login form and is retained until the user + successfully authenticates or the session associated with the + authentication request expires. The limit can be disabled by setting this + attribute to -1. Setting the attribute to + zero will disable the saving of + POST data during authentication +. If not + specified, this attribute is set + to + 4096 (4 kilobytes).

+
+ + +

This attribute value must be HTTP/1.1 to use the HTTP + handler, which is the default.

+
+ + +

If this Connector is being used in a proxy + configuration, configure this attribute to specify the server name + to be returned for calls to request.getServerName(). + See Proxy Support for more + information.

+
+ + +

If this Connector is being used in a proxy + configuration, configure this attribute to specify the server port + to be returned for calls to request.getServerPort(). + See Proxy Support for more + information.

+
+ + +

If this Connector is supporting non-SSL + requests, and a request is received for which a matching + <security-constraint> requires SSL transport, + Catalina will automatically redirect the request to the port + number specified here.

+
+ + +

Set this attribute to the name of the protocol you wish to have + returned by calls to request.getScheme(). For + example, you would set this attribute to "https" + for an SSL Connector. The default value is "http". + See SSL Support for more information.

+
+ + +

Set this attribute to true if you wish to have + calls to request.isSecure() to return true + for requests received by this Connector (you would want this on an + SSL Connector). The default value is false.

+
+ + +

This specifies the character encoding used to decode the URI bytes, + after %xx decoding the URL. If not specified, ISO-8859-1 will be used. +

+
+ + +

This specifies if the encoding specified in contentType should be used + for URI query parameters, instead of using the URIEncoding. This + setting is present for compatibility with Tomcat 4.1.x, where the + encoding specified in the contentType, or explicitely set using + Request.setCharacterEncoding method was also used for the parameters from + the URL. The default value is false. +

+
+ + +

Set this attribute to true to cause Tomcat to use + the IP address that the request was recieved on to determine the Host + to send the request to. The default value is false.

+
+ + +

Set this attribute to true to cause Tomcat to advertise + support for the Servlet specification using the header recommended in the + specification. The default value is false.

+
+ + +
+ +
+ + + +

+ HTTP supports the following additional attributes (in addition to the + common attributes listed above):

+ + + + +

The maximum queue length for incoming connection requests when + all possible request processing threads are in use. Any requests + received when the queue is full will be refused. The default + value is 10.

+
+ + +

For servers with more than one IP address, this attribute + specifies which address will be used for listening on the specified + port. By default, this port will be used on all IP addresses + associated with the server.

+
+ + +

The size (in bytes) of the buffer to be provided for input + streams created by this connector. By default, buffers of + 2048 bytes will be provided.

+
+ + +

The value is a comma separated list of MIME types for which HTTP + compression may be used. + The default value is text/html,text/xml,text/plain.

+
+ + +

The Connector may use HTTP/1.1 GZIP compression in + an attempt to save server bandwidth. The acceptable values for the + parameter is "off" (disable compression), "on" (allow compression, which + causes text data to be compressed), "force" (forces compression in all + cases), or a numerical integer value (which is equivalent to "on", but + specifies the minimum amount of data before the output is compressed). If + the content-length is not known and compression is set to "on" or more + aggressive, the output will also be compressed. If not specified, this + attribute is set to "off".

+
+ + +

The number of milliseconds during which the sockets used by this + Connector will linger when they are closed. + The default value is -1 (socket linger is disabled).

+
+ + +

The number of milliseconds this Connector will wait, + after accepting a connection, for the request URI line to be + presented. The default value is 60000 (i.e. 60 seconds).

+
+ + +

This flag allows the servlet container to use a different, longer + connection timeout while a servlet is being executed, which in the end + allows either the servlet a longer amount of time to complete its + execution, or a longer timeout during data upload. If not specified, + this attribute is set to "true".

+
+ + +

The maximum size of the request and response HTTP header, specified + in bytes. + If not specified, this attribute is set to 4096 (4 KB).

+
+ + +

The maximum number of HTTP requests which can be pipelined until + the connection is closed by the server. Setting this attribute to 1 will + disable HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and + pipelining. Setting this to -1 will allow an unlimited amount of + pipelined or keep-alive HTTP requests. + If not specified, this attribute is set to 100.

+
+ + +

The maximum number of unused request processing threads that + will be allowed to exist until the thread pool starts stopping the + unnecessary threads. The default value is 50.

+
+ + +

The maximum number of request processing threads to be created + by this Connector, which therefore determines the + maximum number of simultaneous requests that can be handled. If + not specified, this attribute is set to 200.

+
+ + +

The number of request processing threads that will be created + when this Connector is first started. The connector + will also make sure it has the specified number of idle processing + threads available. This attribute should be set to a value smaller + than that set for maxThreads. The default value is 4.

+
+ + +

The value is a comma separated list of regular expressions matching + user-agents of HTTP clients for which compression should not be used, + because these clients, although they do advertise support for the + feature, have a broken implementation. + The default value is an empty String (regexp matching disabled).

+
+ + +

The TCP port number on which this Connector + will create a server socket and await incoming connections. Your + operating system will allow only one server application to listen + to a particular port number on a particular IP address.

+
+ + +

The value is a comma separated list of regular expressions matching + user-agents of HTTP clients for which HTTP/1.1 or HTTP/1.0 keep alive + should not be used, even if the clients advertise support for these + features. + The default value is an empty String (regexp matching disabled).

+
+ + +

The Server header for the http response. + Unless your paranoid, you won't need this feature. +

+
+ + +

The size (in bytes) of the buffer to be provided for socket + output buffering. -1 can be specified to disable the use of a buffer. + By default, a buffers of 9000 bytes will be used.

+
+ + +

The thread pooling strategy which will be used. The default strategy does + not use a master thread, but a more conventional strategy using a + master listener thread can be used by setting "ms" as this attribute's value. + The master strategy will work significantly better using the threadPriority + attribute, which will apply only to the thread which listens on the server socket. + This is set to lf by default. +

+
+ + +

If set to true, the TCP_NO_DELAY option will be + set on the server socket, which improves performance under most + circumstances. This is set to true by default.

+
+ + +

The priority of the request processing threads within the JVM. + The default value is java.lang.Thread#NORM_PRIORITY. + See the JavaDoc for the java.lang.Thread class for more details on + what this priority means. +

+
+ +
+ +
+ +
+ + +
+ +

None at this time.

+ +
+ + +
+ + + + +

This Connector supports all of the required features + of the HTTP/1.1 protocol, as described in RFC 2616, including persistent + connections, pipelining, expectations and chunked encoding. If the client + (typically a browser) supports only HTTP/1.0, the + Connector will gracefully fall back to supporting this + protocol as well. No special configuration is required to enable this + support. The Connector also supports HTTP/1.0 + keep-alive.

+ +

RFC 2616 requires that HTTP servers always begin their responses with + the highest HTTP version that they claim to support. Therefore, this + Connector will always return HTTP/1.1 at + the beginning of its responses.

+ +
+ + + + +

The proxyName and proxyPort attributes can + be used when Tomcat is run behind a proxy server. These attributes + modify the values returned to web applications that call the + request.getServerName() and request.getServerPort() + methods, which are often used to construct absolute URLs for redirects. + Without configuring these attributes, the values returned would reflect + the server name and port on which the connection from the proxy server + was received, rather than the server name and port to whom the client + directed the original request.

+ +

For more information, see the + Proxy Support HOW-TO.

+ +
+ + + + +

You can enable SSL support for a particular instance of this + Connector by setting the secure attribute to + true. In addition, you may need to configure the following + attributes:

+ + + + +

The certificate encoding algorithm to be used. If not + specified, the default value is SunX509.

+
+ + +

Set to true if you want the SSL stack to require a + valid certificate chain from the client before + accepting a connection. + Set to want if you + want the SSL stack to request a client + Certificate, but + not fail if one isn't presented. A false + value (which is the default) will not require a certificate chain + unless + the client requests a resource protected by a security + constraint + that uses CLIENT-CERT authentication. See the + SSL HowTo for an example.

+
+ + +

The pathname of the keystore file where you have stored the + server certificate to be loaded. By default, the pathname is + the file ".keystore" in the operating system home + directory of the user that is running Tomcat.

+
+ + +

The password used to access the server certificate from the + specified keystore file. The default value is "changeit". +

+
+ + +

The type of keystore file to be used for the server certificate. + If not specified, the default value is "JKS".

+
+ + +

The version of the SSL protocol to use. If not specified, + the default is "TLS".

+
+ + +

A comma seperated list of the encryption ciphers that may be used. + If not specified, then any available cipher may be used.

+
+ +
+ +

For more information, see the + SSL Configuration HOW-TO.

+ +
+ + +
+ + + + +
diff --git a/webapps/docs/config/index.xml b/webapps/docs/config/index.xml new file mode 100644 index 000000000..f94de892b --- /dev/null +++ b/webapps/docs/config/index.xml @@ -0,0 +1,71 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Overview + + + + + +
+ +

This manual contains reference information about all of the configuration +directives that can be included in a conf/server.xml file to +configure the behavior of the Tomcat 5 Servlet/JSP container. It does not +attempt to describe which configuration directives should be used to perform +specific tasks - for that, see the various HOW-TO documents on the +main index page.

+ +

The configuration element descriptions are organized into the following +major categories:

+
    +
  • Top Level Elements - <Server> is the + root element of the entire configuration file, while + <Service> represents a group of Connectors that is + associated with an Engine.
  • +
  • Connectors - Represent the interface between external + clients sending requests to (and receiving responses from) a particular + Service.
  • +
  • Containers - Represent components whose function is to + process incoming requests, and create the corresponding responses. + An Engine handles all requests for a Service, a Host handles all requests + for a particular virtual host, and a Context handles all requests for a + specific web application.
  • +
  • Nested Components - Represent elements that can be + nested inside the element for a Container. Some elements can be nested + inside any Container, while others can only be nested inside a + Context.
  • +
+ +

For each element, the corresponding documentation follows this general +outline:

+
    +
  • Introduction - Overall description of this particular + component. There will be a corresponding Java interface (in + the org.apache.catalina pacakge) that is implemented by one + or more standard implementations.
  • +
  • Attributes - The set of attributes that are legal for + this element. Generally, this will be subdivided into Common + attributes that are supported by all implementations of the corresponding + Java interface, and Standard Implementation attributes that are + specific to a particular Java class that implements this interface. + The names of required attributes are bolded.
  • +
  • Nested Components - Enumerates which of the Nested + Components can be legally nested within this element.
  • +
  • Special Features - Describes the configuration of a large + variety of special features (specific to each element type) that are + supported by the standard implementation of this interface.
  • +
+ +
+ + + +
diff --git a/webapps/docs/config/loader.xml b/webapps/docs/config/loader.xml new file mode 100644 index 000000000..a11c3c70e --- /dev/null +++ b/webapps/docs/config/loader.xml @@ -0,0 +1,149 @@ + + +]> + + + &project; + + + Craig R. McClanahan + The Loader Component + + + + + +
+ +

The Loader element represents the web + application class loader that will be used to load Java + classes and resources for your web application. Such + a class loader must follow the requirements of the Servlet + Specification, and load classes from the following locations:

+
    +
  • From the /WEB-INF/classes directory inside your + web application.
  • +
  • From JAR files in the /WEB-INF/lib directory + inside your web application.
  • +
  • From resources made available by Catalina to all web + applications globally.
  • +
+ +

A Loader element MAY be nested inside a Context + component. If it is not included, a default Loader configuration will be + created automatically, which is sufficient for most requirements.

+ +

For a more in-depth description of the class loader hierarchy + that is implemented by Catalina, see the ClassLoader HowTo.

+ +
+

The description below uses the variable name $CATALINA_HOME + to refer to the directory into which you have installed Tomcat 5, + and is the base directory against which most relative paths are + resolved. However, if you have configured Tomcat 5 for multiple + instances by setting a CATALINA_BASE directory, you should use + $CATALINA_BASE instead of $CATALINA_HOME for each of these + references.

+
+ +
+ + +
+ + + +

All implementations of Loader + support the following attributes:

+ + + + +

Java class name of the implementation to use. This class must + implement the org.apache.catalina.Loader interface. + If not specified, the standard value (defined below) will be used.

+
+ + +

Set to true if you want the class loader to follow + the standard Java2 delegation model, and attempt to load classes from + parent class loaders before looking inside the web + application. Set to false (the default) to have the + class loader look inside the web application first, before asking + parent class loaders to find requested classes or resources.

+
+ + +

Set to true if you want Catalina to monitor classes in + /WEB-INF/classes/ and /WEB-INF/lib for + changes, and automatically reload the web application if a change + is detected. This feature is very useful during application + development, but it requires significant runtime overhead and is + not recommended for use on deployed production applications. You + can use the Manager web + application, however, to trigger reloads of deployed applications + on demand.

+ +

NOTE - The value for this property will be + inherited from the reloadable attribute you set on + the surrounding Context component, + and any value you explicitly set here will be replaced.

+
+ +
+ +
+ + + + +

The standard implementation of Loader is + org.apache.catalina.loader.WebappLoader. + It supports the following additional attributes (in addition to the + common attributes listed above):

+ + + + +

The number of seconds between checks for modified classes and + resources, if reloadable has been set to + true. The default is 15 seconds.

+
+ + +

Java class name of the java.lang.ClassLoader + implementation class to use. If not specified, the default value is + org.apache.catalina.loader.WebappClassLoader.

+
+ +
+ +
+ + +
+ + +
+ +

No components may be nested inside a Loader element.

+ +
+ + +
+ + + +

A loader is associated with the log category based on its classname.

+ +
+ +
+ + + + + +
diff --git a/webapps/docs/config/manager.xml b/webapps/docs/config/manager.xml new file mode 100644 index 000000000..3e8503cd1 --- /dev/null +++ b/webapps/docs/config/manager.xml @@ -0,0 +1,459 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Yoav Shapira + The Manager Component + + + + + +
+ +

The Manager element represents the session + manager that will be used to create and maintain HTTP sessions + as requested by the associated web application.

+ +

A Manager element MAY be nested inside a + Context component. If it is not included, + a default Manager configuration will be created automatically, which + is sufficient for most requirements.

+ +
+ + +
+ + + +

All implementations of Manager + support the following attributes:

+ + + + +

Java class name of the implementation to use. This class must + implement the org.apache.catalina.Manager interface. + If not specified, the standard value (defined below) will be used.

+
+ + +

Set to true to ask the session manager to enforce + the restrictions described in the Servlet Specification on + distributable applications (primarily, this would mean that all + session attributes must implement java.io.Serializable). + Set to false (the default) to not enforce these + restrictions.

+ +

NOTE - The value for this property is inherited + automatically based on the presence or absence of the + <distributable> element in the web application + deployment descriptor (/WEB-INF/web.xml).

+
+ +
+ +
+ + + + +

Tomcat provides two standard implementations of Manager + for use - the default one stores active sessions, while the optional one + stores active sessions that have been swapped out (in addition to saving + sessions across a restart of Tomcat) in a storage location that is selected + via the use of an appropriate Store nested element.

+ +

Standard Manager Implementation

+ +

The standard implementation of Manager is + org.apache.catalina.session.StandardManager. + It supports the following additional attributes (in addition to the + common attributes listed above):

+ + + + +

Name of the Message Digest algorithm used to calculate + session identifiers produced by this Manager. This value must + be supported by the java.security.MessageDigest class. + If not specified, the default value is "MD5".

+
+ + +

A String value that is utilized when seeding the random number + generator used to create session identifiers for this Manager. + If not specified, a semi-useful value is calculated, but a long + String value should be specified in security-conscious + environments.

+
+ + +

The maximum number of active sessions that will be created by + this Manager, or -1 (the default) for no limit.

+
+ + +

The initial maximum time interval, in seconds, + between client requests before a session is invalidated. A negative value + will result in sessions never timing out. If the attribute is not provided, + a default of 60 seconds is used.

+ +

This attribute provides the initial value whenever a + new session is created, but the interval may be dynamically + varied by a servlet via the + setMaxInactiveInterval method of the HttpSession object.

+
+ + +

Absolute or relative (to the work directory for this Context) + pathname of the file in which session state will be preserved + across application restarts, if possible. The default is + "SESSIONS.ser". See Restart + Persistence for more information. Restart persistence may be + disabled by setting this attribute to an empty string.

+
+ + +

Frequency of the session expiration, and related manager operations. + Manager operations will be done once for the specified amount of + backgrondProcess calls (ie, the lower the amount, the more often the + checks will occur). The minimum value is 1, and the default value is 6. +

+
+ + +

Java class name of the java.util.Random + implementation class to use. If not specified, the default value is + java.security.SecureRandom.

+
+ + +

The length of session ids created by this Manager, excluding any + JVM route information used for load balancing. + The default is 16.

+
+ +
+ +

Persistent Manager Implementation

+ +

WARNING - Use of this Manager implementation + has not been thoroughly tested, and should be considered experimental! +

+ +

The persistent implementation of Manager is + org.apache.catalina.session.PersistentManager. In + addition to the usual operations of creating and deleting sessions, a + PersistentManager has the capability to swap active (but + idle) sessions out to a persistent storage mechanism, as well as to save + all sessions across a normal restart of Tomcat. The actual persistent + storage mechanism used is selected by your choice of a + Store element nested inside the Manager + element - this is required for use of PersistentManager.

+ +

This implementation of Manager supports the following attributes in + addition to the Common Attributes + described earlier.

+ + + + +

Name of the Message Digest algorithm used to calculate + session identifiers produced by this Manager. This value must + be supported by the java.security.MessageDigest class. + If not specified, the default value is "MD5".

+
+ + +

Java class name of the implementation to use. This class must + implement the org.apache.catalina.Manager interface. + You must specify + org.apache.catalina.session.PersistentManager to use + this manager implementation.

+
+ + +

A String value that is utilized when seeding the random number + generator used to create session identifiers for this Manager. + If not specified, a semi-useful value is calculated, but a long + String value should be specified in security-conscious + environments.

+
+ + +

The maximum number of active sessions that will be created by + this Manager, or -1 (the default) for no limit.

+
+ + +

The time interval (in seconds) since the last access to a session + before it is eligible for being persisted to the session store, or + -1 to disable this feature. By default, this feature is + disabled.

+
+ + +

The time interval (in seconds) since the last access to a session + before it should be persisted to the session store, and + passivated out of the server's memory, or -1 to disable + this feature. If this feature is enabled, the time interval specified + here should be equal to or longer than the value specified for + maxIdleBackup. By default, this feature is disabled.

+
+ + +

The time interval (in seconds) since the last access to a session + before it will be eligible to be persisted to the session store, and + passivated out of the server's memory, or -1 for this + swapping to be available at any time. If specified, this value should + be less than that specified by maxIdleSwap. By default, + this value is set to -1.

+
+ + +

The initial maximum time interval, in seconds, + between client requests before a session is invalidated. A negative value + will result in sessions never timing out. If the attribute is not provided, + a default of 60 seconds is used.

+ +

This attribute provides the initial value whenever a + new session is created, but the interval may be dynamically + varied by a servlet via the + setMaxInactiveIntervalmethod of the HttpSession object.

+
+ + +

Java class name of the java.util.Random + implementation class to use. If not specified, the default value is + java.security.SecureRandom.

+
+ + +

Should all sessions be persisted and reloaded when Tomcat is shut + down and restarted (or when this application is reloaded)? By default, + this attribute is set to true.

+
+ + +

The length of session ids created by this Manager, excluding any + JVM route information used for load balancing. + The default is 16.

+
+ +
+ +

In order to successfully use a PersistentManager, you must nest inside + it a <Store> element, as described below.

+ +
+ + +
+ + +
+ +

Standard Manager Implementation

+ +

If you are using the Standard Manager Implementation + as described above, no elements may be nested inside your + <Manager> element.

+ +

Persistent Manager Implementation

+ +

If you are using the Persistent Manager Implementation + as described above, you MUST nest a + <Store> element inside, which defines the + characteristics of the persistent data storage. Two implementations + of the <Store> element are currently available, + with different characteristics, as described belowl

+ +
File Based Store
+ +

The File Based Store implementation saves swapped out + sessions in individual files (named based on the session identifier) + in a configurable directory. Therefore, you are likely to encounter + scalability problems as the number of active sessions increases, and + this should primarily be considered a means to easily experiment.

+ +

To configure this, add a <Store> nested inside + your <Manager> element with the following attributes: +

+ + + + +

The interval (in seconds) between checks for expired sessions + among those sessions that are currently swapped out. By default, + this interval is set to 60 seconds (one minute).

+
+ + +

Java class name of the implementation to use. This class must + implement the org.apache.catalina.Store interface. You + must specify + org.apache.catalina.session.FileStore + to use this implementation.

+
+ + +

Absolute or relative (to the temporary work directory for this web + application) pathname of the directory into which individual session + files are written. If not specified, the temporary work directory + assigned by the container is utilized.

+
+ +
+ + +
JDBC Based Store
+ +

The JDBC Based Store implementation saves swapped out + sessions in individual rows of a preconfigured table in a database + that is accessed via a JDBC driver. With large numbers of swapped out + sessions, this implementation will exhibit improved performance over + the File Based Store described above.

+ +

To configure this, add a <Store> nested inside + your <Manager> element with the following attributes: +

+ + + + +

The interval (in seconds) between checks for expired sessions + among those sessions that are currently swapped out. By default, + this interval is set to 60 seconds (one minute).

+
+ + +

Java class name of the implementation to use. This class must + implement the org.apache.catalina.Store interface. You + must specify + org.apache.catalina.session.JDBCStore + to use this implementation.

+
+ + +

The connection URL that will be handed to the configured JDBC + driver to establish a connection to the database containing our + session table.

+
+ + +

Java class name of the JDBC driver to be used.

+
+ + +

Name of the database column, contained in the specified session + table, that contains the Engine, Host, and Web Application Context + name in the format /Engine/Host/Context.

+
+ + +

Name of the database column, contained in the specified + session table, that contains the serialized form of all session + attributes for a swapped out session. The column type must accept + a binary object (typically called a BLOB).

+
+ + +

Name of the database column, contained in the specified + session table, that contains the session identifier of the + swapped out session. The column type must accept character + string data of at least as many characters as are contained + in session identifiers created by Tomcat (typically 32).

+
+ + +

Name of the database column, contained in the specified + session table, that contains the lastAccessedTime + property of this session. The column type must accept a + Java long (64 bits).

+
+ + +

Name of the database column, contained in the specified + session table, that contains the maxInactiveInterval + property of this session. The column type must accept a + Java integer (32 bits).

+
+ + +

Name of the database table to be used for storing swapped out + sessions. This table must contain (at least) the database columns + that are configured by the other attributes of this element.

+
+ + +

Name of the database column, contained in the specified + session table, that contains a flag indicating whether this + swapped out session is still valid or not. The column type + must accept a single character.

+
+ +
+ +

Before attempting to use the JDBC Based Store for the first time, + you must create the table that will be used to store swapped out sessions. + Detailed SQL commands vary depending on the database you are using, but + a script like this will generally be required:

+ + +create table tomcat_sessions ( + session_id varchar(100) not null primary key, + valid_session char(1) not null, + max_inactive int not null, + last_access bigint not null, + app_name varchar(255), + session_data mediumblob, + KEY kapp_name(app_name) +); + + +

In order for the JDBC Based Store to successfully connect to your + database, the JDBC driver you configure must be visible to Tomcat's + internal class loader. Generally, that means you must place the JAR + file containing this driver into the $CATALINA_HOME/server/lib + directory (if your applications do not also need it) or into the + $CATALINA_HOME/common/lib directory (if you wish to share + this driver with your web applications.

+ +
+ + +
+ + + + +

Whenver Catalina is shut down normally and restarted, or when an + application reload is triggered, the standard Manager implementation + will attempt to serialize all currently active sessions to a disk + file located via the pathname attribute. All such saved + sessions will then be deserialized and activated (assuming they have + not expired in the mean time) when the application reload is completed.

+ +

In order to successfully restore the state of session attributes, + all such attributes MUST implement the java.io.Serializable + interface. You MAY cause the Manager to enforce this restriction by + including the <distributable> element in your web + application deployment descriptor (/WEB-INF/web.xml).

+ +
+ +
+ + + + + +
diff --git a/webapps/docs/config/project.xml b/webapps/docs/config/project.xml new file mode 100644 index 000000000..4712b81d1 --- /dev/null +++ b/webapps/docs/config/project.xml @@ -0,0 +1,46 @@ + + + + Apache Tomcat Configuration Reference + + + The Apache Tomcat Servlet/JSP Container + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapps/docs/config/realm.xml b/webapps/docs/config/realm.xml new file mode 100644 index 000000000..c14797848 --- /dev/null +++ b/webapps/docs/config/realm.xml @@ -0,0 +1,497 @@ + + +]> + + + &project; + + + Craig R. McClanahan + The Realm Component + + + + + +
+ +

A Realm element represents a "database" of usernames, + passwords, and roles (similar to Unix groups) assigned + to those users. Different implementations of Realm allow Catalina to be + integrated into environments where such authentication information is already + being created and maintained, and then utilize that information to implement + Container Managed Security as described in the Servlet + Specification.

+ +

You may nest a Realm inside any Catalina container + Engine, Host, or + Context). In addition, Realms associated with + an Engine or a Host are automatically inherited by lower-level + containers, unless explicitly overridden.

+ +

For more in-depth information about container managed security in web + applications, as well as more information on configuring and using the + standard realm component implementations, please see the + Container-Managed Security Guide. +

+ +
+

The description below uses the variable name $CATALINA_HOME + to refer to the directory into which you have installed Tomcat 5, + and is the base directory against which most relative paths are + resolved. However, if you have configured Tomcat 5 for multiple + instances by setting a CATALINA_BASE directory, you should use + $CATALINA_BASE instead of $CATALINA_HOME for each of these + references.

+
+ +
+ + +
+ + + +

All implementations of Realm + support the following attributes:

+ + + + +

Java class name of the implementation to use. This class must + implement the org.apache.catalina.Realm interface.

+
+ +
+ +
+ + + + +

Unlike most Catalina components, there are several standard + Realm implementations available. As a result, + the className attribute MUST be used to select the + implementation you wish to use.

+ +

JDBC Database Realm (org.apache.catalina.realm.JDBCRealm)

+ +

The JDBC Database Realm connects Catalina to + a relational database, accessed through an appropriate JDBC driver, + to perform lookups of usernames, passwords, and their associated + roles. Because the lookup is done each time that it is required, + changes to the database will be immediately reflected in the + information used to authenticate new logins.

+ +

A rich set of additional attributes lets you configure the required + connection to the underlying database, as well as the table and + column names used to retrieve the required information:

+ + + + +

The database username to use when establishing the JDBC + connection.

+
+ + +

The database password to use when establishing the JDBC + connection.

+
+ + +

The connection URL to be passed to the JDBC driver when + establishing a database connection.

+
+ + +

The name of the MessageDigest algorithm used + to encode user passwords stored in the database. If not specified, + user passwords are assumed to be stored in clear-text.

+
+ + +

The charset for encoding digests. If not specified, the platform + default will be used.

+
+ + +

Fully qualified Java class name of the JDBC driver to be + used to connect to the authentication database.

+
+ + +

Name of the column, in the "user roles" table, which contains + a role name assigned to the corresponding user.

+
+ + +

Name of the column, in the "users" table, which contains + the user's credentials (i.e. password(. If a value for the + digest attribute is specified, this component + will assume that the passwords have been encoded with the + specified algorithm. Otherwise, they will be assumed to be + in clear text.

+
+ + +

Name of the column, in the "users" and "user roles" table, + that contains the user's username.

+
+ + +

Name of the "user roles" table, which must contain columns + named by the userNameCol and roleNameCol + attributes.

+
+ + +

Name of the "users" table, which must contain columns named + by the userNameCol and userCredCol + attributes.

+
+ +
+ +

See the Container-Managed Security Guide for more + information on setting up container managed security using the + JDBC Database Realm component.

+ + +

+ DataSource Database Realm (org.apache.catalina.realm.DataSourceRealm) +

+ +

The DataSource Database Realm connects Catalina to + a relational database, accessed through a JNDI named JDBC DataSource + to perform lookups of usernames, passwords, and their associated + roles. Because the lookup is done each time that it is required, + changes to the database will be immediately reflected in the + information used to authenticate new logins.

+ +

The JDBC Realm uses a single db connection. This requires that + realm based authentication be synchronized, i.e. only one authentication + can be done at a time. This could be a bottleneck for applications + with high volumes of realm based authentications.

+ +

The DataSource Database Realm supports simultaneous realm based + authentications and allows the underlying JDBC DataSource to + handle optimizations like database connection pooling.

+ +

A rich set of additional attributes lets you configure the name + of the JNDI JDBC DataSource, as well as the table and + column names used to retrieve the required information:

+ + + + +

The name of the JNDI JDBC DataSource for this Realm.

+
+ + +

The name of the MessageDigest algorithm used + to encode user passwords stored in the database. If not specified, + user passwords are assumed to be stored in clear-text.

+
+ + +

Name of the column, in the "user roles" table, which contains + a role name assigned to the corresponding user.

+
+ + +

Name of the column, in the "users" table, which contains + the user's credentials (i.e. password(. If a value for the + digest attribute is specified, this component + will assume that the passwords have been encoded with the + specified algorithm. Otherwise, they will be assumed to be + in clear text.

+
+ + +

Name of the column, in the "users" and "user roles" table, + that contains the user's username.

+
+ + +

Name of the "user roles" table, which must contain columns + named by the userNameCol and roleNameCol + attributes.

+
+ + +

Name of the "users" table, which must contain columns named + by the userNameCol and userCredCol + attributes.

+
+ +
+ +

See the + DataSource Realm HOW-TO for more information on setting up container + managed security using the DataSource Database Realm component.

+ + +

JNDI Directory Realm (org.apache.catalina.realm.JNDIRealm)

+ + +

The JNDI Directory Realm connects Catalina to + an LDAP Directory, accessed through an appropriate JNDI driver, + that stores usernames, passwords, and their associated + roles. Changes to the directory are immediately reflected in the + information used to authenticate new logins.

+ + +

The directory realm supports a variety of approaches to using + LDAP for authentication:

+ +
    +
  • The realm can either use a pattern to determine the + distinguished name (DN) of the user's directory entry, or search + the directory to locate that entry. +
  • + +
  • The realm can authenticate the user either by binding to the + directory with the DN of the user's entry and the password + presented by the user, or by retrieving the password from the + user's entry and performing a comparison locally. +
  • + +
  • Roles may be represented in the directory as explicit entries + found by a directory search (e.g. group entries of which the user + is a member), as the values of an attribute in the user's entry, + or both. +
  • +
+ +

A rich set of additional attributes lets you configure the + required behaviour as well as the connection to the underlying + directory and the element and attribute names used to retrieve + information from the directory:

+ + + +

If a socket connection can not be made to the provider at + the connectionURL an attempt will be made to use the + alternateURL.

+
+ + +

A string specifying the type of authentication to use. + "none", "simple", "strong" or a provider specific definition + can be used. If no value is given the providers default is used.

+
+ + +

The directory username to use when establishing a + connection to the directory for LDAP search operations. If not + specified an anonymous connection is made, which is often + sufficient unless you specify the userPassword + property.

+
+ + +

The directory password to use when establishing a + connection to the directory for LDAP search operations. If not + specified an anonymous connection is made, which is often + sufficient unless you specify the userPassword + property.

+
+ + +

The connection URL to be passed to the JNDI driver when + establishing a connection to the directory.

+
+ + +

Fully qualified Java class name of the factory class used + to acquire our JNDI InitialContext. By default, + assumes that the standard JNDI LDAP provider will be utilized.

+
+ + +

A string specifying how aliases are to be dereferenced during + search operations. The allowed values are "always", "never", + "finding" and "searching". If not specified, "always" is used.

+
+ + +

A string specifying the security protocol to use. If not given + the providers default is used.

+
+ + +

The base directory entry for performing role searches. If + not specified the top-level element in the directory context + will be used.

+
+ + +

The name of the attribute that contains role names in the + directory entries found by a role search. In addition you can + use the userRoleName property to specify the name + of an attribute, in the user's entry, containing additional + role names. If roleName is not specified a role + search does not take place, and roles are taken only from the + user's entry.

+
+ + +

The LDAP filter expression used for performing role + searches. Use {0} to substitute the + distinguished name (DN) of the user, and/or {1} to + substitute the username. If not specified a role search does + not take place and roles are taken only from the attribute in + the user's entry specified by the userRoleName + property.

+
+ + +

Set to true if you want to search the entire + subtree of the element specified by the roleBase + property for role entries associated with the user. The + default value of false causes only the top level + to be searched.

+
+ + +

The base element for user searches performed using the + userSearch expression. Not used if you are using + the userPattern expression.

+
+ + +

Name of the attribute in the user's entry containing the + user's password. If you specify this value, JNDIRealm will + bind to the directory using the values specified by + connectionName and + connectionPassword properties, and retrieve the + corresponding attribute for comparison to the value specified + by the user being authenticated. If you do + not specify this value, JNDIRealm will + attempt a simple bind to the directory using the DN of the + user's entry and the password presented by the user, with a + successful bind being interpreted as an authenticated + user.

+
+ + +

Pattern for the distinguished name (DN) of the user's + directory entry, with {0} marking where the + actual username should be inserted. You can use this property + instead of userSearch, userSubtree + and userBase when the distinguished name contains + the username and is otherwise the same for all users.

+
+ + +

The name of an attribute in the user's directory entry + containing zero or more values for the names of roles assigned + to this user. In addition you can use the + roleName property to specify the name of an + attribute to be retrieved from individual role entries found + by searching the directory. If userRoleName is + not specified all the roles for a user derive from the role + search.

+
+ + +

The LDAP filter expression to use when searching for a + user's directory entry, with {0} marking where + the actual username should be inserted. Use this property + (along with the userBase and + userSubtree properties) instead of + userPattern to search the directory for the + user's entry.

+
+ + +

Set to true if you want to search the entire + subtree of the element specified by the userBase + property for the user's entry. The default value of + false causes only the top level to be searched. + Not used if you are using the userPattern + expression.

+
+ +
+ +

See the Container-Managed Security Guide for more + information on setting up container managed security using the + JNDI Directory Realm component.

+ + +

Memory Based Realm (org.apache.catalina.realm.MemoryRealm)

+ +

The Memory Based Realm is a simple Realm implementation + that reads user information from an XML format, and represents it as a + collection of Java objects in memory. This implementation is intended + solely to get up and running with container managed security - it is NOT + intended for production use. As such, there are no mechanisms for + updating the in-memory collection of users when the content of the + underlying data file is changed.

+ +

The Memory Based Realm implementation supports the following + additional attributes:

+ + + + +

Absolute or relative (to $CATALINA_HOME) pathname to the XML file + containing our user information. See below for details on the + XML element format required. If no pathname is specified, the + default value is conf/tomcat-users.xml.

+
+ +
+ +

The XML document referenced by the pathname attribute must + conform to the following requirements:

+
    +
  • The root (outer) element must be <tomcat-users>. +
  • +
  • Each authorized user must be represented by a single XML element + <user>, nested inside the root element.
  • +
  • Each <user> element must have the following + attributes: +
      +
    • name - Username of this user (must be unique + within this file).
    • +
    • password - Password of this user (in + clear text).
    • +
    • roles - Comma-delimited list of the role names + assigned to this user.
    • +
  • +
+ +

See the Container-Managed Security Guide for more + information on setting up container managed security using the + Memory Based Realm component.

+ + +
+ + +
+ + +
+ +

No components may be nested inside a Realm element.

+ +
+ + +
+ +

See Single Sign On for information about + configuring Single Sign On support for a virtual host.

+ +
+ + + + + +
diff --git a/webapps/docs/config/resources.xml b/webapps/docs/config/resources.xml new file mode 100644 index 000000000..c1745de31 --- /dev/null +++ b/webapps/docs/config/resources.xml @@ -0,0 +1,100 @@ + + +]> + + + &project; + + + Remy Maucherat + The Resources Component + + + + + +
+ +

The Resources element represents the web + application static resources, from which classes will be loaded, + HTML, JSP and the other static files will be served. This allows the webapp + to reside on various mediums other than the filesystem, like compressed + in a WAR file, in a JDBC database, or in a more advanced versioning + repository.

+ +

A unified caching engine is provided for all accesses to the webapp + resources made by the servlet container and web applications which use the + container provided mechanisms to access such resources, such as class laoder + access, access through the ServletContext interface, or native + access through the DirectoryContext interface.

+ +

Note: Running a webapp with non-filesystem based + Resources implementations is only possible when the webapp does not + rely on direct filesystem access to its own resources, and uses the methods + in the ServletContext interface to access them.

+ +

A Resources element MAY be nested inside a + Context component. If it is not included, + a default filesystem based Resources will be created automatically, + which is sufficient for most requirements.

+ +
+ + +
+ + + +

All implementations of Resources + support the following attributes:

+ + + + +

Java class name of the implementation to use. This class must + implement the javax.naming.directory.DirContext interface. + It is recommended for optimal functionality and performance, + but not mandatory, that the class extend + org.apache.naming.resources.BaseDirContext, as well as + use the special object types provided in the + org.apache.naming.resources for returned objects. + If not specified, the standard value (defined below) will be used.

+
+ +
+ +
+ + + + +

The standard implementation of Resources is + org.apache.naming.resources.FileDirContext, and + is configured by its parent Context element.

+ +
+ + +
+ + +
+ +

No components may be nested inside a Resources element.

+ +
+ + +
+ +

No special features are associated with a Resources + element.

+ +
+ + + + + +
diff --git a/webapps/docs/config/server.xml b/webapps/docs/config/server.xml new file mode 100644 index 000000000..f22bdab9c --- /dev/null +++ b/webapps/docs/config/server.xml @@ -0,0 +1,97 @@ + + +]> + + + &project; + + + Craig R. McClanahan + The Server Component + + + + + +
+ +

A Server element represents the entire Catalina + servlet container. Therefore, it must be the single outermost element + in the conf/server.xml configuration file. Its attributes + represent the characteristics of the servlet container as a whole.

+ +
+ + +
+ + + +

All implementations of Server + support the following attributes:

+ + + + +

Java class name of the implementation to use. This class must + implement the org.apache.catalina.Server interface. + If no class name is specified, the standard implementation will + be used.

+
+ + +

The TCP/IP port number on which this server waits for a shutdown + command. This connection must be initiated from the same server + computer that is running this instance of Tomcat.

+
+ + +

The command string that must be received via a TCP/IP connection + to the specified port number, in order to shut down Tomcat.

+
+ +
+ +
+ + + +

The standard implementation of Server is + org.apache.catalina.core.StandardServer. + It supports the following additional attributes (in addition to the + common attributes listed above):

+ + + + +
+ +
+ + +
+ +

The following components may be nested inside a Server + element:

+ + +
+ + +
+ +

There are no special features associated with a Server. +

+ +
+ + + + +
diff --git a/webapps/docs/config/service.xml b/webapps/docs/config/service.xml new file mode 100644 index 000000000..c0a9661cb --- /dev/null +++ b/webapps/docs/config/service.xml @@ -0,0 +1,91 @@ + + +]> + + + &project; + + + Craig R. McClanahan + The Service Component + + + + + +
+ +

A Service element represents the combination of one or + more Connector components that share a single + Engine component for processing incoming + requests. One or more Service elements may be nested + inside a Server element.

+ +
+ + +
+ + + +

All implementations of Service + support the following attributes:

+ + + + +

Java class name of the implementation to use. This class must + implement the org.apache.catalina.Service interface. + If no class name is specified, the standard implementation will + be used.

+
+ + +

The display name of this Service, which will + be included in log messages if you utilize standard Catalina + components. The name of each Service that is + associated with a particular Server + must be unique.

+
+ +
+ +
+ + + +

The standard implementation of Service is + org.apache.catalina.core.StandardService. + It supports the following additional attributes (in addition to the + common attributes listed above):

+ + + + + +
+ +
+ + +
+ +

The only components that may be nested inside a Service + element are one or more Connector elements, + followed by exactly one Engine element.

+ +
+ + +
+ +

There are no special features associated with a Service. +

+ +
+ + + + +
diff --git a/webapps/docs/config/valve.xml b/webapps/docs/config/valve.xml new file mode 100644 index 000000000..5f97d9641 --- /dev/null +++ b/webapps/docs/config/valve.xml @@ -0,0 +1,434 @@ + + +]> + + + &project; + + + Craig R. McClanahan + The Valve Component + + + + + +
+ +

A Valve element represents a component that will be + inserted into the request processing pipeline for the associated + Catalina container (Engine, + Host, or Context). + Individual Valves have distinct processing capabilities, and are + described individually below.

+ +
+

The description below uses the variable name $CATALINA_HOME + to refer to the directory into which you have installed Tomcat 5, + and is the base directory against which most relative paths are + resolved. However, if you have configured Tomcat 5 for multiple + instances by setting a CATALINA_BASE directory, you should use + $CATALINA_BASE instead of $CATALINA_HOME for each of these + references.

+
+ +
+ + +
+ + + +

The Access Log Valve creates log files in the same + format as those created by standard web servers. These logs can later + be analyzed by standard log analysis tools to track page hit counts, + user session activity, and so on. The files produces by this Valve + are rolled over nightly at midnight. This Valve + may be associated with any Catalina container (Context, + Host, or Engine), and + will record ALL requests processed by that container.

+ +
+ + + +

The Access Log Valve supports the following + configuration attributes:

+ + + + +

Java class name of the implementation to use. This MUST be set to + org.apache.catalina.valves.AccessLogValve to use the + default access log valve. To use a more optimized access log valve + designed for production use, you MUST set this attribute to + org.apache.catalina.valves.FastCommonAccessLogValve. + In this case, only the common and combined + patterns are supported.

+
+ + +

Absolute or relative pathname of a directory in which log files + created by this valve will be placed. If a relative path is + specified, it is interpreted as relative to $CATALINA_HOME. If + no directory attribute is specified, the default value is "logs" + (relative to $CATALINA_HOME).

+
+ + +

A formatting layout identifying the various information fields + from the request and response to be logged, or the word + common or combined to select a + standard format. See below for more information on configuring + this attribute. Note that the optimized access does only support + common and combined as the value for this + attribute.

+
+ + +

The prefix added to the start of each log file's name. If not + specified, the default value is "access_log.". To specify no prefix, + use a zero-length string.

+
+ + +

Set to true to convert the IP address of the remote + host into the corresponding host name via a DNS lookup. Set to + false to skip this lookup, and report the remote IP + address instead.

+
+ + +

The suffix added to the end of each log file's name. If not + specified, the default value is "". To specify no suffix, + use a zero-length string.

+
+ + +

Deafult true. Flag to determine if log rotation should occur. + If set to false, then this file is never rotated and + fileDateFormat is ignored. Use with caution! +

+
+ + +

Turns on conditional logging. If set, requests will be + logged only if ServletRequest.getAttribute() is + null. For example, if this value is set to + junk, then a particular request will only be logged + if ServletRequest.getAttribute("junk") == null. + The use of Filters is an easy way to set/unset the attribute + in the ServletRequest on many different requests. +

+
+ + +

Allows a customized date format in the access log file name. + The date format also decides how often the file is rotated. + If you wish to rotate every hour, then set this value + to: yyyy-MM-dd.HH +

+
+ +
+ +

Values for the pattern attribute are made up of literal + text strings, combined with pattern identifiers prefixed by the "%" + character to cause replacement by the corresponding variable value from + the current request and response. The following pattern codes are + supported:

+
    +
  • %a - Remote IP address
  • +
  • %A - Local IP address
  • +
  • %b - Bytes sent, excluding HTTP headers, or '-' if zero
  • +
  • %B - Bytes sent, excluding HTTP headers
  • +
  • %h - Remote host name (or IP address if + resolveHosts is false)
  • +
  • %H - Request protocol
  • +
  • %l - Remote logical username from identd (always returns + '-')
  • +
  • %m - Request method (GET, POST, etc.)
  • +
  • %p - Local port on which this request was received
  • +
  • %q - Query string (prepended with a '?' if it exists)
  • +
  • %r - First line of the request (method and request URI)
  • +
  • %s - HTTP status code of the response
  • +
  • %S - User session ID
  • +
  • %t - Date and time, in Common Log Format
  • +
  • %u - Remote user that was authenticated (if any), else '-'
  • +
  • %U - Requested URL path
  • +
  • %v - Local server name
  • +
  • %D - Time taken to process the request, in millis
  • +
  • %T - Time taken to process the request, in seconds
  • +
+ +

+ There is also support to write information from the cookie, incoming + header, the Session or something else in the ServletRequest. + It is modeled after the apache syntax: +

    +
  • %{xxx}i for incoming headers
  • +
  • %{xxx}c for a specific cookie
  • +
  • %{xxx}r xxx is an attribute in the ServletRequest
  • +
  • %{xxx}s xxx is an attribute in the HttpSession
  • +
+

+ + +

The shorthand pattern name common (which is also the + default) corresponds to %h %l %u %t "%r" %s %b".

+ +

The shorthand pattern name combined appends the + values of the Referer and User-Agent headers, + each in double quotes, to the common pattern + described in the previous paragraph.

+ +
+ +
+ + +
+ + + +

The Remote Address Filter allows you to compare the + IP address of the client that submitted this request against one or more + regular expressions, and either allow the request to continue + or refuse to process the request from this client. A Remote Address + Filter can be associated with any Catalina container + (Engine, Host, or + Context), and must accept any request + presented to this container for processing before it will be passed on.

+ +

The syntax for regular expressions is different than that for + 'standard' wildcard matching. Tomcat uses the + Jakarta Regexp library. + Please consult the Regexp documentation for details of the expressions + supported.

+ +
+ + + +

The Remote Address Filter supports the following + configuration attributes:

+ + + + +

Java class name of the implementation to use. This MUST be set to + org.apache.catalina.valves.RemoteAddrValve.

+
+ + +

A comma-separated list of regular expression patterns + that the remote client's IP address is compared to. If this attribute + is specified, the remote address MUST match for this request to be + accepted. If this attribute is not specified, all requests will be + accepted UNLESS the remote address matches a deny + pattern.

+
+ + +

A comma-separated list of regular expression patterns + that the remote client's IP address is compared to. If this attribute + is specified, the remote address MUST NOT match for this request to be + accepted. If this attribute is not specified, request acceptance is + governed solely by the accept attribute.

+
+ +
+ +
+ +
+ + +
+ + + +

The Remote Host Filter allows you to compare the + hostname of the client that submitted this request against one or more + regular expressions, and either allow the request to continue + or refuse to process the request from this client. A Remote Host + Filter can be associated with any Catalina container + (Engine, Host, or + Context), and must accept any request + presented to this container for processing before it will be passed on.

+ +

The syntax for regular expressions is different than that for + 'standard' wildcard matching. Tomcat uses the + Jakarta Regexp library. + Please consult the Regexp documentation for details of the expressions + supported.

+ +
+ + + +

The Remote Host Filter supports the following + configuration attributes:

+ + + + +

Java class name of the implementation to use. This MUST be set to + org.apache.catalina.valves.RemoteHostValve.

+
+ + +

A comma-separated list of regular expression patterns + that the remote client's hostname is compared to. If this attribute + is specified, the remote hostname MUST match for this request to be + accepted. If this attribute is not specified, all requests will be + accepted UNLESS the remote hostname matches a deny + pattern.

+
+ + +

A comma-separated list of regular expression patterns + that the remote client's hostname is compared to. If this attribute + is specified, the remote hostname MUST NOT match for this request to be + accepted. If this attribute is not specified, request acceptance is + governed solely by the accept attribute.

+
+ +
+ +
+ +
+ + +
+ + + + +

The Request Dumper Valve is a useful tool in debugging + interactions with a client application (or browser) that is sending + HTTP requests to your Tomcat-based server. When configured, it causes + details about each request processed by its associated Engine, + Host, or Context to be logged according to + the logging configuration for that container.

+ +

WARNING: Using this valve has side-effects. The + output from this valve includes any parameters included with the request. + The parameters will be decoded using the default platform encoding. Any + subsequent calls to request.setCharacterEncoding() within + the web application will have no effect.

+ +
+ + + + +

The Request Dumper Valve supports the following + configuration attributes:

+ + + + +

Java class name of the implementation to use. This MUST be set to + org.apache.catalina.valves.RequestDumperValve.

+
+ +
+ +
+ + +
+ + +
+ + + +

The Single Sign On Vale is utilized when you wish to give users + the ability to sign on to any one of the web applications associated with + your virtual host, and then have their identity recognized by all other + web applications on the same virtual host.

+ +

See the Single Sign On special + feature on the Host element for more information.

+ +
+ + + + +

The Single Sign On Valve supports the following + configuration attributes:

+ + + + +

Java class name of the implementation to use. This MUST be set to + org.apache.catalina.authenticator.SingleSignOn.

+
+ + +

Default false. Flag to determine whether each request needs to be + reauthenticated to the security Realm. If "true", this + Valve uses cached security credentials (username and password) to + reauthenticate to the Realm each request associated + with an SSO session. If "false", the Valve can itself authenticate + requests based on the presence of a valid SSO cookie, without + rechecking with the Realm.

+
+ + +
+ +
+ + +
+ + +
+ + + +

The Form Authenticator Valve is automatically added to + any Context that is configured to use FORM + authentication.

+ +

If any non-default settings are required, the valve may be configured + within Context element with the required + values.

+ +
+ + + +

The Form Authenticator Valve supports the following + configuration attributes:

+ + + + +

Java class name of the implementation to use. This MUST be set to + org.apache.catalina.authenticator.FormAuthenticator.

+
+ + +

Character encoding to use to read the username and password parameters + from the request. If not set, the encoding of the request body will be + used.

+
+ +
+ +
+ +
+ + + + + +
diff --git a/webapps/docs/connectors.xml b/webapps/docs/connectors.xml new file mode 100644 index 000000000..e27101bd7 --- /dev/null +++ b/webapps/docs/connectors.xml @@ -0,0 +1,61 @@ + + +]> + + + &project; + + + Remy Maucherat + Connectors How To + + + + +
+ +

Choosing a connector to use with Tomcat can be difficult. This page will +list the connectors which are supported with this Tomcat release, and will +hopefully help you make the right choice according to your needs.

+ +
+ +
+ +

The HTTP connector is setup by default with Tomcat, and is ready to use. This +connector features the lowest latency and best overall performance.

+ +

For clustering, a HTTP load balancer with support for web sessions stickiness +must be installed to direct the traffic to the Tomcat servers. Tomcat supports mod_proxy +(on Apache HTTP Server 2.x, and included by default in Apache HTTP Server 2.2) as the load balancer. +It should be noted that the performance of HTTP proxying is usually lower than the +performance of AJP, so AJP clustering is often preferable.

+ +
+ +
+ +

When using a single server, the performance when using a native webserver in +front of the Tomcat instance is most of the time significantly worse than a +standalone Tomcat with its default HTTP connector, even if a large part of the web +application is made of static files. If integration with the native webserver is +needed for any reason, an AJP connector will provide faster performance than +proxied HTTP. AJP clustering is the most efficient from the Tomcat perspective. +It is otherwise functionally equivalent to HTTP clustering.

+ +

The native connectors supported with this Tomcat release are: +

    +
  • JK 1.2.x with any of the supported servers
  • +
  • mod_proxy on Apache HTTP Server 2.x (included by default in Apache HTTP Server 2.2), +with AJP enabled
  • +
+

+ +

Other native connectors supporting AJP may work, but are no longer supported.

+ +
+ + + +
diff --git a/webapps/docs/default-servlet.xml b/webapps/docs/default-servlet.xml new file mode 100644 index 000000000..84fbd24bd --- /dev/null +++ b/webapps/docs/default-servlet.xml @@ -0,0 +1,298 @@ + + +]> + + + &project; + + + Tim Funk + Default Servlet Reference + + + + +
+ +This discusses different ways to manipulate the default servlet. Topics are + + +
+ +
+ +The default servlet is the servlet which serves static resources as well +as serves the directory listings (if directory listings are enabled). + +
+ +
+ +It is declared globally in $CATALINA_HOME/conf/web.xml. +By default here is it's declaration: + + <servlet> + <servlet-name>default</servlet-name> + <servlet-class> + org.apache.catalina.servlets.DefaultServlet + </servlet-class> + <init-param> + <param-name>debug</param-name> + <param-value>0</param-value> + </init-param> + <init-param> + <param-name>listings</param-name> + <param-value>true</param-value> + </init-param> + <load-on-startup>1</load-on-startup> + </servlet> + +... + + <servlet-mapping> + <servlet-name>default</servlet-name> + <url-pattern>/</url-pattern> + </servlet-mapping> + + + +So by default, the default servlet is loaded at webapp startup and +directory listings are enabled and debugging is turned off. +
+ +
+ +The DefaultServlet allows the following initParamters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
debug + Debugging level. It is not very useful unless you are a tomcat + developer. As + of this writing, useful values are 0, 1, 11, 1000. +
listings + If no welcome file is present, can a directory listing be + shown? + value may be true or false +
+ Welcome files are part of the servlet api. +
+ WARNING: Listings of directories containing many entries are + expensive. Multiple requests for large directory listings can consume + significant proportions of server resources. +
readmeFile + If a directory listing is presented, a readme file may also + be presented with the listing. This file is inserted as is + so it may contain HTML. default value is null +
globalXsltFile + If you wish to customize your directory listing, you + can use an XSL transformation. This value is an absolute + file name which be used for all direcotory listings. + This can be disabled by per webapp by also declaring the + default servlet in your local webapp's web.xml. The format + of the xml is shown below. +
localXsltFile + You may also customize your directory listing by directory by + configuring localXsltFile. This should be a relative + file name in the directory where the listing will take place. + This overrides globalXsltFile. If this value + is present but a file does not exist, then + globalXsltFile will be used. If + globalXsltFile does not exist, then the default + directory listing will be shown. +
input + Input buffer size (in bytes) when reading + resources to be served. [2048] +
output + Output buffer size (in bytes) when writing + resources to be served. [2048] +
readonly + Is this context "read only", so HTTP commands like PUT and + DELETE are rejected? [true] +
fileEncoding + File encoding to be used when reading static resources. + [platform default] +
sendfileSize + If the connector used supports sendfile, this represents the minimal + file size in KB for which sendfile will be used. Use a negative value + to always disable sendfile. [48] +
+
+ +
+ +

You can override DefaultServlet with you own implementation and use that +in your web.xml declaration. If you +can undertand what was just said, we will assume yo can read the code +to DefaultServlet servlet and make the appropriate adjustments. (If not, +then that method isn't for you) +

+

+You can use either localXsltFile or +globalXsltFile and DefaultServlet will create +an xml document and run it through an xsl transformation based +on the values provided in localXsltFile and +globalXsltFile. localXsltFile is first +checked, followed by globalXsltFile, then default +behaviors takes place. +

+ +

+Format: + + <listing> + <entries> + <entry type='file|dir' urlPath='aPath' size='###' date='gmt date'> + fileName1 + </entry> + <entry type='file|dir' urlPath='aPath' size='###' date='gmt date'> + fileName2 + </entry> + ... + </entries> + <readme></readme> + </listing> + +

    +
  • size will be missing if type='dir'
  • +
  • Readme is a CDATA entry
  • +
+

+The following is a sample xsl file which mimics the default tomcat behavior: + +<?xml version="1.0"?> + +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + version="1.0"> + + <xsl:output method="xhtml" encoding="iso-8859-1" indent="no"/> + + <xsl:template match="listing"> + <html> + <head> + <title> + Sample Directory Listing For + <xsl:value-of select="@directory"/> + </title> + <style> + h1{color : white;background-color : #0086b2;} + h3{color : white;background-color : #0086b2;} + body{font-family : sans-serif,Arial,Tahoma; + color : black;background-color : white;} + b{color : white;background-color : #0086b2;} + a{color : black;} HR{color : #0086b2;} + </style> + </head> + <body> + <h1>Sample Directory Listing For + <xsl:value-of select="@directory"/> + </h1> + <hr size="1" /> + <table cellspacing="0" + width="100%" + cellpadding="5" + align="center"> + <tr> + <th align="left">Filename</th> + <th align="center">Size</th> + <th align="right">Last Modified</th> + </tr> + <xsl:apply-templates select="entries"/> + </table> + <xsl:apply-templates select="readme"/> + <hr size="1" /> + <h3>Apache Tomcat/5.0</h3> + </body> + </html> + </xsl:template> + + + <xsl:template match="entries"> + <xsl:apply-templates select="entry"/> + </xsl:template> + + <xsl:template match="readme"> + <hr size="1" /> + <pre><xsl:apply-templates/></pre> + </xsl:template> + + <xsl:template match="entry"> + <tr> + <td align="left"> + <xsl:variable name="urlPath" select="@urlPath"/> + <a href="{$urlPath}"> + <tt><xsl:apply-templates/></tt> + </a> + </td> + <td align="right"> + <tt><xsl:value-of select="@size"/></tt> + </td> + <td align="right"> + <tt><xsl:value-of select="@date"/></tt> + </td> + </tr> + </xsl:template> + +</xsl:stylesheet> + + +
+ +
+ +Use web.xml in each individual webapp. See the security section of the +Servlet specification. + +
+ + + +
diff --git a/webapps/docs/deployer-howto.xml b/webapps/docs/deployer-howto.xml new file mode 100644 index 000000000..7933338e8 --- /dev/null +++ b/webapps/docs/deployer-howto.xml @@ -0,0 +1,330 @@ + + +]> + + + &project; + + + Allistair Crossley + Tomcat Web Application Deployment + + + + +
+ + +
+ +
+

+ Deployment is the term used for the process of installing a web + application (either a 3rd party WAR or your own custom web application) + into the Tomcat server. +

+

+ Web application deployment may be accomplished in a number of ways + within the Tomcat server. +

    +
  • Statically; the web application is setup before Tomcat is started
  • +
  • + Dynamically; in conjunction with the Tomcat Manager web application or + manipulating already deployed web applications +
  • +
+

+

+ The Tomcat Manager is a tool that allows URL-based web application + deployment features. There is also a tool called the Client Deployer, + which is a command shell based script that interacts with the Tomcat + Manager but provides additional functionality such as compiling and + validating web applications as well as packaging web application into + web application resource (WAR) files. +

+
+ +
+

+ There is no installation required for static deployment of web + applications as this is provided out of the box by Tomcat. Nor is any + installation required for deployment functions with the Tomcat Manager, + although some configuration is required as detailed in the + Tomcat Manager manual. An installation is however required if you wish + to use the Tomcat Client Deployer (TCD). +

+

+ The TCD is not packaged with the Tomcat core + distribution, and must therefore be downloaded separately from + the Downloads area. The download is usually labelled + jakarta-tomcat-5.5.x-deployer. +

+

+ TCD has prerequisites of Apache Ant 1.6.2+ and a Java installation. + Your environment should define an ANT_HOME environment value pointing to + the root of your Ant installation, and a JAVA_HOME value pointing to + your Java installation. Additionally, you should ensure Ant's ant + command, and the Java javac compiler command run from the command shell + that your operating system provides. +

+
    +
  1. Download the TCD distribution
  2. +
  3. + The TCD package need not be extracted into any existing Tomcat + installation, it can be extracted to any location. +
  4. +
  5. Read Using the + Tomcat Client Deployer
  6. +
+
+ +
+

+ In talking about deployment of web applications, the concept of a + Context is required to be understood. A Context is what Tomcat + calls a web application. +

+

+ In order to configure a Context within Tomcat a Context Descriptor + is required. A Context Descriptor is simply an XML file that contains + Tomcat related configuration for a Context, e.g naming resources or + session manager configuration. In earlier versions of + Tomcat the content of a Context Descriptor configuration was often stored within + Tomcat's primary configuration file server.xml but this is now + discouraged (although it currently still works). +

+

+ Context Descriptors not only help Tomcat to know how to configure + Contexts but other tools such as the Tomcat Manager and TDC often use + these Context Descriptors to perform their roles properly. +

+

+ The locations for Context Descriptors are; +

    +
  1. $CATALINA_HOME/conf/[enginename]/[hostname]/context.xml
  2. +
  3. $CATALINA_HOME/webapps/[webappname]/META-INF/context.xml
  4. +
+ If a Context Descriptor is not provided for a Context, Tomcat + automatically creates one and places it in (1) with a filename of + [webappname].xml although if manually created, the filename need not + match the web application name as Tomcat is concerned only with the + Context configuration contained within the Context Descriptor file(s). +

+
+ +
+

+ If you are not interested in using the Tomcat Manager, or TCD, + then you'll need to deploy your web applications + statically to Tomcat, followed by a Tomcat startup. The location you + deploy web applications to for this type of deployment is called the + appBase which is specified per Host. You either copy a + so-called exploded web application, i.e non-compressed, to this + location, or a compressed web application resource .WAR file. +

+

+ The web applications present in the location specified by the Host's + (default Host is "localhost") appBase attribute (default + appBase is "$CATALINA_HOME/webapps") will be deployed on Tomcat startup + only if the Host's deployOnStartup attribute is "true". +

+

+ The following deployment sequence will occur on Tomcat startup in that + case: +

+
    +
  1. Any Context Descriptors will be deployed first.
  2. +
  3. + Exploded web applications not referenced by any Context + Descriptor will then be deployed. If they have an associated + .WAR file in the appBase and it is newer than the exploded web application, + the exploded directory will be removed and the webapp will be + redeployed from the .WAR +
  4. +
  5. .WAR files will be deployed
  6. +
+

+ Note again that for each deployed web application, a + Context Descriptor will be created unless one exists already. +

+
+ +
+

+ It is possible to deploy web applications to a running Tomcat server. +

+

+ If the Host autoDeploy attribute is "true", the Host will + attempt to deploy and update web applications dynamically, as needed, + for example if a new .WAR is dropped into the appBase. + For this to work, the Host needs to have background processing + enabled which is the default configuration. +

+ +

+ autoDeploy set to "true" and a running Tomcat allows for: +

+
    +
  • Deployment of .WAR files copied into the Host appBase.
  • +
  • + Deployment of exploded web applications which are + copied into the Host appBase. +
  • +
  • + Re-deployment of a web application which has already been deployed from + a .WAR when the new .WAR is provided. In this case the exploded + web application is removed, and the .WAR is expanded again. + Note that the explosion will not occur if the Host is configured + so that .WARs are not exploded with a unpackWARs + attribute set to "false", in which case the web application + will be simply redeployed as a compressed archive. +
  • +
  • + Re-deployment of a web application if the /WEB-INF/web.xml file (or any + other resource defined as a WatchedResource) is updated. +
  • +
  • + Re-deployment of a web application if the Context Descriptor file from which + the web application has been deployed is updated. +
  • +
  • + Re-deployment of a web application if a Context Descriptor file (with a + filename corresponding to the Context path of the previously deployed + web application) is added to the + $CATALINA_HOME/conf/[enginename]/[hostname]/ + directory. +
  • +
  • + Undeployment of a web application if its document base (docBase) + is deleted. Note that on Windows, this assumes that anti-locking + features (see Context configuration) are enabled, otherwise it is not + possible to delete the resources of a running web application. +
  • +
+

+ Note that web application reloading can also be configured in the loader, in which + case loaded classes will be tracked for changes. +

+
+ +
+

+ The Tomcat Manager is covered in its own manual page. +

+
+ +
+

+ Finally, deployment of web application may be achieved using the + Tomcat Client Deployer. This is a package which can be used to + validate, compile, compress to .WAR, and deploy web applications to + production or development Tomcat servers. It should be noted that this feature + uses the Tomcat Manager and as such the target Tomcat server should be + running. +

+ +

+ It is assumed the user will be familar with Apache Ant for using the TCD. + Apache Ant is a scripted build tool. The TCD comes pre-packaged with a + build script to use. Only a modest understanding of Apache Ant is + required (installation as listed earlier in this page, and familiarity + with using the operating system command shell and configuring + environment variables). +

+ +

+ The TCD includes Ant tasks, the Jasper page compiler for JSP compilation + before deployment, as well as a task which + validates the web application Context Descriptor. The validator task (class + org.apache.catalina.ant.ValidatorTask) allows only one parameter: + the base path of an exploded web application. +

+ +

+ The TCD uses an exploded web application as input (see the list of the + properties used below). A web application that is programatically + deployed with the deployer may include a Context Desciptor in + /META-INF/context.xml. +

+ +

+ The TCD includes a ready-to-use Ant script, with the following targets: +

+
    +
  • + compile (default): Compile and validate the web + application. This can be used standalone, and does not need a running + Tomcat server. The compiled application will only run on the associated + Tomcat 5.5.x server release, and is not guaranteed to work on another + Tomcat release, as the code generated by Jasper depends on its runtime + component. It should also be noted that this target will also compile + automatically any Java source file located in the + /WEB-INF/classes folder of the web application.
  • +
  • + deploy: Deploy a web application (compiled or not) to + a Tomcat server. +
  • +
  • undeploy: Undeploy a web application
  • +
  • start: Start web application
  • +
  • reload: Reload web application
  • +
  • stop: Stop web application
  • +
+ +

+ In order for the deployment to be configured, create a file + called deployer.properties in the TCD installation + directory root. In this file, add the following name=value pairs per + line: +

+ +

+ Additionally, you will need to ensure that a user has been + setup for the target Tomcat Manager (which TCD uses) otherwise the TCD + will not authenticate with the Tomcat Manager and the deployment will + fail. To do this, see the Tomcat Manager page. +

+ +
    +
  • + build: The build folder used will be, by default, + ${build}/webapp/${path}. After the end of the execution + of the compile target, the web application .WAR will be + located at ${build}/webapp/${path}.war. +
  • +
  • + webapp: The directory containing the exploded web application + which will be compiled and validated. By default, the folder is + myapp. +
  • +
  • + path: Deployed context path of the web application, + by default /myapp. +
  • +
  • + url: Absolute URL to the Tomcat Manager web application of a + running Tomcat server, which will be used to deploy and undeploy the + web application. By default, the deployer will attempt to access + a Tomcat instance running on localhost, at + http://localhost:8080/manager. +
  • +
  • + username: Tomcat Manager username (user should have a role of + manager) +
  • +
  • password: Tomcat Manager password.
  • +
+
+ + + +
diff --git a/webapps/docs/developers.xml b/webapps/docs/developers.xml new file mode 100644 index 000000000..290b79c54 --- /dev/null +++ b/webapps/docs/developers.xml @@ -0,0 +1,58 @@ + + +]> + + + &project; + + + Remy Maucherat + Yoav Shapira + Tomcat Developers + + + + +
+ +

+ The list indicates the developers' main areas of interest. Feel free to + add to the list :) The developers email addresses are + [login]@apache.org. Please do not contact + developers directly for any support issues (please post to the + tomcat-users mailing list instead, or one of the other support + resources; some organizations and individual consultants also offer + for pay Tomcat support, as listed on the + vendors page + on the Jakarta website). +

+ +
    +
  • Amy Roh (amyroh): Catalina, Admin webapp
  • +
  • Bill Barker (billbarker): Connectors
  • +
  • Costin Manolache (costin): Catalina, Connectors
  • +
  • Filip Hanik (fhanik): Clustering
  • +
  • Glenn Nielsen (glenn): Catalina, Connectors
  • +
  • Henri Gomez (hgomez): Connectors
  • +
  • Jan Luehe (luehe): Jasper
  • +
  • Jean-Francois Arcand (jfarcand): Catalina
  • +
  • Jean-Frederic Clere (jfclere): Connectors
  • +
  • Kin-Man Chung (kinman): Jasper
  • +
  • Mladen Turk (mturk): Connectors
  • +
  • Peter Rossbach (pero): Catalina, Clustering, JMX
  • +
  • Remy Maucherat (remm): Catalina, Connectors, Docs
  • +
  • Tim Funk (funkman): Catalina, Docs
  • +
  • Yoav Shapira (yoavs): Docs, JMX, Catalina, balancer, Release Manager
  • +
+ +
+ +
+ + + +
+ + +
diff --git a/webapps/docs/funcspecs/fs-admin-apps.xml b/webapps/docs/funcspecs/fs-admin-apps.xml new file mode 100644 index 000000000..8080f7375 --- /dev/null +++ b/webapps/docs/funcspecs/fs-admin-apps.xml @@ -0,0 +1,278 @@ + + +]> + + + &project; + + + Craig McClanahan + Administrative Apps - Overall Requirements + $Id: fs-admin-apps.xml 301989 2003-06-25 01:38:16Z yoavs $ + + + + + +
+ + + + +

The purpose of this specification is to define high level requirements + for administrative applications that can be used to manage the operation + of a running Tomcat 5 container. A variety of Access Methods + to the supported administrative functionality shall be supported, to + meet varying requirements:

+
    +
  • As A Scriptable Web Application - The existing + Manager web application provides a simple HTTP-based + interface for managing Tomcat through commands that are expressed + entirely through a request URI. This is useful in environments + where you wish to script administrative commands with tools that + can generate HTTP transactions.
  • +
  • As An HTML-Based Web Application - Use an HTML presentation + to provide a GUI-like user interface for humans to interact with the + administrative capabilities.
  • +
  • As SOAP-Based Web Services - The operational commands to + administer Tomcat are made available as web services that utilize + SOAP message formats.
  • +
  • As Java Management Extensions (JMX) Commands - The operational + commands to administer Tomcat are made available through JMX APIs, + for integration into management consoles that utilize them.
  • +
  • Other Remote Access APIs - Other remote access APIs, such + as JINI, RMI, and CORBA can also be utilized to access administrative + capabilities.
  • +
+ +

Underlying all of the access methods described above, it is assumed + that the actual operations are performed either directly on the + corresponding Catalina components (such as calling the + Deployer.deploy() method to deploy a new web application), + or through a "business logic" layer that can be shared across all of the + access methods. This approach minimizes the cost of adding new + administrative capabilities later -- it is only necessary to add the + corresponding business logic function, and then write adapters to it for + all desired access methods.

+ +

The current status of this functional specification is + PROPOSED. It has not yet been discussed and + agreed to on the TOMCAT-DEV mailing list.

+ +
+ + + + +

The implementation of this functionality depends on the following + external specifications:

+ + +
+ + + + +

The implementation of this functionality shall conform to the + following requirements:

+
    +
  • To the maximum extent feasible, all administrative functions, + and the access methods that support them, shall run portably + on all platforms where Tomcat 5 itself runs.
  • +
  • In a default Tomcat distribution, all administrative capabilities + shall be disabled. It shall be necessary for a system + administrator to specifically enable the desired access methods + (such as by adding a username/password with a specific role to + the Tomcat user's database.
  • +
  • Administrative functions shall be realized as direct calls to + corresponding Catalina APIs, or through a business logic layer + that is independent of the access method used to initiate it.
  • +
  • The common business logic components shall be implemented in + package org.apache.catalina.admin.
  • +
  • The common business logic components shall be built as part of the + standard Catalina build process, and made visible in the + Catalina class loader.
  • +
  • The Java components required for each access method shall be + implemented in subpackages of org.apache.catalina.admin. +
  • +
  • The build scripts should treat each access method as optional, + so that it will be built only if the corresponding required + APIs are present at build time.
  • +
  • It shall be possible to save the configured state of the running + Tomcat container such that this state can be reproduced when the + container is shut down and restarted.
  • +
  • Adminstrative commands to start up and shut down the overall + Tomcat container are out of scope for the + purposes of these applications. It is assumed that other + (usually platform-specific) mechanisms will be used for container + startup and shutdown.
  • +
+ +
+ + +
+ + +
+ + + + +

The following environmental dependencies must be met in order for + administrative applications to operate correctly:

+
    +
  • For access methods that require creation of server sockets, the + appropriate ports must be configured and available.
  • +
+ +
+ + + + +

Correct operation of administrative applications depends on the + following specific features of the surrounding container:

+
    +
  • To the maximum extent feasible, Catalina components that offer + direct administrative APIs and property setters shall support + "live" changes to their operation, without requiring a container + restart.
  • +
+ +
+ + + + +

The availability of the following technologies can be assumed + for the implementation and operation of the various access methods + and the corresponding administrative business logic:

+ + +
+ + +
+ + +
+ + + + +

Functional requirements for administrative applications are specified + in terms of Administered Objects, whose definitions and detailed + properties are listed here. In general, + Administered Objects correspond to components in the Catalina architecture, + but these objects are defined separately here for the following reasons:

+
    +
  • It is possible that the administrative applications do not expose + every possible configurable facet of the underlying components.
  • +
  • In some cases, an Administered Object (from the perspective of an + administrative operation) is realized by more than one Catalina + component, at a finer-grained level of detail.
  • +
  • It is necessary to represent the configuration information for a + component separately from the component itself (for instance, in + order to store that configuration information for later use).
  • +
  • It is necessary to represent configuration information (such as + a Default Context) when there is no corresponding component instance. +
  • +
  • Administered Objects, when realized as Java classes, will include + methods for administrative operations that have no correspondence + to operations performed by the corresponding actual components.
  • +
+ +

It is assumed that the reader is familiar with the overall component + architecture of Catalina. For further information, see the corresponding + Developer Documentation. To distinguish names that are used as both + Administered Objects and Components, different + font presentations are utilized. Default values for many properties + are listed in [square brackets].

+ +
+ + + + +

The administrative operations that are available are described in terms + of the corresponding Administered Objects (as defined above), in a manner + that is independent of the access method by which these operations are + requested. In general, such operations are relevant only in the context + of a particular Administered Object (and will most likely be realized as + method calls on the corresponding Administered Object classes), so they + are organized based on the currently "focused" administered object. + The available Supported Operations are documented + here.

+ +
+ + + + +
Scriptable Web Application
+ +

An appropriate subset of the administrative operations described above + shall be implemented as commands that can be performed by the "Manager" + web application. FIXME - Enumerate them.

+ +

In addition, this web application shall conform to the following + requirements:

+
    +
  • All request URIs shall be protected by a security constraint that + requires security role manager for processing.
  • +
  • The default user database shall not contain any + user that has been assigned the role manager.
  • +
+ +
HTML-Based Web Application
+ +

The entire suite of administrative operations described above shall be + made available through a web application designed for human interaction. + In addition, this web application shall conform to the following + requirements:

+
    +
  • Must be implemented using servlet, JSP, and MVC framework technologies + described under "External Technologies", above.
  • +
  • Prompts and error messages must be internationalizable to multiple + languages.
  • +
  • Rendered HTML must be compatible with Netscape Navigator (verson 4.7 + or later) and Internet Explorer (version 5.0 or later).
  • +
+ +
+ + +
+ + +
+ +

FIXME - Complete this section.

+ +
+ + + + +
diff --git a/webapps/docs/funcspecs/fs-admin-objects.xml b/webapps/docs/funcspecs/fs-admin-objects.xml new file mode 100644 index 000000000..1545a70e3 --- /dev/null +++ b/webapps/docs/funcspecs/fs-admin-objects.xml @@ -0,0 +1,481 @@ + + +]> + + + &project; + + + Craig McClanahan + Administrative Apps - Administered Objects + $Id: fs-admin-objects.xml 303281 2004-09-27 16:00:31Z yoavs $ + + + + + +
+ +

This document defines the Administered Objects that represent +the internal architectural components of the Catalina servlet container. +Associated with each is a set of Supported +Operations that can be performed when the administrative application is +"focused" on a particular configurable object.

+ +

The following Administered Objects are defined:

+ + +
+ + +
+ +

An Access Logger is an optional Valve that can + create request access logs in the same formats as those provided by + web servers. Such access logs are useful input to hit count and user + access tracking analysis programs. An Access Logger can be attached to + an Engine, a Host, a Context, or a Default + Context.

+ +

The standard component implementing an Access Logger is + org.apache.catalina.valves.AccessLogValve. It supports the + following configurable properties:

+
    +
  • debug - Debugging detail level. [0]
  • +
  • directory - Absolute or relative (to $CATALINA_HOME) path + of the directory into which access log files are created. + [logs].
  • +
  • pattern - Pattern string defining the fields to be + included in the access log output, or "common" for the standard + access log pattern. See + org.apache.catalina.valves.AccessLogValve for more + information. [common]
  • +
  • prefix - Prefix added to the beginning of each log file + name created by this access logger.
  • +
  • resolveHosts - Should IP addresses be resolved to host + names in the log? [false]
  • +
  • suffix - Suffix added to the end of each log file name + created by this access logger.
  • +
+ +
+ + +
+ +

A Connector is the representation of a communications endpoint + by which requests are received from (and responses returned to) a Tomcat + client. The administrative applications shall support those connectors + that are commonly utilized in Tomcat installations, as described in detail + below.

+ +

For standalone use, the standard connector supporting the HTTP/1.1 + protocol is org.apache.catalina.connectors.http.HttpConnector. + It supports the following configurable properties:

+
    +
  • acceptCount - The maximum queue length of incoming + connections that have not yet been accepted. [10]
  • +
  • address - For servers with more than one IP address, the + address upon which this connector should listen. [All Addresses]
  • +
  • bufferSize - Default input buffer size (in bytes) for + requests created by this Connector. [2048]
  • +
  • debug - Debugging detail level. [0]
  • +
  • enableLookups - Should we perform DNS lookups on remote + IP addresses when request.getRemoteHost() is called? + [true]
  • +
  • maxProcessors - The maximum number of processor threads + supported by this connector. [20]
  • +
  • minProcessors - The minimum number of processor threads + to be created at container startup. [5]
  • +
  • port - TCP/IP port number on which this Connector should + listen for incoming requests. [8080]
  • +
  • proxyName - Host name to be returned when an application + calls request.getServerName(). [Value of Host: header]
  • +
  • proxyPort - Port number to be returned when an application + calls request.getServerPort(). [Same as port] +
  • +
+ +
+ + +
+ +

A Context is the representation of an individual web application, + which is associated with a corresponding Host. Note that the + administrable properties of a Context do not + include any settings from inside the web application deployment descriptor + for that application.

+ +

The standard component implementing a Context is + org.apache.catalina.core.StandardContext. It supports the + following configurable properties:

+
    +
  • cookies - Should be use cookies for session identifier + communication? [true]
  • +
  • crossContext - Should calls to + ServletContext.getServletContext() return the actual + context responsible for the specified path? [false]
  • +
  • debug - Debugging detail level. [0]
  • +
  • docBase - The absolute or relative (to the + appBase of our owning Host) pathname of a + directory containing an unpacked web application, or of a web + application archive (WAR) file.
  • +
  • override - Should settings in this Context + override corresponding settings in the Default Context? + [false]
  • +
  • path - Context path for this web application, or an empty + string for the root application of a Host. [Inferred from + directory or WAR file name]
  • +
  • reloadable - Should Tomcat monitor classes in the + /WEB-INF/classes directory for changes, and reload the + application if they occur? [false]
  • +
  • useNaming - Should Tomcat provide a JNDI naming context, + containing preconfigured entries and resources, corresponding to the + requirements of the Java2 Enterprise Edition specification? [true]
  • +
  • workDir - Absolute pathname of a scratch directory that is + provided to this web application. [Automatically assigned relative to + $CATALINA_HOME/work]
  • +
+ +

Each Context is owned by a parent Host, and is + associated with:

+
    +
  • An optional Access Logger that logs all requests processed + by this web application.
  • +
  • Zero or more Environment Entries representing environment + entries for the JNDI naming context associated with a web + application.
  • +
  • Zero or more JDBC Resources representing database connection + pools associated with a web application.
  • +
  • A Loader representing the web application class loader used + by this web application.
  • +
  • A Manager representing the session manager used by this + web application.
  • +
  • An optional Realm used to provide authentication and access + control information for this web application.
  • +
  • Zero or more Request Filters used to limit access to this + web application based on remote host name or IP address.
  • +
+ +
+ + +
+ +

A Default Context represents a subset of the configurable + properties of a Context, and is used to set defaults for those + properties when web applications are automatically deployed. A Default + Context object can be associated with an Engine or a + Host. The following configurable properties are supported:

+
    +
  • cookies - Should be use cookies for session identifier + communication? [true]
  • +
  • crossContext - Should calls to + ServletContext.getServletContext() return the actual + context responsible for the specified path? [false]
  • +
  • reloadable - Should Tomcat monitor classes in the + /WEB-INF/classes directory for changes, and reload the + application if they occur? [false]
  • +
  • useNaming - Should Tomcat provide a JNDI naming context, + containing preconfigured entries and resources, corresponding to the + requirements of the Java2 Enterprise Edition specification? [true]
  • +
+ +

Each Default Context is owned by a parent Engine or + Host, and is associated with:

+
    +
  • Zero or more Environment Entries representing environment + entries for the JNDI naming context associated with a web + application.
  • +
  • Zero or more JDBC Resources representing database connection + pools associated with a web application.
  • +
  • An optional Loader representing default configuration + properties for the Loader component of deployed web applications.
  • +
  • An optional Manager representing default configuration + properties for the Manager component fo deployed web applications.
  • +
+ +
+ + +
+ +

Default web application characteristics are configured in a special + deployment descriptor named $CATALINA_HOME/conf/web.xml. This + section describes the configurable components that may be stored there.

+ +

FIXME - Complete the description of default servlets, + default mappings, default MIME types, and so on.

+ +
+ + +
+ +

An Engine is the representation of the entire Catalina + servlet container, and processes all requests for all of the associated + virtual hosts and web applications.

+ +

The standard component implementing an Engine is + org.apache.catalina.core.StandardEngine. It supports the + following configurable properties:

+
    +
  • debug - Debugging detail level. [0]
  • +
  • defaultHost - Name of the Host to which requests + will be directed if the requested host is unknown. [localhost]
  • +
  • name - Logical name of this engine. [Tomcat Stand-Alone] +
  • +
+ +

Each Engine is owned by a parent Service, and is + associated with:

+
    +
  • An optional Access Logger that logs all requests processed + by the entire container.
  • +
  • A Default Context, representing default properties of a + Context for automatically deployed applications for all + associated Hosts (unless overridden by a subordinate + component).
  • +
  • One or more Hosts representing individual virtual hosts + supported by this container.
  • +
  • A Realm used to provide authentication and access control + information for all virtual hosts and web applications (unless + overridden by a subordinate component).
  • +
  • Zero or more Request Filters used to limit access to the + entire container based on remote host name or IP address.
  • +
+ +
+ + +
+ +

An Environment Entry is the representation of a + <env-entry> element from a web application deployment + descriptor. It will cause the creation of a corresponding entry in the + JNDI naming context provided to the corresponding Context. The + following configurable properties are supported:

+
    +
  • description - Description of this environment entry.
  • +
  • name - Environment entry name (relative to the + java:comp/env context)
  • +
  • type - Environment entry type (must be one of the fully + qualified Java classes listed in the servlet spec).
  • +
  • value - Environment entry value (must be convertible from + String to the specified type.
  • +
+ +
+ + +
+ +

A Host is the representation of an individual virtual host, + which has a unique set of associated web applications.

+ +

The standard component implementing a Host is + org.apache.catalina.core.StandardHost. It supports the + following configurable properties:

+
    +
  • aliases - Zero or more DNS names that are also associated + with this host (for example, a particular host might be named + www.mycompany.com with an alias company.com). +
  • +
  • appBase - Absolute or relative (to $CATALINA_HOME) path + to a directory from which web applications will be automatically + deployed.
  • +
  • debug - Debugging detail level. [0]
  • +
  • name - DNS Name of the virtual host represented by this + object.
  • +
  • unpackWARs - Should web application archive files + deployed by this virtual host be unpacked first? [true]
  • +
+ +

Each Host is owned by a parent Engine, and is + associated with:

+
    +
  • An optional Access Logger that logs all requests processed + by this virtual host.
  • +
  • One or more Contexts representing the web applications + operating on this Host.
  • +
  • A Default Context representing default Context + properties for web applications that are automatically deployed + by this Host.
  • +
  • A optional Realm used to provide authentication and access + control information for all web applications associated with this + virtual host (unless overridden by a subordinate component).
  • +
+ +

FIXME - Should we support configuration of the + User Web Applications functionality?

+ +
+ + +
+ +

A JDBC Resources represents a database connection pool (i.e. + an implementation of javax.sql.DataSource that will be + configured and made available in the JNDI naming context associated with + a web application.

+ +

FIXME - properties of this administered object

+ +
+ + +
+ +

A Loader represents a web application class loader that will + be utilized to provide class loading services for a particular + Context.

+ +

The standard component implementing a Loader is + org.apache.catalina.loader.StandardLoader. It supports + the following configurable properties:

+
    +
  • checkInterval - Number of seconds between checks for + modified classes, if automatic reloading is enabled. [15]
  • +
  • debug - Debugging detail level. [0]
  • +
  • reloadable - Should this class loader check for modified + classes and initiate automatic reloads? [Set automatically from the + reloadable property of the corresponding Context] +
  • +
+ +

Each Loader is owned by a parent Context.

+ +
+ + +
+ +

A Manager represents a session manager that will be associated + with a particular web application. FIXME - Add support + for advanced session managers and their associated Stores.

+ +

The standard component implementing a Manager is + org.apache.catalina.session.StandardManager. It supports + the following configurable properties:

+
    +
  • checkInterval - Number of seconds between checks for + expired sessions. [60]
  • +
  • debug - Debugging detail level. [0]
  • +
  • entropy - String initialization parameter used to increase + the entropy (initial randomness) of the random number generator used to + create session identifiers. [Inferred from engine, host, and context] +
  • +
  • maxActiveSessions - The maximum number of active sessions + that are allowed, or -1 for no limit. [-1]
  • +
+ +

Each Manager is owned by a parent Context.

+ +
+ + +
+ +

A Realm represents a "database" of information about authorized + users, their passwords, and the security roles assigned to them. This will + be used by the container in the implementation of container-managed security + in accordance with the Servlet Specification. Several alternative + implementations are supported.

+ +

org.apache.catalina.realm.MemoryRealm initializes its user + information from a simple XML file at startup time. If changes are made + to the information in this file, the corresponding web applications using + it must be restarted for the changes to take effect. It supports the + following configurable properties:

+
    +
  • debug - Debugging detail level. [0]
  • +
  • pathname - Absolute or relative (to $CATALINA_HOME) path to + the XML file containing our user information. [conf/tomcat-users.xml] +
  • +
+ +

org.apache.catalina.realm.JDBCRealm uses a relational + database (accessed via JDBC APIs) to contain the user information. Changes + in the contents of this database take effect immediately; however, the roles + assigned to a particular user are calculated only when the user initially + logs on (and not per request). The following configurable properties + are supported:

+
    +
  • connectionName - Database username to use when establishing + a JDBC connection.
  • +
  • connectionPassword - Database password to use when + establishing a JDBC connection.
  • +
  • connectionURL - Connection URL to use when establishing + a JDBC connection.
  • +
  • debug - Debugging detail level. [0]
  • +
  • digest - Name of the MessageDigest algorithm + used to encode passwords in the database, or a zero-length string for + no encoding. [Zero-length String]
  • +
  • driverName - Fully qualified Java class name of the JDBC + driver to be utilized.
  • +
  • roleNameCol - Name of the column, in the User Roles table, + which contains the role name.
  • +
  • userCredCol - Name of the column, in the Users table, + which contains the password (encrypted or unencrypted).
  • +
  • userNameCol - Name of the column, in both the Users and + User Roles tables, that contains the username.
  • +
  • userRoleTable - Name of the User Roles table, which contains + one row per security role assigned to a particular user. This table must + contain the columns specified by the userNameCol and + roleNameCol properties.
  • +
  • userTable - Name of the Users table, which contains one row + per authorized user. This table must contain the columns specified by + the userNameCol and userCredCol properties. +
  • +
+ +

FIXME - Should we provide mechanisms to edit the contents + of a "tomcat-users.xml" file through the admin applications?

+ +

Each Realm is owned by a parent Engine, Host, + or Context.

+ +
+ + +
+ +

FIXME - complete this entry

+ +
+ + +
+ +

FIXME - complete this entry

+ +
+ + +
+ +

FIXME - complete this entry

+ +
+ + + +
diff --git a/webapps/docs/funcspecs/fs-admin-opers.xml b/webapps/docs/funcspecs/fs-admin-opers.xml new file mode 100644 index 000000000..60852ba8e --- /dev/null +++ b/webapps/docs/funcspecs/fs-admin-opers.xml @@ -0,0 +1,324 @@ + + +]> + + + &project; + + + Craig McClanahan + Administrative Apps - Supported Operations + $Id: fs-admin-opers.xml 303281 2004-09-27 16:00:31Z yoavs $ + + + + + +
+ +

This document defines the Supported Operations that may +be performed against the Administered +Objects that are supported by Tomcat 5 administrative applications. +Not all operations are required to be available through every administrative +application that is implemented. However, if a given operation is available, +it should operate consistently with the descriptions found here.

+ +

Supported Operations are described for the following Administered +Objects:

+ + +
+ + +
+ +

From the perspective of a particular Access Logger, it shall + be possible to perform the following administrative operations:

+
    +
  • Navigate to the owning Engine, Host, or + Context.
  • +
  • Edit the configurable properties of this object.
  • +
+ +
+ + +
+ +

From the perspective of a particular Connector, it shall be + possible to perform the following administrative operations:

+
    +
  • Navigate to the owning Service.
  • +
  • Edit the configurable properties of this object.
  • +
+ +
+ + +
+ +

From the perspective of a particular Context, it shall be + possible to perform the following administrative operations:

+
    +
  • Navigate to the owning Host.
  • +
  • Edit the configurable properties of this object.
  • +
  • Create and configure a new Access Logger associated + with this object.
  • +
  • Edit the configurable properties of the associated Access + Logger.
  • +
  • Remove the associated Access Logger.
  • +
  • Create and configure a new Environment Entry associated + with this object.
  • +
  • Select and edit the configurable properties of an associated + Environment Entry.
  • +
  • Remove an associated Environment Entry.
  • +
  • Create and configure a new JDBC Resource associated + with this object.
  • +
  • Select and edit the configurable properties of an associated + JDBC Resource.
  • +
  • Remove an associated JDBC Resource.
  • +
  • Create and configure a new Loader associated with + this object.
  • +
  • Edit the configurable properties of the associated Loader.
  • +
  • Remove the associated Loader.
  • +
  • Create and configure a new Manager associated with + this object.
  • +
  • Edit the configurable properties of the associated Manager.
  • +
  • Remove the associated Manager.
  • +
  • Create and configure a new Realm associated with + this object.
  • +
  • Edit the configurable properties of the associated Realm.
  • +
  • Remove the associated Realm.
  • +
  • Create and configure a new Request Filter associated with + this object.
  • +
  • Select and edit the configurable properties of an + associated Request Filter
  • +
  • Remove an associated Request Filter.
  • +
+ +
+ + +
+ +

From the perspective of a particular Default Context, it shall + be possible to perform the following administrative operations:

+
    +
  • Navigate to the owning Engine or Host.
  • +
  • Edit the configurable properties of this object.
  • +
  • Create and configure a new Environment Entry associated + with this object.
  • +
  • Select and edit the configurable properties of an associated + Environment Entry.
  • +
  • Remove an associated Environment Entry.
  • +
  • Create and configure a new JDBC Resource associated + with this object.
  • +
  • Select and edit the configurable properties of an associated + JDBC Resource.
  • +
  • Remove an associated JDBC Resource.
  • +
+ +
+ + +
+ +

From the perspective of a particular Engine, it shall be + possible to perform the following administrative operations:

+
    +
  • Navigate to the owning Service.
  • +
  • Edit the configurable properties of this object.
  • +
  • Create and configure a new Access Logger associated + with this object.
  • +
  • Edit the configurable properties of the associated Access + Logger.
  • +
  • Remove the associated Access Logger.
  • +
  • Create and configure a new Default Context associated + with this object.
  • +
  • Edit the configurable properties of the associated Default + Context.
  • +
  • Remove the associated Default Context.
  • +
  • Create and configure a new Host associated with + this object.
  • +
  • Select and edit the configurable properties of an + associated Host.
  • +
  • Remove an associated Host.
  • +
  • Create and configure a new Realm associated with + this object.
  • +
  • Edit the configurable properties of the associated Realm.
  • +
  • Remove the associated Realm.
  • +
  • Create and configure a new Request Filter associated with + this object.
  • +
  • Select and edit the configurable properties of an + associated Request Filter
  • +
  • Remove an associated Request Filter.
  • +
+ +
+ + +
+ +

From the perspective of a particular Environment Entry, it shall + be possible to perform the following administrative operations:

+
    +
  • Navigate to the owning Context or Default Context.
  • +
  • Edit the configurable properties of this object.
  • +
+ +
+ + +
+ +

From the perspective of a particular Host, it shall be + possible to perform the following administrative operations:

+
    +
  • Navigate to the owning Engine.
  • +
  • Edit the configurable properties of this object.
  • +
  • Create and configure a new Access Logger associated + with this object.
  • +
  • Edit the configurable properties of the associated Access + Logger.
  • +
  • Remove the associated Access Logger.
  • +
  • Create and configure a new Context associated with + this object.
  • +
  • Select and edit the configurable properties of an associated + Context.
  • +
  • Remove an associated Context.
  • +
  • Create and configure a new Default Context associated + with this object.
  • +
  • Edit the configurable properties of the associated Default + Context.
  • +
  • Remove the associated Default Context.
  • +
  • Create and configure a new Realm associated with + this object.
  • +
  • Edit the configurable properties of the associated Realm.
  • +
  • Remove the associated Realm.
  • +
  • Create and configure a new Request Filter associated with + this object.
  • +
  • Select and edit the configurable properties of an + associated Request Filter
  • +
  • Remove an associated Request Filter.
  • +
+ +
+ + +
+ +

From the perspective of a particular JDBC Resource, it shall + be possible to perform the following administrative operations:

+
    +
  • Navigate to the owning Context or Default Context.
  • +
  • Edit the configurable properties of this object.
  • +
+ +
+ + +
+ +

From the perspective of a particular Loader, it shall + be possible to perform the following administrative operations:

+
    +
  • Navigate to the owning Context.
  • +
  • Edit the configurable properties of this object.
  • +
+ +
+ + +
+ +

From the perspective of a particular Manager, it shall + be possible to perform the following administrative operations:

+
    +
  • Navigate to the owning Context.
  • +
  • Edit the configurable properties of this object.
  • +
+ +
+ + +
+ +

From the perspective of a particular Realm, it shall + be possible to perform the following administrative operations:

+
    +
  • Navigate to the owning Engine, Host, or + Context.
  • +
  • Edit the configurable properties of this object.
  • +
+ +
+ + +
+ +

From the perspective of a particular Request Filter, it shall + be possible to perform the following administrative operations:

+
    +
  • Navigate to the owning Engine, Host, or + Context.
  • +
  • Edit the configurable properties of this object.
  • +
+ +
+ + +
+ +

From the perspective of the overall Server, it shall be + possible to perform the following administrative operations:

+
    +
  • Edit the configurable properties of this object.
  • +
  • Create and configure a new Service associated with + this object.
  • +
  • Select and edit the configurable properties of an associated + Service.
  • +
+ +
+ + +
+ +

From the perspective of a particular Service, it shall be + possible to perform the following administrative operations:

+
    +
  • Navigate to the owning Server.
  • +
  • Edit the configurable properties of this object.
  • +
  • Create and configure a new Connector associated with + this object.
  • +
  • Select and edit the configurable properties of an associated + Connector.
  • +
  • Remove an associated Connector.
  • +
  • Create and configure a new Engine associated with + this object.
  • +
  • Edit the configurable properties of the associated Engine.
  • +
  • Remove the associated Engine.
  • +
+ +
+ + + + +
diff --git a/webapps/docs/funcspecs/fs-default.xml b/webapps/docs/funcspecs/fs-default.xml new file mode 100644 index 000000000..d42fcfd03 --- /dev/null +++ b/webapps/docs/funcspecs/fs-default.xml @@ -0,0 +1,252 @@ + + +]> + + + &project; + + + Craig McClanahan + Default Servlet + $Id: fs-default.xml 301460 2003-01-15 03:40:45Z glenn $ + + + + + +
+ + + + +

The purpose of the Default Servlet is to serve + static resources of a web application in response to client requests. + As the name implies, it is generally configured as the "default" + servlet for a web application, by being mapped to a URL pattern "/".

+ +
+ + + + +

The following external specifications have provisions which + partially define the correct behavior of the default servlet:

+ + +
+ + + + +

The implementation of this functionality shall conform to the + following requirements:

+
    +
  • Must be implemented as a servlet.
  • +
  • Must support configurable parameters for debugging detail level, + input buffer size, output buffer size, whether or not to produce + directory listings when no welcome file is present, and whether or not + modifications are supported via DELETE and PUT.
  • +
  • Log debugging and operational messages (suitably internationalized) + via the getServletContext().log() method.
  • +
+ +
+ + +
+ + +
+ + + + +

The following environmental dependencies must be met in order for + the default servlet to operate correctly:

+
    +
  • The default servlet must be registered in the application deployment + descriptor (or the default deployment descriptor in file + $CATALINA_HOME/conf/web.xml) using a "default servlet" + servlet mapping, signified by URL pattern "/".
  • +
+ +
+ + + + +

Correct operation of the default servlet depends on the following + specific features of the surrounding container:

+
    +
  • The container shall provide a servlet context attribute that + lists the welcome file names that have been defined for this + web application.
  • +
  • The container shall provide a servlet context attribute that + contains a javax.naming.directory.DirContext + implementation representing the static resources of this + web application.
  • +
+ +
+ + +
+ + +
+ + + + +

The following processing must be performed when the init() + method of the invoker servlet is called:

+
    +
  • Process and sanity check configuration parameters.
  • +
+ +
+ + + + + +

For all HTTP request methods, the resource path is determined from + the path information provided to this request, either as request attribute + javax.servlet.include.path_info (for a request dispatcher + access to a static resource) or by calling + request.getPathInfo() directly.

+ +

On each HTTP DELETE request processed by this servlet, the following + processing shall be performed:

+
    +
  • If modifications to the static resources are not allowed (set by a + configuration parameter), return HTTP status 403 (forbidden).
  • +
  • If an attempt is made to delete a resource from /META-INF + or /WEB-INF, return HTTP status 403 (forbidden).
  • +
  • If the requested resource does not exist, return HTTP status 404 + (not found)
  • +
  • Unbind the resource from the directory context containing the + static resources for this web application. If successful, return + HTTP status 204 (no content). Otherwise, return HTTP status 405 + (method not allowed).
  • +
+ + +

On each HTTP GET request processed by this servlet, the following + processing shall be performed:

+
    +
  • If the request is for a resource under /META-INF or + /WEB-INF, return HTTP status 404 (not found).
  • +
  • If the requested resource does not exist, return HTTP status 404 + (not found).
  • +
  • If the requested resource is not a directory, but the resource + path ends in "/" or "\", return HTTP status 404 (not found).
  • +
  • If the requested resource is a directory: +
      +
    • If the request path does not end with "/", redirect to a + corresponding path with "/" appended so that relative references + in welcome files are resolved correctly.
    • +
    • If one of the specified welcome files exists, redirect to the + path for that welcome file so that it will be served explicitly. +
    • +
  • +
  • If the request being processed contains an If-Range + header, perform the processing described in the HTTP/1.1 specification + to determine whether the client's information is up to date.
  • +
  • Determine the content type of the response, by looking up the + corresponding MIME type in our servlet context.
  • +
  • If the requested resource is a directory: +
      +
    • If directory listings are suppressed, return HTTP status 404 + (not found).
    • +
    • Set the content type to text/html.
    • +
  • +
  • Determine the range(s) to be returned, based on the existence of + any If-Range and Range headers.
  • +
  • If the requested resource is a directory, include an ETag + header in the response, with the value calculated based on the content + of the directory.
  • +
  • Include a Last-Modified header in the response documenting + the date/time that the resource was last modified.
  • +
  • Unless we are processing a HEAD request, include the appropriate + content (or content ranges) in the response.
  • +
+ +

On each HTTP HEAD request processed by this servlet, the following + processing shall be performed:

+
    +
  • Processed identically to an HTTP GET request, except that the data + content is not transmitted after the headers.
  • +
+ +

On each HTTP POST request processed by this servlet, the following + processing shall be performed:

+
    +
  • Processed identically to an HTTP GET request.
  • +
+ + +

On each HTTP PUT request processed by this servlet, the following + processing shall be perfomred:

+
    +
  • If modifications to the static resources are not allowed (set by a + configuration parameter), return HTTP status 403 (forbidden).
  • +
  • If an attempt is made to delete a resource from /META-INF + or /WEB-INF, return HTTP status 403 (forbidden).
  • +
  • Create a new resource from the body of this request.
  • +
  • Bind or rebind the specified path to the new resource (depending on + whether it currently exists or not). Return HTTP status as follows: +
      +
    • If binding was unsuccessful, return HTTP status 409 (conflict). +
    • +
    • If binding was successful and the resource did not previously + exist, return HTTP status 201 (created).
    • +
    • If binding was successful and the resource previously existed, + return HTTP status 204 (no content).
    • +
  • +
+ +
+ + + + +

No specific processing is required when the destroy() + method is called:

+ +
+ + +
+ + +
+ +

In addition the the assertions implied by the functionality requirements + listed above, the following additional assertions shall be tested to + validate the behavior of the invoker servlet:

+
    +
  • Requests for resources that do not exist in the web application must + return HTTP status 404 (not found).
  • +
  • The default servlet must operate identically for web applications that + are run out of a WAR file directly, or from an unpacked directory + structure.
  • +
  • If the web application is running out of an unpacked directory + structure, the default servlet must recognize cases where the resource + has been updated through external means.
  • +
+ +
+ + + + +
diff --git a/webapps/docs/funcspecs/fs-invoker.xml b/webapps/docs/funcspecs/fs-invoker.xml new file mode 100644 index 000000000..8ee7ca8ac --- /dev/null +++ b/webapps/docs/funcspecs/fs-invoker.xml @@ -0,0 +1,247 @@ + + +]> + + + &project; + + + Craig McClanahan + Invoker Servlet + $Id: fs-invoker.xml 301460 2003-01-15 03:40:45Z glenn $ + + + + + +
+ + + + +

The purpose of the Invoker Servlet is to allow a + web application to dynamically register new servlet definitions + that correspond with a <servlet> element in the + /WEB-INF/web.xml deployment descriptor, and execute + requests utilizing the new servlet definitions. From the perspective + of the newly registered servlets, all servlet lifecycle requirements + of the Servlet Specification (such as calling init() and + destroy() at the correct times) will be respected.

+ +
+ + + + +

I do not know of any formal specification of the behavior of an + invoker servlet that is publicly available. Anyone know of one?

+ +
+ + + + +

The implementation of this functionality shall conform to the + following requirements:

+
    +
  • Implemented as a servlet.
  • +
  • Exist in the org.apache.catalina.servlets package + so that it can be loaded by the Catalina class loader.
  • +
  • Implement the org.apache.catalina.ContainerServlet + interface, so that it gains knowledge of the Wrapper + that is responsible for itself and, therefore, access to other + internal Catalina components.
  • +
  • Support a configurable debugging detail level.
  • +
  • Log debugging and operational messages (suitably internationalized) + via the getServletContext().log() method.
  • +
+ +
+ + +
+ + +
+ + + + +

The following environmental dependencies must be met in order for + the Invoker servlet to operate correctly:

+
    +
  • The invoker servlet must be registered in the application deployment + descriptor (or the default deployment descriptor in file + $CATALINA_HOME/conf/web.xml) using a "path mapped" + servlet mapping. The historical default mapping is to URL pattern + "/servlet/*", although the invoker servlet must operate + correctly with an arbitrary mapping.
  • +
+ +
+ + + + +

Correct operation of the invoker servlet depends on the following + specific features of the surrounding container:

+
    +
  • Correct support for the ContainerServlet interface, + including calling setWrapper() before + the init() method of the invoker servlet is called.
  • +
  • The web application class loader must be stored as the context + class loader of the request processing thread.
  • +
+ +
+ + +
+ + +
+ + + + +

The following processing must be performed when the init() + method of the invoker servlet is called:

+
    +
  • Ensure that the container has called setWrapper(). If + not, throw a permanent UnavailableException.
  • +
  • Look up and cache the Context that corresponds to our + Wrapper. This is the component with which new servlet + definitions and mappings will be registered.
  • +
+ +
+ + + + +

On each request, the following processing shall be performed:

+
    +
  1. Calculate the {ServletPath} for this request, either from + request attribute javax.servlet.include.servlet_path or + by calling request.getServletPath().
  2. +
  3. Calculate the {PathInfo} for this request, either from + request attribute javax.servlet.include.path_info or + by calling request.getPathInfo(). If the calculated + {PathInfo} is null, return HTTP status 400 + (bad request).
  4. +
  5. Parse the calculated {PathInfo} value as follows: +
      +
    1. Ignore the leading slash character.
    2. +
    3. Accumulate characters up to the next '/' (if any) as the + {ServletSelector}.
    4. +
    5. If a '/' was encountered, accumulate all characters from that + slash (inclusive) to the end of the string as + {PathRemainder}. If no slash was encountered, + set {PathRemainder} to a zero-length string.
    6. +
  6. +
  7. Determine whether {ServletSelector} is the name of an + existing servlet definition, and process it as follows: +
      +
    1. Ask our associated Context to find and return a + child Wrapper named {ServletSelector}. +
    2. +
    3. If there is no such child, skip to the next major step.
    4. +
    5. Register a new servlet mapping for this Wrapper, + using a URL pattern calculated as follows: + {ServletPath} + "/" + {ServletSelector} + + "/*"
    6. +
    7. Create a request dispatcher using a path calculated as follows: + {ServletPath} + "/" + {ServletSelector} + + {PathRemainder}
    8. +
    9. Forward this request to the created request dispatcher, and + exit from this request.
    10. +
  8. +
  9. Assume that {ServletSelector} is the fully qualified + name of a Java class that implements javax.servlet.Servlet + and process it as follows: +
      +
    1. Synthesize a new {ServletName} for the servlet + definition that will be created.
    2. +
    3. If there is already a child Wrapper associated with + this name, return HTTP status 500 (internal server error), because + a mapping should have already been created for this servlet.
    4. +
    5. Attempt to load a class named {ServletSelector} from + the web application class loader (i.e. the context class loader + for our current thread). If this fails, return HTTP status 404 + (not found).
    6. +
    7. Instantiate an instance of this class. If an error occurs, + return HTTP status 404 (not found).
    8. +
    9. If this class does not implement the + javax.servlet.Servlet interface, return HTTP status + 404 (not found).
    10. +
    11. Create and register a new Wrapper child with our + Context, under name {ServletName}.
    12. +
    13. Register a new servlet mapping for this Wrapper, + using a URL pattern calculated as follows: + {ServletPath} + "/" + {ServletSelector} + + "/*"
    14. +
    15. Create a request dispatcher using a path calculated as follows: + {ServletPath} + "/" + {ServletSelector} + + {PathRemainder}
    16. +
    17. Forward this request to the created request dispatcher, and + exit from this request.
    18. +
  10. +
+ +
+ + + + +

No specific processing is required when the destroy() + method is called:

+ +
+ + +
+ + +
+ +

In addition the the assertions implied by the functionality requirements + listed above, the following additional assertions shall be tested to + validate the behavior of the invoker servlet:

+
    +
  • It is possible to access an existing servlet definition by name + through the invoker. The existing servlet definition can include + either a <servlet-class> or + <jsp-file> subelement.
  • +
  • When an existing servlet definition is accessed by name, the request + will be ultimately processed by the same servlet instance that would + have processed it had a mapping to that servlet definition been used + on the request directly.
  • +
  • It is possible to access an anonymous servlet by class name + through the invoker.
  • +
  • When an anonymous servlet is accessed, the servlet instance is processed + according to the lifecycle requirements of the Servlet Specification. +
  • +
  • When an anonymous servlet is accessed, the servlet instance receives + a ServletConfig instance with no servlet initialization + parameters.
  • +
  • It is possible to utilize the invoker servlet via a direct request.
  • +
  • It is possible to utilize the invoker servlet via a call to + RequestDispatcher.forward(), or the corresponding + <jsp:forward> tag in a JSP page.
  • +
  • It is possible to utilize the invoker servlet via a call to + RequestDispatcher.include(), or the corresponding + <jsp:include> tag in a JSP page.
  • +
  • It is possible to use any HTTP method (including GET and POST) that + is supported by the Servlet class that is ultimately executed.
  • +
  • The invoker servlet should never be asked to process a second or + subsequent request for the same {ServletSelector} (because + it will have registered an appropriate servlet mapping.
  • +
+ +
+ + + + +
diff --git a/webapps/docs/funcspecs/fs-jdbc-realm.xml b/webapps/docs/funcspecs/fs-jdbc-realm.xml new file mode 100644 index 000000000..c2fca5563 --- /dev/null +++ b/webapps/docs/funcspecs/fs-jdbc-realm.xml @@ -0,0 +1,248 @@ + + +]> + + + &project; + + + Craig McClanahan + JDBCRealm + $Id: fs-jdbc-realm.xml 301460 2003-01-15 03:40:45Z glenn $ + + + + + +
+ + + + +

The purpose of the JDBCRealm implementation is to + provide a mechanism by which Tomcat 5 can acquire information needed + to authenticate web application users, and define their security roles, + from a relational database accessed via JDBC APIs. For integration + with Catalina, the resulting class(es) must implement the + org.apache.catalina.Realm interface.

+ +

This specification reflects a combination of functionality that is + already present in the org.apache.catalina.realm.JDBCRealm + class, as well as requirements for enhancements that have been + discussed. Where appropriate, requirements statements are marked + [Current] and [Requested] to distinguish them.

+ +

The current status of this functional specification is + PROPOSED. It has not yet been discussed and + agreed to on the TOMCAT-DEV mailing list.

+ +
+ + + + +

The implementation of this functionality depends on the following + external specifications:

+ + +
+ + + + +

The implementation of this functionality shall conform to the + following requirements:

+
    +
  • Be realized in one or more implementation classes.
  • +
  • Implement the org.apache.catalina.Realm interface. + [Current]
  • +
  • Implement the org.apache.catalina.Lifecycle + interface. [Current]
  • +
  • Subclass the org.apache.catalina.realm.RealmBase + base class.
  • +
  • Live in the org.apache.catalina.realm package. + [Current]
  • +
  • Support a configurable debugging detail level. [Current]
  • +
  • Log debugging and operational messages (suitably internationalized) + via the getContainer().log() method. [Current]
  • +
+ +
+ + +
+ + +
+ + + + +

The following environmental dependencies must be met in order for + JDBCRealm to operate correctly:

+
    +
  • The desire to utilize JDBCRealm must be registered in + $CATALINA_HOME/conf/server.xml, in a + <Realm> element that is nested inside a + corresponding <Engine>, <Host>, + or <Context> element.
  • +
+ +
+ + + + +

Correct operation of JDBCRealm depends on the following + specific features of the surrounding container:

+
    +
  • Interactions with JDBCRealm will be initiated by + the appropriate Authenticator implementation, based + on the login method that is selected.
  • +
  • JDBCRealm must have the JDBC standard API classes + available to it. For a JDK 1.2 or later container, these APIs + are included in the standard platform.
  • +
  • When connection pooling is implemented, JDBCRealm + must have the JDBC Optional Package (version 2.0 or later) APIs + available to it. This library is available as a separate + download (and will be included in Tomcat binary distributions).
  • +
+ +
+ + +
+ + +
+ + + + +

The main purpose of JDBCRealm is to allow Catalina to + authenticate users, and look up the corresponding security roles, from + the information found in a relational database accessed via JDBC APIs. + For maximum flexibility, the details of how this is done (for example, + the names of the required tables and columns) should be configurable.

+ +

Each time that Catalina needs to authenticate a user, it will call + the authenticate() method of this Realm implementation, + passing the username and password that were specified by the user. If + we find the user in the database (and match on the password), we accumulate + all of the security roles that are defined for this user, and create a + new GenericPrincipal object to be returned. If the user + is not authenticated, we return null instead. The + GenericUser object caches the set of security roles that + were owned by this user at the time of authentication, so that calls to + isUserInRole() can be answered without going back to the + database every time.

+ +
+ + + + + +

Configurable Properties

+ +

The implementation shall support the following properties + that can be configured with JavaBeans property setters:

+
    +
  • Configuration parameters defining the JDBC driver to use, the + database connection URL to be accessed, and the username/password + to use for logging in. [Current]
  • +
  • Configuration parameters describing the connection pool to be + created to support simultaneous authentications. [Requested]
  • +
  • Name of the tables to be searched for users and roles. [Current]
  • +
  • Name of the columns to be used for usernames, passwords, and + role names. [Current]
  • +
+ +

Lifecycle Functionality

+ +

The following processing must be performed when the start() + method is called:

+
    +
  • Establish a connection to the configured database, using the + configured username and password. [Current]
  • +
  • Configure and establish a connection pool of connections to the + database. [Requested]
  • +
+ +

The following processing must be performed when the stop() + method is called:

+
    +
  • Close any opened connections to the database.
  • +
+ + +

Method authenticate() Functionality

+ +

When authenticate() is called, the following processing + is required:

+
    +
  • Acquire the one and only connection [Current] or acquire a connection + from the connection pool [Requested].
  • +
  • Select the one and only row from the user's table for this user, + and retrieve the corresponding password column. If zero rows (or + more than one row) are found, return null.
  • +
  • Authenticate the user by comparing the (possibly encrypted) password + value that was received against the password presented by the user. + If there is no match, return null.
  • +
  • Acquire a List of the security roles assigned to the + authenticated user by selecting from the roles table.
  • +
  • Construct a new instance of class + org.apache.catalina.realm.GenericPrincipal, passing as + constructor arguments: this realm instance, the authenticated + username, and a List of the security roles associated + with this user.
  • +
  • WARNING - Do not attempt to cache and reuse previous + GenericPrincipal objects for a particular user, because + the information in the directory server might have changed since the + last time this user was authenticated.
  • +
  • Return the newly constructed GenericPrincipal.
  • +
+ + +

Method hasRole() Functionality

+ +

When hasRole() is called, the following processing + is required:

+
    +
  • The principal that is passed as an argument SHOULD + be one that we returned (instanceof class + org.apache.catalina.realm.GenericPrincipal, with a + realm property that is equal to our instance.
  • +
  • If the passed principal meets these criteria, check + the specified role against the list returned by + getRoles(), and return true if the + specified role is included; otherwise, return false.
  • +
  • If the passed principal does not meet these criteria, + return false.
  • +
+ +
+ +
+ + +
+ +

In addition the the assertions implied by the functionality requirements + listed above, the following additional assertions shall be tested to + validate the behavior of JDBCRealm:

+
    +
+ +
+ + + + +
diff --git a/webapps/docs/funcspecs/fs-jndi-realm.xml b/webapps/docs/funcspecs/fs-jndi-realm.xml new file mode 100644 index 000000000..873dd806d --- /dev/null +++ b/webapps/docs/funcspecs/fs-jndi-realm.xml @@ -0,0 +1,403 @@ + + +]> + + + &project; + + + Craig McClanahan + JNDIRealm + $Id: fs-jndi-realm.xml 301460 2003-01-15 03:40:45Z glenn $ + + + + + +
+ + + + +

The purpose of the JNDIRealm implementation is to + provide a mechanism by which Tomcat 5 can acquire information needed + to authenticate web application users, and define their security roles, + from a directory server or other service accessed via JNDI APIs. For + integration with Catalina, this class must implement the + org.apache.catalina.Realm interface.

+ +

This specification reflects a combination of functionality that is + already present in the org.apache.catalina.realm.JNDIRealm + class, as well as requirements for enhancements that have been + discussed. Where appropriate, requirements statements are marked + [Current] and [Requested] to distinguish them.

+ +

The current status of this functional specification is + PROPOSED. It has not yet been discussed and + agreed to on the TOMCAT-DEV mailing list.

+ +

The code in the current version of JNDIRealm, and the + ideas expressed in this functional specification, are the results of + contributions from many individuals, including (alphabetically):

+
    +
  • Holman, John <j.g.holman@qmw.ac.uk>
  • +
  • Lockhart, Ellen <elockhart@home.com>
  • +
  • McClanahan, Craig <craigmcc@apache.org>
  • +
+ +
+ + + + +

The implementation of this functionality depends on the following + external specifications:

+ + +
+ + + + +

The implementation of this functionality shall conform to the + following requirements:

+
    +
  • Be realized in one or more implementation classes.
  • +
  • Implement the org.apache.catalina.Realm interface. + [Current]
  • +
  • Implement the org.apache.catalina.Lifecycle + interface. [Current]
  • +
  • Subclass the org.apache.catalina.realm.RealmBase + base class.
  • +
  • Live in the org.apache.catalina.realm package. + [Current]
  • +
  • Support a configurable debugging detail level. [Current]
  • +
  • Log debugging and operational messages (suitably internationalized) + via the getContainer().log() method. [Current]
  • +
+ +
+ + +
+ + +
+ + + + +

The following environmental dependencies must be met in order for + JNDIRealm to operate correctly:

+
    +
  • The desire to utilize JNDIRealm must be registered in + $CATALINA_HOME/conf/server.xml, in a + <Realm> element that is nested inside a + corresponding <Engine>, <Host>, + or <Context> element.
  • +
  • If the Administrator Login operational mode is selected, + the configured administrator username and password must be configured + in the corresponding directory server.
  • +
  • If the Username Login operational mode is selected, + the corresponding directory server must be configured to accept + logins with the username and password that will be passed to + JNDIRealm by the appropriate Authenticator. +
  • +
+ +
+ + + + +

Correct operation of JNDIRealm depends on the following + specific features of the surrounding container:

+
    +
  • Interactions with JNDIRealm will be initiated by + the appropriate Authenticator implementation, based + on the login method that is selected.
  • +
  • JNDIRealm must have the JNDI API classes available + to it. For a JDK 1.2 container, that means jndi.jar + and the appropriate implementation (such as ldap.jar) + must be placed in the server/lib directory.
  • +
+ +
+ + +
+ + +
+ + + + +

The completed JNDIRealm must support two major operational + modes in order to support all of the required use cases. For the purposes + of this document, the modes are called administrator login and + Username Login. They are described further in the following + paragraphs.

+ +

For Administrator Login mode, JNDIRealm will be + configured to establish one or more connections (using a connection pool) + to an appropriate directory server, using JNDI APIs, under a "system + administrator" username and password. This is similar to the approach + normally used to configure JDBCRealm to access authentication + and access control information in a database. It is assumed that the + system administrator username and password that are configured provide + sufficient privileges within the directory server to read (but not modify) + the username, password, and assigned roles for each valid user of the + web application associated with this Realm. The password + can be stored in cleartext, or in one of the digested modes supported by + the org.apache.catalina.realm.RealmBase base class.

+ +

For Username Login mode, JNDIRealm does not + normally remain connected to the directory server. Instead, whenever a + user is to be authenticated, a connection to the directory server + (using the username and password received from the authenticator) is + attempted. If this connection is successful, the user is assumed to be + successfully authenticated. This connection is then utilized to read + the corresponding security roles associated with this user, and the + connection is then broken.

+ +

NOTE - Username Login mode cannot be used + if you have selected login method DIGEST in your web + application deployment descriptor (web.xml) file. This + restriction exists because the cleartext password is never available + to the container, so it is not possible to bind to the directory server + using the user's username and password.

+ +

Because these operational modes work so differently, the functionality + for each mode will be described separately. Whether or not both modes + are actually supported by a single class (versus a class per mode) is + an implementation detail left to the designer.

+ +

NOTE - The current implementation only implements + part of the Administrator Lookup mode requirements. It does + not support the Username Lookup mode at all, at this point.

+ +
+ + + + + +

Configurable Properties

+ +

The implementation shall support the following properties + that can be configured with JavaBeans property setters:

+
    +
  • connectionURL - URL of the directory server we will + be contacting.
  • +
  • contextFactory - Fully qualified class name of the JNDI + context factory used to retrieve our InitialContext. + [com.sun.jndi.ldap.LdapCtxFactory]
  • +
  • Additional configuration properties required to establish the + appropriate connection. [Requested]
  • +
  • Connection pool configuration properties. [Requested]
  • +
  • Configuration properties defining how a particular user is + authenticated. The following capabilities should be supported: +
      +
    • Substitute the specified username into a string. [Requested]
    • +
    • Retrieve the distinguished name (DN) of an authorized user via an + LDAP search string with a replacement placeholder for the + username, and comparison of the password to a configurable + attribute retrieved from the search result. [Current]
    • +
  • +
  • Configuration properties defining how the roles associated with a + particular authenticated user can be retrieved. The following + approaches should be supported: +
      +
    • Retrieve a specified attribute (possibly multi-valued) + from an LDAP search expression, + with a replacement placeholder for the DN of the user. + [Current]
    • +
    • Retrieve a set of role names that are defined implicitly (by + selecting principals that match a search pattern) rather than + explicitly (by finding a particular attribute value). + [Requested]
    • +
  • +
+ +

Lifecycle Functionality

+ +

The following processing must be performed when the start() + method is called:

+
    +
  • Establish a connection to the configured directory server, using the + configured system administrator username and password. [Current]
  • +
  • Configure and establish a connection pool of connections to the + directory server. [Requested]
  • +
+ +

The following processing must be performed when the stop() + method is called:

+
    +
  • Close any opened connections to the directory server.
  • +
+ + +

Method authenticate() Functionality

+ +

When authenticate() is called, the following processing + is required:

+
    +
  • Acquire the one and only connection [Current] or acquire a connection + from the connection pool [Requested].
  • +
  • Authenticate the user by retrieving the user's Distinguished Name, + based on the specified username and password.
  • +
  • If the user was not authenticated, release the allocated connection + and return null.
  • +
  • Acquire a List of the security roles assigned to the + authenticated user.
  • +
  • Construct a new instance of class + org.apache.catalina.realm.GenericPrincipal, passing as + constructor arguments: this realm instance, the authenticated + username, and a List of the security roles associated + with this user.
  • +
  • WARNING - Do not attempt to cache and reuse previous + GenericPrincipal objects for a particular user, because + the information in the directory server might have changed since the + last time this user was authenticated.
  • +
  • Return the newly constructed GenericPrincipal.
  • +
+ + +

Method hasRole() Functionality

+ +

When hasRole() is called, the following processing + is required:

+
    +
  • The principal that is passed as an argument SHOULD + be one that we returned (instanceof class + org.apache.catalina.realm.GenericPrincipal, with a + realm property that is equal to our instance.
  • +
  • If the passed principal meets these criteria, check + the specified role against the list returned by + getRoles(), and return true if the + specified role is included; otherwise, return false.
  • +
  • If the passed principal does not meet these criteria, + return false.
  • +
+ +
+ + + + +

Configurable Properties

+ +

The implementation shall support the following properties + that can be configured with JavaBeans property setters:

+
    +
  • connectionURL - URL of the directory server we will + be contacting.
  • +
  • contextFactory - Fully qualified class name of the JNDI + context factory used to retrieve our InitialContext. + [com.sun.jndi.ldap.LdapCtxFactory]
  • +
  • Additional configuration properties required to establish the + appropriate connection. [Requested]
  • +
  • Connection pool configuration properties. [Requested]
  • +
  • Configuration properties defining if and how a user might be looked + up before binding to the directory server. The following approaches + should be supported: +
      +
    • No previous lookup is required - username specified by the user + is the same as that used to authenticate to the directory + server.
    • +
    • Substitute the specified username into a string.
    • +
    • Search the directory server based on configured criteria to + retrieve the distinguished name of the user, then attempt to + bind with that distinguished name.
    • +
  • +
  • Configuration properties defining how the roles associated with a + particular authenticated user can be retrieved. The following + approaches should be supported: +
      +
    • Retrieve a specified attribute (possibly multi-valued) + from an LDAP search expression, + with a replacement placeholder for the DN of the user. + [Current]
    • +
  • +
+ +

Lifecycle Functionality

+ +

The following processing must be performed when the start() + method is called:

+
    +
  • None required.
  • +
+ +

The following processing must be performed when the stop() + method is called:

+
    +
  • None required.
  • +
+ + +

Method authenticate() Functionality

+ +

When authenticate() is called, the following processing + is required:

+
    +
  • Attempt to bind to the directory server, using the username and + password provided by the user.
  • +
  • If the user was not authenticated, release the allocated connection + and return null.
  • +
  • Acquire a List of the security roles assigned to the + authenticated user.
  • +
  • Construct a new instance of class + org.apache.catalina.realm.GenericPrincipal, passing as + constructor arguments: this realm instance, the authenticated + username, and a List of the security roles associated + with this user.
  • +
  • WARNING - Do not attempt to cache and reuse previous + GenericPrincipal objects for a particular user, because + the information in the directory server might have changed since the + last time this user was authenticated.
  • +
  • Return the newly constructed GenericPrincipal.
  • +
+ + +

Method hasRole() Functionality

+ +

When hasRole() is called, the following processing + is required:

+
    +
  • The principal that is passed as an argument SHOULD + be one that we returned (instanceof class + org.apache.catalina.realm.GenericPrincipal, with a + realm property that is equal to our instance.
  • +
  • If the passed principal meets these criteria, check + the specified role against the list returned by + getRoles(), and return true if the + specified role is included; otherwise, return false.
  • +
  • If the passed principal does not meet these criteria, + return false.
  • +
+ +
+ +
+ + +
+ +

In addition the the assertions implied by the functionality requirements + listed above, the following additional assertions shall be tested to + validate the behavior of JNDIRealm:

+
    +
+ +
+ + + + +
diff --git a/webapps/docs/funcspecs/fs-memory-realm.xml b/webapps/docs/funcspecs/fs-memory-realm.xml new file mode 100644 index 000000000..60b38413e --- /dev/null +++ b/webapps/docs/funcspecs/fs-memory-realm.xml @@ -0,0 +1,239 @@ + + +]> + + + &project; + + + Craig McClanahan + MemoryRealm + $Id: fs-memory-realm.xml 301460 2003-01-15 03:40:45Z glenn $ + + + + + +
+ + + + +

The purpose of the MemoryRealm implementation is to + provide a mechanism by which Tomcat 5 can acquire information needed + to authenticate web application users, and define their security roles, + from a simple text-based configuration file in XML format. This is + intended to simplify the initial installation and operation of Tomcat 5, + without the complexity of configuring a database or directory server + based Realm. It is not intended for production use.

+ +

This specification reflects a combination of functionality that is + already present in the org.apache.catalina.realm.MemoryRealm + class, as well as requirements for enhancements that have been + discussed. Where appropriate, requirements statements are marked + [Current] and [Requested] to distinguish them.

+ +

The current status of this functional specification is + PROPOSED. It has not yet been discussed and + agreed to on the TOMCAT-DEV mailing list.

+ +
+ + + + +

The implementation of this functionality depends on the following + external specifications:

+
    +
  • None
  • +
+ +
+ + + + +

The implementation of this functionality shall conform to the + following requirements:

+
    +
  • Be realized in one or more implementation classes.
  • +
  • Implement the org.apache.catalina.Realm interface. + [Current]
  • +
  • Implement the org.apache.catalina.Lifecycle + interface. [Current]
  • +
  • Subclass the org.apache.catalina.realm.RealmBase + base class.
  • +
  • Live in the org.apache.catalina.realm package. + [Current]
  • +
  • Support a configurable debugging detail level. [Current]
  • +
  • Log debugging and operational messages (suitably internationalized) + via the getContainer().log() method. [Current]
  • +
+ +
+ + +
+ + +
+ + + + +

The following environmental dependencies must be met in order for + MemoryRealm to operate correctly:

+
    +
  • The desire to utilize MemoryRealm must be registered in + $CATALINA_HOME/conf/server.xml, in a + <Realm> element that is nested inside a + corresponding <Engine>, <Host>, + or <Context> element. (This is already + included in the default server.xml file.)
  • +
+ +
+ + + + +

Correct operation of MemoryRealm depends on the following + specific features of the surrounding container:

+
    +
  • Interactions with MemoryRealm will be initiated by + the appropriate Authenticator implementation, based + on the login method that is selected.
  • +
  • MemoryRealm must have an XML parser compatible with + the JAXP/1.1 APIs available to it. This is normally accomplished + by placing the corresponding JAR files in directory + $CATALINA_HOME/server/lib (to make them visible only + to internal Catalina classes) or in directory + $CATALINA_HOME/common/lib (to make them visible to + Catalina internal classes and installed web + applications).
  • +
+ +
+ + +
+ + +
+ + + + +

The main purpose of MemoryRealm is to allow Catalina to + authenticate users, and look up the corresponding security roles, from + the information found in an XML-format configuration file. The format + of this file is described below. When a MemoryRealm + instance is started, it will read the contents of this XML file and create + an "in memory database" of all the valid users and their associated + security roles.

+ +

Each time that Catalina needs to authenticate a user, it will call + the authenticate() method of this Realm implementation, + passing the username and password that were specified by the user. If + we find the user in the database (and match on the password), we accumulate + all of the security roles that are defined for this user, and create a + new GenericPrincipal object to be returned. If the user + is not authenticated, we return null instead. The + GenericUser object caches the set of security roles that + were owned by this user at the time of authentication, so that calls to + isUserInRole() can be answered without going back to the + database every time.

+ +
+ + + + + +

Configurable Properties

+ +

The implementation shall support the following properties + that can be configured with JavaBeans property setters:

+
    +
  • Configurable debugging detail level.
  • +
  • Configurable file pathname (absolute or relative to + $CATALINA_HOME of the XML file containing our + defined users. [conf/tomcat-users.xml].
  • +
+ +

Lifecycle Functionality

+ +

The following processing must be performed when the start() + method is called:

+
    +
  • Open and parse the specified XML file.
  • +
  • Create an in-memory database representation of the XML file + contents.
  • +
  • NOTE - There is no requirement to recognize + subsequent changes to the contents of the XML file.
  • +
+ +

The following processing must be performed when the stop() + method is called:

+
    +
  • Release object references to the in-memory database representation.
  • +
+ + +

Method authenticate() Functionality

+ +

When authenticate() is called, the following processing + is required:

+
    +
  • Select the one and only "user" instance from the in-memory database, + based on matching the specified username. If there is no such + instance, return null.
  • +
  • Authenticate the user by comparing the (possibly encrypted) password + value that was received against the password presented by the user. + If there is no match, return null.
  • +
  • Construct a new instance of class + org.apache.catalina.realm.GenericPrincipal (if not + already using this as the internal database representation) that + contains the authenticated username and a List of the + security roles associated with this user.
  • +
  • Return the newly constructed GenericPrincipal.
  • +
+ + +

Method hasRole() Functionality

+ +

When hasRole() is called, the following processing + is required:

+
    +
  • The principal that is passed as an argument SHOULD + be one that we returned (instanceof class + org.apache.catalina.realm.GenericPrincipal, with a + realm property that is equal to our instance.
  • +
  • If the passed principal meets these criteria, check + the specified role against the list returned by + getRoles(), and return true if the + specified role is included; otherwise, return false.
  • +
  • If the passed principal does not meet these criteria, + return false.
  • +
+ +
+ +
+ + +
+ +

In addition the the assertions implied by the functionality requirements + listed above, the following additional assertions shall be tested to + validate the behavior of MemoryRealm:

+
    +
+ +
+ + + + +
diff --git a/webapps/docs/funcspecs/index.xml b/webapps/docs/funcspecs/index.xml new file mode 100644 index 000000000..0b306798e --- /dev/null +++ b/webapps/docs/funcspecs/index.xml @@ -0,0 +1,54 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Table of Contents + + + + + +
+ +

This documentation area includes functional specifications for +many features supported by the Catalina servlet container +portion of Tomcat 5. In most cases, these features are not documented in the +underlying Servlet or JSP specifications, so a definition of the expected +correct behavior is important both to implementors of those features, and to +test writers trying to decide what to test.

+ +

The functional specifications are divided into the following categories +in the menu (to the left):

+
    +
  • Administrative Apps - Overall requirements for supporting an + ability to configure and operate a Tomcat 5 installation through tools, + as well as detailed requirements for the tools themselves.
  • +
  • Internal Servlets - Requirements for Catalina features that are + implemented as internal, container-managed, servlets.
  • +
  • Realm Implementations - Requirements for the implementations of + the org.apache.catalina.Realm interface (providing access to + collections of users, passwords and roles) that are included in the + standard Tomcat 5 distribution.
  • +
+ +

NOTE - In some cases, the contents of these functional specs has +been "reverse engineered" from existing implementations. This exercise is +stil useful, because it provides an introduction to what +Catalina does, without being as concerned with how this is +accomplished.

+ +

TODO - Obviously, this area has a long ways to go before +it is complete. Contributions are welcome!

+ +
+ + + + +
diff --git a/webapps/docs/funcspecs/mbean-names.xml b/webapps/docs/funcspecs/mbean-names.xml new file mode 100644 index 000000000..ac47b0945 --- /dev/null +++ b/webapps/docs/funcspecs/mbean-names.xml @@ -0,0 +1,870 @@ + + +]> + + + &project; + + + Craig McClanahan + Amy Roh + Tomcat MBean Names + $Id: mbean-names.xml 303281 2004-09-27 16:00:31Z yoavs $ + + + + + +
+ +

We will be using JMX MBeans as the technology for + implementing manageability of Tomcat.

+ +

One of the key concepts of JMX (and JSR-77) is that each management + bean has a unique name in the MBeanServer's registry, and that + management applications can utilize these names to retrieve the MBean + of interest to them for a particular management operation. + This document proposes a naming convention for MBeans that allows easy + calculation of the name for a particular MBean. For background + information on JMX MBean names, see the Java Management Extensions + Instrumentation and Agent Specification, version 1.0, section 6. + In particular, we will be discussing the String Representation of + ObjectName instances.

+ +
+ +
+ +

Tomcat's servlet container implementation, called Catalina, can be +represented as a hierarchy of objects that contain references to each other. +The object hierarchy can be represented as a tree, or (isomorphically) based +on the nesting of configuration elements in the conf/server.xml +file that is traditionally used to configure Tomcat stand-alone.

+ +

The valid component nestings for Catalina are depicted in the following +table, with columns that contain the following values:

+
    +
  • Pattern - Nesting pattern of XML elements (in the + conf/server.xml file) used to configure this component.
  • +
  • Cardinality - Minimum and maximum number of occurrences of + this element at this nesting position, which also corresponds to the + minimum and maximum number of Catalina components.
  • +
  • Identifier - Name of the JavaBeans property of this component + that represents the unique identifier (within the nested hierarchy), + if any.
  • +
  • MBean ObjectName - The portion of the MBean object name that + appears after the domain name. For now, it should be + assumed that all of these MBeans appear in the default JMX domain.
  • +
+ +

In the MBean ObjectName descriptions, several types of symbolic +expressions are utilized to define variable text that is replaced by +corresponding values:

+
    +
  • ${GROUP} - One of the standard MBean names of the specified + "group" category. For example, the expression ${REALM} + represents the values like JDBCRealm and JAASRealm + that identify the various MBeans for possible Realm components.
  • +
  • ${name} - Replaced by the value of property name + from the current component.
  • +
  • ${parent.name} - Replaced by the value of property + name from a parent of the current component, with the + parent's type identified by parent.
  • +
  • ${###} - An arbitrary numeric identifier that preserves + order but has no other particular meaning. In general, the server will + assign numeric values to existing instances with large gaps into which + new items can be configured if desired.
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PatternCardinalityIdentifierMBean ObjectName
Server1..1(none)type=${SERVER}
Server / Listener0..n(none)type=${LISTENER}, sequence=${###}
Server / Service1..nnametype=${SERVICE}, name=${name}
Server / Service / Connector1..naddress, porttype=${CONNECTOR}, service=${service}, port=${port}, + address=${address}
Server / Service / Connector / Factory0..1(none)(Only defined explicitly for an SSL connector, but can be treated + as part of the connector component)
Server / Service / Connector / Listener0..n(none)type=${LISTENER}, sequence=${###}, service=${service}, + port=${connector.port}, address=${connector.address}
Server / Service / Engine1..1(none)type=${ENGINE}, service=${service.name}
Server / Service / Engine / DefaultContext0..1(none)type=${DEFAULT-CONTEXT}, service=${service.name}
Server / Service / Engine / Host1..nnametype=${HOST}, host=${name}, + service=${service.name}
Server / Service / Engine / Host / Context1..npathtype=${CONTEXT}, path=${path}, host=${host.name}, + service=${service.name}
Server / Service / Engine / Host / Context / InstanceListener0..n(none)type=${INSTANCE-LISTENER}, sequence=${###}, path=${context.path}, + host=${host.name}, service=${service.name}
Server / Service / Engine / Host / Context / Listener0..n(none)type=${LISTENER}, sequence=${###}, path=${context.path}, + host=${host.name}, service=${service.name}
Server / Service / Engine / Host / Context / Loader0..1(none)type=${LOADER}, path=${context.path}, host=${host.name}, + service=${service.name}
Server / Service / Engine / Host / Context / Manager0..1(none)type=${MANAGER}, path=${context.path}, host=${host.name}, + service=${service.name}
Server / Service / Engine / Host / Context / Realm0..1(none)type=${REALM}, path=${context.path}, host=${host.name}, + service=${service.name}
Server / Service / Engine / Host / Context / Resources0..1(none)type=${RESOURCES}, path=${context.path}, host=${host.name}, + service=${service.name}
Server / Service / Engine / Host / Context / Valve0..n(none)type=${VALVE}, sequence=${###}, path=${context.path}, + host=${host.name}, service=${service.name}
Server / Service / Engine / Host / Context / WrapperLifecycle0..n(none)type=${WRAPPER-LIFECYCLE}, sequence=${###}, path=${context.path}, + host=${host.name}, service=${service.name}
Server / Service / Engine / Host / Context / WrapperListener0..n(none)type=${WRAPPER-LISTENER}, sequence=${###}, path=${context.path}, + host=${host.name}, service=${service.name}
Server / Service / Engine / Host / DefaultContext0..1(none)type=DefaultContext, host=${host.name}, + service=${service.name}
Server / Service / Engine / Host / Listener0..n(none)type=${LISTENER}, sequence=${###}, host=${host.name}, + service=${service.name}
Server / Service / Engine / Host / Realm0..1(none)type=${REALM}, host=${host.name}, + service=${service.name}
Server / Service / Engine / Host / Valve0..n(none)type=${VALVE}, sequence=${###}, + host=${host.name}, service=${service.name}
Server / Service / Engine / Listener0..n(none)type=${LISTENER}, sequence=${###} + (FIXME - disambiguate from Server / Service / + Listener)
Server / Service / Engine / Realm0..1(none)type=${REALM}, service=${service.name}
Server / Service / Engine / Valve0..n(none)type=${VALVE}, sequence=${###}, + service=${service.name}
Server / Service / Listener0..n(none)type=${LISTENER}, sequence=${###} + (FIXME - disambiguate from Server / Service / + Engine / Listener)
+ +
+ +
+ +

The following MBean names shall be defined in the resource file +/org/apache/catalina/mbeans/mbeans-descriptors.xml (and +therefore available for use within the Administration/Configuration +web application for Tomcat):

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MBean NameGroup NameCatalina InterfaceImplementation Class
AccessLogValveVALVEorg.apache.catalina.Valveorg.apache.catalina.valves.AccessLogValve
BasicAuthenticatorVALVEorg.apache.catalina.Valveorg.apache.catalina.authenticator.BasicAuthenticator
CertificatesValveVALVEorg.apache.catalina.Valveorg.apache.catalina.valves.CertificatesValve
ContextConfigLISTENERorg.apache.catalina.LifecycleListenerorg.apache.catalina.startup.ContextConfig
ContextEnvironmentRESOURCESorg.apache.catalina.deploy.ContextEnvironmentorg.apache.catalina.deploy.ContextEnvironment
ContextResourceRESOURCESorg.apache.catalina.deploy.ContextResourceorg.apache.catalina.deploy.ContextResource
ContextResourceLinkRESOURCESorg.apache.catalina.deploy.ContextResourceLinkorg.apache.catalina.deploy.ContextResourceLink
CoyoteConnectorCONNECTORorg.apache.catalina.Connectororg.apache.coyote.tomcat4.CoyoteConnector
DefaultContextDEFAULT-CONTEXTorg.apache.catalina.DefaultContextorg.apache.catalina.core.StandardDefaultContext
DigestAuthenticatorVALVEorg.apache.catalina.Valveorg.apache.catalina.authenticator.DigestAuthenticator
EngineConfigLISTENERorg.apache.catalina.LifecycleListenerorg.apache.catalina.startup.EngineConfig
ErrorReportValveVALVEorg.apache.catalina.Valveorg.apache.catalina.valves.ErrorReportValve
ErrorDispatcherValveVALVEorg.apache.catalina.Valveorg.apache.catalina.valves.ErrorDispatcherValve
FormAuthenticatorVALVEorg.apache.catalina.Valveorg.apache.catalina.authenticator.FormAuthenticator
GroupGROUPorg.apache.catalina.Grouporg.apache.catalina.Group
HostConfigLISTENERorg.apache.catalina.LifecycleListenerorg.apache.catalina.startup.HostConfig
HttpConnector10CONNECTORorg.apache.catalina.Connectororg.apache.catalina.connector.http10.HttpConnector
HttpConnector11CONNECTORorg.apache.catalina.Connectororg.apache.catalina.connector.http.HttpConnector
JAASRealmREALMorg.apache.catalina.Realmorg.apache.catalina.realm.JAASRealm
JDBCRealmREALMorg.apache.catalina.Realmorg.apache.catalina.realm.JDBCRealm
JDBCUserDatabaseUSERDATABASEorg.apache.catalina.users.JDBCUserDatabaseorg.apache.catalina.users.JDBCUserDatabase
JNDIRealmREALMorg.apache.catalina.Realmorg.apache.catalina.realm.JNDIRealm
MBeanFactoryorg.apache.catalina.mbeans.MBeanFactory
MemoryRealmREALMorg.apache.catalina.Realmorg.apache.catalina.realm.MemoryRealm
MemoryUserDatabaseUSERDATABASEorg.apache.catalina.users.MemoryUserDatabaseorg.apache.catalina.users.MemoryUserDatabase
NamingContextListenerLISTENERorg.apache.catalina.LifecycleListenerorg.apache.catalina.core.NamingContextListener
NamingResourcesRESOURCESorg.apache.catalina.deploy.NamingResourcesorg.apache.catalina.deploy.NamingResources
NonLoginAuthenticatorVALVEorg.apache.catalina.Valveorg.apache.catalina.authenticator.NonLoginAuthenticator
PersistentManagerMANAGERorg.apache.catalina.Managerorg.apache.catalina.session.PersistentManager
RemoteAddrValveVALVEorg.apache.catalina.Valveorg.apache.catalina.valves.RemoteAddrValve
RemoteHostValveVALVEorg.apache.catalina.Valveorg.apache.catalina.valves.RemoteHostValve
RequestDumperValveVALVEorg.apache.catalina.Valveorg.apache.catalina.valves.RequestDumperValve
RoleROLEorg.apache.catalina.Roleorg.apache.catalina.Role
SingleSignOnVALVEorg.apache.catalina.Valveorg.apache.catalina.valves.SingleSignOn
SSLAuthenticatorVALVEorg.apache.catalina.Valveorg.apache.catalina.authenticator.SSLAuthenticator
StandardContextCONTEXTorg.apache.catalina.Contextorg.apache.catalina.core.StandardContext
StandardContextValveVALVEorg.apache.catalina.Valveorg.apache.catalina.core.StandardContextValve
StandardEngineENGINEorg.apache.catalina.Engineorg.apache.catalina.core.StandardEngine
StandardEngineValveVALVEorg.apache.catalina.Valveorg.apache.catalina.core.StandardEngineValve
StandardHostHOSTorg.apache.catalina.Hostorg.apache.catalina.core.StandardHost
StandardHostValveVALVEorg.apache.catalina.Valveorg.apache.catalina.core.StandardHostValve
StandardManagerMANAGERorg.apache.catalina.Managerorg.apache.catalina.session.StandardManager
StandardServerSERVERorg.apache.catalina.Serverorg.apache.catalina.core.StandardServer
StandardServiceSERVICEorg.apache.catalina.Serviceorg.apache.catalina.core.StandardService
StandardWrapperValveVALVEorg.apache.catalina.Valveorg.apache.catalina.core.StandardWrapperValve
UserUSERorg.apache.catalina.Userorg.apache.catalina.User
UserDatabaseRealmREALMorg.apache.catalina.Realmorg.apache.catalina.realm.UserDatabaseRealm
WebappLoaderLOADERorg.apache.catalina.Loaderorg.apache.catalina.loader.WebappLoader
+ +
+ +
+ +

The managed objects in the JSR-77 object hierarchy correspond +to the specified MBean names or groups as follows:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
JSR-77 Managed ObjectMBean Name or GroupComments
J2EEServer${SERVICE}
Node${SERVICE}Tomcat supports a single node only.
Port${CONNECTOR}
Servlet${WRAPPER}FIXME - Not yet identified as an MBean
WebModule${CONTEXT}
+ +
+ +
+ +

The deployment objects in the JSR-88 API object hierarchy correspond +to the specified MBean names or groups as follows:

+ + + + + + + + + + + + + + + + + + + + + +
JSR-88 API ObjectMBean Name or GroupComments
DeployableObject${CONTEXT}Context deployment info plus the corresponding WAR file
Target${HOST}
+ +
+ + + +
diff --git a/webapps/docs/funcspecs/project.xml b/webapps/docs/funcspecs/project.xml new file mode 100644 index 000000000..b265a0774 --- /dev/null +++ b/webapps/docs/funcspecs/project.xml @@ -0,0 +1,39 @@ + + + + Catalina Functional Specifications + + + Catalina Functional Specifications + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapps/docs/html-manager-howto.xml b/webapps/docs/html-manager-howto.xml new file mode 100644 index 000000000..cf3a74729 --- /dev/null +++ b/webapps/docs/html-manager-howto.xml @@ -0,0 +1,543 @@ + + +]> + + + &project; + + + Glenn L. Nielsen + Tomcat Web Application Manager How To + + + + +
+ +

In many production environments it is very useful to have the capability +to manage your web applications without having to shut down and restart +Tomcat. This document is for the HTML web interface to the web application +manager.

+ +

The interface is divided into five sections: +

    +
  • Message - Displays success and failure messages.
  • +
  • Manager - General manager operations like list and + help.
  • +
  • Applications - List of web applications and + commands.
  • +
  • Deploy - Deploying web applications.
  • +
  • Server Information - Information about the Tomcat + server.
  • +
+

+ +
+ +
+ +

+Displays information about the success or failure of the last web application +manager command you performed. If it succeeded OK is displayed +and may be followed by a success message. If it failed FAIL +is displayed followed by an error message. Common failure messages are +documented below for each command. The complete list of failure messages for +each command can be found in the manager web +application documentation. +

+ +
+ +
+ +

The Manager section has three links: +

    +
  • List Applications - Redisplay a list of web + applications.
  • +
  • HTML Manager Help - A link to this document.
  • +
  • Manager Help - A link to the comprehensive Manager + App HOW TO.
  • +
+

+ +
+ +
+ +

The Applications section lists information about all the installed web +applications and provides links for managing them. For each web application +the following is displayed: +

    +
  • Path - The web applicaton context path.
  • +
  • Display Name - The display name for the web application + if it has one configured in its "web.xml" file.
  • +
  • Running - Whether the web application is running and + available (true), or not running and unavailable (false).
  • +
  • Sessions - The number of active sessions for remote + users of this web application. The number of sessions is a link which + when submitted displays more details about session usage by the web + application in the Message box.
  • +
  • Commands - Lists all commands which can be performed on + the web application. Only those commands which can be performed will be + listed as a link which can be submitted. No commands can be performed on + the manager web application itself. The following commands can be + performed: +
      +
    • Start - Start a web application which had been + stopped.
    • +
    • Stop - Stop a web application which is currently + running and make it unavailable.
    • +
    • Reload - Reload the web application so that new + ".jar" files in /WEB-INF/lib/ or new classes in + /WEB-INF/classes/ can be used.
    • +
    • Undeploy - Stop and then remove this web + application from the server.
    • +
    +
  • +
+

+ + + +

Signal a stopped application to restart, and make itself available again. +Stopping and starting is useful, for example, if the database required by +your application becomes temporarily unavailable. It is usually better to +stop the web application that relies on this database rather than letting +users continuously encounter database exceptions.

+ +

If this command succeeds, you will see a Message like this:

+ +OK - Started application at context path /examples + + +

Otherwise, the Message will start with FAIL and include an +error message. Possible causes for problems include: +

    +
  • Encountered exception +
    +

    An exception was encountered trying to start the web application. + Check the Tomcat 5 logs for the details.

    +
  • +
  • Invalid context path was specified +
    +

    The context path must start with a slash character, unless you are + referencing the ROOT web application -- in which case the context path + must be a zero-length string.

    +
  • +
  • No context exists for path /foo +
    +

    There is no deployed application on the context path + that you specified.

    +
  • +
  • No context path was specified +
    + The path parameter is required. +
  • +
+

+ +
+ + + +

Signal an existing application to make itself unavailable, but leave it +deployed. Any request that comes in while an application is +stopped will see an HTTP error 404, and this application will show as +"stopped" on a list applications command.

+ +

If this command succeeds, you will see a Message like this:

+ +OK - Stopped application at context path /examples + + +

Otherwise, the Message will start with FAIL and include an +error message. Possible causes for problems include: +

    +
  • Encountered exception +
    +

    An exception was encountered trying to stop the web application. + Check the Tomcat 5 logs for the details.

    +
  • +
  • Invalid context path was specified +
    +

    The context path must start with a slash character, unless you are + referencing the ROOT web application -- in which case the context path + must be a zero-length string.

    +
  • +
  • No context exists for path /foo +
    +

    There is no deployed application on the context path + that you specified.

    +
  • +
  • No context path was specified +
    + The path parameter is required. +
  • +
+

+ +
+ + + +

Signal an existing application to shut itself down and reload. This can +be useful when the web application context is not reloadable and you have +updated classes or property files in the /WEB-INF/classes +directory or when you have added or updated jar files in the +/WEB-INF/lib directory. +

+

NOTE: The /WEB-INF/web.xml +web application configuration file is not checked on a reload; +the previous web.xml configuration is used. +If you have made changes to your web.xml file you must stop +then start the web application. +

+ +

If this command succeeds, you will see a Message like this:

+ +OK - Reloaded application at context path /examples + + +

Otherwise, the Message will start with FAIL and include an +error message. Possible causes for problems include: +

    +
  • Encountered exception +
    +

    An exception was encountered trying to restart the web application. + Check the Tomcat 5 logs for the details.

    +
  • +
  • Invalid context path was specified +
    +

    The context path must start with a slash character, unless you are + referencing the ROOT web application -- in which case the context path + must be a zero-length string.

    +
  • +
  • No context exists for path /foo +
    +

    There is no deployed application on the context path + that you specified.

    +
  • +
  • No context path was specified +
    + The path parameter is required. +
  • +
  • Reload not supported on WAR deployed at path /foo +
    + Currently, application reloading (to pick up changes to the classes or + web.xml file) is not supported when a web application is + installed directly from a WAR file, which happens when the host is + configured to not unpack WAR files. As it only works when the web + application is installed from an unpacked directory, if you are using + a WAR file, you should undeploy and then deploy + the application again to pick up your changes. +
  • +
+

+ +
+ + + +

WARNING - This command will delete the +contents of the web application directory and/or ".war" file if it exists within +the appBase directory (typically "webapps") for this virtual host +. The web application temporary work directory is also deleted. If +you simply want to take an application out of service, you should use the +/stop command instead.

+ +

Signal an existing application to gracefully shut itself down, and then +remove it from Tomcat (which also makes this context path available for +reuse later). This command is the logical opposite of the +/deploy Ant command, and the related deploy features available +in the HTML manager.

+ +

If this command succeeds, you will see a Message like this:

+ +OK - Undeployed application at context path /examples + + +

Otherwise, the Message will start with FAIL and include an +error message. Possible causes for problems include: +

    +
  • Encountered exception +
    +

    An exception was encountered trying to undeploy the web application. + Check the Tomcat logs for the details.

    +
  • +
  • Invalid context path was specified +
    +

    The context path must start with a slash character, unless you are + referencing the ROOT web application -- in which case the context path + must be a zero-length string.

    +
  • +
  • No context exists for path /foo +
    +

    There is no deployed application on the context path + that you specified.

    +
  • +
  • No context path was specified +
    + The path parameter is required. +
  • +
+

+ +
+ +
+ +
+ +

Web applications can be deployed using files or directories located +on the Tomcat server or you can upload a web application archive (WAR) +file to the server.

+ +

To install an application, fill in the appropriate fields for the type +of install you want to do and then submit it using the Install +button.

+ + + +

Deploy and start a new web application, attached to the specified Context +Path: (which must not be in use by any other web application). +This command is the logical opposite of the Undeploy command.

+ +

There are a number of different ways the deploy command can be used.

+ +

Deploy a Directory or WAR by URL

+ +

Install a web application directory or ".war" file located on the Tomcat +server. If no Context Path is specified, the directory name or the +war file name without the ".war" extension is used as the path. The +WAR or Directory URL specifies a URL (including the file: +scheme) for either a directory or a web application archive (WAR) file. The +supported syntax for a URL referring to a WAR file is described on the Javadocs +page for the java.net.JarURLConnection class. Use only URLs that +refer to the entire WAR file.

+ +

In this example the web application located in the directory +C:\path\to\foo on the Tomcat server (running on Windows) +is deployed as the web application context named /footoo. + +Context Path: /footoo +WAR or Directory URL: file:C:/path/to/foo + +

+ +

In this example the ".war" file /path/to/bar.war on the +Tomcat server (running on Unix) is deployed as the web application +context named /bar. Notice that there is no path +parameter so the context path defaults to the name of the web application +archive file without the ".war" extension. + +WAR or Directory URL: jar:file:/path/to/bar.war!/ + +

+ +

Deploy a Directory or War from the Host appBase

+ +

Install a web application directory or ".war" file located in your Host +appBase directory. If no Context Path is specified the directory name +or the war file name without the ".war" extension is used as the path.

+ +

In this example the web application located in a subdirectory named +foo in the Host appBase directory of the Tomcat server is +deployed as the web application context named /foo. Notice +that there is no path parameter so the context path defaults +to the name of the web application directory. + +WAR or Directory URL: foo + +

+ +

In this example the ".war" file bar.war located in your +Host appBase directory on the Tomcat server is deployed as the web +application context named /bartoo. + +Context Path: /bartoo +WAR or Directory URL: bar.war + +

+ +

Deploy using a Context configuration ".xml" file

+ +

If the Host deployXML flag is set to true, you can install a web +application using a Context configuration ".xml" file and an optional +".war" file or web application directory. The Context Path +is not used when installing a web application using a context ".xml" +configuration file.

+ +

A Context configuration ".xml" file can contain valid XML for a +web application Context just as if it were configured in your +Tomcat server.xml configuration file. Here is an +example for Tomcat running on Windows: + +<Context path="/foobar" docBase="C:\path\to\application\foobar" + debug="0"> + + <!-- Link to the user database we will get roles from --> + <ResourceLink name="users" global="UserDatabase" + type="org.apache.catalina.UserDatabase"/> + +</Context> + +

+ +

Use of the WAR or Directory URL is optional. When used +to select a web application ".war" file or directory it overrides any +docBase configured in the context configuration ".xml" file.

+ +

Here is an example of installing an application using a Context +configuration ".xml" file for Tomcat running on Windows. + +XML Configuration file URL: file:C:/path/to/context.xml + +

+ +

Here is an example of installing an application using a Context +configuration ".xml" file and a web application ".war" file located +on the server (Tomcat running on Unix). + +XML Configuration file URL: file:/path/to/context.xml +WAR or Directory URL: jar:file:/path/to/bar.war!/ + +

+ +
+ + + +

Upload a WAR file from your local system and install it into the +appBase for your Host. The name of the WAR file without the ".war" +extension is used as the context path name.

+ +

Use the Browse button to select a WAR file to upload to the +server from your local desktop system.

+ +

The .WAR file may include Tomcat specific deployment configuration, by +including a Context configuration XML file in +/META-INF/context.xml.

+ +

Upload of a WAR file could fail for the following reasons:

+
    +
  • File uploaded must be a .war +
    +

    The upload install will only accept files which have the filename + extension of ".war".

    +
  • +
  • War file already exists on server +
    +

    If a war file of the same name already exists in your Host's + appBase the upload will fail. Either undeploy the existing war file + from your Host's appBase or upload the new war file using a different + name.

    +
  • +
  • File upload failed, no file +
    +

    The file upload failed, no file was received by the server.

    +
  • +
  • Install Upload Failed, Exception: +
    +

    The war file upload or install failed with a Java Exception. + The exception message will be listed.

    +
  • +
+ +
+ + + +

If the Host is configured with unpackWARs=true and you install a war +file, the war will be unpacked into a directory in your Host appBase +directory.

+ +

If the application war or directory is deployed in your Host appBase +directory and either the Host is configured with autoDeploy=true or +liveDeploy=true, the Context path must match the directory name or +war file name without the ".war" extension.

+ +

For security when untrusted users can manage web applications, the +Host deployXML flag can be set to false. This prevents untrusted users +from installing web applications using a configuration XML file and +also prevents them from installing application directories or ".war" +files located outside of their Host appBase.

+ +
+ + + +

If deployment and startup is successful, you will receive a Message +like this:

+ +OK - Deployed application at context path /foo + + +

Otherwise, the Message will start with FAIL and include an +error message. Possible causes for problems include:

+
    +
  • Application already exists at path /foo +
    +

    The context paths for all currently running web applications must be + unique. Therefore, you must either undeploy the existing web + application using this context path, or choose a different context path + for the new one.

    +
  • +
  • Document base does not exist or is not a readable directory +
    +

    The URL specified by the WAR or Directory URL: field must + identify a directory on this server that contains the "unpacked" version + of a web application, or the absolute URL of a web application archive + (WAR) file that contains this application. Correct the value entered for + the WAR or Directory URL: field.

    +
  • +
  • Encountered exception +
    +

    An exception was encountered trying to start the new web application. + Check the Tomcat 5 logs for the details, but likely explanations include + problems parsing your /WEB-INF/web.xml file, or missing + classes encountered when initializing application event listeners and + filters.

    +
  • +
  • Invalid application URL was specified +
    +

    The URL for the WAR or Directory URL: field that you specified + was not valid. Such URLs must start with file:, and URLs + for a WAR file must end in ".war".

    +
  • +
  • Invalid context path was specified +
    +

    The context path must start with a slash character, unless you are + referencing the ROOT web application -- in which case the context path + must be a "/" string.

    +
  • +
  • Context path must match the directory or WAR file name: +
    + If the application war or directory is deployed in your Host appBase + directory and either the Host is configured with autoDeploy=true or + liveDeploy=true, the Context path must match the directory name or + war file name without the ".war" extension. +
  • +
  • Only web applications in the Host web application directory can + be deployed +
    + If the Host deployXML flag is set to false this error will happen + if an attempt is made to install a web application directory or + ".war" file outside of the Host appBase directory. +
  • +
+ +
+
+ +
+ +

This section displays information about Tomcat, the operating system of +the server Tomcat is hosted on, and the Java Virtual Machine Tomcat is +running in.

+ +
+ + + +
diff --git a/webapps/docs/images/add.gif b/webapps/docs/images/add.gif new file mode 100644 index 0000000000000000000000000000000000000000..0774d074e5e48291bdacfacb086506e6be117e51 GIT binary patch literal 1037 zcmZ?wbhEHb6k!lyc+SA^9|->a|M&0T|Nno1n4h0tnTz4o;>0&glV!LWO;{KX^ykTP zGrU;!o~1phVTD*cK_!)em>kR#mn&Z^0eO_xlSoe_rhTdU2{GAH%zidEYmsygkrvrz1CG(e()%elNK2f9s9cY)lOA zFHHY+vFYoj2~vCv9}m?1K3M+d$V54A1}%N3>6>p)KJ;Ph^-o+33=fX46z69#)mMIU zX`LuPvyQH3L))$XdH+|R`pLj3#K*_?|NDPF1}|^fSwWhMt)w~)6|3?yj#iYvY3u#U zz+k?5_Z0?4&i}vuGc&jbXzljryOSdOKilYUx!k$z`*f|fsunnK;giFW)5K{fr5eq4b7~gYAGEP z7#KS_xkU;zCM1>#7e(d>$#qP^BWE~tBtO4mJmGb}q literal 0 HcmV?d00001 diff --git a/webapps/docs/images/asf-logo.gif b/webapps/docs/images/asf-logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..22eb9d7358ef57c3488331845e680b72c9b7c8e2 GIT binary patch literal 7279 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 F{{tbU1q=WH literal 0 HcmV?d00001 diff --git a/webapps/docs/images/code.gif b/webapps/docs/images/code.gif new file mode 100644 index 0000000000000000000000000000000000000000..d27307b5c09467c2e45bbfcd1ff74989eb2e7d65 GIT binary patch literal 394 zcmZ?wbhEHb6k!lySjxcg|NsAg|Na>m7<~Bf;lYCk`uh5YhK2_Y90&`0TwMGlHulx| z^XKp1zrTO~{%OFIr0wCGk>*L_#l_fx07^78uf_y0eALxXeY&ZVS$tf_gsW5<=_ z#~&LR{Wx~~@qq*T{{8>o&~U}u`>TV)%Z7#qKR>_t`1lhio=8gm&d$CqCiY|X>Z2Pr zZ1DH@->~lav}tGl|Nm=XU^H>*6ylK%0}z1x!oarPp`pM-N2)dikZ=q-8iKhfFV&ot-Z?#bsK$q(mDRr`$3(c`=?^VUbBf3LBO?F*3FB z2rH&5?cP|btfH!>&Z(iPC8xdDk6A}sSMT=aD<1m#3{1+}>>KXh^JOqF2nv4n;e)*V JgAa}j)&TJ-upR&a literal 0 HcmV?d00001 diff --git a/webapps/docs/images/design.gif b/webapps/docs/images/design.gif new file mode 100644 index 0000000000000000000000000000000000000000..f5db0a9fc783924486176ce157924fba53df73fc GIT binary patch literal 608 zcmZ?wbhEHb6k!lyIL5&6|NsAgK=A*+y}iAiot?eCt%HMuEs*J8ujLw+y7Ptq{{K!J zf7q}4X0-UF?)+zRlW&T4U*v2)!e6yXwRo0{SJEe-5&!>cxrG=mdLiwZn4h0tkeBaZ zXTN^^`uFeOe|Y!)!-o&&&!6AFfB%LJ8x|~BuzKPA|Ns7#x-xkKyruV1%sHz7ZzCM7sKSh-eh--RQa&hK1ucJ=HF%O;;& z(71m>$AyWdcbfMc+`Vw!lBw%v)-7nyom8CNS*TU6fAIXF^#?X=1X{Rn{hEX8E?l^< zY2Dfj=YX!b$S}x&4#+*AxL{yE+Q87%#Ms=-#MIW++}hp8(Az(WfqCjw7G_pfW;S+? zK29!f9$r3v0YM>Q5mB)&afwAsB$uyTEw!$TO?uDXeKN9r%yRNakI5@2C^8>9BCn*Z zBB!dVrgo-TU7hjpQ4LKkZEYR#ysImZEe>aVg^r Vos(-!G%qcgJt^mrj0gvVH2@9_)ye<> literal 0 HcmV?d00001 diff --git a/webapps/docs/images/docs.gif b/webapps/docs/images/docs.gif new file mode 100644 index 0000000000000000000000000000000000000000..d64a4a18c405e2c10ab791363f9f7acd16f3d433 GIT binary patch literal 261 zcmZ?wbhEHb6k!lyXklRZ|NsBLfBy^&3_g7L@ZiA%eSLjHL&F0H4xB%K{{H>@`}gm^ zaN)w=|Nrz24bGiAckjXd0|)l~`~Sb8p~273FFrp0;lqa;Hf-?s_kVc*!TptFK^W zYAveoFcA_K5zXln5UZ$U78jG4CN@JuQj&p5NQ}L2!9raIDJdi4wVO8!3NGHP$Y2cs DYrJfE literal 0 HcmV?d00001 diff --git a/webapps/docs/images/fix.gif b/webapps/docs/images/fix.gif new file mode 100644 index 0000000000000000000000000000000000000000..d59ad642ba46c0bc1af17ebd2485722e92d6c70e GIT binary patch literal 345 zcmZ?wbhEHb6k!lySjxcg|NsAg|NhCz$;r#h*Vot2pFe-Xgb57|4F?V!*sx)Pf`Wp- zzyHC52YafE7nQ{H_?deNa@Yt7|Ns5_|Np=BjScHJZqShyb`oKj>}~Xa{jy+g9z6-E ze;_me7)uCF^D_FsZh9ae>;K=s{^BeQRBRf^&21nd@qhh{Kt8trzduj* zHV)$93F2e56B6$9w|uc@qp`Ti|35%m2ml=hAOQJ=fvwJ=K|nx4s{h22qR1Gdx!wm8 zv|72?TbvF$Sny2pWe}U_A+XHvXu`zQIrE#HnF2E`LX!mA98j7>H; OF){5sba63^6 literal 0 HcmV?d00001 diff --git a/webapps/docs/images/printer.gif b/webapps/docs/images/printer.gif new file mode 100644 index 0000000000000000000000000000000000000000..5021187b064c981bfa6688696d7144557468aaeb GIT binary patch literal 438 zcmZ?wbhEHbRA7*0IP#z2KM*i5+`E78+VyMa&YwHSV0i5Kv8~&-E?u^C&b&EOrcG&S zYbh=)PM*h*oS4i2RBAAXfq~(`fdfF27@+u*g^__lh(QOW7-S~{>;DBReJP%LD^{+1 zWwb0OW|y(&kV>k zoOo=K^QXOuJ0Hm{NahgWnfSbCS&!m_J#TnkY(62tR9SRN+sgHj0JFEIS?oy@Hx34C E05v70Bme*a literal 0 HcmV?d00001 diff --git a/webapps/docs/images/tomcat.gif b/webapps/docs/images/tomcat.gif new file mode 100644 index 0000000000000000000000000000000000000000..61756736b82350f64b5ea1b2bfc31ac57e30a3d3 GIT binary patch literal 1934 zcmV;92XXjENk%w1VS)f$0J8u9BOx8|@bIUTSMktri*Y8?)6=uFvqwTSxRM}|k&$m} zUC*>)|J-%bq#OVM0RR90A^8LV00000EC2ui0D=Hq000F4@X1N5y*TSF&na9eTE=0F zXsU9B<0{}PKjk~$IH$NSkmRDkjt2l5j{qL;bHo&qN=K|oO|=|D;;AZ0L=VX=cf2t; z0E?(g+|2R_2gi?0$9MsZxS9=g^A~*Hx%V1l1;r`f=TCCFQpUwJbcGuVNO5* z033iC=VVk|sm262%8iJ$T~RLNjfFUO=X z7y$9r1j~ITJ@%Cg5w5Vx0X#i0o;47Cm(hv??7-rS8NpHsixUZO4rn7Zf}q%;eh6AKO_#>7hkdO&B82UI#l<&{-#gQYYpCK(D2o$#mDQG+p=;6Rk`%z+Wd{&|Km*h)!J$o=XsD)mXQd*prmbNIPQep&1l&XMOM*vVNQRtzWwyMXc-cW=`PGZgHhL{^%fvbpv zs@m$Wm?j$PM+*33?6Jr0u;&1A=z@d)u3Vtn9vZ;@>QJW?5k>?}*}AC$v`t8>jR4iQ zn&_TCzJTJo*64v@no8Z1-Y3bfG^4BrekJFK@A|Re9UO$tPF7CU@s95 z4|IUOnF>3Umq}QB<{HNo4Q6mF6mX6QN+ydi$$zOg3^EqYv z*&t8Uy^Fh(2Ma*?*khk4Zm50kS0s(FarYV5H-JF-2tbs6?ui~CFimD z6ZMOn3lg}$vSE%dq!L9Z1aZLQsjgWKsgpW*?>l~bngdWhBzxH_MKe@1n0Fns9GM?d)eK20xbe0qYxKa%sv&t`E z37~t>5_{TPl|!J{giag}il^V0?{DX`8mDd3&BLt*qjsYWP3v54q^;#}DBg@0xc zngkPxE;R)b5x|B22!KhIs_=+A8R8|P@o)&_0+@pB?BNK4Qqn^>y0>N-6Hzw=LOp{O zQxy0z7xPTo&D_Z|0vPIHTeF!9%D2p=;EM;p%PGRxsZEyZE~rbHC{42?qKgV7K!5Cy zMzbiwips!xt`gr2ZkCN9hK#9aaA+Ifw}M9C52`oFr#2MIwXI^osleLLw}SR7I4N}m zmZ2sY5|#aJ7~;z(db3T(!02a#JaTCR9!*g_*D z=>o_O7fh%-H16tnZ~}>8i5vTTE_4H@y7gTl9iP>%3W~c!b+PNb)(Ee7$BRmzy7#?4 Ub;x?xOW1VGcfR$_MFao + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + 2006-05-09T08:17:21Z + 2006-05-09T08:37:38Z + Illustrator + + + + JPEG + 256 + 184 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAuAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXhH/OYHnWfQ/wAurfRLSUxXXmK49GQqaN9VtwJJqH3cxqfYnFXhP5Y/ 85O+f/JU0enaw769okbBJLS8ZvrUKg0IhnarDj/I9R2HHFX2F+Xn5neT/P8ApP6R8u3glKAfW7KS iXNuzdFljqaezCqnsTirK8VdirsVdirsVdirsVdirC/zM/Nvyd+XemC71255Xcqk2WmQUa5nI2+F CRxUd3ag+nbFXx1+Zf8Azkn+YvneaW1tLh9C0NgwXTrB2V3Sm/rzji8m3UDitP2cVfV//OOfmabz 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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + eJzdffle8sqy6H0B3gFUFGQwEyEBB2YHUEFwwJlJRJlkWGuv88d59lvVSUgICWmQ75x1716/7aed +Tnd1dXXN1fF6iuVQsjmot0J8mHG7vN70qFWbDEYxN2l1n3e70/FkhE2+G7+bZcMMdEqeS29qx7vW +aNwZ9GPkEXmYw7d951e565vTrN/t80NbpTPptqB1Mug1apPw+K+2X5sLXs7UJvAwciAfMKKbZWJ8 +1J28hOepwbTf7PTbqcF/YPyo6OYZzi3AU0GKwuOzzk1rbO4TjrK8jB3DnAy/CLwYluBNQYInDL6V +GTSmvVZ/UhwNGq3xOD3oDkbjmDv9T63vvqy14UnNXW11u4O/3alurfHtgtVG3nKdbgsW1qtN3FFc +ZfKcfyOv3o7hHXgdf8fm6Nt5D1rKrckEoIKBESXpy2reOB9Aqv7ne7pptTsEw4CIF78ycqXVG3YB +KWRRPCCFl0XtX7UHwEOehqJsmJdlGfAmhiMy9BMlPiwwjAC/RMgj5Q193a2/Oq2/Y+6rQb+lLC45 +mpQ7/9XCqRg3xzBK68202xrd9jsTWASHTbKy4stBs9VVm8i7uW6NLJT8x+o/lQ6V2qjdmsBODbrT +CaEUSZvhator1P5pjfQJroetfmVwR+ALiUJYFMWIWxQY5Rc2HHFLouyOMoA6ScEgC8tUp2TJtKwy +No6E42gTRHHvi7Az16NOu9OPsYLoDnHYint2Ouo09S2Lcm5J+UHWEZYM/5e1/ysAw9onk1Zf2eZs +v5ke9BDJY6Re2Ng+7Hp30FaezX4nT2C66VCBlfz9BvtRHHX6CIPrijyR3ordKTw6HQ2mw/P+x8Dl +U05lEScd9a/78MunOzWajj/dlcGgC6dtroP6SBkFH44mxt5L54C+9uPrA601drrW7Xbao9rws9Ow +Gt7i+Wweu3eXTgjbNGrpY5A/Z/8ufbPcIKi0gnL+0WxwizeWz/BPrz7odsY9fWBDi/67E0XARnVb +/eZ4Nozypw5YofOX1rh8sEzrA1idYWtJa7b/V6s7GBrQOGup9Zvu+9poaDcsQvfR6TcBK+VpZ9LS +N3rQGyIDd5c/a0NsXuipnBA4PcbzEQotPzgrvyArT5ARTv7ptsaug3x/8Hef/OGOuXxPgJLatDt5 +8bsPrmq9ljvoOih3gEm3tC6M+9rFqDzwG367cWn8MO/SuCLjfvgH/riAX76g6W+34L50P70w7ia0 +Pty4kIE9NF0HxRoA54673AcwLfxLAIQV6eA5rrFY6wI7axEginWXnbhBkMauhdZiY/bGt+XTYmoG +gjbTKvgtwHBGpC6skHRYZyNZRnmkHBsc5v+ozTCQqdFmcBVWTV6CclJzed8OtL9hr/GvTgOxURv9 +o/z9cFm4ArlI/vBtN9W+QC3lCQzedvv+0+v2oUMIf/SBgvxAQt436+d/1bpTtYPsPjiHOeceT/4Z +qk8PkqNRzQqCXmtSawLgvweAXQ+Av2qjTq3eRT1o/G8A4n8dhv9JLMT1Po3PTrc5avXVPiayNXQE +mTXq1KcTBDRIHgUX1xIb15Dn4ZH4H95Y6iXNQ4zvOIPp2+2P3xpg5wx6cZvOBpi5/9lt0NawuB3k +QewvuuUBHY7/rYvDNQRpyHFNKoC1A7leEYQ44areIeYk++9DlXEVi8TQHTS+W03n9fXB6vv3rU2D +/k9SwQq84N98WCiRNL/28cff/2sScNztNP6/EH9kIeXBdNRoEa/Tv3JN8yD/4wjizFN2cNOqdf81 +pP6PpcBzXM3MAfjvWs1/rFbzd6c5+XRcEScyYVbk2H/ZilTgF1f12eq0P53VbVYSwgLL/9uWpUG/ +uK76YALqYaH1MVEciM4rdB+kBoN/z9IWF/AvEbYgm/4fl7WbEzgbAt7ggMAWRsVd8pxl3TM/BnFA +uwu1fntaa7fcxcFwOjSRLnmhOGqNW6O/Wu5K6z8Td7bZmdTqnW5norJoMRLhI7MJZHdtNKkPaqOm +u4HBAjfrHmmKnWPP9qilrdexb31GGRFO4CT7rpwOgGNPAwCOfesLQnyx2zzp4vPJqNYfD2uwr41/ +YLpO0z3u/Fdrtk0a2mX3sDZsjeBhb9olfjdNWjMax8RO19PJcDpx39TGk9ao81+ko1sPtajgRebe +uWyNPx3eYOb2X6Mldwd61SYtWHmL2EhLO3/3QaUfAHBtdAOrx/3pstXsTHuGCV8MJ9+KPNX4CqCC +kOHEbbB/TEdCIxfAvIr4qIb55rATNkFb63bGpqZebfytolnUMDasNXWzJHnuTk4ngxn2tP1nDAeM +cX/MQB6RfqG/Wo0JkEy91q31G4t7PfcKYKzb6bfcEzhrdD3Hk9HgWzv7rE3nRrczBJJE581/4Dy0 +AW0Obwy1Uz/4qzUaooN0xl4ANY3BqNlqLm6D++BqMJl7vCrvcRhOp5YDne8djJqjcVhx4JgV74Vu +tX5/MJmtXdnlhU4aHsbjeQ662HHabzh0AXkHJ6ZJdQSML/9nGNYlpdXo0GEwbE4dOoydRmgM5tmY +qQOSzvIOgz6QyEShw6VzqT112iasyaonMOJ5lsQzNj1H5p7RiHXHueNnufNDZd+X7zp0AjY038/A +lc1dP2vN1qi1fLwuiyezNlnaCXA3Ia6bpX16eGzHRkZu1a/fagPj/2v5YPUOnsF5CWYGvPVXq2s/ +yEd/Eh5P6+MlC8Muze5w9DGY8RcrKlO69UDbUbUDS3S3e9/hXm30PR58fIQVdZe6+0jX+yl6TwZD +6r5d0LhnCLDpDPyh1TRDTdHdADVF7xnUFH3noF7ce+xLNJx6bbSMuLHfyBA9dOg6BGHQ6X8MnGYe +GVZi3YUsRO0T5iK2C262PlCKGsxZa2ZMOn8N6hNMZHLsqIiij0532RHDjmMMdjr0mZMfVr0ao2Z4 +Ahq5ppFZnSDsM240+ssOo9Jn2G38Y9BrFvGmdKt1W+G/KPt9LiE77DUYtbWxlvZRx7Fi8NhlOBh3 +lhMZ9oL9Hn4ORv+lcraoXb/BqIO5YA4DdkfhmYJUx3Sx5X01WTkcTJYcG+ypMztrOgNadFAPsEe9 +M+nVhmYRadebrKI2Vl6i6DpYTuGzfnXVW7qsY7M17rT7TugeDkdhYkItoxbs9AlMbNxaxhtJt7/p +uhndQksGc2Qi0Enfs2iUDwuWjAm6dTCJcE4cROSIU3eDOGClsLVsmnWeSQNWdOqqC4OozNl1NeJI +ZG27GZBkxaewS1NJC1nCFqGTs7Y/nnTVXsNh035G7KbOOOtnPyB0wZPZtfLxL/RF2m+N5lyCS6dX ++muGgiHlyGoGEL/dFjGVdJM4PnPZYAJRUuvsRpuKyryyO504WW3icNZHoA6Oxi0cbWS/YOw5/u4M +gVv2v504HCoEcNzbluu7GNQxvcywOt0TA52yxbL72mS8zvlP1D4FtKIxexGz2IiPa6kHRX3rdFRr +ooAgbyk+FTtDZPaO4jc4uFP8ASk7f4AKumrfV3RrybZP2c4HoHRLo/WfVq3/G6P1T+ORwRGWuGFY +o9eqP9D9Be5On7gcUCpbuWwWqc/3ZEg3d69B/1Z2Cq6hmMm9pYmN1TG6Lq3IU+uueT0NEKHrE8BI +14aKA7TTWmKyaOOcItbg6FQ+p716v9bpLpGD2juYtwz/5pZKV61zDojqvlXHd5yhIQncmcHffSWR +J9/pNw0kTvuamdI5zkols3mZpMcn64O/dFtu+atp3arV4V2+0/NvlaY1fc+5iOOEmFtf1r17yzZ3 +VPtndWzOv7UaMuffXQWX+ObKqDS9tAIm8U16RF4O+oPG52jQa1mh09r5s+xdM1KFpRuCI9gjVaCa +2xK1y4+i8gJIHudDXhl1epfoUXDuCvydsich9tRSA37GDQEl50sNc51vEiUGQajMwnN2Jrh5efct +BzeM9sI1UdtzgHhA39+D0XdhpqKu9l7KyU1k++bNuqBWlrphtNdS6MAoLPcdzfW9cTBR5jqvAIMR +Q8voWQG4019iAWtds716q3meThdHxILUpOjSU16e1hGNg/7kBo1EZ3hmqh+FCFW0m4ohNkelHi0Z +C54rmtKVIdNmKbLNL17W/rNED6UaodO31Ulp3lf01JTJb079OmqdqtKp6JyrD6Hqt2WH0ILD6xVj +LM1R4Us2RoN6baLUjc3MDuihrmqmdppNDtkc3hrW+pp7XJOx5btTJGGFmCcLHjv1cWHQqC3OAA/J +wVGsCJWm9GcAXqOju/4NM2b7jYEerxX0B6TUQufSM00eHpHyHKRdOBANi+daheLik2L7Y7HxoWZO +LcDpu53GDKz4ojmgF77M12Lgjik1Griz2jMX2UljC5oYyXL6/FyKZGDcJlbteAPHYmgnMfY/bGXy +F42PnL/EJRM/qVefcHL9fhy955lmvBXz9smf8fPx4CP3Xpju5TyBJ8bUFji5qx8wXHcSSd5UcpVE +bPgii49i79HlPQy95wZkMJgvPk6Wp7e+ZL/eHqvvHP/0kvn77PZodFzrn3bvvuqp98tSMhnssy/x +E/ZOymw3p9lM+uz5hQwVOD4aeoUxv1MKnHxOeAKIy0sBygqAHNWTweHVRSIvj4+ls8P7cG7wKNy5 +vNnR8yOTecxVK7mj5FHDCp7jof9wCBOchdLcztF7JjxN3Cajz29VsTpki7nd0kNXna+R3M18DP1s +snIxmeptLq/Smn/wT2Cci2kmfP15OBoJmQ7DiVvDxN1eeUfpzjLFWs4/2a1lgy9XBykxyG2p47wP +EqNRfFwBeIPnDBv6iunIiqdu0i2XdyzlJnfc6+B7Vyy19gMRT9p/LRyWYpXA0Y34OXphxodhviBz +geNTz64w5saXAM2dFD4YS6eC9BP/gj/9fqa5W83MT/o8erl8LpFJgcbmp4V3o6+R2Plr2HLS152r +gu2kYid/6rWa1OUdjQ49vtGY9Y6s1jqWiuyzsMXF9q0mHe8FL0M2k0Y+fbW9apZM6vIurFXwPwcO +uXbJctKt3KuwfTvsFqwmZXKpfMJqUpcXphW3d/oj/5E1goXqK5P7uCpbT3rqOdxlL94qlpOennEV +Mime/UUEc4/HlXcyKbufrGfnd/V+9Dw9LuCk8cU99VX5py7rh0lDQX1SmEUhpQKTUtda3NszTRqJ +9N6GdpO+jV4++xWbSRM1MZrbYV1e07QqKZ2839hNerbD++LP1pMeel7G25+tG9OkwGGUaUtp//HP +Tq9gNWkg3o0d20wa+dw/eUxcW08qVKtMTmaugMas1rqVa0d3bnrctdWkTO7lJWczqbjt/e5fpk2T +wizatDXmNPh+Zz3pKZPca/miVUv0TraDJ+qk1ZDPhN6TK+Ho2aWcVTb7/J2bW+vjIVOIhlic9HBh +0rPWQLyphTiYlAmZV1p4eqyZJiWzqGuNfjdzr3aTZpjL/RfZetLzn1jia3R1YzlpOb7Hw6m0Xqu4 +nW+VecZm0qcQU37zb1lPmj9rXT09+n36pC6vYdq7vX7bdtLyZ+m9bjfpKXOXHx5aTw== + + + WuC9Lu9tLnF4ZLnWu+HFlu2kd2+nWxO7Sa+Z+5N8Rp8U1mKY9vI4+/ZaenmxnPTl+vvcdtKvaqSZ +s5n0Gbgl8zLuhqzXevU17F3LEm856dt5qG876chbDnj0SVGKGc/qLZPt9C4sJ5WuQluexEsoC5Py +YfOhmb5F39RJ67zfdGhcXv9jobZPpuX2jn1n82stMO/7sSROemyaFIb9+tGYvnhgnnQ82D1SJ52c +BGBf5tfqea49+ZVJU1X2fJ4VBkfj22MPTppY5EnnIW2lh6xpUsBY/GxLVKY9YfMhEysMDoUrRdLw +O7F0fn7SndGoVu/jpCnzSkfJ1kCj3hTQmFmUR75iqqQ5iZXCJgRvDVrvFUWmtmpv4jxIZ7e7r4OY +1VMikSNn1RLbu7N7+5M5e/dObZ8C683s2jyFHdgNpL0qt2RaX62o6bkosW8a3ONvyfy0/7n1YPs0 +WjyPPetPF3Zf4vZv3m3flj5rr3u2T5Pc7mPD6qmqwxQC/RPO9u1C/fojbvv0eqtRP7N5Kp3tnh3e +jjWMfez9yKa3bwMdTT39YLdi5qf1i3Lf9uldJvA90p8uYOzeWz/w2L59/5yJHdk+ffe+RnesnqoY ++5oUh2e2b3/fcamS7dPed+741e4poKoUj8wwtvj8ghOOH2yfNvr1csHu6a5n9/x53x5ju9nkZb1l ++/YFd7LF2j1Nergdf8wWY5EzJnu0r6065oubznSgUhqfqE/T4UPT08r76X7S+FQI3iBDKSnGXDq0 +nwbdcjJ8fUm3Pyvo1EseHctnO0hZ9z7VWj5pxGzMvvFD4u7jtpysVLz3hEUlK5dNIVsbPXkDqcH4 +Sm8Du7I2etwjfC7GSp4rwsw8+/k46wlmbu49wbvXsif41qx4fE/+Kf5WBBL8TntC+bfIolFYbSdL +fFkCqNMBsE4H3+JOVP5AS3yf82h25YuUe5s81xLxIbuVuQhsR7Sl7faSg8wrkOm2vMXtHRWPM639 +rJecOzRnnjQsWvdzKT3R2pKX9yT9jmPpp6pjPzDD6js333o/l9e257730DNwHFHcpl0L2GLRG/8L +xYg7fT7+RtHPe925rFGsRdxGod6gGHHvvB5ua/22e7n0x4V0cHnRisKf+9vJ6GOXV2xkPwjHj0OF +Tpgx101Wkv0ccxER9hWyQfcHWMsRThe84lZVuMw+Nn4+DjpHdb/4KBbOVLs5ujuaCeB0cvBz60cO +s7glft/JU3c5eGhLv9AAt5WrhY1eBVvwmFz+sGgCz3I3hKvMuxVwhFvq4FXfqMA73RFpgDstbT8a +dH478KSzOWKxxV31ZjlwQGPK1l7l72jAy2ZvczPcZZLl4PcODFCqHnS2Y8G5CQKHZhqLGUBh9yKv +mY9KhkeQBVzaob5SNnjLhvRJR1M+zVBMCjr//LREO15z0kBsMMnipEOCFoabJj7Tn8Kbui+gah4P +M9lGsSJqbsX2NNuoth6UNo2P5zPnzSPQlHLTbjReui6ib5GbPb3B38AI/5bPAergdy59EiuTbTdY +FuPA8XF2D6At7yOMYbLq46GvOVZdNfMORmWlbW83ebt9hFoBs5Usdz2jXFa6OVAHvWr8BI6LuwOY +BYWZOPGxp+qLO82MojYDZKmDz1bGq/wAOriHwYqiam3BfLMtIcvIoJMhN7+MjMGrQJbhNfzAmWPv +P8WYQbTOgfezEnDkVC4Fr86fWYFnAdy+LXC4FhW8MQ14hEIJVaojXkh2y53q42m7b7tg+HGjLFfx +3VgsF4yrwvLlulbZjb2tNUlF5ckLu3Fa7CERt/EgbStcR7wgauyddCyf3hbBctr1kh/c3glzjoCc +z4YqaZyvKELnpwzsCxhId5T7S0F8A3Y/9ZVjWDnyleATj6jB7fpmvosK04Rd9Xq1H8K+eiCJy2Au +AhF7H43rsE3xEC0CXXSn7fT55zcI1LVxFYWoJz/++oDoCORSj/IF+i3nULgSAi042o0VR5udympw +aMYyM3xNr8fRsgjNqY4RVSJb4+Q0v4sz31jufvb5emLaq8jwQC6a9oqwd5fXlsHPjXjnoRhR/VF7 +yCCCzmx3/zXL78Tzhbm92t6z3KtWMbyr7osFxk5ipcvNYCwToNzJXZfKD615w2sWHQX3Jvm6Okgu +LwIVpgXKASSwWatWIFnISic8MU4gDQJHugpBWIFyXi6WgJcOPy3F2K6uihhPL3FeamC6vBbnt7xE +I6lzCyLf+fSSfbE8vzkrxcpi43Xd6omMqAbW5sZzeZURT3zZPBUpGYTMpWzNI2G5CmOenTqiw5jO +nU+yVv3mUG2giNrWJbcci3he5mhCXzq8PTmdLX2ojy1VdvcuTyvPX02GTT23M+Gb26Ae7iczw1C3 +I50nqbLSSiYtV2PnRnwYL5dxLu8cITrrWd/SZHW9zeVdOuJ0M5rgTIp9yx6qEY/q+/o5sKJa7HyK +3v0LM082SXYa82JuXz63N70v8s6m90Wmsm5W2RdppMhSJ5UGjVCCVFXtOrXhtM1TXWt1eZeqXTRM +St3u07uB7eYAT17nGN4tCJmlqHR5nY/hiK3t7J39BpUmHQaQSafBroLK+hilmKOWvbJhfmsSgzN7 +n2BnckxlXNKpsWe6GutAY7pqb6lscKmHT7PSaYUMl8HosN79yQmVNbn0aJowdkLFPuiM5zPdeP4t +xqpbu5vB2PGYjvXMrKlFDV3RYYAcTsv9lSxHW5BWtpGtzQYEqTpcCSQlwmsNFBVfoQDpbUR19uct +bDulun1moVQv8Y/NLOxyfD70dKMNe+hLRl89Ye5lXE+lP6Nnw0w+/5PSgjVk0q9zprlXyxJkuLz0 +RjjJFrIg55dx34EBuLwWODmzwcnX+Yp7pQHnMqd5auBNHNSSleSey8u9TLzUJGBlZpuWu2hk0/iU +bHdjEtijBc5FsxuYg3C7qgfIaN3M8eQTX2ZixSDWJ75PbhZ7XUUu2nD58+UuNKOmREvOq7vQiAZr +YyAiAokT7TcIJAxu5k9WtY97eyP8hL1YMGcoXWiWnt4LkxNtTe8LvxPz7ZC9Aj7m7ESjON0wYtgs +m/XxFnbf8XT3LlZ3odlgbN6JtjbG5B9m8bys46/qXVC40Fy0QPG/caGpUR4FKDsn2sp4iphAAilG +QfNzvpI5igezgcI561qmOqgpJ9eGIOJJrDixCyLmkc6zlB5FZ/89UOD2SttkoOR52hnmTT4um2NB +ZTKTUwkjvkxTeZqDhj+WSxX+5DbmM+0V6JbWrnT/LuECdhjzbwpjFnJ4HcI+ufXyixHedRgAgPSx +9/NgC9JcJNERKPNpowXJZO8jUAvi1tYba61Pz+2fxypiZUtZ1j5vC1MfyWc7btLQdT72ULY9uusE +3k6LPTb7Mj416fxrBHPSALdg1o+s+RitzEXCPqDWLubtdEtZiTAe0YTWHE4voo0/uatc0u2+E9r8 +PmcPPM25I7Sx4M2jXd+8hwRWuPwQ0x5h3ES/brj9msb8C4FxC4pw0UpfMiJtlM48noHGLGIfrz9L +Ylen5T6toHN5KUQd7n7lN+GmmY08B+MqLNPrwDJxPDgvjrFCpxEtnBqob/p1Xcflndd20sARYpTH +giJ95OGWGCmEJ//2bIy/HRjcjJJpIyPAAFZXeHAtNioPwugQIaTkTrd4XjZhqyBIgUX/prpIrLBb +gaVgrk1w9fXNPIomwlj0TK4lX+4GxFzZEI0FFnmN0S9AMiHnA8eOfBPR5hjlmQsbu+hNF8SibeAY +xZL9hilnf6WIRxoenI9W2jU7fzLAvWn75eFuo1kEAKHJ8WCVRUB3crLPz2YHqi3aXN5l5A7bvREj +BuULUMeiH3HN9Vkn8Gj1lSvwvjsr7+HaNLZW7p21WCYV3DiiTbThN7EGZGEBIpZdXqtMZmAuBUqc +0IhlktO7Ce8hws3ScRh6sfz8s5JYdjl4IhBG4ddiWeEw9xsSywBSyEos28Qslh++2tblatlzth4S +WN+mxPLzD3KYTfgRCbJsxbKuw6wqlq3yuezEMkpkLcePTiy/jZaI5ZiPnlvSiGUA7snJWG9Nbg8s +rSS7wOrDg0Vm/9JsRf1sl+O2PPlttHG5/7BZuf82WkHu2/mr5rdb3KgljnlDNLa9YTw7Xx9usrMj +ZEY7NA4/Jb7vfPZpMl2tvH5c6qGaJF4/l3cxMv9Q3azXD/OUdL+fDcGumEqKKoSZ9VhERqhSSY1k +kXr43lq+k2pkhNqtCIDSOpUNbkXAmE1oGGGcmAP/zoqMJYtSzn6VXiLTkG59bFKvl2baL0tRQtwd +OKrXKuXMPL3OZz/18OboZFhMTCdYnJf7qtjSdYpUrPMafEiWgw+D5E2/nk+FpMH1Ap5md2iZb8vi +xm1PqF96c3mxejrrCSX5V0/oQs6qhdMXctUT/Pyq4I8wtuWw1DpN6q3xBonDZPm795Ft3J80cC1Z +rMisZmrl40LOPzpD9+rOXi7zHdrCKmpB1ZSUAuviWaWYDYz5XV3Sikdf9fNsPZRYLLa9OrnR92pJ +v+IBM1f3at+zFCtS9BtN38Mhq34u72LPGEsz81bu1XLExX7NA7q1bOW+KGce8lRrwQuyIlQjnoZk +Qz+7StnROBYYG+4hsS/kFR4+C7P7CewKeQ+3fLaFvBizMGwJG6YAL3AY7904Aidub/+I02c98m5f +Z/xEV6PdcyggV28GY3KDSoUCvN1C67PpXATdMgEH1qtlfftV6YECd0z26umUYmNd3rnCf3vwSmsX +Ru8fHRhojLoeG6ux4ytN6vIa1o/3Da0zqeAvKpOqroXCQyKW89ZUGJRYktgflhOHnckDjn2bDew3 +w8lr9uQe2qZbJhVrSTgmNx052vu6OWCvwVsZTcXdnl0aRkbX6hwyh/cpyygX6hnnbT9DJNEYMLWv +Gl1wp9AAZ2clFXcXsOxcqGILHHKYhYKt3yTwZywMroy5sn4Fk6u4R12XQ1fDu6gTrkYq8xHe4u6A +LkccmB5dyXJghXxLGuKjrUyZVwjtq74tAtoOCCT5lsuqvqkSkp0QiLOoKFyIBv7igJgSy5ZU2C1B +oBVHqwb7dhwtq9wISmGp0nG0atCSMa/ugX/Nru6gUSq57OLtMOJGEsu03c8+Vx3sXCofZTVkmYq3 +DsZWj8lYZ9pjIIXWs+NYCQ1HeANRUQSJMvJOA5RTloS9V8geY/YRiOX2sNXpVXZfO791bmB3fnO/ +Ob0WOSR1jio9nDqMUue3qHMUKUq3csSvZ3Xq1PtgLTyFzj7mWo62It5lsXTHCh7QtxM2FTzNU72C +Z3nNCH3NqWNRhjqUGk2gKpSkUist9TbLvL5Tytt6qEs5qXXL+XNgX1tsWcA4x5NpzIu5fVmUPr/e +F+dLgFbdFzqVdaV9obsJaJVqZXPYCj0kv7mcCauVnSuZXKsdQ0rl1YzK2W3zVoeG7k4gClSqOgwi +0zH6uCoq9Zqm5TWJKxvmk+MfKzGo172aBeH6hvnk2CwG7Whsptpb00H7bCWTY3anyg== + + + wu6fUTK4oKJdvHOv77ZHU8OYhfm8tvE8OTGL+bUxRjK1N4IxOtaj62N2xDDGU7kop5dYjvYgrWwj +2wK1GBCkAsngUZwBRcVXKEDSbbblZ3/ewrYJUGKQaSFlxto/ZrKwna65GX7YX3PzMm6bkxhcXmcj +fEkRNOU2uSjLZH/MVudKwJki71/ny1NNV1U/YTxUc2jvhXOq3+JeJj77GxbsfUpLarRXYS5OudZY +tLyOB8jCulF48vlyBrH6ck1aiOXtQBZycUnJMoU8cy0e8SUIdDjitgi01GDPraozV0TgnO7h8qrV +mezF2M4Iv/i1C22+sp7NL5gf69X1Utw/ttLphhGdXWgu+urMnRhrvuJgreonwJhDSRZ9JTR93oVT +2TF1FcbyGw6xEnoThV0uLwL1+xxUFSQbF9oKt50Y9+9iungVwpJct1m2rVOe1oN9EBFLQilreaj8 +9/k1k5mNGRFaES1Lk51EfRXCyW10b+Gum5XuEzVV5tpehbBaLU9+zTxmK4x5Hd2vlJXQs6sQDBHe +Ncuzac6ai648+5cpzKq9j0DRJIFSpoDmrSNWK2bSWSYuF3u2GjreBV17o6rGpzu4WFMaNitda90S +gHCvFLYy1FjZlomWf51XvFApvJHbgBFtiSnt7juhjTZ25aIqX/5tPZGijZNiY+p7ih0rvReM7LVp +bKWbEVzOhb44In2Zr6U0V2ZZLPT9avlsv4zANHePaOr4dEE3k/u2NxB8tRwvTHYMNyla3wxGjr7e +XB/Rtn4dxjugvrfHdkSr+vWRla4zu90US1QXfFhWx4IqfQTFpCFErHGY9eqMaS9ypo6MYLVrYbqm +wmNTKbwYa1mzuJffzK1NpHh5wb9pnWlPU77sfAWU7fpUzq+XLzuWKlBXeoc3R2M2gWNT2NgQ5XHO +08eqb6c6TMtUApRijiUmoK8cH9sEjkmBqpPPwbVCxOO0Olxz18z+5PRK30Ogqv/Y++E2mUWQts3d +mcsioDo51eGiR3Gte+HSK30UwbF4+W5Aa/E5rW9Td0Mpld4L3sO1acz5ywj0lgwZj13re0mOYnkS +WHYXNGiFmxTLYCjSaxfLqeieQizPqjgpxXJt640yZ84olpdVCm9GLAPaIpu5S40ULy8Ry6abJ53K +l9cUywseElK+vCGxXNu63NDNkwRZTmIZ7f3VKj8BbSuLZWqPYnFZPhcpZF0ill1GK4pKLL+NVq/7 +tF7LfC3watmKVnWfCzwZetZpvlpEL/djPmGjch8g/N6hlfsUt35jzfcKdZ8UlvjbiD6J16buU/X1 +kfp+2spP6rrPvaM71vnsr5DpOuf1q49NXr85ywJLWTfo9eNSD82p453DK6aSYuG3zXUFhsiI/YUF +NmRRH9O6Falvn6tu+va5+pjarUhzXUE6HF3h7NOVLK9834X9Jq96XQHF2Qfq/+11BarcV8SWzhuO +xRKfvBkkaqluNN87DDCZV4tjMftQ9eInqX03O1GsmC5jxXTB5fWEpNCb5Yeq9ytJcc0PVZs+U+3y +/pEPVZs+U004/+Y/VG3q5/L+kQ9Vmz5TvXwta3+o2nYtG/1Qtekz1XgTxR/4ULXVl743/6FqE3Au +7x/5UHVg/jPVsJY/8aFqE3DEB7v5D1WbPlOt1b5t+EPVps9UY5baH/hQtWlS/Dr2H/hQNcJg+Ez1 +zKuw2Q9Vz0sfowd+kx+qXjVz2KGM0uZD1RaRRINm88sPVdsBZ7aSaD9UTVtAPqar4V3vQ9Wm8Rbv +6nQ0uWg+VL1SDS/dh6qdSUVZC/WHqqlLluc/U22fb0lLfJYfqnbOt/zth6otEGj7pe8Vk8eXIxDv +7KK6LJP2gAysvrFjVWFHjcAF14nTLQEOZu+y8uwNR3lsyrMp/HYLX5Te4P15enE27dcZnDJLlxdn +r+KDtSnPXgdjm7ky11Sc/ZuoqFqevYGsG4rybAqQyL78rjybojjbDmNrOq1sirO1L0pv8nKFxeJs +my8ZrVKeTZ2j+KvybAqPmm2Uh748m6I4Wz+Va5dnU3A527XQl2dTf7X8V+XZFptoLs6212FWGNGx +dtFKiq1Ynm2gWrvi7CX7QluevcK+/KI82xKL87GGjeyLo/a74l2dVuXZv/8CO015NoWyoX+Vae3y +bIribGM04beV7vbF2evdaj5Xnk2BSrv85BXKsymKs1eOii6WZ1OUGlvl9a1Ynk1RnO1wLxxNeTZF +cfZ81s1a5dlrY2zFCkrH4myn80JRdkwhpV2UQK1YfWkCaZZtu3559iJIFnnjvy7Ppqys/2V5tnNx +tjHXGtfaMicOUq/U6uad2bezre7oNn49m75Wfdm3s6m+J05dNm7HmEw1VrTgrfjtbKdM+818O1uX +yNZfz157N+a+nU19k96vvp1tpcEuq6OmUmkWlmv7bfRPuotcHAvRSRU1sffX8Out9u1sy7s6qRFI +p8jQ36vwuVAZR319CahDBj9//s9VjNvc1LrhinEKL9wGKsYXa0X/RMW4PcY2WTG+gRsOKSrGaW84 +/F3FuDHn6s9VjNN80eD3FeMuh4SjzVSML2YQ/YmK8VmFnWWx8aYqxvVK4SjlQVunYnzdb9itVjG+ +HGObqhjH/OT1a6doK8bNsdc/UzFuWVm/8Ypx+rsIflMxPl+V9qcqxpfljm6uYnyluwfXrhi3/VrW +RivGN1OX5FQxvkJd0i8qxhdy4P9IxfgGaIyiYtxFL31/UTE+R2N/rGJ8lW/Wr18xbvPN+g1XjJMb +QTna6Oq6FeMu7+I3zzdfMb6hGiuHinEDJdOXpq1cMa74+uxUnk1VjCvaBb8ptNmUpq1e97pOxbi1 +72LTFeObo7HFWPbi3YMrlqatWDHuWsl0Wbdi3Hxn15+pGLe/qXWTFeOz6qc96vvX1qgY/81dN/QV +4y6KD17/XtnQvlpOUdLyi4pxu+/ybLZifDmNLVaMr1rfPXc7kOVHHzZXMY7f4LbKl95sxbjyjdTf +524trxg3c5g/UzHucvZEbKBifMZh2C3ar5KuUTG+5t1QK1aML/GQbLBiHLTxWc34H6kYJ2LZ/gsg +m6wY178AssK3gleuGKeIjGygYtzCSvoDFeNk923LiTdVMW6oeqZ1WK9RMb7eDYerVoyvZImvXTFu +cUfEH6gYJxVDd5v8NtKc10+tGHd5rT9xv9mKcVjLrGb8z1WMW0ZGNl4xrkdGqN2Ka1SMk7w+20/c +b6pifHb20+Hon6sYd8i031DF+Er3j61dMW5z/9jyivFFPC2pGMfacPwG95+qDtdrw+Hs/7HqcL0f +YuxPVYfr/VzeP1cdvnwtm6oO1/u5vH+uOlwvtl380vfmqsP12nC9amDz1eE6cHNfYd5wdThdZf1v +q8NNlfV/qDrcsbJ+I9Xhepk26Px/rDpcrw3X5MufqA5XRUK3PQWM/bHqcF0xVK2kP1IdbpcDv9nq +cJMO84eqw80+pT9THb65L+Utqw5fo15sjerwpV8v3Vh1uF4bvkZOL3V1uL5cy69mbKg63CKj+w9U +h1tmdG+8OlwPYzvUWfyqOtzKStpYdbiGO6s6iz9QHa4jw+VIT+tXhy/U8P6R6nC6/LHfVocbswj+ +XHX4YtXzn6gOX5ajuLnqcKcI72aqw/XacIds219Vh9thbLPV4XptOE3m8LrV4TbZgxuuDtdlvVrN +8Ueqw3VEm+5V2Gh1uJ6M5PL+uepw27VstDpcrw0309gmq8PtdZhNVodbSbHNV4cv2ZcNVofrteGb +3Re7T3f/Yl9W+HT3Eovv19Xh+mZb6Pwbqw7XNxtj4n+qOtypinMz1eFzttgfqw6nuleB+SgIz0tR +afAbqAs3xpENCRIur5Yi0WvZf8A39fC6+gdAz23PfvtsU4W8lLdq6NLeUsOD9X1TfQH4nXtFz1Wn ++MA6kFLq4cd8K/ZKpZwLGFuxlNMOY7T3XThjbPHm3xXu7Jpbmq0JvxJIJJL4RpWO5Py9dFtmZZ/X +Z4unFYtI56xXE1Br3OJmF+giX2Cnrfek0PlxpQu5O7jSOZ3fwlK31/RPfJmRnaZ/brLTf/0V5uxC +GZoN56er9l3L6Wh7EziAt2AU/8bpCON5V/gyi6PT8dzW6bg8D9Z+N/ZWOjQOVtL5eldSLqust0gJ ++90nwGcC0eXdxM0Jnwvp7fMItPkO7xIELknctkWgrQ6DxetOyWHUCMRZsHjdyZ5QcWchIS0yRsft +JbVv/I48pKlsoPPB9i6sdn+NrMCLjX/172KzXzQALrFwsNcrfdbzvX+LMccP/tH5LbF6ekPfSL0g +Gd+/zxsnIFmkelvd1EqBJ0c/03zKnlLLY5eihcXrv/w86sw7Olfsxp9UJhkb79Iwv2aWt7UPlj+5 +DZhvgFlnm2IlLSrqlFNHK95jJftjtsaN0/nVE7xtMXbk3wjGPFq92C8TqfMUSWR0X/xEoH6T222I +8eWtfBtr4skUNVoe5XFS8rF0nSYd0LV6gcZwScIClsZaHNy1b5zGuBB1kY/L61RTTCdzl0vcue8j +n73HzO6W9S+KwNJ17fQaIrxrfWm39kZzwYOLshSbSvDakrj+FWasW9/EbRFK1fr8EV73Vg1StR7c +HI2tKn2tZK9uv5AR69Q0tkLyeLmPPNnGj4iOHqoybmdBp+9+uW97HdLqYWyEcF9nmY66pWFEuzIP +MuLSa3VcXooRLWtT95ORI7simFtLD8n6sVAQkxTizUVzNgDuHA3x2TruF+ssgAHQ3j1DVZu6nywu +3j24VvnY3WB5berc7juWYu+vaT6Z/MmEOjZTm4rl15qz9LfyBavWnWtTaWksvpAgYXYiLctAsPlm +vQXfNDtCKArlZoFxwpO1ezoAj/u2yaJs9jlNYxRa+Rws13K30lVZSyuKKb9dSx01A/N3o3fcIYyr +3fdg/33ku5Xuy1peiK1V1/76kga7FCVLi8/5S+freB+svl+JdetrXZplhSyrexStXKSUH8PEEe3C +H1Y0tsKVEbWt0xM7sXyvi2UHbkkplp9/lovlFeRLbeuBxqtpJZZt7iGB3ac9dzRimdS91jfgc0G0 +2Yrlxd13/Hg3taavHz1Lnny/MbGM5dcgljdwi6ZStb5ULK9EY5eOFzzYiOVl36zfnFhe8Chi2DVo +K5YBxlsa08wklu3X8uAslqkrV3Ur6W3kqFgtfPPcuX6d27TcfxttWO7HfLQXSnjnIolLyuv7v7xq +cd4Sf1jBEaKOaIs7kxuEourZWUxi/brz2aepYLfw+r15lnn96oaPECy3xOm8fh/psIONiH4YmysX +lpU0fzpduDCfgeuiuNOg+mu34sI9ilY5Sb9wK1Yt8y3Xvn2YlK7TS2S6z50fUKvXWi2PjdiyTC1a +48KF+bNfpfHzr2JN6kIL8y0LQthebL2M2w7Xg6nLWPZdiHnr9TZ2YDsfRcTcdr7ZjTqqxxHxWKhk +6weNXrLfCA2Ske700iQDyFSpbktkEoff18+5/d1rjbk0kruZj6GfTebvHwuzfQYrSQ== + + + r7xXT5G5+/uV3l3vrNRqqTgpXKe6kodNX92XWrnD7HMY1nfvy/lLXDLxk3r1YWWKYg7MWk8aORyx +mIhXSlOsjz6TQp7dafY+de+ZP1zFTCNWa2Yb79niaMSNk5799qh0EPLGdvn7y0gyIgbGn+cHg2nN +5d07a0ny/snTzuOW53zi9yRzNwdb1VcxtlO+3854v/vlwl7rcxgSy4Wft+h3s9BOfL9ffeZbZVm+ +ej77uSuzw/xH+bPU6d6eHlxO795O/b63t3TA/1WNfF33ioH4h8s7DDwmJiNv2bc3GvE7nq1Ba3Dg +ZXY+4/7HQuMuIAcufcc/O71CjHu/OUoyh4dbo9FJrOjZfzm99HCp624g3hASTI45OWZylfscc7o9 +uGJOr68+R6POSWg0/TwGbjneC17Vw3xBjiXL2+09UkIO63vOhqKF3S8pepLOp7rRUoAUb8NKKxWA +odUMWFy4YJHnoOyky2t55YK/05U9ga5Qwul5nXRjXG2vlDgMnQlKQfte6ufGGsddVih/3u78jBJ9 +8crl9dxf5QMOKJq+h3f2d70PxR0p3k15i+XTi7338vmRIO9eirCqlCdZOaifYIF8JXB0ELpH4KKJ ++MtrN3Ph852Qr2NXS0z2Lvo2Grcvthmu9LydjL4kWpnz3slDIjZ8OTR58oFHXv5kg9I4LBcvSp3Z +6TXQOciFYlo/FC6vdixeLnXxznDdyWH6U7yuwl6NX5OwF/dz4zx5rcY2433/JTf1BD+/HvC+i7vX +rCd4ef/g8YVqW3jLxQX+iHtCSb7oCR3svuI2HXtC/dKzJ9AIy4iOSPKm8ryXrTPxKBk7es8zTXLz +Bfkt3notfgL3vffBqrYP8Tbgs4+XTGs0CiZ7g8IYVnX/g23NXDrl2Up8bSe76U7tgGWY8ftupn79 +dpWUgsNBIHv3cAadH7ZgvsA7ov+ceztrBhn2ddub6l2/SLl0clpLDMdsXfvi57HYCGYbje39RPzi +G459Pj8hRhPDTSfbidF2c5QKSd0rht3zt5Plxt40WdqX7pKDQbiAiuqOWM3384nYdfor+x5qTxKH +J4I3kyrcNXAtUZc39/52PUxWMo8ckHvwKPPBVPFaD5kla8U/3xOHomeEx8I/a+sd+hOFcqrb3wvh +YLe4k5HU90/Mmyold8SUMAk85XyDdzbzEXq6Jpz/XQCiak5wnGrm4+U+muomujyOSOJBnvTnU2Ma +uwzwT0gHeQI8kFfoIpe9vJNynuBNLvfmf8qLk+FrEfbqJAiAeHynk7dhHVb1ICBPvpgGEvGCB+/V +3d/O5PNnUXh7Ozw3jm9P25zMCBc+zqVboaeUEOn7CQloe/rgTX+Gzptn22FvVN9nPPvv51sAfI8N +ZILeac53dn4eu0pNnzLn54ldvS3e5qrfqbPb/o8yHzethmCRzS29i/gofj0lbz7ao8zHwc5btrH9 +fUKmgrUAAP5c9uc5ltv3BwPiduyhnG0ED0Nzi7ziYNJUn7iOdBhT35c3B0AHzyO8iyBNeFvmI3Uv +5TKRRw4IqVrIZTk/6DAGdHDbb98JPnXwpfzJtqMDgDa9bVhQ/vF0YAD+KPdzRnYNtuSplBhNc3tA +DNU7hvdsSZnw9WeGbCLoYx+9+E6y5Km2YRnRi8zF+3gX5N3RC8MFW92UmLj/IfKVYQfVLrCmh0ny +mg2V1c1pDktkf9UuqXorcfdxew8Mda+QKlVPGYIMQmMfsIM3vXLu+azQSl6nU9VM/txzt/CgzVyQ +033kCwXfxWrhNpF7be1UM+fdwFXmYzA6VhgXHy/vptqPpbv4x7SYRsJ9hrOPh1PRrggLm3U68k25 +99PDoa+We/fHMhhuu1ZhfNr/zgY6jxNxO339tgCS2JzAvpzswMjnfTwvd2Qtzy9HL/nsQaYd8tWT +khgN5zLVShDQFn1iuEk8KRe97Yf4RapxnzsZnxZz73fVJChTFQGPVCpZDu1cpi+P+mmVWzQK41Sp +dH2bavSnr+q+SP32M5+tlx5QF8yHxRPx4TSdvREmKgnkq9108z54n/kojd+QCd/msuxoJxOs/eAK +HkOZg9rhbqzd37sFuCK+TGt8Iqi48wgyUYJAt+S5wiT3FryLoRpbMpoNVr4prnAPxBmXcP+KtDOD +fLGYe+WZc+nPaF710CJHAz6dq6AElMXbI7wVMHm7G38nnfAukXt85yLV9VYq6XZ77AG4LyUET8o2 +Iu/+6F23cKqfl+hd6akCP3q13OHp0ylhZqQtdtWOd2KdV+kDHrCwFvVAAgCZVmfwdOo9ff7K1ivZ +iD4YcLTUrfhQG96R7UbiLGdaD35+9ud76ps78mhC5GwPr35pprrhmwBYQS9+QmPZXaB5IZvztU5e +koPP633VAtMfNL+esrVaRD6Wz7mBgtnLs7vvxOi0B/qD/7WUCd80OPJ0XudPI59+gbW0PytvoFsn +jyx02ZjBLQ5MagtY6+1OIj7oVVPXk9o43op5+4oFdj4efOTeC9M9PUtAb5vd1nj80yNX1YDiGN2L +7Q44ARTjn7vEwWQ/E5AjwiH8dniROBgPT+DB5UVmWitew4Ojk5y8c9NMv1xsnxEFK3oX2rrMvV/u +RlWn4zAJVtL8Mb0GkLlptvF4RITjDUixwxGezw7uwTnoAjxPfBd44ivkyEXjjYeQqV82sC9+iEdf +9fNsPZQ4V7I7duIfZweV5DUzvERCO1dE+bTH12HPfyrkphhyKxdwgYc0UWjhnAs+YKg/DaJsHIbe +cwP99i5JHhx8JMuT4TSZf/RLsBYkP0PrTf/7OVvf3X87O3rm7xV1+PrH30hdT/d8yMzOMh+vW99n +2zenYeDyz/d4MdBPznfx5QO0DBh1qGmJUCAcXCZ44PKysOXHMJjMAQNsbwMf37uA/f3ZBUWm6kve +dIf72cb3jwwaUDKEU3WIiILDEHwE9p/YIlRCrhc68t8HOgQtZLnECsTPI4XVbFv29DWMBS/ZrVw2 +44+aepqdFWyl4wOQmE9QjbY+U6FYZkdhlLMfYBS2PDDAzVaydNX6grMvtKeNeRLA+wKkQeZi/2kH +hmgNDVpfIwVSG9EvC29PN4fBx8xzLhMUAwb5eXJzeJ/z7b50svVyfpoNFMJKpXDKm8mn3vncc3On +TXYf21hgAPEJKMHXHrmbazzHW7f+TqrxszVSucXO1jjnL3ZigePo3Vn6/Tu1n2m9Tx9zb5PPbiKW +89ZmD7ZcXmApL8cKD3kU28+gj+UN2gxYP2I0l+kGFUGIBzslTvKTo9xb98CTiGXjxaQcz4e03Q0O +QPdoT3PJXiyo3X7Uvp73Wq9iNhivwQvtJMb+h61M/uLxPc3e9sY5z345pD/AL0tefLRhzyPRlBhk +H3DEi9Q3W2tkcs+X7Wzg8/URT+A78TilO1/iAehM99PoiD/rpAqPgwc4i7FnEOSfO8Ajr4RE7Opb +Tl0Xhx1QaWK78tfI8+TyqqSksLAPJtXtDUPK0dUV7MdGixmNjg6wyzZoLh95llC8PphisOxGBvr1 +WFWQcjdbOX+1OAEau06HjomCiRufRMM9hBYKo8O9ON8ooHuzjnzdeAfw2fYkfpLbicRhsNkkl34R +X8H2jzi9dHkNyuTifEXDDVx2OFHuvkrvnGRtVwq7r6z1kbuwWqvFzNuOKx3sm1ZK/DBWawXb3pva +ySxdaYl2pWBX8udPPaPF0GyXTLhlcw+n7MztlIpx9YMO2mw1NCC+iDwj/EB7UM+bpB2efXgeb3u8 +X9lG9Z1LdS8OemAWHkfQ45jCjwsUcu+xgZDzyaI/GwoMhrqNddAJxvAsPsqJ+5J3y/Ld1w+s5AJG +ko/GOunMJ+G1KPJ9yDyD8Y/g6DHdvLu/VC3e42wQDTcZTIlTwGKd2cl8fJT4mR3rz4TD58E4c/Lh +gS4Hr7psdnnl67v2de71eaAIodgV030Tpzf8Pdj7500Ypxgh3hC8bxF08OHTa/K6cPaIqn0p984l +IwqNHcZ7Nwx3dj3NnE6irVQkE7rTnwLG4o3rS5BExQFIIrkGnLgxVuAhasD0nTXc9mcECeSnPUhP +I5CzM5BA5zcDlRmXbYEKxLu3V6uDhLtf3O3ZAKXcI3lli6f52wqvwIZ6207ExqEBbvxZNnA1qIBh +cwUWX7LYK7dz6cZNGv0+j3jkuHTnKBWwnPSmx71qzuLMOHMR2N9OCfdcCk1PJlke98tAVAfTufUl +eCLF/FOQKhcPZNq5Sf3PhnNnNAA7JQWpuWSmYYlyBanntQcyKdiVxmljrPVOT45/aHd6YVKuXTJE +RgxoxS8bF3S0Lq7PFqkwaeJ+v0ZAgmMWfCVP0T+mPce7Sp8VoEr78Wcr8rICCXSh70s7kF4JSGhZ +2AGFmDABpT/FOzhfaEGC86IDdVKZXC0Hak2QXN6VgNJBwrinn5YdWZz9ZQxpTXZEfH3V4UrUbzpy +6oGc5J4tJ8XjiDT2ctFWVNq5jajaHMiX2rJzDgfO4pRjnpI6LF7IKh/j7jcsJn3Qd9+O5LoWrOcE +bwS6ACm2ucNne/RA66Mlqo90OLQmm4Hd/xMCBUjqc6qTlI0UW0JUR5z1sMVne0rV1rJkWDs+XXz7 +oT0AQGP00LbGtsMyuZR4bQuryzveyrUZm2EHnvWPK8A6O654e7bNgV31uL63bY8rruX0LLVMLFf7 +NsM23myHBQR9GbgAcpiFYV/smMuLDdWW+9YnrCAc6XFkI0fgT24LBQt0vNpsXXVgqSkFC4G4znDI +rebKBAkuVWXPLSZozaLHX9n6wQfGNkqvROlW3kD/fOr7MjQBdf/5PtvYFncUV/j1q3hMwhHogVfM +WX6XuInU3y4+vtEPc8MGvqN7DJtP9k4fTo7qSeb4oqc5Z6Gtuu9ppD+fUt6Z77+L8ZwfLb7kF4l3 +BTO7NL8QrL8bRhfNceajUsJgzuN++uPos4iGu+KwP6yL8X7q23fzEW/tiUXcqyd84wIMlrO+4myC +P6VZXOgZzDrf9uyrGaL/Z2YbfQEXzDJKqIfkTighsVz1VQkVsPnvSS7BXNwCHsKP6p97mXsllKV4 +/LEtefotkKgRWuJq3OgcgxhcsnJ3GwC6ewkYbRowOQ5Pu8fVbH1wFkoWm/GmIVjF+/vbYMfd7mTO +u7e3JscnCQShlcTEo5pDNzhGk8urhE8OQ/et1Hfha6T4B+eCObXk7e7hMWz33fViQOm+q9u2JCKF +33ycj0lxZ+mhQiL5armv7fTkSwmu5E9+BD3yg9vZSXde3zit7TEOW7LvnwWw9mHNzD5Sss/vM8TF +Lr62f8haovf8Yc04PYnHPo2F1PfeaU4z631eY6ArffyilmvNXmPzVZT775feLkasRMXi67xe9IHG +RiLG6bbk72QW0ObnZzHTBw8cvvxohp2JEj0ddRp+DdZ7KfHA+MPan7tg7+d8ecaLzulLOHK1XYUY +mrvBfG6fO+a0bXyU0Oru5N738i9wAo+2SWQE3ZgZA0sBGkqA/f3QS1Yus3l9c1xezQ== + + + /+uVsVMcWj1fydIVaJkY6tHRMYsgyXgOCkrwCO24+QfFRLx3nDYEfV74bBdsZOKA04JCxEFV1UJG +4ihRTudvQA/xn5MoHjpBJQw4PGldUl9JqfH4kDl4KEWVcNosGAXblPlIxJ+TF4Qnm4GKYrToKNmv +196V84K35xzujVvtrG/rrp3JeT8u5gNKF+J9zz9IDobDekqYpkqmiJTCYT5zJ+Pnu8Dx9uE2vnMG +mA/siNssc39wWf5GHfVkB/Sj/SfVEfJ+fgyc6mRsiFx2vZWSIZQzH4QBi6/16v8A7SqHmTPbEvqg +B7MY0d3Z9s1RHInhEihmb0LcEYpD15wHqmVuzYIs1/qkuJa5aTc+Kbt3gRbfee27uBjb8l9IJVk6 +BS7YqpDAuPoOCcaNIoVUKB6PEe89MArvNF0YTK4RzKF2Srhp+nN6U8HARA45jMLCSGvvK1lJ336Q +ZcyOoV8JtxWfLp6zb8PmF9DiVkQbjASC2Ex2J/R5z3Ah3yRZDHUraswf/yxdle8wMuJvXish++/W +C4xTYGup7vd5WQvjA51PfOHLxfi++kDc/vGUT4c7hyL63bcQqYVovHF7Q4QWSfZAWQm41aJFC6I1 +1u6nSing0lupwmMpqbJWRbqeMBhFD6NQ68/kx2Gq+yzHCAx6nGYWf+metnOJduJZOQJkG9lU/dMU +0VHjNPL4hHwyQOmH9/wnfhKjQ+IdVN+VO57sXn+3BCCxTy6vOTfk+DTvI9GLROzB10lxX2E1Jq70 +C4Z7Sngk3SjHzCGTdGtag+mTLVX3eKgWsvVws4VWUqe9rTiWQDiO1SDN6O5UTZBIpTygMBwntFCP +b5cczePdcqwTOK4OFE1BCfoQl+xD7eeC8Omzo9c7hhAX0cf0AI/gzZxWE/Vk/8QzyJw/idtKyi1/ +6BOSkebpbeLno91XL/h6mISVQodOMBZAPWqQrNzv7GffxWHD0M/iTntxB4DK/aAH/gsTaUZqoHP2 +A0OQmon31MzWvc26iQQQTxktEUqVj2QtO3u5zHfw9Oj+I51guO3vj6z/tdYGPaMyzj62Jruq0Nv7 +8CYOI18dZMcvChcAZCW1lL5sH/NdSMpQEiQJxyditUI/9fl+iXZlJ/n8nq2XqjPZpgV97t+PK6nu +Vj9HojyyeOpvYDgGtbCHDHkQPbwX3zDtpYMh8lI2WPk4MMCFn6AA6v0Za7qlwj7k5Hvi8CwdxsHi +amhY3d9YshxMgLLRqUxIsgtqzJdaduT4v49dAsMKbiHKiu6Dm2m3NboeddqdvjvoirsOkucse9tv +DnKjVqvS+s8kM2hMe63+xB1zHyTL6fNzCfhrY9BsQXfvXDyn8aFnOuppV7QxX8sg/aPYe3R5SehT +zeES42PMMPWBrGuPF6LEx7X+affuq556vywlk8E++xI/Ye+kzHZzms2kz55ftCjq0FyxBKLIGZQV +AAHdPji8ukjk5fGxdHZ4H84NHgVgrNnR8yOTecxVK7mj5FHDCh6NISo6z9dKkfOZwFseORfqB6ks +d5YgQfPEx23lKnkmvl9RRc5Re1dVBEWT7/a30KR4UyLit6+5GvD8pytDogS2SZXn1H3qe1eaaCcE +j+VXp6bwx5kQ1APgbLDdPlaYkS9br3QOM/n84d68CVMAtb8XxByeoprIo6RHvEQTsWtfCznJKVE0 +NTWz9pT6zpwxKg9nMi8khIRhp/RTCxihvK9EX0h8ngTkhffQi/IlF9x4NVyvpRLqOVN6WyzPHhzo +gRwlf6ReOdxGsRp8ieTejpM1+4w5e6PncXAJyziVVaEU8vWUPKrKxVRWRYh8+ePyJkaNMFGkJ9lm +7LhnYbj00UwMn748+2LpVrl4OxtnlohmCAKWrYwjlzd2WSudKOaBvtP3l8NzAvycDXSHcfeTH2Nb +z7eX8zWeZ+zyBZTP4uOBIeqO6QioVPWOMDmvWwWB+CIbktfQqkp1Wyk20bseltQw3selrKf7YZxw +V8lHNybtFB7A0mC+CWtE5OfwEz6RgYRZmSJIxZNbEA3j4JzhkhxlznOPW9qfhwB3/uHDuKDGjxfU +ndeQJky07M3rglgiGYGouIeeMOVd+diaoOkWJGW20Mrkdv2lVOSuNNEyygw+EYwEHqN0vP/J+c4f +bmabc6mmuoYS6J5gdmD3MTdAswwq9Rk6QpqZ4XlDFfBmMauNPDg6U3TDxWS5C80weQ7PJeeh7UOU +Lu1oPj5ye8e+M2OXe/kj0w7kaxa2y2G2cfyyDasPPphAArFaehx2zGL+ZVwvgfWSDYPpIbfErdxb +CbpIrOZveX45er5KH+WSjXYDU+Su0vxR5ZjYuEoCByba6VYMWct9kFhBhgQ7dvBzBiRXJCSSydQu +Lm4T8ZPpZE4rP79Pd46OYwoTBu39OxEvT4qpkPQVSHXD7f1ksfFRQLjK5FNkzcfsY/MCY7Avx5ge +gihq+NKd8SFL6iTmy2FN18KkNPPg+9p2UnSmzE3760nF41vhKskcTscqHzt4BEpW0unZg+3xYeA2 +PlI6oXZE3lET4zBZbhZZVlMAX/NZ4xFXbKDgI1ZonKksDNtaA6EBp3LBelET8UwJduoJROvlOtXL +qZuMVsDgIvui/4kZna3UWWX7Ffc0jSkfQWK0n2DKSLo3S7W7RLfLQ7J/tv8zy+vSH1zMvvU10JBa +64FmXPlBsVVNxCs3Y+Xp3AUcqyfMcIUK+t0+QUQNt+OtyvsNCNtaz1yaUrmYTGdyXy9YUT7seDHF +xN3D0Yib7Hr8h1eCJ3Swd4cp9BnPTkY6nGXUn+CDC0/wZ3iND04wwb7pCV4+nHn2f7ZHsC+XLyYX +J70RtroJhqkzqxphq5tgcF5WNsJWN8HURJCVjLDVTTDtoodVjLDVTTDislnRCFvdBMOSjFWNsNVN +MCUpfzUjbHUTzOVdNMK0mljiifZXR6TqoZ87zDVZs0Kv2AbG4rezTMszDOIZaiTuKue1XFYqtZRy +39zsURv3PEw+5KoU3UrcbS5ZnmyVcZObWPNxrBTKGzKq2qXXWXrdrVVaHGoXmL71Vpm8ZANjfnfG +wpZngiUcM8Eau0ZbbHnWG36is7Q0E+yOIhNMS2jzTHzj5ZlgzPlzMKxFkpalCk7rxR/TSkHuO2e9 +2a50a+v45HTpSm/nPnW5NOuNyR5eZx1W2tqKHNiuVNt9ZRmpg0untMiz3TNjcdjJaSATDouPxGhQ +5JlS/aA+uCfSjhTkaPJOed7bAuMk86Vkus1y2fb53fgTO59e92Wwqy4i4bieJ2d61+VV3gbl9gvs +pdhuLlnqjWcxpQZ7+tpmQOa8jlDNO8/6b8/HimoL6ucNBu5bWAHYIlFivZgJU+7ec8kn1gPyI/WK +7lq9sH2+NsY+2sy1S7TRZhJrNiVOhUNrRZtfLpcHwNHe/2XGCgVIJPBgCMlerRnsXxLqrwZBVm48 +L6+2dXpuymExpM44pUYZP1JtMPvSy/PyDGlAq+TldW9WT3UgsnJZvgdGnH6dFApr2VwWFl6BPbYC +yeWlShb8ZQ6P8ZpCI1Cx4mTt/MVFkDBM+/vEorvBcna0/OwvMKQ12ZHp7L+8U1C/He2/2uaqkQJp +Mu062WpW59wqVw3k/m+z1Shy1VAik1yamC/4RzKyydGb7f5qRFW3T9SiSP/dlECZJ6kW8fasS1R2 +qU/vZkq1Wsvq+dPvS9M1HdOybaFtLMv/ah6YBjWnmD/ZDfvxG8wCT16WXLrmcU2Y8pXNa+ktT5dH +dvxjMWwSTbysDReoPitrsR8W7Zd31SF06x0ky4+eSYp7v/wislmpNrlKH7wSp/l83cmLfrOBegH6 +8rsNfn2zAWDM+W6DX99soAbpl99t8OubDVxeirsNAr+92YAU4TvdbfDrmw3UhLbldxv8+mYDl5fi +boNf32wANOZ8t8GvbzZweSnuNvj1zQbouXK82yDw25sNMC7meLfBr282wFJMx7sNAr+92QB23/lu +g1/fbABrcbrbAAxgh/sFHC81QHt/tQsVVptUuc9gVh6/eKPBBu8zUEvKrW402OB9Bvq1OAs3GgQ2 +d58BXryl3mhgIVoNlZsF081B0jDIjVPfmb3PmTC6RWob5fZ9/g7AkL4HWVHdJnC5lExV9Au9zF8K +EM+cN47u9J7Yj/jopGQ5+L1DHEuGywO2qsJl9rHpbRNXMuxVXxV0IPck5YqfWUq47+ygs1XcnaVN +vM2c5kRg9vQwgybU78d6W1LknzvJSJNrq36B0vM2iWjgqVRiGiUmt783muphDxQE7yAIvv2pXmC3 +qgyWPxmWofMgljn/+jnjMqGngDGW0mxfZAPj7G7685kPJpnjaZQQl8ur31iAQraRhR0ZAPqDUzWO +fFS8IUEYY1TiOBuaRSXUT3ZwwZEHyed7vp93ti/aB8qUKvGr3e/qLBSSnt3Nu6uFQuDgoslBrihY +JIHPJ4Z9ufxMRfziyJgRQfJFMOuWI/EJvK/sKdPKPuwBEvQ06fte7r0w4MFw2/pMdfKJseoO1Or9 +UUDf4+5Xoe00DIpKqJ3zfUivWP5fx5i4d7hvOGiRA7meaX1dHDKRev4ED1Ioze0cvWfC0/EDSJ/K +VHvABJOV7G5HzWzeO+NzvnxSVyH2E7HsAXDQVP1E0S0vSbRBi2Tc1xOVG6mMmaEldX+1AIia4Y4R +R/2GgMF/H7viQEbnLPuW7TeNuWQurxdayq3JdIgdIm+pVrvTL9T+aY1crFv5j4H/WDfnjspuLhLB +fxg3D/8v1F2+xqA7GI397kLf5X07SI4mmU5j0hn0a6N/3DFsergs3J5n3DH3rGvc7QNImDfoDE/8 +mLz2BtC9uRh3Ev7/8LdrfwpzZ+D3axcTZjg+4mbCLCcL8E+EkSWY+tvFqIDBC//AHxfwyxc0/e0W +3JfupxfG3cSxblwCK4R5GcAWInyYkeDtntIWjUKTFGZFRnRjQ1SGhQnRaDgiwUwCy4Yl8prEhwWZ +4dxpl8AIAI0IDyUAxM3LXDjKiCym74UlkHxuXpLDgihIbkFkw5gCBC/xUT4s8xzMIQphjmOjbj4i +hAWOg8lEeCREeTfPywCaQF7jZFguvMaL4QjHRsjgcoQX3TwnhMWIDFBH5TDLsvAaQC1HRAXGKBPF +11gmLIk8QBAVwxLDYCc2zETgF5wtKokiaYmwLC6fA0AkjrzHwioFVmljYd2kJRpRWxgYkrREohHS +wsusSN7jw1wEloC4EWVWgLXwAGaUcwOCw7LMwS+48IgIA0RkpQXekyPhKC/xSi+JgUHZCKBHgl8Y +QIYgSWRT+EhUIDsHC5ZwC8jOMazSxghKJwkXjNsr46YubHja9QETQn+YXMGxBLvWI22wgIjSJsJa +sUXgcBBsEQSlJSLwSgP8z91wKZ0krRMfdSsDCbOBRPfidA0AggGiBsTBS6zyROQEAgduiCiSpoiE +hAQtUVmQlRYetxGIjYmyCiCw3wIBZLEXjiSpI0UlZaS56RCO/Vvrw0pOoXb4wiyMzA== + + + IPBw1sNSVMLjx8Ay4fBxoFlGOaQlwDEflWRcBeCdY4AKeUEGJCBa4HiJER7pmwHqwpPCSHBSgKp5 +IBegdDwgAg/HgQFUzdoKpC0aZZR+oN5ESFtEwSTPiGExipvEc2FJ4pAykT/g8YWJGFw/0iXP424J +XAQQF4XXWJhbJCQjKQTCs3Bco4h3eJ8nYEELJ/HaYQfCBrA4EagPVyHKYZ6JwuBwklgBtrvqQtqO +EMKOIow8TAa/8BKLrUDRPJwVNxx2RAgH/Tl8EoFfkUphRs7NCZEwnGGBkIyMZMVxeKwFmCfKAb9D +YIBvhCWYi8DAsTATxwHIwK2gJRoWETwOliUzEraIsE+AKGA2wEMAoQilIMEpbbhYOHiiRHYJUCVE +ZDcL7AQISybwwiRzLSpXSLv0Njie5GQADAycDQ4OmKmN4QSln8wqsDLALqMRmBMQIUUA8xwTBUaJ +x59H/gHUzOGGMQJH4OJkgKLhQvgJqQMWYbGMRFCj8KIIo5x2DqkCuQ3wpGiEENQicRacaL6QUoQf +iEIi+kKhtYThZNBr1CZUwlDrSiUMiSB0t1eQeVGNBQq6zIuqMk/WZF5ElXkozRSZx2kyT9RlXkST +eTyReYwm83hN5kU1mcfrMo/VZJ64IPMiZpnHW8g8XpN5vCrzJE6Tebwm80RN5gGlqTJPVmUesBmT +zIOWBZkHbSaZhy3zMg9bFmQeYy/zhAWZJ1rIPEGTeZIq81hGk3lRTeYJusyLajJPUGVeVJN5gibz +zBuuyDxWE0K8LvNYTebxmsxjNZnHazKPVWUer8s8VpN5vCbzWE3m8ZrMM083k3mSrAkhXpN50KTK +PF6VedCiSjNek2aMJvP4mcxb7EVGktSRiMwzT4dwIHELMuKMCYtAKeRI8ApDR/TLEYmwYCaCHB4o +CTghS/YxCoyHsHxRIrsv4mmRCOETKQBDANkCBxeEqCInkZNGeZacLAGJFV8DkmR5RCD8AhySMEMg +OlwdSC+ZQTICBHKIUiAaEJ4CvofgImkRlVKAo4AaUwQXIIiEJHG/kGgiynuyQtx4bkVCLNBL5nBX +NNkrgFgBquHIsiMRWSRwskyUSGNAU1RAARVl8OiwbgVxiE0CCse7F1CZduKvU3K2EYG8DP/KcHh6 +5NzKHApWra1gbOPIlhQMby62zN77mDXCsQ3LUZCehglmbQVjG6yPFwTDeJZNszfxPAE9inxkBgqS +kKjqBDPoDE36svQ3rdq0Vw1TzGAxzGGAz9CmL01/16pt9u4HbgfsuETYAHBYVuIJa4jgaRH1poJC +fUwkMtfGAwELeAIt20D3kGUydQQYRASp2dgGS5WRunhU6YncRtUZGR7IA4kTUFSwirAXBGQ/ArIR +hANoH4hRAJYbxbMCSiacF2xRtSzQhsKiGNUb4DXUcfA8651gX4Fjw2t8FMSOzJOWqERAEhXJogii +qBTR2mSi2oFKysC5I2/KyIyUNo5lUO+UUF7gaHjM4QVBANYuskaw1AZlNaAyCoZOEdT0WMJBQNuV +CVok5ABkwShj8DUQpiIyOgHPLbK+CAhTCTkPoJOXREXOwmAGpKM0jhJJqTaR/cLtZ/Dko/rECgo3 +4ySJJfsQAWUayBKMYxaPu9aCImzWBlwQeQiOBaQYlWW9DWQTTITyiVdsDpwO6JHVQUgrVpQEG2Ak +D2xTCVCWOA3QOTolupxiovCgFER5lKPA2qISCKqe0oaESJoiZAxg5qh5ALeXJNRCo7AIGeUbil8B +dWHoIQqMYWbEGlgZojxP5lFgqjzqOmAnSBLuN/RiCC9EWxwsFTJ6RJYUoSICTnAs2GdgOpLephyt +KIeUgnZTBAWKonQocImipFDB3IlMW59INLhA8qmWTZTQHEgunqwZ9CeOaNDA9QRiXcvAEQhUAop5 +BVeirFC0iDJc5MnuE9JWDrLEsaoNilZVgfAK2DhJkb6oguC7qABGFH4eYSKyijGOVfuBbCNNomrb +oZohs4Sjo56IG4jTMqgN4NaDwBNV8ECdB4YqabIJNxctzDuVBiReaSPDkhY8FKQFjaYFOklrigmA +LEWJwQ1oifJEakTQRANyB8qAHZIi2sZzgtrEaaudf1W1Mm5dstvndz/cu5ZJRK0Ph4pVhKiAcGii +HApGMKlQj5VUHQtW0HVxUcQpSm+wfjng5Ni28G4XQLCfkxMRUlRv0XCLAP5gLmAOIOUVNUqG0wHD +ossCSJNsBuEqXYtXHaYCWgazQVaEG2jvOFUE7UtBUa4icNpgWCBB0CZEhf3wUVzB4qvLp0IHGyIB +2WOEiaJURnKKsGhBC7hvcIi7hAswHE6vyZfu4qsOM0mCIkN5kEwysapwBKJO88hIQVTgqBJaNsjE +gXEC5ZAm05sOExGjAfmliLiAXcc1RZQTh2IRrG6ewI/ePpRT0I8YUV2Ldx3mQncZw0pEFBDeDHNx +ILPwBHBwGkEq4LCg0ooiylt4xrEcWejCq05TgeYqEi0BmJhEDhs6TDhUldHW59RhkVsSLhuBbZTJ +qsyvLp9J0WKRXDkZLVFclMAAGxNR7YU5QQ1EaJEfS0TX4HhFu+5avOswF4NMl0eGDxKDEYkvDHkC +4V3o5kEGDOPCwY2KaIKybDjKsjJpM7+7fC5V8KG4n3Nzwepwq2zcXBxrdnNxrIWbS1LdXGC8L7q5 +ZDRaoIlRLCvQQBn0I6C1CFsDz4jbDu0oBjUAaGPRVIA2dF2xqGihBSSJskpVHDrIOFSyZYJpURkL +IOTRT4WePEmUOGKBy+iDRGUClKYosbeiRNxBi4xuCvQIRlVvInE7RfQmlFUo/1nF18QSrzlxcxG5 +xqMfh7jQ0JeG+pQiHBUnEqpmcIyEKJxiOHthiZhbyAtZ0c0BouDoKwoFx0RY8hpOi2tDJicR4cYR +7xu6xMhxBV7LEZNZVjGM/jD8BRBEOBF6z2CkCApgVlaYUxQ9hRFeUxRgEjTUOaI/otNMa2kQlspw +6GDRezEKmnliVgLj5UBTg8MkkwWjcgrT8cAtRBRnuMXoSOOQIEgngB+1EHS+SRySmIiCNYLmKScg +USP5yKjqwUpA1spIh3iMiJwiXEIhSPTTRKNq2EB1jQqKaxTQBBhTXaOi5hrlFlyj7IJrFOYBjosi +JIKyBNaLvh5CKKCHMKiHKO5GpBiM4PACKuEcg5qbdkRBhSDvCSIwaWQGQjQCK4ZHgog8F6hRBnMD +34OHircJoBPRaObQlGAjCmcGUgYwQUkDBRNb0KJnRLKfwLii2AtMBOLcIr1ERlGcJVDHoQU1LZkl +DJUokQ0iNVEnBgg4Hl7n0HkUVZkzUfU5UMBFDq0HHmMVMiHfqKS4YdHyAWQAMmFfRRZ1woga2MGR +0Y0gYDhJIjhBB5PMysQw4XmwylAYK6cPNlpGjxi2sCKgXiAqJfH3gdmGDjTSiZFYluxcFIQPaYmi +3sfxsuo0gxYRthIxGVUIDJvIatHhSxyR8DqPh59DhiKyioEDFEe8wgxhqVGVj+PSgLMD61HCeBLL +oH8ZGST6LOAXYLKc+l6EHAwZNw5sKw4dh1FB8dezHJIOMk+Dnz1NfNBmP3tkwc8uWPjZuQU/u6h5 +1XnNzy7qPvWZn33WFtV96hHNzz7Xtuhn51H9jxBWSyw2JHJRwBYOYzLYMvOzEwPY7GfnzH52IAST +n52Z+dmB04DOAfwAqJwHBgK0gfChps6rMoSLomcN0QAnV0RhAu/JnGKdzNoKxjYeScDUJoaBAGA0 +9DAyRKRhZAnIEpQTVbrA+WAjxE7mkBGAugRtOABuGViRsEkCacHzzEWRVyBeAFCGJxYBgioJguIj +YDmF4cObPEGLwn70yAKrRBbSxrBX1Bz24qSFsBenh71ELezF6WEv0SLsFV0Ie0UWwl68Oeyl2DeE +wnlZIFSIZlhPDdDwircRaE5ws6CskOOD+8FEyYFCZiMpwWMiQ4AwgbEz6GuYtRWgDf2caCkAaxcx +ukDeRCUHcSZE8HDAoMSYAP01wiiEg5FscoCA3eHZQk4gS0TWgcxB1zOHngMGhS0GDnji58eRMPSA +yFdpGTkB8E0SH4oi3zGv1zHaaRX58RZr7VZlVOt0WyNXe1z7q+Wu9fuDSW3SGsITd3vUGk8Go5Z7 +/Dn4G1vgFa2715u9zrn+L1T7Dxc= + + + diff --git a/webapps/docs/images/update.gif b/webapps/docs/images/update.gif new file mode 100644 index 0000000000000000000000000000000000000000..31e22abbc7a2e24b20b978e9be9bce91d4d97728 GIT binary patch literal 627 zcmZ?wbhEHb6k!lyIL5&6|NsAgK=A*+y}iAiot?eCt%HMuEs*J8ujLw+y7Ptq{{K!J zf7q}4X0-UF?)+zRlW&T4U*v2)!e6yXwRo0{SJEe-5&!>cxrG=mdLiwZn4h0tkeBaZ zXTN^^`uFeOe|Y!)!-o&&&!6AFfB%LJ8x|~BprD}e|KI zixKbaBa2L3t=6qucmCpq-3N9pT)$}Y+DUZ_>hmV#r_`iKsYvtb2q@R8MedK$FEQlQ z=a5vD+;`!~rt>?OoLxQp!m`Qd7Budkz+leWabaTVo#u#BStWN`r`%g8s3p4R;O>R% zmP}nYvu;6q?xf=E&O#{_89^-(t#bYP8*L_qrri462hSf`e_+E#pd0tCUvqFBkFL=A zvs*7*xUgy6+SLo^E6dAWI0y8^MUY>q3UnBN02CJt>^B-1nwl7!o0*u}x|& + +]> + + + &project; + + + Craig R. McClanahan + Remy Maucherat + Yoav Shapira + Documentation Index + + + + +
+ +

This is the top-level entry point of the documentation bundle for the +Apache Tomcat Servlet/JSP container. Apache Tomcat version 5.5 +implements the +Servlet 2.4 and JavaServer Pages 2.0 specifications from the +Java Community Process, and includes many +additional features that make it a useful platform for developing and deploying +web applications and web services.

+ +

Select one of the links from the navigation menu (to the left) to drill +down to the more detailed documentation that is available. Each available +manual is described in more detail below.

+ +
+ + +
+ +

The following documents will assist you in downloading, installing +Apache Tomcat 5, and using many of the Apache Tomcat features.

+ +
    +
  1. Introduction - A + brief, high level, overview of Apache Tomcat.
  2. +
  3. Setup - How to install and run + Apache Tomcat on a variety of platforms.
  4. +
  5. First web application + - An introduction to the concepts of a web application as defined + in the Servlet + 2.3 Specification. Covers basic organization of your web application + source tree, the structure of a web application archive, and an + introduction to the web application deployment descriptor + (/WEB-INF/web.xml).
  6. +
  7. Deployer - + Operating the Apache Tomcat Deployer to deploy, precompile, and validate web + applications.
  8. +
  9. Manager - + Operating the Manager web app to deploy, undeploy, and + redeploy applications while Apache Tomcat is running.
  10. +
  11. Realms and Access Control + - Description of how to configure Realms (databases of users, + passwords, and their associated roles) for use in web applications that + utilize Container Managed Security.
  12. +
  13. Security Manager + - Configuring and using a Java Security Manager to + support fine-grained control over the behavior of your web applications. +
  14. +
  15. JNDI Resources + - Configuring standard and custom resources in the JNDI naming context + that is provided to each web application.
  16. +
  17. + JDBC DataSource + - Configuring a JNDI DataSoure with a DB connection pool. + Examples for many popular databases.
  18. +
  19. Classloading + - Information about class loading in Apache Tomcat 5, including where to place + your application classes so that they are visible.
  20. +
  21. JSPs + - Information about Jasper configuration, as well as the JSP compiler + usage.
  22. +
  23. SSL - + Installing and + configuring SSL support so that your Apache Tomcat will serve requests using + the https protocol.
  24. +
  25. SSI - + Using Server Side Includes in Apache Tomcat.
  26. +
  27. CGI - + Using CGIs with Apache Tomcat.
  28. +
  29. Proxy Support - + Configuring Apache Tomcat 5 to run behind a proxy server (or a web server + functioning as a proxy server).
  30. +
  31. MBean Descriptor - + Configuring MBean descriptors files for custom components.
  32. +
  33. Default Servlet - + Configuring the default servlet and customizing directory listings.
  34. +
  35. Apache Tomcat Clustering - + Enable session replication in a Apache Tomcat environment.
  36. +
  37. Balancer - + Configuring, using, and extending the load balancer application.
  38. +
  39. Connectors - + Connectors available in Apache Tomcat, and native web server integration.
  40. +
  41. Monitoring and Management - + Enabling JMX Remote support, and using tools to monitor and manage Apache Tomcat.
  42. +
  43. Logging - + Confuguring logging in Apache Tomcat.
  44. + +
+ +
+ + +
+ +

The following documents are aimed at System Administrators who +are responsible for installing, configuring, and operating a Apache Tomcat 5 server. +

+ + +
+ + +
+ +

The following documents are for Java developers who wish to contribute to +the development of the Apache Tomcat project.

+
    +
  • Building from Source - + Details the steps necessary to download Apache Tomcat 5 source code (and the + other packages that it depends on), and build a binary distribution from + those sources. +
  • +
  • Changelog - Details the + changes made to Apache Tomcat. +
  • +
  • Status - Apache Tomcat development + status. +
  • +
  • Developers - List of active + Apache Tomcat contributors. +
  • +
  • Functional Specifications + - Requirements specifications for features of the Catalina servlet + container portion of Apache Tomcat 5.
  • +
  • Catalina Javadocs + - Javadoc API documentation for the Catalina servlet + container and its dependencies.
  • +
  • Jasper Javadocs + - Javadoc API documentation for the Jasper JSP container + portion of Apache Tomcat 5.
  • +
  • Apache Tomcat Architecture + - Documentation of the Apache Tomcat Server Architecture.
  • + +
+ +
+ + + +
diff --git a/webapps/docs/introduction.xml b/webapps/docs/introduction.xml new file mode 100644 index 000000000..c9ab051b2 --- /dev/null +++ b/webapps/docs/introduction.xml @@ -0,0 +1,130 @@ + + +]> + + + &project; + + + Robert Slifka + Introduction + + + + + +
+ +

For administrators and web developers alike, there are some important bits +of information you should familiarize yourself with before starting out. This +document serves as a brief introduction to some of the concepts and +terminology behind the Tomcat container. As well, where to go when you need +help.

+ +
+ + +
+ +

In the course of reading these documents, you'll run across a number of +terms; some specific to Tomcat, and others defined by the +Servlet or +JSP specifications.

+ +
    +
  • Context - In a nutshell, a Context is a + web application.
  • +
  • Term2 - This is it.
  • +
  • Term3 - This is it!
  • +
+ +
+ + +
+ +

Throughout the docs, you'll notice there are numerous references to +$CATALINA_HOME. This represents the root of your Tomcat +installation. When we say, "This information can be found in your +$CATALINA_HOME/README.txt file" we mean to look at the README.txt file at the +root of your Tomcat install.

+ +

These are some of the key tomcat directories, all relative +to $CATALINA_HOME:

+ +
    +
  • /bin - Startup, shutdown, and other scripts. The + *.sh files (for Unix systems) are functional duplicates of + the *.bat files (for Windows systems). Since the Win32 + command-line lacks certain functionality, there are some additional + files in here.
  • +
  • /conf - Configuration files and related DTDs. The most + important file in here is server.xml. It is the main configuration file + for the container.
  • +
  • /logs - Log files are here by default.
  • +
  • /webapps - This is where your webapps go.
  • +
+ +
+ + +
+ +

This section will acquaint you with the basic information used during +the configuration of the container.

+ +

All of the information in the configuration files is read at startup, +meaning that any change to the files necessitates a restart of the container. +

+ +
+ + +
+ +

While we've done our best to ensure that these documents are clearly +written and easy to understand, we may have missed something. Provided +below are various web sites and mailing lists in case you get stuck.

+ +

As Tomcat 5 is a new release of Tomcat, keep in mind that some of the +issues and solutions vary between the major versions of Tomcat (4.x versus +5). As you search around the web, there will be some documentation that +is not relevant to Tomcat 5, but 3.x and 4.x. Doing 3.x or 4.x things to 5 +will probably not work in most cases as the server.xml files are very +different.

+ +
    +
  • Current document - most documents will list potential hangups. Be sure + to fully read the relevant documentation as it will save you much time + and effort. There's nothing like scouring the web only to find out that + the answer was right in front of you all along!
  • +
  • Tomcat FAQ as maintained by the developers.
  • +
  • Tomcat WIKI
  • +
  • Tomcat FAQ at jGuru
  • +
  • Tomcat mailing list archives - numerous sites archive the Tomcat mailing + lists. Since the links change over time, clicking here will search + Google. +
  • +
  • The TOMCAT-USER mailing list, which you can subscribe to + here. If you don't + get a reply, then there's a good chance that your question was probably + answered in the list archives or one of the FAQs. Although questions + about web application development in general are sometimes asked and + answered, please focus your questions on Tomcat-specific issues.
  • +
  • The TOMCAT-DEV mailing list, which you can subscribe to + here. This list is + reserved for discussions about the development of Tomcat + itself. Questions about Tomcat configuration, and the problems you run + into while developing and running applications, will normally be more + appropriate on the TOMCAT-USER list instead.
  • +
+ +

And, if you think something should be in the docs, by all means let us know +on the TOMCAT-DEV list, or send one of the doc authors email.

+ +
+ + + +
diff --git a/webapps/docs/jasper-howto.xml b/webapps/docs/jasper-howto.xml new file mode 100644 index 000000000..dedd38021 --- /dev/null +++ b/webapps/docs/jasper-howto.xml @@ -0,0 +1,345 @@ + + +]> + + + &project; + + + Glenn L. Nielsen + Peter Rossbach + Jasper 2 JSP Engine How To + + + + +
+

+Introduction
+Configuration
+Production Configuration
+Web Application Compilation
+Using Jikes
+

+
+ +
+ +

Tomcat 5.5 uses the Jasper 2 JSP Engine to implement +the JavaServer Pages 2.0 +specification.

+ +

Jasper 2 has been redesigned to significantly improve performance over +the orignal Jasper. In addition to general code improvements the following +changes were made: +

    +
  • JSP Custom Tag Pooling - The java objects instantiated +for JSP Custom Tags can now be pooled and reused. This significantly boosts +the performance of JSP pages which use custom tags.
  • +
  • Background JSP compilation - If you make a change to +a JSP page which had already been compiled Jasper 2 can recompile that +page in the background. The previously compiled JSP page will still be +available to serve requests. Once the new page has been compiled +successfully it will replace the old page. This helps improve availablity +of your JSP pages on a production server.
  • +
  • Recompile JSP when included page changes - Jasper 2 +can now detect when a page included at compile time from a JSP has changed +and then recompile the parent JSP.
  • +
  • JDT used to compile JSP pages - The +Eclipse JDT Java compiler is now used to perform JSP java source code +compilation. This compiler loads source dependencies from the container +classloader. Ant and javac can still be used.
  • +
+

+ +

Jasper is implemented using the servlet class +org.apache.jasper.servlet.JspServlet.

+ +
+ +
+ +

By default Jasper is configured for use when doing web application +development. See the section +Production Configuration for information on configuring Jasper +for use on a production Tomcat server.

+ +

The servlet which implements Jasper is configured using init parameters +in your global $CATALINA_BASE/conf/web.xml. + +

    +
  • checkInterval - If development is false and reloading is +true, background compiles are enabled. checkInterval is the time in seconds +between checks to see if a JSP page needs to be recompiled. Default +300 seconds.
  • + +
  • compiler - Which compiler Ant should use to compile JSP +pages. See the Ant documentation for more information. If the value is not set, +then the default Eclipse JDT Java compiler will be used instead of using Ant. +No default value.
  • + +
  • classdebuginfo - Should the class file be compiled with +debugging information? true or false, default +true. +
  • + +
  • classpath - What class path should I use while compiling +generated servlets? By default the classpath is created dynamically based on +the current web application.
  • + +
  • compilerSourceVM - What JDK version are the source files compatible with? (Default JDK 1.4)
  • + +
  • compilerTargetVM - What JDK version are the generated files compatible with? (Default JDK 1.4)
  • + +
  • development - Is Jasper used in development mode (will +check for JSP modification on every access)? true or +false, default true.
  • + +
  • enablePooling - Determines whether tag handler pooling is +enabled. true or false, default true. +
  • + +
  • engineOptionsClass - Allows specifying the Options class +used to configure Jasper. If not present, the default EmbeddedServletOptions +will be used. +
  • + +
  • ieClassId - The class-id value to be sent to Internet +Explorer when using <jsp:plugin> tags. Default +clsid:8AD9C840-044E-11D1-B3E9-00805F499D93.
  • + +
  • fork - Have Ant fork JSP page compiles so they are +performed in a seperate JVM from Tomcat? true or +false, default true.
  • + +
  • javaEncoding - Java file encoding to use for generating +java source files. Default UTF8.
  • + +
  • genStringAsCharArray - Should text strings be generated as char +arrays, to improve performance in some cases? Default false.
  • + +
  • keepgenerated - Should we keep the generated Java source +code for each page instead of deleting it? true or +false, default true.
  • + +
  • mappedfile - Should we generate static content with one +print statement per input line, to ease debugging? +true or false, default true.
  • + +
  • modificationTestInterval - Checks for modification for a given +JSP file (and all its dependent files) will be performed only once every specified amount +of seconds. Setting this to 0 will cause the JSP to be checked on every access. +Default is 4 seconds.
  • + +
  • reloading - Should Jasper check for modified JSPs? +true or false, default false.
  • + +
  • scratchdir - What scratch directory should we use when +compiling JSP pages? Default is the work directory for the current web +application.
  • + +
  • trimSpaces - Should white spaces in template text between +actions or directives be trimmed ?, default false.
  • +
+

+ +

The Java compiler from Eclipse JDT in included as the default compiler. It is an +advanced Java compiler which will load all dependencies from the Tomcat class loader, +which will help tremendously when compiling on large installations with tens of JARs. +On fast servers, this will allow sub-second recompilation cycles for even large JSP +pages. This new compiler will be updated to support the Java 5 syntax as soon as +possible.

+ +

Apache Ant, which was used in previous Tomcat releases, can be used instead instead of +the new compiler by simply removing the common/lib/jasper-compiler-jdt.jar file, +and placing the ant.jar file from the latest Ant distribution in the +common/lib folder. If you do this, you also need to use the "javac" +argument to catalina.sh.

+ +
+ +
+ +

The main JSP optimization which can be done is precompilation of JSPs. However, +this might not be possible (for example, when using the jsp-property-group feature) +or practical, in which case the configuration of the Jasper servlet becomes critical.

+ +

When using Jasper 2 in a production Tomcat server you should consider +making the following changes from the default configuration. +

    +
  • development - To disable on access checks for JSP +pages compilation set this to false.
  • +
  • genStringAsCharArray - To generate slightly more efficient +char arrays, set this to true.
  • +
  • modificationTestInterval - If development has to be set to +true for any reason (such as dynamic generation of JSPs), setting +this to a high value will improve performance a lot.
  • +
  • trimSpaces - To remove useless bytes from the response, +set this to true.
  • +
+

+ +
+ +
+ +

Using Ant is the preferred way to compile web applications using JSPC. +Use the script given below (a similar script is included in the "deployer" +download) to precompile a webapp: +

+ +

+ +<project name="Webapp Precompilation" default="all" basedir="."> + + <target name="jspc"> + + <taskdef classname="org.apache.jasper.JspC" name="jasper2" > + <classpath id="jspc.classpath"> + <pathelement location="${java.home}/../lib/tools.jar"/> + <fileset dir="${tomcat.home}/bin"> + <include name="*.jar"/> + </fileset> + <fileset dir="${tomcat.home}/server/lib"> + <include name="*.jar"/> + </fileset> + <fileset dir="${tomcat.home}/common/lib"> + <include name="*.jar"/> + </fileset> + </classpath> + </taskdef> + + <jasper2 + validateXml="false" + uriroot="${webapp.path}" + webXmlFragment="${webapp.path}/WEB-INF/generated_web.xml" + outputDir="${webapp.path}/WEB-INF/src" /> + + </target> + + <target name="compile"> + + <mkdir dir="${webapp.path}/WEB-INF/classes"/> + <mkdir dir="${webapp.path}/WEB-INF/lib"/> + + <javac destdir="${webapp.path}/WEB-INF/classes" + optimize="off" + debug="on" failonerror="false" + srcdir="${webapp.path}/WEB-INF/src" + excludes="**/*.smap"> + <classpath> + <pathelement location="${webapp.path}/WEB-INF/classes"/> + <fileset dir="${webapp.path}/WEB-INF/lib"> + <include name="*.jar"/> + </fileset> + <pathelement location="${tomcat.home}/common/classes"/> + <fileset dir="${tomcat.home}/common/lib"> + <include name="*.jar"/> + </fileset> + <pathelement location="${tomcat.home}/shared/classes"/> + <fileset dir="${tomcat.home}/shared/lib"> + <include name="*.jar"/> + </fileset> + <fileset dir="${tomcat.home}/bin"> + <include name="*.jar"/> + </fileset> + </classpath> + <include name="**" /> + <exclude name="tags/**" /> + </javac> + + </target> + + <target name="all" depends="jspc,compile"> + </target> + + <target name="cleanup"> + <delete> + <fileset dir="${webapp.path}/WEB-INF/src"/> + <fileset dir="${webapp.path}/WEB-INF/classes/org/apache/jsp"/> + </delete> + </target> + +</project> + +

+ +

+The following command line can be used to run the script +(replacing the tokens with the Tomcat base path and the path to the webapp +which should be precompiled):
+ +$ANT_HOME/bin/ant -Dtomcat.home=<$TOMCAT_HOME> -Dwebapp.path=<$WEBAPP_PATH> + +

+ +

+Then, the declarations and mappings for the servlets which were generated +during the precompilation must be added to the web application deployment +descriptor. Insert the ${webapp.path}/WEB-INF/generated_web.xml +at the right place inside the ${webapp.path}/WEB-INF/web.xml file. +Restart the web application (using the manager) and test it to verify it is +running fine with precompiled servlets. An appropriate token placed in the +web application deployment descriptor may also be used to automatically +insert the generated servlet declarations and mappings using Ant filtering +capabilities. This is actually how all the webapps distributed with Tomcat +are automatically compiled as part of the build process. +

+ +

+At the jasper2 task you can use the option addWebXmlMappings for +automatic merge the ${webapp.path}/WEB-INF/generated_web.xml +with the current web application deployment descriptor at ${webapp.path}/WEB-INF/web.xml. +When you want to use Java 5 feature inside your jsp's, add the following javac compiler task +attributes: source="1.5" target="1.5". For live application +you can also compile with optimize="on" and without debug info +debug="off". +

+ +

+When you don't want to stop the jsp generation at first jsp syntax error, use +failOnError="false"and with showSuccess="true" +all successfull jsp to java generation are printed out. Sometimes it is +very helpfull, when you cleanup the generate java source files at ${webapp.path}/WEB-INF/src +and the compile jsp servlet classes at ${webapp.path}/WEB-INF/classes/org/apache/jsp. +

+ +

Hints: +

    +
  • When you switch to another tomcat release, then regenerate and recompile +your jsp's with this version again!
  • +
  • Use java system property at server runtime to disable tag pooling org.apache.jasper.runtime.JspFactoryImpl.USE_POOL=false. +and limit the buffering with org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true. Note that changing +from the defaults may affect performance, but depending on the application.
  • +
+

+
+ +
+ +

If you wish to use + +Jikes to compile JSP pages: +

    +
  • From your Ant installation, copy ant.jar +and (if it's available: Ant 1.5 and later) ant-launcher.jar to +$CATALINA_BASE/common/lib.
  • +
  • Download and install jikes. jikes must support the -encoding option. +Execute jikes -help to verify that it was built with support +for -encoding.
  • +
  • Set the init parameter compiler to jikes.
  • +
  • Define the property -Dbuild.compiler.emacs=true when starting +Tomcat by adding it to your CATALINA_OPTS environment variable. +This changes how jikes outputs error messages so that it is compatible with +Jasper.
  • +
  • If you get an error reporting that jikes can't use UTF8 encoding, try +setting the init parameter javaEncoding to +ISO-8859-1.
  • +
+

+ +
+ + +
diff --git a/webapps/docs/jndi-datasource-examples-howto.xml b/webapps/docs/jndi-datasource-examples-howto.xml new file mode 100644 index 000000000..417b58aab --- /dev/null +++ b/webapps/docs/jndi-datasource-examples-howto.xml @@ -0,0 +1,655 @@ + + +]> + + + &project; + + + Les Hughes + David Haraburda + Glenn Nielsen + Yoav Shapira + JNDI Datasource HOW-TO + + + + +
+

+Introduction
+ +Database Connection Pool (DBCP) Configurations
+Non DBCP Solutions
+Oracle 8i with OCI client
+Common Problems
+

+
+ +
+ +

JNDI Datasource configuration is covered extensively in the +JNDI-Resources-HOWTO. However, feedback from tomcat-user has +shown that specifics for individual configurations can be rather tricky.

+ +

Here then are some example configurations that have been posted to +tomcat-user for popular databases and some general tips for db useage.

+ +

You should be aware that since these notes are derived from configuration +and/or feedback posted to tomcat-user YMMV :-). Please let us +know if you have any other tested configurations that you feel may be of use +to the wider audience, or if you feel we can improve this section in anyway.

+ +

+Please note that JNDI resource configuration has changed somewhat between +Tomcat 5.0.x and Tomcat 5.5.x. You will most likely need to modify your JNDI +resource configurations to match the syntax in the example below in order +to make them work in Tomcat 5.5.x. +

+ +

+Also, please note that JNDI DataSource configuration in general, and this +tutorial in particular, assumes that you have read and understood the +Context and +Host configuration references, including +the section about Automatic Application Deployment in the latter reference. +

+
+ +
+ +

DBCP provides support for JDBC 2.0. On systems using a 1.4 JVM DBCP +will support JDBC 3.0. Please let us know if you have used DBCP and its +JDBC 3.0 features with a 1.4 JVM. +

+ +

See the +DBCP documentation for a complete list of configuration parameters. +

+ + +

DBCP uses the Jakarta-Commons Database Connection Pool. It relies on +number of Jakarta-Commons components: +

    +
  • Jakarta-Commons DBCP
  • +
  • Jakarta-Commons Collections
  • +
  • Jakarta-Commons Pool
  • +
+These libraries are located in a single JAR at +$CATALINA_HOME/common/lib/naming-factory-dbcp.jar. However, +only the classes needed for connection pooling have been included, and the +packages have been renamed to avoid interfering with applications. +

+ +
+ + + +

+A database connection pool creates and manages a pool of connections +to a database. Recycling and reusing already existing connections +to a dB is more efficient than opening a new connection. +

+ +

+There is one problem with connection pooling. A web application has +to explicetely close ResultSet's, Statement's, and Connection's. +Failure of a web application to close these resources can result in +them never being available again for reuse, a db connection pool "leak". +This can eventually result in your web application db connections failing +if there are no more available connections.

+ +

+There is a solution to this problem. The Jakarta-Commons DBCP can be +configured to track and recover these abandoned dB connections. Not +only can it recover them, but also generate a stack trace for the code +which opened these resources and never closed them.

+ +

+To configure a DBCP DataSource so that abandoned dB connections are +removed and recycled add the following attribute to the +Resource configuration for your DBCP DataSource: + + removeAbandoned="true" + +When available db connections run low DBCP will recover and recyle +any abandoned dB connections it finds. The default is false. +

+ +

+Use the removeAbandonedTimeout attribute to set the number +of seconds a dB connection has been idle before it is considered abandoned. + + removeAbandonedTimeout="60" + +The default timeout for removing abandoned connections is 300 seconds. +

+ +

+The logAbandoned attribute can be set to true +if you want DBCP to log a stack trace of the code which abandoned the +dB connection resources. + + logAbandoned="true" + +The default is false. +

+ +
+ + + +

0. Introduction

+

Versions of MySQL and JDBC drivers that have been reported to work: +

    +
  • MySQL 3.23.47, MySQL 3.23.47 using InnoDB,, MySQL 3.23.58, MySQL 4.0.1alpha
  • +
  • Connector/J 3.0.11-stable (the official JDBC Driver)
  • +
  • mm.mysql 2.0.14 (an old 3rd party JDBC Driver)
  • +
+

+ +

Before you proceed, don't forget to copy the JDBC Driver's jar into $CATALINA_HOME/common/lib.

+ +

1. MySQL configuration

+

+Ensure that you follow these instructions as variations can cause problems. +

+ +

Create a new test user, a new database and a single test table. +Your MySQL user must have a password assigned. The driver +will fail if you try to connect with an empty password. + +mysql> GRANT ALL PRIVILEGES ON *.* TO javauser@localhost + -> IDENTIFIED BY 'javadude' WITH GRANT OPTION; +mysql> create database javatest; +mysql> use javatest; +mysql> create table testdata ( + -> id int not null auto_increment primary key, + -> foo varchar(25), + -> bar int); + +

+Note: the above user should be removed once testing is +complete! +
+

+ +

Next insert some test data into the testdata table. + +mysql> insert into testdata values(null, 'hello', 12345); +Query OK, 1 row affected (0.00 sec) + +mysql> select * from testdata; ++----+-------+-------+ +| ID | FOO | BAR | ++----+-------+-------+ +| 1 | hello | 12345 | ++----+-------+-------+ +1 row in set (0.00 sec) + +mysql> + +

+ +

2. server.xml configuration

+

Configure the JNDI DataSource in Tomcat by adding a declaration for your +resource to $CATALINA_HOME/conf/server.xml.

+

Add this in between the </Context> tag of the examples +context and the </Host> tag closing the localhost definition. +If there is no such tag, you can add one as illustrated in the +Context and +Host configuration references, and repeated below +for your convenience. + + +<Context path="/DBTest" docBase="DBTest" + debug="5" reloadable="true" crossContext="true"> + + <!-- maxActive: Maximum number of dB connections in pool. Make sure you + configure your mysqld max_connections large enough to handle + all of your db connections. Set to 0 for no limit. + --> + + <!-- maxIdle: Maximum number of idle dB connections to retain in pool. + Set to -1 for no limit. See also the DBCP documentation on this + and the minEvictableIdleTimeMillis configuration parameter. + --> + + <!-- maxWait: Maximum time to wait for a dB connection to become available + in ms, in this example 10 seconds. An Exception is thrown if + this timeout is exceeded. Set to -1 to wait indefinitely. + --> + + <!-- username and password: MySQL dB username and password for dB connections --> + + <!-- driverClassName: Class name for the old mm.mysql JDBC driver is + org.gjt.mm.mysql.Driver - we recommend using Connector/J though. + Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver. + --> + + <!-- url: The JDBC connection url for connecting to your MySQL dB. + The autoReconnect=true argument to the url makes sure that the + mm.mysql JDBC Driver will automatically reconnect if mysqld closed the + connection. mysqld by default closes idle connections after 8 hours. + --> + + <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource" + maxActive="100" maxIdle="30" maxWait="10000" + username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver" + url="jdbc:mysql://localhost:3306/javatest?autoReconnect=true"/> + +</Context> + +

+ +

3. web.xml configuration

+ +

Now create a WEB-INF/web.xml for this test application. + +<web-app xmlns="http://java.sun.com/xml/ns/j2ee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee +http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" + version="2.4"> + <description>MySQL Test App</description> + <resource-ref> + <description>DB Connection</description> + <res-ref-name>jdbc/TestDB</res-ref-name> + <res-type>javax.sql.DataSource</res-type> + <res-auth>Container</res-auth> + </resource-ref> +</web-app> + +

+ +

4. Test code

+

Now create a simple test.jsp page for use later. + +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + +<sql:query var="rs" dataSource="jdbc/TestDB"> +select id, foo, bar from testdata +</sql:query> + +<html> + <head> + <title>DB Test</title> + </head> + <body> + + <h2>Results</h2> + +<c:forEach var="row" items="${rs.rows}"> + Foo ${row.foo}<br/> + Bar ${row.bar}<br/> +</c:forEach> + + </body> +</html> + +

+ +

That JSP page makes use of JSTL's SQL and Core taglibs. You can get it from Sun's Java Web Services Developer Pack or Jakarta Taglib Standard 1.1 project - just make sure you get a 1.1.x release. Once you have JSTL, copy jstl.jar and standard.jar to your web app's WEB-INF/lib directory. + +

+ +

Finally deploy your web app into $CATALINA_HOME/webapps either +as a warfile called DBTest.war or into a sub-directory called +DBTest

+

Once deployed, point a browser at +http://localhost:8080/DBTest/test.jsp to view the fruits of +your hard work.

+ +
+ + +

0. Introduction

+ +

Oracle requires minimal changes from the MySQL configuration except for the +usual gotchas :-)

+

Drivers for older Oracle versions may be distributed as *.zip files rather +than *.jar files. Tomcat will only use *.jar files installed in +$CATALINA_HOME/common/lib. Therefore classes111.zip +or classes12.zip will need to be renamed with a .jar +extension. Since jarfiles are zipfiles, there is no need to unzip and jar these +files - a simple rename will suffice.

+ +

Some early versions of Tomcat 4.0 when used with JDK 1.4 will not load +classes12.zip unless you unzip the file, remove the javax.sql.* +class heirarchy and rejar.

+ +

For Oracle 9i onwards you should use oracle.jdbc.OracleDriver +rather than oracle.jdbc.driver.OracleDriver as Oracle have stated +that oracle.jdbc.driver.OracleDriver is deprecated and support +for this driver class will be discontinued in the next major release. +

+ +

1. server.xml configuration

+

In a similar manner to the mysql config above, you will need to define your +Datasource in your server.xml file. Here we define a Datasource called myoracle +using the thin driver to connect as user scott, password tiger to the sid +called mysid. (Note: with the thin driver this sid is not the same as the +tnsname). The schema used will be the default schema for the user scott.

+ +

Use of the OCI driver should simply involve a changing thin to oci in the URL string. + +<Resource name="jdbc/myoracle" auth="Container" + type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" + url="jdbc:oracle:thin:@127.0.0.1:1521:mysid" + username="scott" password="tiger" maxActive="20" maxIdle="10" + maxWait="-1"/> + +

+ +

2. web.xml configuration

+

You should ensure that you respect the elemeent ordering defined by the DTD when you +create you applications web.xml file.

+ +<resource-ref> + <description>Oracle Datasource example</description> + <res-ref-name>jdbc/myoracle</res-ref-name> + <res-type>javax.sql.DataSource</res-type> + <res-auth>Container</res-auth> +</resource-ref> + +

3. Code example

+

You can use the same example application as above (asuming you create the required DB +instance, tables etc.) replacing the Datasource code with something like

+ +Context initContext = new InitialContext(); +Context envContext = (Context)initContext.lookup("java:/comp/env"); +DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle"); +Connection conn = ds.getConnection(); +//etc. + +
+ + + +

0. Introduction

+

PostgreSQL is configured in a similar manner to Oracle.

+ +

1. Required files

+

+Copy the Postgres JDBC jar to $CATALINA_HOME/common/lib. As with Oracle, the +jars need to be in this directory in order for DBCP's Classloader to find +them. This has to be done regardless of which configuration step you take next. +

+ +

2. Resource configuration

+ +

+You have two choices here: define a datasource that is shared across all Tomcat +applications, or define a datasource specifically for one application. +

+ +

2a. Shared resource configuration

+

+Use this option if you wish to define a datasource that is shared across +multiple Tomcat applications, or if you just prefer defining your datasource +in this file. +

+

This author has not had success here, although others have reported so. +Clarification would be appreciated here.

+ + +<Resource name="jdbc/postgres" auth="Container" + type="javax.sql.DataSource" driverClassName="org.postgresql.Driver" + url="jdbc:postgresql://127.0.0.1:5432/mydb" + username="myuser" password="mypasswd" maxActive="20" maxIdle="10" maxWait="-1"/> + +

2b. Application-specific resource configuration

+ +

+Use this option if you wish to define a datasource specific to your application, +not visible to other Tomcat applications. This method is less invasive to your +Tomcat installation. +

+ +

+Create a resource definition file for your application defining the +datasource. This file must have the same name as your application, so if +your application deploys as someApp.war, this filename must +be someApp.xml. This file should look something like the following. +

+ + +<Context path="/someApp" docBase="someApp" + crossContext="true" reloadable="true" debug="1"> + +<Resource name="jdbc/postgres" auth="Container" + type="javax.sql.DataSource" driverClassName="org.postgresql.Driver" + url="jdbc:postgresql://127.0.0.1:5432/mydb" + username="myuser" password="mypasswd" maxActive="20" maxIdle="10" +maxWait="-1"/> +</Context> + + +

3. web.xml configuration

+ +<resource-ref> + <description>postgreSQL Datasource example</description> + <res-ref-name>jdbc/postgres</res-ref-name> + <res-type>javax.sql.DataSource</res-type> + <res-auth>Container</res-auth> +</resource-ref> + + +

4. Accessing the datasource

+

+When accessing the datasource programmatically, remember to prepend +java:/comp/env to your JNDI lookup, as in the following snippet of +code. Note also that "jdbc/postgres" can be replaced with any value you prefer, provided +you change it in the above resource definition file as well. +

+ + +InitialContext cxt = new InitialContext(); +if ( cxt == null ) { + throw new Exception("Uh oh -- no context!"); +} + +DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/postgres" ); + +if ( ds == null ) { + throw new Exception("Data source not found!"); +} + + +
+
+ +
+

+These solutions either utilise a single connection to the database (not recommended for anything other +than testing!) or some other pooling technology. +

+
+ +
+ +

Whilst not strictly addressing the creation of a JNDI DataSource using the OCI client, these notes can be combined with the +Oracle and DBCP solution above.

+

+In order to use OCI driver, you should have an Oracle client installed. You should have installed +Oracle8i(8.1.7) client from cd, and download the suitable JDBC/OCI +driver(Oracle8i 8.1.7.1 JDBC/OCI Driver) from otn.oracle.com. +

+

+After renaming classes12.zip file to classes12.jar +for Tomcat, copy it into $CATALINA_HOME/common/lib. +You may also have to remove the javax.sql.* classes +from this file depending upon the version of Tomcat and JDK you are using. +

+
+ + +

+Ensure that you have the ocijdbc8.dll or .so in your $PATH or LD_LIBRARY_PATH + (possibly in $ORAHOME\bin) and also confirm that the native library can be loaded by a simple test program +using System.loadLibrary("ocijdbc8"); +

+

+You should next create a simple test servlet or jsp that has these +critical lines: +

+ +DriverManager.registerDriver(new +oracle.jdbc.driver.OracleDriver()); +conn = +DriverManager.getConnection("jdbc:oracle:oci8:@database","username","password"); + +

+where database is of the form host:port:SID Now if you try to access the URL of your +test servlet/jsp and what you get is a +ServletException with a root cause of java.lang.UnsatisfiedLinkError:get_env_handle. +

+

+First, the UnsatisfiedLinkError indicates that you have +

    +
  • a mismatch between your JDBC classes file and +your Oracle client version. The giveaway here is the message stating that a needed library file cannot be +found. For example, you may be using a classes12.zip file from Oracle Version 8.1.6 with a Version 8.1.5 +Oracle client. The classeXXXs.zip file and Oracle client software versions must match. +
  • +
  • A $PATH, LD_LIBRARY_PATH problem.
  • +
  • It has been reported that ignoring the driver you have downloded from otn and using +the classes12.zip file from the directory $ORAHOME\jdbc\lib will also work. +
  • +
+

+

+Next you may experience the error ORA-06401 NETCMN: invalid driver designator +

+

+The Oracle documentation says : "Cause: The login (connect) string contains an invalid +driver designator. Action: Correct the string and re-submit." + +Change the database connect string (of the form host:port:SID) with this one: +(description=(address=(host=myhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl))) +

+

+Ed. Hmm, I don't think this is really needed if you sort out your TNSNames - but I'm not an Oracle DBA :-) +

+
+
+ +
+

Here are some common problems encountered with a web application which +uses a database and tips for how to solve them.

+ + +

+Tomcat runs within a JVM. The JVM periodically performs garbage collection +(GC) to remove java objects which are no longer being used. When the JVM +performs GC execution of code within Tomcat freezes. If the maximum time +configured for establishment of a dB connection is less than the amount +of time garbage collection took you can get a db conneciton failure. +

+ +

To collect data on how long garbage collection is taking add the +-verbose:gc argument to your CATALINA_OPTS +environment variable when starting Tomcat. When verbose gc is enabled +your $CATALINA_BASE/logs/catalina.out log file will include +data for every garbage collection including how long it took.

+ +

When your JVM is tuned correctly 99% of the time a GC will take less +than one second. The remainder will only take a few seconds. Rarely, +if ever should a GC take more than 10 seconds.

+ +

Make sure that the db connection timeout is set to 10-15 seconds. +For the DBCP you set this using the parameter maxWait.

+ +
+ + +

+These can occur when one request gets a db connection from the connection +pool and closes it twice. When using a connection pool, closing the +connection just returns it to the pool for reuse by another request, +it doesn't close the connection. And Tomcat uses multiple threads to +handle concurrent requests. Here is an example of the sequence +of events which could cause this error in Tomcat: +

+  Request 1 running in Thread 1 gets a db connection.
+
+  Request 1 closes the db connection.
+
+  The JVM switches the running thread to Thread 2
+
+  Request 2 running in Thread 2 gets a db connection
+  (the same db connection just closed by Request 1).
+
+  The JVM switches the running thread back to Thread 1
+
+  Request 1 closes the db connection a second time in a finally block.
+
+  The JVM switches the running thread back to Thread 2
+
+  Request 2 Thread 2 tries to use the db connection but fails
+  because Request 1 closed it.
+
+Here is an example of properly written code to use a db connection +obtained from a connection pool: +
+  Connection conn = null;
+  Statement stmt = null;  // Or PreparedStatement if needed
+  ResultSet rs = null;
+  try {
+    conn = ... get connection from connection pool ...
+    stmt = conn.createStatement("select ...");
+    rs = stmt.executeQuery();
+    ... iterate through the result set ...
+    rs.close();
+    rs = null;
+    stmt.close();
+    stmt = null;
+    conn.close(); // Return to connection pool
+    conn = null;  // Make sure we don't close it twice
+  } catch (SQLException e) {
+    ... deal with errors ...
+  } finally {
+    // Always make sure result sets and statements are closed,
+    // and the connection is returned to the pool
+    if (rs != null) {
+      try { rs.close(); } catch (SQLException e) { ; }
+      rs = null;
+    }
+    if (stmt != null) {
+      try { stmt.close(); } catch (SQLException e) { ; }
+      stmt = null;
+    }
+    if (conn != null) {
+      try { conn.close(); } catch (SQLException e) { ; }
+      conn = null;
+    }
+  }
+
+

+ +
+ + +

+ Please note that although the above instructions place the JNDI declarations in a Context + element, it is possible and sometimes desirable to place these declarations in the + GlobalNamingResources section of the server + configuration file. A resource placed in the GlobalNamingResources section will be shared + among the Contexts of the server. +

+
+ + +

+ In order to get Realms to work, the realm must refer to the datasource as + defined in the <GlobalNamingResources> or <Context> section, not a datasource as renamed + using <ResourceLink>. +

+
+ +
+ + +
diff --git a/webapps/docs/jndi-resources-howto.xml b/webapps/docs/jndi-resources-howto.xml new file mode 100644 index 000000000..8c6308f3b --- /dev/null +++ b/webapps/docs/jndi-resources-howto.xml @@ -0,0 +1,765 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Yoav Shapira + JNDI Resources HOW-TO + + + + + +
+ +

Tomcat 5 provides a JNDI InitialContext implementation +instance for each web application running under it, in a manner that is +compatible with those provided by a +Java2 Enterprise Edition application +server. + +The J2EE standard provides a standard set of elements in +the /WEB-INF/web.xml file to reference resources; resources +referenced in these elements must be defined in an application-server-specific configuration. +

+ +

For Tomcat 5, these entries in per-web-application +InitialContext are configured in the +<Context> elements that can be specified +in either $CATALINA_HOME/conf/server.xml or, preferably, +the per-web-application context XML file (either META-INF/context.xml). +

+ +

Tomcat 5 maintains a separate namespace of global resources for the +entire server. These are configured in the + +<GlobalNameingResources> element of +$CATALINA_HOME/conf/server.xml. You may expose these resources to +web applications by using +<ResourceLink> elements. +

+ +

The resources defined in these elements +may be referenced by the following elements in the web application deployment +descriptor (/WEB-INF/web.xml) of your web application:

+
    +
  • <env-entry> - Environment entry, a + single-value parameter that can be used to configure how the application + will operate.
  • +
  • <resource-ref> - Resource reference, + which is typically to an object factory for resources such as a JDBC + DataSource, a JavaMail Session, or custom + object factories configured into Tomcat 5.
  • +
  • <resource-env-ref> - Resource + environment reference, a new variation of resource-ref + added in Servlet 2.4 that is simpler to configure for resources + that do not require authentication information.
  • +
+ +

The InitialContext is configured as a web application is +initially deployed, and is made available to web application components (for +read-only access). All configured entries and resources are placed in +the java:comp/env portion of the JNDI namespace, so a typical +access to a resource - in this case, to a JDBC DataSource - +would look something like this:

+ + +// Obtain our environment naming context +Context initCtx = new InitialContext(); +Context envCtx = (Context) initCtx.lookup("java:comp/env"); + +// Look up our data source +DataSource ds = (DataSource) + envCtx.lookup("jdbc/EmployeeDB"); + +// Allocate and use a connection from the pool +Connection conn = ds.getConnection(); +... use this connection to access the database ... +conn.close(); + + +

See the following Specifications for more information about programming APIs +for JNDI, and for the features supported by Java2 Enterprise Edition (J2EE) +servers, which Tomcat emulates for the services that it provides:

+ + +
+ + +
+ +

Each available JNDI Resource is configured based on inclusion of the +following elements in the <Context> or +<DefaultContext> elements:

+ +
    +
  • <Environment> - + Configure names and values for scalar environment entries that will be + exposed to the web application through the JNDI + InitialContext (equivalent to the inclusion of an + <env-entry> element in the web application + deployment descriptor).
  • +
  • <Resource> - + Configure the name and data type of a resource made available to the + application (equivalent to the inclusion of a + <resource-ref> element in the web application + deployment descriptor).
  • +
  • <ResourceLink> - + Add a link to a resource defined in the global JNDI context. Use resource + links to give a web application access to a resource defined in + the<GlobalNamingResources> + child element of the <Server> + element.
  • +
  • <Transaction> - + Add a resource factory for instantiating the UserTransaction object + instance that is available at java:comp/UserTransaction.
  • + +
+ +

Any number of these elements may be nested inside a +<Context> element (to be associated +only with that particular web application).

+ +

In addition, the names and values of all <env-entry> +elements included in the web application deployment descriptor +(/WEB-INF/web.xml) are configured into the initial context as +well, overriding corresponding values from conf/server.xml +only if allowed by the corresponding +<Environment> element (by setting the +override attribute to "true").

+ +

Global resources can be defined in the server-wide JNDI context, by adding +the resource elements described above to the +<GlobalNamingResources> +child element of the <Server> +element and using a +<ResourceLink> to +include it in the per-web-application context.

+ +
+ + +
+ +

Tomcat 5 includes a series of standard resource factories that can + provide services to your web applications, but give you configuration + flexibility (in $CATALINA_HOME/conf/server.xml) without + modifying the web application or the deployment descriptor. Each + subsection below details the configuration and usage of the standard + resource factories.

+ +

See Adding Custom + Resource Factories for information about how to create, install, + configure, and use your own custom resource factory classes with + Tomcat 5.

+ +

NOTE - Of the standard resource factories, only the + "JDBC Data Source" and "User Transaction" factories are mandated to + be available on other platforms, and then they are required only if + the platform implements the Java2 Enterprise Edition (J2EE) specs. + All other standard resource factories, plus custom resource factories + that you write yourself, are specific to Tomcat and cannot be assumed + to be available on other containers.

+ + + +

0. Introduction

+ +

This resource factory can be used to create objects of any + Java class that conforms to standard JavaBeans naming conventions (i.e. + it has a zero-arguments constructor, and has property setters that + conform to the setFoo() naming pattern. The resource factory will + create a new instance of the appropriate bean class every time a + lookup() for this entry is made.

+ +

The steps required to use this facility are described below.

+ +

1. Create Your JavaBean Class

+ +

Create the JavaBean class which will be instantiated each time + that the resource factory is looked up. For this example, assume + you create a class com.mycompany.MyBean, which looks + like this:

+ + +package com.mycompany; + +public class MyBean { + + private String foo = "Default Foo"; + + public String getFoo() { + return (this.foo); + } + + public void setFoo(String foo) { + this.foo = foo; + } + + private int bar = 0; + + public int getBar() { + return (this.bar); + } + + public void setBar(int bar) { + this.bar = bar; + } + + +} + + +

2. Declare Your Resource Requirements

+ +

Next, modify your web application deployment descriptor + (/WEB-INF/web.xml) to declare the JNDI name under which + you will request new instances of this bean. The simplest approach is + to use a <resource-env-ref> element, like this:

+ + +<resource-env-ref> + <description> + Object factory for MyBean instances. + </description> + <resource-env-ref-name> + bean/MyBeanFactory + </resource-env-ref-name> + <resource-env-ref-type> + com.mycompany.MyBean + </resource-env-ref-type> +</resource-env-ref> + + +

WARNING - Be sure you respect the element ordering + that is required by the DTD for web application deployment descriptors! + See the + Servlet + Specification for details.

+ +

3. Code Your Application's Use Of This Resource

+ +

A typical use of this resource environment reference might look + like this:

+ + +Context initCtx = new InitialContext(); +Context envCtx = (Context) initCtx.lookup("java:comp/env"); +MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory"); + +writer.println("foo = " + bean.getFoo() + ", bar = " + + bean.getBar()); + + +

4. Configure Tomcat's Resource Factory

+ +

To configure Tomcat's resource factory, add an elements like this to the + $CATALINA_HOME/conf/server.xml file, nested inside the + Context element for this web application.

+ +<Context ...> + ... + <Resource name="bean/MyBeanFactory" auth="Container" + type="com.mycompany.MyBean" + factory="org.apache.naming.factory.BeanFactory" + bar="23"/> + ... +</Context> + + +

Note that the resource name (here, bean/MyBeanFactory + must match the value specified in the web application deployment + descriptor. We are also initializing the value of the bar + property, which will cause setBar(23) to be called before + the new bean is returned. Because we are not initializing the + foo property (although we could have), the bean will + contain whatever default value is set up by its constructor.

+ +
+ + + + +

0. Introduction

+ +

In many web applications, sending electronic mail messages is a + required part of the system's functionality. The + Java Mail API + makes this process relatively straightforward, but requires many + configuration details that the client application must be aware of + (including the name of the SMTP host to be used for message sending).

+ +

Tomcat 5 includes a standard resource factory that will create + javax.mail.Session session instances for you, already + connected to the SMTP server that is configured in server.xml. + In this way, the application is totally insulated from changes in the + email server configuration environment - it simply asks for, and receives, + a preconfigured session whenever needed.

+ +

The steps required for this are outlined below.

+ +

1. Declare Your Resource Requirements

+ +

The first thing you should do is modify the web application deployment + descriptor (/WEB-INF/web.xml) to declare the JNDI name under + which you will look up preconfigured sessions. By convention, all such + names should resolve to the mail subcontext (relative to the + standard java:comp/env naming context that is the root of + all provided resource factories. A typical web.xml entry + might look like this:

+ +<resource-ref> + <description> + Resource reference to a factory for javax.mail.Session + instances that may be used for sending electronic mail + messages, preconfigured to connect to the appropriate + SMTP server. + </description> + <res-ref-name> + mail/Session + </res-ref-name> + <res-type> + javax.mail.Session + </res-type> + <res-auth> + Container + </res-auth> +</resource-ref> + + +

WARNING - Be sure you respect the element ordering + that is required by the DTD for web application deployment descriptors! + See the + Servlet + Specification for details.

+ +

2. Code Your Application's Use Of This Resource

+ +

A typical use of this resource reference might look like this:

+ +Context initCtx = new InitialContext(); +Context envCtx = (Context) initCtx.lookup("java:comp/env"); +Session session = (Session) envCtx.lookup("mail/Session"); + +Message message = new MimeMessage(session); +message.setFrom(new InternetAddress(request.getParameter("from")); +InternetAddress to[] = new InternetAddress[1]; +to[0] = new InternetAddress(request.getParameter("to")); +message.setRecipients(Message.RecipientType.TO, to); +message.setSubject(request.getParameter("subject")); +message.setContent(request.getParameter("content"), "text/plain"); +Transport.send(message); + + +

Note that the application uses the same resource reference name + that was declared in the web application deployment descriptor. This + is matched up against the resource factory that is configured in + $CATALINA_HOME/conf/server.xml, as described below.

+ +

3. Configure Tomcat's Resource Factory

+ +

To configure Tomcat's resource factory, add an elements like this to the + $CATALINA_HOME/conf/server.xml file, nested inside the + Context element for this web application.

+ +<Context ...> + ... + <Resource name="mail/Session" auth="Container" + type="javax.mail.Session" + mail.smtp.host="localhost"/> + ... +</Context> + + +

Note that the resource name (here, mail/Session) must + match the value specified in the web application deployment descriptor. + Customize the value of the mail.smtp.host parameter to + point at the server that provides SMTP service for your network.

+ +

4. Install the JavaMail libraries

+ +

+ Download the JavaMail API. The JavaMail API requires the Java Activation + Framework (JAF) API as well. The Java Activation Framework can be downloaded + from Sun's site. +

+ +

This download includes 2 vital libraries for the configuration; + activation.jar and mail.jar. Unpackage both distributions and place + them into $CATALINA_HOME/common/lib so that they are available to + Tomcat during the initialization of the mail Session Resource. + Note: placing these jars in both common/lib and a + web application's lib folder will cause an error, so ensure you have + them in the $CATALINA_HOME/common/lib location only. +

+ +

Example Application

+ +

The /examples application included with Tomcat contains + an example of utilizing this resource factory. It is accessed via the + "JSP Examples" link. The source code for the servlet that actually + sends the mail message is in + /WEB-INF/classes/SendMailServlet.java.

+ +

WARNING - The default configuration assumes that + there is an SMTP server listing on port 25 on localhost. + If this is not the case, edit the + $CATALINA_HOME/conf/server.xml file, and modify the + parameter value for the mail.smtp.host parameter to be + the host name of an SMTP server on your network.

+ +
+ + + +

0. Introduction

+ +

Many web applications need to access a database via a JDBC driver, + to support the functionality required by that application. The J2EE + Platform Specification requires J2EE Application Servers to make + available a DataSource implementation (that is, a connection + pool for JDBC connections) for this purpose. Tomcat 5 offers exactly + the same support, so that database-based applications you develop on + Tomcat using this service will run unchanged on any J2EE server.

+ +

For information about JDBC, you should consult the following:

+ + +

NOTE - The default data source support in Tomcat + is based on the DBCP connection pool from the + Jakarta Commons + subproject. However, it is possible to use any other connection pool + that implements javax.sql.DataSource, by writing your + own custom resource factory, as described + below.

+ +

1. Install Your JDBC Driver

+ +

Use of the JDBC Data Sources JNDI Resource Factory requires + that you make an appropriate JDBC driver available to both Tomcat internal + classes and to your web application. This is most easily accomplished by + installing the driver's JAR file(s) into the + $CATALINA_HOME/common/lib directory, which makes the driver + available both to the resource factory and to your application.

+ +

2. Declare Your Resource Requirements

+ +

Next, modify the web application deployment descriptor + (/WEB-INF/web.xml) to declare the JNDI name under + which you will look up preconfigured data source. By convention, all such + names should resolve to the jdbc subcontext (relative to the + standard java:comp/env naming context that is the root of + all provided resource factories. A typical web.xml entry + might look like this:

+ +<resource-ref> + <description> + Resource reference to a factory for java.sql.Connection + instances that may be used for talking to a particular + database that is configured in the server.xml file. + </description> + <res-ref-name> + jdbc/EmployeeDB + </res-ref-name> + <res-type> + javax.sql.DataSource + </res-type> + <res-auth> + Container + </res-auth> +</resource-ref> + + +

WARNING - Be sure you respect the element ordering + that is required by the DTD for web application deployment descriptors! + See the + Servlet + Specification for details.

+ +

3. Code Your Application's Use Of This Resource

+ +

A typical use of this resource reference might look like this:

+ +Context initCtx = new InitialContext(); +Context envCtx = (Context) initCtx.lookup("java:comp/env"); +DataSource ds = (DataSource) + envCtx.lookup("jdbc/EmployeeDB"); + +Connection conn = ds.getConnection(); +... use this connection to access the database ... +conn.close(); + + +

Note that the application uses the same resource reference name + that was declared in the web application deployment descriptor. This + is matched up against the resource factory that is configured in + $CATALINA_HOME/conf/server.xml, as described below.

+ +

4. Configure Tomcat's Resource Factory

+ +

To configure Tomcat's resource factory, add an element like this to the + /META-INF/context.xml file in the web application.

+ +<Context ...> + ... + <Resource name="jdbc/EmployeeDB" auth="Container" + type="javax.sql.DataSource" username="dbusername" password="dbpassword" + driverClassName="org.hsql.jdbcDriver" url="jdbc:HypersonicSQL:database" + maxActive="8" maxIdle="4"/> + ... +</Context> + + +

Note that the resource name (here, jdbc/EmployeeDB) must + match the value specified in the web application deployment descriptor.

+ +

This example assumes that you are using the HypersonicSQL database + JDBC driver. Customize the driverClassName and + driverName parameters to match your actual database's + JDBC driver and connection URL.

+ +

The configuration properties for Tomcat's standard data source + resource factory + (org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory) are + as follows:

+
    +
  • driverClassName - Fully qualified Java class name + of the JDBC driver to be used.
  • +
  • maxActive - The maximum number of active instances + that can be allocated from this pool at the same time.
  • +
  • maxIdle - The maximum number of connections that + can sit idle in this pool at the same time.
  • +
  • maxWait - The maximum number of milliseconds that the + pool will wait (when there are no available connections) for a + connection to be returned before throwing an exception.
  • +
  • password - Database password to be passed to our + JDBC driver.
  • +
  • url - Connection URL to be passed to our JDBC driver. + (For backwards compatibility, the property driverName + is also recognized.)
  • +
  • user - Database username to be passed to our + JDBC driver.
  • +
  • validationQuery - SQL query that can be used by the + pool to validate connections before they are returned to the + application. If specified, this query MUST be an SQL SELECT + statement that returns at least one row.
  • +
+

For more details, please refer to the commons-dbcp documentation.

+ +
+ +
+ + +
+ +

If none of the standard resource factories meet your needs, you can + write your own factory and integrate it into Tomcat 5, and then configure + the use of this factory in the conf/server.xml configuration + file. In the example below, we will create a factory that only knows how + to create com.mycompany.MyBean beans, from the + Generic JavaBean Resources + example, above.

+ +

1. Write A Resource Factory Class

+ +

You must write a class that implements the JNDI service provider + javax.naming.spi.ObjectFactory inteface. Every time your + web application calls lookup() on a context entry that is + bound to this factory, the getObjectInstance() method is + called, with the following arguments:

+
    +
  • Object obj - The (possibly null) object containing + location or reference information that can be used in creating an + object. For Tomcat, this will always be an object of type + javax.naming.Reference, which contains the class name + of this factory class, as well as the configuration properties + (from conf/server.xml) to use in creating objects + to be returned.
  • +
  • Name name - The name to which this factory is bound + relative to nameCtx, or null if no name + is specified.
  • +
  • Context nameCtx - The context relative to which the + name parameter is specified, or null if + name is relative to the default initial context.
  • +
  • Hashtable environment - The (possibly null) + environment that is used in creating this object. This is generally + ignored in Tomcat object factories.
  • +
+ +

To create a resource factory that knows how to produce MyBean + instances, you might create a class like this:

+ + +package com.mycompany; + +import java.util.Enumeration; +import java.util.Hashtable; +import javax.naming.Context; +import javax.naming.Name; +import javax.naming.NamingException; +import javax.naming.RefAddr; +import javax.naming.Reference; +import javax.naming.spi.ObjectFactory; + +public class MyBeanFactory implements ObjectFactory { + + public Object getObjectInstance(Object obj, + Name name, Context nameCtx, Hashtable environment) + throws NamingException { + + // Acquire an instance of our specified bean class + MyBean bean = new MyBean(); + + // Customize the bean properties from our attributes + Reference ref = (Reference) obj; + Enumeration addrs = ref.getAll(); + while (addrs.hasMoreElements()) { + RefAddr addr = (RefAddr) addrs.nextElement(); + String name = addr.getType(); + String value = (String) addr.getContent(); + if (name.equals("foo")) { + bean.setFoo(value); + } else if (name.equals("bar")) { + try { + bean.setBar(Integer.parseInt(value)); + } catch (NumberFormatException e) { + throw new NamingException("Invalid 'bar' value " + value); + } + } + } + + // Return the customized instance + return (bean); + + } + +} + + +

In this example, we are unconditionally creating a new instance of + the com.mycompany.MyBean class, and populating its properties + based on the parameters included in the <ResourceParams> + element that configures this factory (see below). You should note that any + parameter named factory should be skipped - that parameter is + used to specify the name of the factory class itself (in this case, + com.mycompany.MyBeanFactory) rather than a property of the + bean being configured.

+ +

For more information about ObjectFactory, see the + JNDI 1.2 Service + Provider Interface (SPI) Specification.

+ +

You will need to compile this class against a class path that includes + all of the JAR files in the $CATALINA_HOME/common/lib and + $CATALINA_HOME/server/lib directories. When you are through, + place the factory class (and the corresponding bean class) unpacked under + $CATALINA_HOME/common/classes, or in a JAR file inside + $CATALINA_HOME/common/lib. In this way, the required class + files are visible to both Catalina internal resources and your web + application.

+ +

2. Declare Your Resource Requirements

+ +

Next, modify your web application deployment descriptor + (/WEB-INF/web.xml) to declare the JNDI name under which + you will request new instances of this bean. The simplest approach is + to use a <resource-env-ref> element, like this:

+ + +<resource-env-ref> + <description> + Object factory for MyBean instances. + </description> + <resource-env-ref-name> + bean/MyBeanFactory + </resource-env-ref-name> + <resource-env-ref-type> + com.mycompany.MyBean + </resource-env-ref-type> +<resource-env-ref> + + +

WARNING - Be sure you respect the element ordering + that is required by the DTD for web application deployment descriptors! + See the + Servlet + Specification for details.

+ +

3. Code Your Application's Use Of This Resource

+ +

A typical use of this resource environment reference might look + like this:

+ + +Context initCtx = new InitialContext(); +Context envCtx = (Context) initCtx.lookup("java:comp/env"); +MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory"); + +writer.println("foo = " + bean.getFoo() + ", bar = " + + bean.getBar()); + + +

4. Configure Tomcat's Resource Factory

+ +

To configure Tomcat's resource factory, add an elements like this to the + $CATALINA_HOME/conf/server.xml file, nested inside the + Context element for this web application.

+ +<Context ...> + ... + <Resource name="bean/MyBeanFactory" auth="Container" + type="com.mycompany.MyBean" + factory="com.mycompany.MyBeanFactory" + bar="23"/> + ... +</Context> + + +

Note that the resource name (here, bean/MyBeanFactory + must match the value specified in the web application deployment + descriptor. We are also initializing the value of the bar + property, which will cause setBar(23) to be called before + the new bean is returned. Because we are not initializing the + foo property (although we could have), the bean will + contain whatever default value is set up by its constructor.

+ +

You will also note that, from the application developer's perspective, + the declaration of the resource environment reference, and the programming + used to request new instances, is identical to the approach used for the + Generic JavaBean Resources example. This illustrates one of the + advantages of using JNDI resources to encapsulate functionality - you can + change the underlying implementation without necessarily having to + modify applications using the resources, as long as you maintain + compatible APIs.

+ +
+ + + + + +
diff --git a/webapps/docs/logging.xml b/webapps/docs/logging.xml new file mode 100644 index 000000000..4f551adb6 --- /dev/null +++ b/webapps/docs/logging.xml @@ -0,0 +1,272 @@ + + +]> + + + &project; + + + Logging in Tomcat + Allistair Crossley + Yoav Shapira + + + + +
+

+ Tomcat 5.5 uses + Commons Logging + throughout its internal code allowing the + developer to choose a logging configuration that suits their needs, e.g + java.util.logging or + Log4J. + Commons Logging provides Tomcat the ability to log + hierarchially across various log levels without needing to rely on a particular + logging implementation. +

+

+ An important consequence for Tomcat 5.5 is that the <Logger> element found in + previous versions to create a localhost_log is no longer a valid nested element + of <Context>. Instead, the default Tomcat configuration will use java.util.logging. + If the developer wishes to collect detailed internal Tomcat logging (i.e what is happening + within the Tomcat engine), then they should configure a logging system such as java.util.logging + or log4j as detailed next. +

+ +
+ +
+

+ Tomcat 5.5 has done away with localhost_log which you may be familiar with + as the runtime exception/stack trace log. These types of error are usually thrown + by uncaught exceptions, but are still valuable to the developer. They can now be + found in the stdout log. +

+ +

+ If you need to setup cross-context detailed logging from within Tomcat's code, + then you can use a simple log4j configuration. Note that this logging van be very + verbose depending on the log level you chose to use. Note also that a log4j logging + configuration is not going to produce stack trace type logging: those stack traces + are output to stdout as discussed above. +

+ +

+ Follow the following steps to setup a file named tomcat.log that has internal + Tomcat logging output to it: +

+ +

+

    +
  1. Create a file called log4j.properties with the following content + and save it into common/classes. + + log4j.rootLogger=debug, R
    + log4j.appender.R=org.apache.log4j.RollingFileAppender
    + log4j.appender.R.File=${catalina.home}/logs/tomcat.log
    + log4j.appender.R.MaxFileSize=10MB
    + log4j.appender.R.MaxBackupIndex=10
    + log4j.appender.R.layout=org.apache.log4j.PatternLayout
    + log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
    + log4j.logger.org.apache.catalina=DEBUG, R + +
  2. + +
  3. Download Log4J + (v1.2 or later) and place the log4j jar in $CATALINA_HOME/common/lib.
  4. + +
  5. + Download Commons Logging and place the commons-logging.jar + (not commons-logging-api.jar) in $CATALINA_HOME/common/lib with + the log4j jar.
  6. + +
  7. Start Tomcat
  8. +
+

+ +

+ This log4j configuration sets up a file called tomcat.log in your + Tomcat logs folder with a maximum file size of 10MB and + up to 10 backups. DEBUG level is specified which will result in the + most verbose output from Tomcat. +

+ +

+ You can (and should) be more picky about which packages to include + in the logging. Tomcat 5.5 uses defines loggers by Engine and Host names. + For example, for a default Catalina localhost log, add this to the + end of the log4j.properties above. Note that there are known issues with + using this naming convention (with square brackets) in log4j XML based + configuration files, so we recommend you use a properties file as described + until a future version of log4j allows this convention. + +

    +
  • log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=DEBUG, R
  • +
  • log4j.logger.org.apache.catalina.core=DEBUG, R
  • +
  • log4j.logger.org.apache.catalina.session=DEBUG, R
  • +
+ + Be warned a level of DEBUG will produce megabytes of logging and slow startup + of Tomcat. This level should be used sparingly when debugging of internal Tomcat + operations is required. +

+ +

+ Your web applications should certainly use their own log4j configuration. + This is valid with the above configuration. You would place a similar log4j.properties + file in your web application's WEB-INF/classes folder, and log4j1.2.8.jar into + WEB-INF/lib. Then specify your package level logging. This is a basic setup of log4j + which does *not* require Commons-Logging, + and you should consult the + log4j documentation + for more options. This page is intended only as a bootstrapping guide. +

+ +
+ +
+ +

+ In order to configure JDK logging you should have JDK 1.4+. Tomcat 5.5 is intended for + JDK 5.0, but can be run on JDK 1.4 using a compatibility package. +

+

+ The default implemenatation of java.util.logging provided in the JDK is too limited to be + useful. A limitation of JDK Logging appears to be the inability to have per-web application logging, + as the configuration is per-VM. As a result, Tomcat will, in the default configuration, + replace the default LogManager implementation with a container friendly implementation + called JULI, which addresses these shortcomings. It supports the same configuration mechanisms + as the standard JDK java.util.logging, using either a programmatic approach, or properties + files. The main difference is that per-classloader properties files can be set (which enables easy + redeployment friendly webapp configuration), and the properties files support slightly extended + constructs which allows more freedom for defining handlers and assigning them to loggers. +

+

+ JULI is enabled by default in Tomcat 5.5, and supports per classloader configuration, in addition to + the regular global java.util.logging configuration. This means that logging can be configured at + the following layers: +

    +
  • In the JDK's logging.properties file. Check + your JAVA_HOME environment setting to see which JDK Tomcat is using (or maybe JRE 5.0 as Tomcat + can now run on a JRE from version 5.5). The file will be in $JAVA_HOME/jre/lib. + Alternately, it can also use a global configuration file located elsewhere by using the + system property java.util.logging.config.file, or programmatic configuration using + java.util.logging.config.class.
  • +
  • In each classloader using a logging.properties file. This means that it is possible to have a + configuration for the Tomcat core, as well as separate configurations for each webapps which will + have the same lifecycle as the webapps.
  • +
+

+

+ The default logging.properties specifies a ConsoleHandler for routing logging to stdout and + also a FileHandler. A handler's log level threshold can be set using SEVERE, CONFIG, INFO, + WARN, FINE, FINEST or ALL. The logging.properties shipped with JDK is set to INFO. You + can also target specific packages to collect logging from and specify a level. Here is how + you would set debugging from Tomcat. You would need to ensure the ConsoleHandler's level is also + set to collect this threshold, so FINEST or ALL should be set. Please refer to Sun's java.util.logging + documentation for the complete details. +

+

+ org.apache.catalina.level=FINEST +

+

+ The configuration used by JULI is extremely similar, but uses a few extensions to allow better + flexibility in assigning loggers. The main differences are: +

    +
  • A prefix may be added to handler names, so that multiple handlers of a single class may be + instantiated. A prefix is a String which starts with a digit, and ends with '.'. For example, + 22foobar. is a valid prefix.
  • +
  • As in Java 5.0, loggers can define a list of handlers using the loggerName.handlers + property.
  • +
  • By default, loggers will not delegate to their parent if they have associated handlers. This + may be changed per logger using the loggerName.useParentHandlers property, which accepts + a boolean value.
  • +
  • The root logger can define its set of handlers using a .handlers property.
  • +
  • System property replacement for property values which start with ${sytstemPropertyName}.
  • +
+

+

+ Example logging.properties file to be placed in common/classes: + +handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, \ + 3manager.org.apache.juli.FileHandler, 4admin.org.apache.juli.FileHandler, \ + java.util.logging.ConsoleHandler + +.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler + +############################################################ +# Handler specific properties. +# Describes specific configuration info for Handlers. +############################################################ + +1catalina.org.apache.juli.FileHandler.level = FINE +1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs +1catalina.org.apache.juli.FileHandler.prefix = catalina. + +2localhost.org.apache.juli.FileHandler.level = FINE +2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs +2localhost.org.apache.juli.FileHandler.prefix = localhost. + +3manager.org.apache.juli.FileHandler.level = FINE +3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs +3manager.org.apache.juli.FileHandler.prefix = manager. + +4admin.org.apache.juli.FileHandler.level = FINE +4admin.org.apache.juli.FileHandler.directory = ${catalina.base}/logs +4admin.org.apache.juli.FileHandler.prefix = admin. + +java.util.logging.ConsoleHandler.level = FINE +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter + + +############################################################ +# Facility specific properties. +# Provides extra control for each logger. +############################################################ + +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \ + 2localhost.org.apache.juli.FileHandler + +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \ + 3manager.org.apache.juli.FileHandler + +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/admin].level = INFO +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/admin].handlers = \ + 4admin.org.apache.juli.FileHandler + +# For example, set the com.xyz.foo logger to only log SEVERE +# messages: +#org.apache.catalina.startup.ContextConfig.level = FINE +#org.apache.catalina.startup.HostConfig.level = FINE +#org.apache.catalina.session.ManagerBase.level = FINE + +

+ +

+ Example logging.properties for the servlet-examples web application to be placed + in WEB-INF/classes inside the web application: + +handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler + +############################################################ +# Handler specific properties. +# Describes specific configuration info for Handlers. +############################################################ + +org.apache.juli.FileHandler.level = FINE +org.apache.juli.FileHandler.directory = ${catalina.base}/logs +org.apache.juli.FileHandler.prefix = servlet-examples. + +java.util.logging.ConsoleHandler.level = FINE +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter + +

+ +
+ + +
diff --git a/webapps/docs/manager-howto.xml b/webapps/docs/manager-howto.xml new file mode 100644 index 000000000..eca541dd0 --- /dev/null +++ b/webapps/docs/manager-howto.xml @@ -0,0 +1,1295 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Manager App HOW-TO + + + + +
+ +

+Introduction
+ +Configuring Manager Application Access
+Supported Manager Commands
+

+Deploy A New Application Remotely
+Deploy A New Application from a Local Path
+ +List Currently Deployed Applications
+Reload An Existing Application
+List OS and JVM Properties
+ +List Available Global JNDI Resources
+List Available Security Roles
+Session Statistics
+Start an Existing Application
+Stop an Existing Application
+ +Undeploy an Existing Application
+
+ +Executing Manager Commands With Ant
+ +Using the JMX Proxy Servlet
+
+What is JMX Proxy Servlet?
+Query command
+Set command
+
+

+ +
+ +
+ +

In many production environments, it is very useful to have the capability +to deploy a new web application, or undeploy an existing one, without having +to shut down and restart the entire container. In addition, you can request +an existing application to reload itself, even if you have not declared it +to be reloadable in the Tomcat 5 server +configuration file.

+ +

To support these capabilities, Tomcat 5 includes a web application +(installed by default on context path /manager) that supports +the following functions:

+
    +
  • Deploy a new web application, on a specified context path, from + the uploaded contents of a WAR file.
  • +
  • Deploy a new web application, on a specified context path, from the + server file system.
  • +
  • List the currently deployed web applications, as well as the + sessions that are currently active for those web apps.
  • +
  • Reload an existing web application, to reflect changes in the + contents of /WEB-INF/classes or /WEB-INF/lib. +
  • +
  • List the OS and JVM property values.
  • +
  • List the available global JNDI resources, for use in deployment + tools that are preparing <ResourceLink> elements + nested in a <Context> deployment description.
  • +
  • List the available security roles defined in the user database.
  • +
  • Start a stopped application (thus making it available again).
  • +
  • Stop an existing application (so that it becomes unavailable), but + do not undeploy it.
  • +
  • Undeploy a deployed web application and delete its document base + directory (unless it was deployed from file system).
  • +
+ +

There are two ways to configure the Manager web application +Context: +

    +
  • Install the manager.xml context configuration file + in the $CATALINA_HOME/conf/[enginename]/[hostname] folder. +
  • +
  • Configure the Manager Context within the + Host configuration in your Tomcat server.xml + configuration. Here is an example: +
    +<Context path="/manager" debug="0" privileged="true"
    +         docBase="/usr/local/kinetic/tomcat5/server/webapps/manager">
    +</Context>
    +
    +
  • +
+

+ +

If you have Tomcat configured to support multiple virtual hosts +(websites) you would need to configure a Manager for each.

+ +

There are three ways to use the Manager web application. +

    +
  • As an application with a user interface you use in your browser. +Here is an example URL where you can replace localhost with +your website host name: http://localhost/manager/html/ .
  • +
  • A minimal version using HTTP requests only which is suitable for use +by scripts setup by system administrators. Commands are given as part of the +request URI, and responses are in the form of simple text that can be easily +parsed and processed. See +Supported Manager Commands for more information.
  • +
  • A convenient set of task definitions for the Ant +(version 1.4 or later) build tool. See +Executing Manager Commands +With Ant for more information.
  • +
+

+ +

Future versions of Tomcat 5 will include administrative functionality that +is presented in (at least) the following forms: +

    +
  • As web services, so that Tomcat administration can be easily integrated + into remote and/or non-Java mnagement environments.
  • +
  • As a web application with a nice user interface (built on top of the + web services processing layer) for easy Tomcat administration via a + web browser.
  • +
+

+ +
+ +
+ +
+

The description below uses the variable name $CATALINA_HOME + to refer to the directory into which you have installed Tomcat 5, + and is the base directory against which most relative paths are + resolved. However, if you have configured Tomcat 5 for multiple + instances by setting a CATALINA_BASE directory, you should use + $CATALINA_BASE instead of $CATALINA_HOME for each of these + references.

+
+ +

It would be quite unsafe to ship Tomcat with default settings that allowed +anyone on the Internet to execute the Manager application on your server. +Therefore, the Manager application is shipped with the requirement that anyone +who attempts to use it must authenticate themselves, using a username and +password that have the role manager associated with them. +Further, there is no username in the default users file +($CATALINA_HOME/conf/tomcat-users.xml) that is assigned this +role. Therefore, access to the Manager application is completely disabled +by default.

+ +

To enable access to the Manager web application, you must either create +a new username/password combination and associate the role name +manager with it, or add the manager role +to some existing username/password combination. Exactly where this is done +depends on which Realm implementation you are using:

+
    +
  • MemoryRealm - If you have not customized your + $CATALINA_HOME/conf/server.xml to select a different one, + Tomcat 5 defaults to an XML-format file stored at + $CATALINA_HOME/conf/tomcat-users.xml, which can be + edited with any text editor. This file contains an XML + <user> for each individual user, which might + look something like this: + +<user name="craigmcc" password="secret" roles="standard,manager" /> + + which defines the username and password used by this individual to + log on, and the role names he or she is associated with. You can + add the manager role to the comma-delimited + roles attribute for one or more existing users, and/or + create new users with that assigned role.
  • +
  • JDBCRealm - Your user and role information is stored in + a database accessed via JDBC. Add the manager role + to one or more existing users, and/or create one or more new users + with this role assigned, following the standard procedures for your + environment.
  • +
  • JNDIRealm - Your user and role information is stored in + a directory server accessed via LDAP. Add the manager + role to one or more existing users, and/or create one or more new users + with this role assigned, following the standard procedures for your + environment.
  • +
+ +

The first time you attempt to issue one of the Manager commands +described in the next section, you will be challenged to log on using +BASIC authentication. The username and password you enter do not matter, +as long as they identify a valid user in the users database who possesses +the role manager.

+ +

In addition to the password restrictions the manager web application +could be restricted by the remote IP address or host by adding a +RemoteAddrValve or RemoteHostValve. Here is +an example of restricting access to the localhost by IP address: +

+<Context path="/manager" debug="0" privileged="true"
+         docBase="/usr/local/kinetic/tomcat5/server/webapps/manager">
+         <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+                allow="127.0.0.1"/>
+</Context>
+
+

+
+ + +
+ +

All commands that the Manager application knows how to process are +specified in a single request URI like this:

+ +http://{host}:{port}/manager/{command}?{parameters} + +

where {host} and {port} represent the hostname +and port number on which Tomcat is running, {command} +represents the Manager command you wish to execute, and +{parameters} represents the query parameters +that are specific to that command. In the illustrations below, customize +the host and port appropriately for your installation.

+ +

Most commands accept one or more of the following query parameters:

+
    +
  • path - The context path (including the leading slash) + of the web application you are dealing with. To select the ROOT web + application, specify "/". NOTE - + It is not possible to perform administrative commands on the + Manager application itself.
  • +
  • war - URL of a web application archive (WAR) file, + pathname of a directory which contains the web application, or a + Context configuration ".xml" file. You can use URLs in any of the + following formats: +
      +
    • file:/absolute/path/to/a/directory - The absolute + path of a directory that contains the unpacked version of a web + application. This directory will be attached to the context path + you specify without any changes.
    • +
    • file:/absolute/path/to/a/webapp.war - The absolute + path of a web application archive (WAR) file. This is valid + only for the /deploy command, and is + the only acceptable format to that command.
    • +
    • jar:file:/absolute/path/to/a/warfile.war!/ - The + URL to a local web application archive (WAR) file. You can use any + syntax that is valid for the JarURLConnection class + for reference to an entire JAR file.
    • +
    • file:/absolute/path/to/a/context.xml - The + absolute path of a web application Context configuration ".xml" + file which contains the Context configuration element.
    • +
    • directory - The directory name for the web + applciation context in the Host's application base directory.
    • +
    • webapp.war - The name of a web application war file + located in the Host's application base directory.
    • +
  • +
+ +

Each command will return a response in text/plain format +(i.e. plain ASCII with no HTML markup), making it easy for both humans and +programs to read). The first line of the response wil begin with either +OK or FAIL, indicating whether the requested +command was successful or not. In the case of failure, the rest of the first +line will contain a description of the problem that was encountered. Some +commands include additional lines of information as described below.

+ +

Internationalization Note - The Manager application looks up +its message strings in resource bundles, so it is possible that the strings +have been translated for your platform. The examples below show the English +version of the messages.

+ +
+

WARNING: the legacy commands /install and +/remove are deprecated. +They are presently equivalent to /deploy and /undeploy, +but could be removed in a future release.

+
+ + + + +http://localhost:8080/manager/deploy?path=/foo + + +

Upload the web application archive (WAR) file that is specified as the +request data in this HTTP PUT request, install it into the appBase +directory of our corresponding virtual host, and start it on the context path +specified by the path request parameter. If no path +is specified the directory name or the war file name without the .war extension +is used as the path. The application can +later be undeployed (and the corresponding application directory removed) +by use of the /undeploy.

+ +

The .WAR file may include Tomcat specific deployment configuration, by +including a Context configuration XML file in +/META-INF/context.xml.

+ +

URL parameters include: +

    +
  • update: When set to true, any existing update will be + undeployed first. The default value is set to false.
  • +
  • tag: Specifying a tag name, this allows associating the + deployed webapp with a version number. The application version can + be later redeployed when needed using only the tag.
  • +
+

+ +

NOTE - This command is the logical +opposite of the /undeploy command.

+ +

If installation and startup is successful, you will receive a response +like this:

+ +OK - Deployed application at context path /foo + + +

Otherwise, the response will start with FAIL and include an +error message. Possible causes for problems include:

+
    +
  • Application already exists at path /foo +
    +

    The context paths for all currently running web applications must be + unique. Therefore, you must undeploy the existing web + application using this context path, or choose a different context path + for the new one. The update parameter may be specified as + a parameter on the URL, with a value of true to avoid this + error. In that case, an undeploy will be performed on an existing + application before performing the deployment.

    +
  • +
  • Encountered exception +
    +

    An exception was encountered trying to start the new web application. + Check the Tomcat 5 logs for the details, but likely explanations include + problems parsing your /WEB-INF/web.xml file, or missing + classes encountered when initializing application event listeners and + filters.

    +
  • +
  • Invalid context path was specified +
    +

    The context path must start with a slash character. To reference the + ROOT web application use "/".

    +
  • +
  • No context path was specified +
    + The path parameter is required. +
  • +
+ +
+ + + +

Deploy and start a new web application, attached to the specified context +path (which must not be in use by any other web application). +This command is the logical opposite of the /undeploy command.

+ +

There are a number of different ways the deploy command can be used.

+ +

Deploy a version of a previously deployed webapp

+ +

This can be used to deploy a previous version of a web application, which +has been deployed using the tag attribute. Note that the work +directory for the manager webapp will contain the previously deployed WARs; +removing it would make the deployment fail. + +http://localhost:8080/manager/deploy?path=/footoo&tag=footag + +

+ +

Deploy a Directory or WAR by URL

+ +

Deploy a web application directory or ".war" file located on the Tomcat +server. If no path is specified, the directory name or the war file +name without the ".war" extension is used as the path. The war +parameter specifies a URL (including the file: scheme) for either +a directory or a web application archive (WAR) file. The supported syntax for +a URL referring to a WAR file is described on the Javadocs page for the +java.net.JarURLConnection class. Use only URLs that refer to +the entire WAR file.

+ +

In this example the web application located in the directory +/path/to/foo on the Tomcat server is deployed as the +web application context named /footoo. + +http://localhost:8080/manager/deploy?path=/footoo&war=file:/path/to/foo + +

+ +

In this example the ".war" file /path/to/bar.war on the +Tomcat server is deployed as the web application context named +/bar. Notice that there is no path parameter +so the context path defaults to the name of the web application archive +file without the ".war" extension. + +http://localhost:8080/manager/deploy?war=jar:file:/path/to/bar.war!/ + +

+ +

Deploy a Directory or War from the Host appBase

+ +

Deploy a web application directory or ".war" file located in your Host +appBase directory. If no path is specified the directory name +or the war file name without the ".war" extension is used as the path.

+ +

In this example the web application located in a sub directory named +foo in the Host appBase directory of the Tomcat server is +deployed as the web application context named /foo. Notice +that there is no path parameter so the context path defaults +to the name of the web application directory. + +http://localhost:8080/manager/deploy?war=foo + +

+ +

In this example the ".war" file bar.war located in your +Host appBase directory on the Tomcat server is deployed as the web +application context named /bartoo. + +http://localhost:8080/manager/deploy?path=/bartoo&war=bar.war + +

+ +

Deploy using a Context configuration ".xml" file

+ +

If the Host deployXML flag is set to true you can deploy a web +application using a Context configuration ".xml" file and an optional +".war" file or web application directory. The context path +is not used when deploying a web application using a context ".xml" +configuration file.

+ +

A Context configuration ".xml" file can contain valid XML for a +web application Context just as if it were configured in your +Tomcat server.xml configuration file. Here is an +example: + +<Context path="/foobar" docBase="/path/to/application/foobar" + debug="0"> + + <!-- Link to the user database we will get roles from --> + <ResourceLink name="users" global="UserDatabase" + type="org.apache.catalina.UserDatabase"/> + +</Context> + +

+ +

When the optional war parameter is set to the URL +for a web application ".war" file or directory it overrides any +docBase configured in the context configuration ".xml" file.

+ +

Here is an example of deploying an application using a Context +configuration ".xml" file. + +http://localhost:8080/manager/deploy?config=file:/path/context.xml + +

+ +

Here is an example of deploying an application using a Context +configuration ".xml" file and a web application ".war" file located +on the server. + +http://localhost:8080/manager/deploy?config=file:/path/context.xml&war=jar:file:/path/bar.war!/ + +

+ +

Deployment Notes

+ +

If the Host is configured with unpackWARs=true and you deploy a war +file, the war will be unpacked into a directory in your Host appBase +directory.

+ +

If the application war or directory is installed in your Host appBase +directory and either the Host is configured with autoDeploy=true or +liveDeploy=true, the Context path must match the directory name or +war file name without the ".war" extension.

+ +

For security when untrusted users can manage web applications, the +Host deployXML flag can be set to false. This prevents untrusted users +from deploying web applications using a configuration XML file and +also prevents them from deploying application directories or ".war" +files located outside of their Host appBase.

+ + +

Deploy Response

+ +

If installation and startup is successful, you will receive a response +like this:

+ +OK - Deployed application at context path /foo + + +

Otherwise, the response will start with FAIL and include an +error message. Possible causes for problems include:

+
    +
  • Application already exists at path /foo +
    +

    The context paths for all currently running web applications must be + unique. Therefore, you must undeploy the existing web + application using this context path, or choose a different context path + for the new one. The update parameter may be specified as + a parameter on the URL, with a value of true to avoid this + error. In that case, an undeploy will be performed on an existing + application before performing the deployment.

    +
  • +
  • Document base does not exist or is not a readable directory +
    +

    The URL specified by the war parameter must identify a + directory on this server that contains the "unpacked" version of a + web application, or the absolute URL of a web application archive (WAR) + file that contains this application. Correct the value specified by + the war parameter.

    +
  • +
  • Encountered exception +
    +

    An exception was encountered trying to start the new web application. + Check the Tomcat 5 logs for the details, but likely explanations include + problems parsing your /WEB-INF/web.xml file, or missing + classes encountered when initializing application event listeners and + filters.

    +
  • +
  • Invalid application URL was specified +
    +

    The URL for the directory or web application that you specified + was not valid. Such URLs must start with file:, and URLs + for a WAR file must end in ".war".

    +
  • +
  • Invalid context path was specified +
    +

    The context path must start with a slash character. To reference the + ROOT web application use "/".

    +
  • +
  • Context path must match the directory or WAR file name: +
    + If the application war or directory is installed in your Host appBase + directory and either the Host is configured with autoDeploy=true or + liveDeploy=true, the Context path must match the directory name or + war file name without the ".war" extension. +
  • +
  • Only web applications in the Host web application directory can + be installed +
    + If the Host deployXML flag is set to false this error will happen + if an attempt is made to deploy a web application directory or + ".war" file outside of the Host appBase directory. +
  • +
+ +
+ + + + +http://localhost:8080/manager/list + + +

List the context paths, current status (running or +stopped), and number of active sessions for all currently +deployed web applications. A typical response immediately +after starting Tomcat might look like this:

+ +OK - Listed applications for virtual host localhost +/webdav:running:0 +/examples:running:0 +/manager:running:0 +/:running:0 + + +
+ + + + +http://localhost:8080/manager/reload?path=/examples + + +

Signal an existing application to shut itself down and reload. This can +be useful when the web application context is not reloadable and you have +updated classes or property files in the /WEB-INF/classes +directory or when you have added or updated jar files in the +/WEB-INF/lib directory. +

+

NOTE: The /WEB-INF/web.xml +web application configuration file is not reread on a reload. +If you have made changes to your web.xml file you must stop +then start the web application. +

+ +

If this command succeeds, you will see a response like this:

+ +OK - Reloaded application at context path /examples + + +

Otherwise, the response will start with FAIL and include an +error message. Possible causes for problems include:

+
    +
  • Encountered exception +
    +

    An exception was encountered trying to restart the web application. + Check the Tomcat 5 logs for the details.

    +
  • +
  • Invalid context path was specified +
    +

    The context path must start with a slash character. To reference the + ROOT web application use "/".

    +
  • +
  • No context exists for path /foo +
    +

    There is no deployed application on the context path + that you specified.

    +
  • +
  • No context path was specified +
    + The path parameter is required. +
  • +
  • Reload not supported on WAR deployed at path /foo +
    + Currently, application reloading (to pick up changes to the classes or + web.xml file) is not supported when a web application is + deployed directly from a WAR file. It only works when the web application + is deployed from an unpacked directory. If you are using a WAR file, + you should undeploy and then deploy or + deploy with the update parameter the + application again to pick up your changes. +
  • +
+ +
+ + + + +http://localhost:8080/manager/serverinfo + + +

Lists information about the Tomcat version, OS, and JVM properties.

+ +

If an error occurs, the response will start with FAIL and +include an error message. Possible causes for problems include:

+
    +
  • Encountered exception +
    +

    An exception was encountered trying to enumerate the system properties. + Check the Tomcat 5 logs for the details.

    +
  • +
+ +
+ + + + +http://localhost:8080/manager/resources[?type=xxxxx] + + +

List the global JNDI resources that are available for use in resource +links for context configuration files. If you specify the type +request parameter, the value must be the fully qualified Java class name of +the resource type you are interested in (for example, you would specify +javax.sql.DataSource to acquire the names of all available +JDBC data sources). If you do not specify the type request +parameter, resources of all types will be returned.

+ +

Depending on whether the type request parameter is specfied +or not, the first line of a normal response will be:

+
+  OK - Listed global resources of all types
+
+

or

+
+  OK - Listed global resources of type xxxxx
+
+

followed by one line for each resource. Each line is composed of fields +delimited by colon characters (":"), as follows:

+
    +
  • Global Resource Name - The name of this global JNDI resource, + which would be used in the global attribute of a + <ResourceLink> element.
  • +
  • Global Resource Type - The fully qualified Java class name of + this global JNDI resource.
  • +
+ +

If an error occurs, the response will start with FAIL and +include an error message. Possible causes for problems include:

+
    +
  • Encountered exception +
    +

    An exception was encountered trying to enumerate the global JNDI + resources. Check the Tomcat 5 logs for the details.

    +
  • +
  • No global JNDI resources are available +
    +

    The Tomcat server you are running has been configured without + global JNDI resources.

    +
  • +
+ + +
+ + + + + +http://localhost:8080/manager/roles + + +

List the security role names (and corresponding descriptions) that are +available in the org.apache.catalina.UserDatabase resource that +is linked to the users resource reference in the web.xml file +for the Manager web application. This would typically be used, for example, +by a deployment tool that wanted to create +<security-role-ref> elements to map security role names +used in a web application to the role names actually defined within the +container.

+ +

By default, the users resource reference is pointed at the +global UserDatabase resource. If you choose to utilize a +different user database per virtual host, you should modify the +<ResourceLink> element in the default +manager.xml context configuration file to point at the global +user database resource for this virtual host.

+ +

When this command is executed, the first line of the response will be:

+
+  OK - Listed security roles
+
+

followed by one line for each security role. Each line is composed of +fields delimited by colon characters (":") as follows:

+
    +
  • Security Role Name - A security role name that is known to Tomcat + in the user database.
  • +
  • Description - Description of this security role (useful in + creating user interfaces for selecting roles.
  • +
+ +

If an error occurs, the response will start with FAIL and +include an error message. Possible causes for problems include:

+
    +
  • Cannot resolve user database reference - A JNDI error prevented + the successful lookup of the org.apache.catalina.UserDatabase + resource. Check the Tomcat log files for a stack trace associated with + this error.
  • +
  • No user database is available - You have not configured a resource + reference for the users resource that points at an + appropriate user database instance. Check your manager.xml + file and ensure that you have created an appropriate + <ResourceLink> or + <ResourceParams> element for this resource.
  • +
+ +
+ + + + + +http://localhost:8080/manager/sessions?path=/examples + + +

Display the default session timeout for a web application, and the +number of currently active sessions that fall within ten-minute ranges of +their actual timeout times. For example, after restarting Tomcat and then +executing one of the JSP samples in the /examples web app, +you might get something like this:

+ +OK - Session information for application at context path /examples +Default maximum session inactive interval 30 minutes +30 - <40 minutes:1 sessions + + +
+ + + + + +http://localhost:8080/manager/start?path=/examples + + +

Signal a stopped application to restart, and make itself available again. +Stopping and starting is useful, for example, if the database required by +your application becomes temporarily unavailable. It is usually better to +stop the web application that relies on this database rather than letting +users continuously encounter database exceptions.

+ +

If this command succeeds, you will see a response like this:

+ +OK - Started application at context path /examples + + +

Otherwise, the response will start with FAIL and include an +error message. Possible causes for problems include:

+
    +
  • Encountered exception +
    +

    An exception was encountered trying to start the web application. + Check the Tomcat 5 logs for the details.

    +
  • +
  • Invalid context path was specified +
    +

    The context path must start with a slash character. To reference the + ROOT web application use "/".

    +
  • +
  • No context exists for path /foo +
    +

    There is no deployed application on the context path + that you specified.

    +
  • +
  • No context path was specified +
    + The path parameter is required. +
  • +
+ +
+ + + + +http://localhost:8080/manager/stop?path=/examples + + +

Signal an existing application to make itself unavailable, but leave it +deployed. Any request that comes in while an application is +stopped will see an HTTP error 404, and this application will show as +"stopped" on a list applications command.

+ +

If this command succeeds, you will see a response like this:

+ +OK - Stopped application at context path /examples + + +

Otherwise, the response will start with FAIL and include an +error message. Possible causes for problems include:

+
    +
  • Encountered exception +
    +

    An exception was encountered trying to stop the web application. + Check the Tomcat 5 logs for the details.

    +
  • +
  • Invalid context path was specified +
    +

    The context path must start with a slash character. To reference the + ROOT web application use "/".

    +
  • +
  • No context exists for path /foo +
    +

    There is no deployed application on the context path + that you specified.

    +
  • +
  • No context path was specified +
    + The path parameter is required. +
  • +
+ +
+ + + + + +http://localhost:8080/manager/undeploy?path=/examples + + +

WARNING - This command will delete any web +application artifacts that exist within appBase directory +(typically "webapps") for this virtual host. +This will delete the the application .WAR, if present, +the application directory resulting either from a deploy in unpacked form +or from .WAR expansion as well as the XML Context definition from +$CATALINA_HOME/conf/[enginename]/[hostname]/ directory. +If you simply want to take an application +out of service, you should use the /stop command instead.

+ +

Signal an existing application to gracefully shut itself down, and +remove it from Tomcat (which also makes this context path available for +reuse later). In addition, the document root directory is removed, if it +exists in the appBase directory (typically "webapps") for +this virtual host. This command is the logical opposite of the +/deploy command.

+ +

If this command succeeds, you will see a response like this:

+ +OK - Undeployed application at context path /examples + + +

Otherwise, the response will start with FAIL and include an +error message. Possible causes for problems include:

+
    +
  • Encountered exception +
    +

    An exception was encountered trying to undeploy the web application. + Check the Tomcat 5 logs for the details.

    +
  • +
  • Invalid context path was specified +
    +

    The context path must start with a slash character. To reference the + ROOT web application use "/".

    +
  • +
  • No context exists for path /foo +
    +

    There is no deployed application on the context path + that you specified.

    +
  • +
  • No context path was specified +
    + The path parameter is required. +
  • +
+ +
+ +
+ +
+ +

In addition to the ability to execute Manager commands via HTTP requests, +as documented above, Tomcat 5 includes a convenient set of Task definitions +for the Ant (version 1.4 or later) build tool. In order to use these +commands, you must perform the following setup operations:

+
    +
  • Download the binary distribution of Ant from + http://ant.apache.org. + You must use version 1.4 or later.
  • +
  • Install the Ant distribution in a convenient directory (called + ANT_HOME in the remainder of these instructions).
  • +
  • Copy the file server/lib/catalina-ant.jar from your Tomcat 5 + installation into Ant's library directory ($ANT_HOME/lib). +
  • +
  • Add the $ANT_HOME/bin directory to your PATH + environment variable.
  • +
  • Configure at least one username/password combination in your Tomcat + user database that includes the manager role.
  • +
+ +

To use custom tasks within Ant, you must declare them first with a +<taskdef> element. Therefore, your build.xml +file might look something like this:

+ + + +
+<project name="My Application" default="compile" basedir=".">
+
+  <!-- Configure the directory into which the web application is built -->
+  <property name="build"    value="${basedir}/build"/>
+
+  <!-- Configure the context path for this application -->
+  <property name="path"     value="/myapp"/>
+
+  <!-- Configure properties to access the Manager application -->
+  <property name="url"      value="http://localhost:8080/manager"/>
+  <property name="username" value="myusername"/>
+  <property name="password" value="mypassword"/>
+
+  <!-- Configure the custom Ant tasks for the Manager application -->
+  <taskdef name="deploy"    classname="org.apache.catalina.ant.DeployTask"/>
+  <taskdef name="list"      classname="org.apache.catalina.ant.ListTask"/>
+  <taskdef name="reload"    classname="org.apache.catalina.ant.ReloadTask"/>
+  <taskdef name="resources" classname="org.apache.catalina.ant.ResourcesTask"/>
+  <taskdef name="roles"     classname="org.apache.catalina.ant.RolesTask"/>
+  <taskdef name="start"     classname="org.apache.catalina.ant.StartTask"/>
+  <taskdef name="stop"      classname="org.apache.catalina.ant.StopTask"/>
+  <taskdef name="undeploy"  classname="org.apache.catalina.ant.UndeployTask"/>
+
+  <!-- Executable Targets -->
+  <target name="compile" description="Compile web application">
+    <!-- ... construct web application in ${build} subdirectory, and
+            generated a ${path}.war ... -->
+  </target>
+
+  <target name="deploy" description="Install web application"
+          depends="compile">
+    <deploy url="${url}" username="${username}" password="${password}"
+            path="${path}" war="${build}${path}.war"/>
+  </target>
+
+  <target name="reload" description="Reload web application"
+          depends="compile">
+    <reload  url="${url}" username="${username}" password="${password}"
+            path="${path}"/>
+  </target>
+
+  <target name="undeploy" description="Remove web application">
+    <undeploy url="${url}" username="${username}" password="${password}"
+            path="${path}"/>
+  </target>
+
+</project>
+
+ +

Now, you can execute commands like ant deploy to deploy the +application to a running instance of Tomcat, or ant reload to +tell Tomcat to reload it. Note also that most of the interesting values in +this build.xml file are defined as replaceable properties, so +you can override their values from the command line. For example, you might +consider it a security risk to include the real manager password in your +build.xml file's source code. To avoid this, omit the password +property, and specify it from the command line:

+
+  ant -Dpassword=secret deploy
+
+ + + +

Using Ant version 1.6.2 or later, +the Catalina tasks offer the option to capture their output in +properties or external files. They support directly the following subset of the +<redirector> type attributes: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionRequired
outputName of a file to which to write the output. If +the error stream is not also redirected to a file or property, it will +appear in this output.No
errorThe file to which the standard error of the +command should be redirected.No
logErrorThis attribute is used when you wish to see +error output in Ant's log and you are redirecting output to a +file/property. The error output will not be included in the output +file/property. If you redirect error with the error or errorProperty +attributes, this will have no effect.No
appendWhether output and error files should be +appended to or overwritten. Defaults to false.No
createemptyfilesWhether output and error files should be created +even when empty. Defaults to true.No
outputpropertyThe name of a property in which the output of +the command should be stored. Unless the error stream is redirected to +a separate file or stream, this property will include the error output.No
errorpropertyThe name of a property in which the standard +error of the command should be stored.No
+ +

A couple of additional attributes can also be specified: +

+ + + + + + + + + + + + + + + + + + +
AttributeDescriptionRequired
alwaysLogThis attribute is used when you wish to see the +output you are capturing, appearing also in the Ant's log. It must not be +used unless you are capturing task output. +Defaults to false. +This attribute will be supported directly by <redirector> +in Ant 1.6.3No
failonerrorThis attribute is used when you wish to avoid that +any manager command processing error terminates the ant execution. Defaults to true. +It must be set to false, if you want to capture error output, +otherwise execution will terminate before anything can be captured. +

+This attribute acts only on manager command execution, +any wrong or missing command attribute will still cause Ant execution termination. +
No
+ +

They also support the embedded <redirector> element +in which you can specify +its full set of attributes, but input, inputstring and +inputencoding that, even if accepted, are not used because they have +no meaning in this context. +Refer to ant manual for details on +<redirector> element attributes. +

+ +

+Here is a sample build file extract that shows how this output redirection support +can be used: +

+ + + +
+	<target name="manager.deploy"
+		depends="context.status"
+		if="context.notInstalled">
+		<deploy url="${mgr.url}"
+			username="${mgr.username}"
+			password="${mgr.password}"
+			path="${mgr.context.path}"
+			config="${mgr.context.descriptor}"/>
+	</target>
+
+	<target name="manager.deploy.war"
+		depends="context.status"
+		if="context.deployable">
+		<deploy url="${mgr.url}"
+			username="${mgr.username}"
+			password="${mgr.password}"
+			update="${mgr.update}"
+			path="${mgr.context.path}"
+			war="${mgr.war.file}"/>
+	</target>
+	
+	<target name="context.status">
+		<property name="running" value="${mgr.context.path}:running"/>
+		<property name="stopped" value="${mgr.context.path}:stopped"/>
+	
+		<list url="${mgr.url}"
+			outputproperty="ctx.status"
+			username="${mgr.username}"
+			password="${mgr.password}">
+		</list>
+		
+		<condition property="context.running">
+			<contains string="${ctx.status}" substring="${running}"/>
+		</condition>
+		<condition property="context.stopped">
+			<contains string="${ctx.status}" substring="${stopped}"/>
+		</condition>
+		<condition property="context.notInstalled">
+			<and>
+				<isfalse value="${context.running}"/>
+				<isfalse value="${context.stopped}"/>
+			</and>
+		</condition>
+		<condition property="context.deployable">
+			<or>
+				<istrue value="${context.notInstalled}"/>
+				<and>
+					<istrue value="${context.running}"/>
+					<istrue value="${mgr.update}"/>
+				</and>
+				<and>
+					<istrue value="${context.stopped}"/>
+					<istrue value="${mgr.update}"/>
+				</and>
+			</or>
+		</condition>
+		<condition property="context.undeployable">
+			<or>
+				<istrue value="${context.running}"/>
+				<istrue value="${context.stopped}"/>
+			</or>
+		</condition>
+	</target>
+
+ +

WARNING: even if it doesn't make many sense, and is always a bad idea, +calling a Catalina task more than once, +badly set Ant tasks depends chains may cause that a task be called +more than once in the same Ant run, even if not intended to. A bit of caution should be exercised when you are +capturing output from that task, because this could lead to something unexpected: +

    +
  • when capturing in a property you will find in it only the output from the first call, because +Ant properties are immutable and once set they cannot be changed, +
  • +
  • when capturing in a file, each run will overwrite it and you will find in it only the last call +output, unless you are using the append="true" attribute, in which case you will +see the output of each task call appended to the file. +
  • +
+

+ +
+ +
+ +
+ + + The JMX Proxy Servlet is a lightweight proxy to get and set the + tomcat internals. (Or any class that has been exposed via an MBean) + Its usage is not very user friendly but the UI is + extremely help for integrating command line scripts for monitoring + and changing the internals of tomcat. You can do two things with the proxy: + get information and set information. For you to really understand the + JMX Proxy Servlet, you should have a general understanding of JMX. + If you don't know what JMX is, then prepare to be confused. + + + + This takes the form: + +http://webserver/manager/jmxproxy/?qry=STUFF + + Where STUFF is the JMX query you wish to perform. For example, + here are some queries you might wish to run: +
    +
  • + qry=*%3Atype%3DRequestProcessor%2C* --> + type=RequestProcessor which will locate all + workers which can process requests and report + their state. +
  • +
  • + qry=*%3Aj2eeType=Servlet%2c* --> + j2eeType=Servlet which return all loaded servlets. +
  • +
  • + qry=Catalina%3Atype%3DEnvironment%2Cresourcetype%3DGlobal%2Cname%3DsimpleValue --> + Catalina:type=Environment,resourcetype=Global,name=simpleValue + which look for a specific MBean by the given name. +
  • +
+ You'll need to experiment with this to really understand its capabilites. + If you provide no qry parameter, then all of the MBeans will + be displayed. We really recommend looking at the tomcat source code and + understand the JMX spec to get a better understanding of all the queries + you may run. +
+ + + Now that you can query an MBean, its time to muck with Tomcat's internals! + The general form of the set command is : + +http://webserver/manager/jmxproxy/?set=BEANNAME&att=MYATTRIBUTE&val=NEWVALUE + + So you need to provide 3 request parameters: +
    +
  1. set: The full bean name
  2. +
  3. att: The attribute you wish to alter
  4. +
  5. val: The new value
  6. +
+ If all goes ok, then it will say OK, otherwise an error message will be + shown. For example, lets say we wish to turn up debugging on the fly for the + ErrorReportValve. The following will set debugging to 10. + +http://localhost:8080/manager/jmxproxy/ +?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost&att=debug&val=10 + + and my result is (YMMV): + +Result: ok + + + Here is what I see if I pass in a bad value. Here is the URL I used, + I try set debugging equal to 'cowbell': + +http://localhost:8080/manager/jmxproxy/ +?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost&att=debug&val=cowbell + + When I try that, my result is + +Error: java.lang.NumberFormatException: For input string: "cowbell" + +
+ + +
+ + + + + +
diff --git a/webapps/docs/mbeans-descriptor-howto.xml b/webapps/docs/mbeans-descriptor-howto.xml new file mode 100644 index 000000000..69df84e35 --- /dev/null +++ b/webapps/docs/mbeans-descriptor-howto.xml @@ -0,0 +1,63 @@ + + +]> + + + &project; + + + Amy Roh + MBean Descriptor How To + + + + +
+ +

Tomcat 5 uses JMX MBeans as the technology for implementing +manageability of Tomcat.

+ +

The descriptions of JMX MBeans for Catalina are in the mbeans-descriptor.xml +file in each package.

+ +

You will need to add MBean descriptions for your custom components +in order to avoid a "ManagedBean is not found" exception.

+ +
+ +
+ +

You may also add MBean descriptions for custom components in +a mbeans-descriptor.xml file, located in the same package as the class files +it describes.

+ + + <mbean name="LDAPRealm" + className="org.apache.catalina.mbeans.ClassNameMBean" + description="Custom LDAPRealm" + domain="Catalina" + group="Realm" + type="com.myfirm.mypackage.LDAPRealm"> + + <attribute name="className" + description="Fully qualified class name of the managed object" + type="java.lang.String" + writeable="false"/> + + <attribute name="debug" + description="The debugging detail level for this component" + type="int"/> + . + . + . + + </mbean> + + + +
+ + + +
diff --git a/webapps/docs/monitoring.xml b/webapps/docs/monitoring.xml new file mode 100644 index 000000000..e6cdae8c9 --- /dev/null +++ b/webapps/docs/monitoring.xml @@ -0,0 +1,1137 @@ + + +]> + + + &project; + + + Peter Rossbach + Remy Maucherat + Monitoring and Managing Tomcat + + + + +
+ +

Monitoring is a very important question today. Looking inside the running + server, grab some statistic data or reconfigure some aspects are + daliy adminstration tasks.

+ +
+ +
+ +

The Sun website includes the list of options and how to configure JMX Remote on Java 5: + + http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html. +

+

For quick installation you find here a short installation guide:

+

Add the following parameters to your tomcat startup script: + + set CATALINA_OPTS="-Dcom.sun.management.jmxremote \ + -Dcom.sun.management.jmxremote.port=%my.jmx.port% \ + -Dcom.sun.management.jmxremote.ssl=false \ + -Dcom.sun.management.jmxremote.authenticate=false" + +

+

+

    +
  1. When you think authorisation is a good, add and change this : + + -Dcom.sun.management.jmxremote.authenticate=true \ + -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password \ + -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access \ + +
  2. +
  3. edit the access allow file $CATALINA_BASE/conf/jmxremote.access : + +monitorRole readonly +controlRole readwrite + +
  4. +
  5. edit the password file $CATALINA_BASE/conf/jmxremote.password : + +monitorRole tomcat +controlRole tomcat + + Tipp: Password File must be readonly and not accessable from every + other user! Remove all other users under windows to access this file. +
  6. +
+ Note:The JSR 160 JMX-Adaptor opens a second data protocol port. That is a problem + when you have installed a local firewall.
+

+

Activate JMX MX4J Http Adaptor with Java 1.4: +

    +
  1. Install the tomcat compat package
  2. +
  3. Install the mx4j-tools.jar at common/lib. Please, use the same MX4j + version as your tomcat release
  4. +
  5. Configure a MX4J JMX HTTP Adaptor at your AJP Connector +

    + + <Connector port="${AJP.PORT}" + handler.list="mx" + mx.enabled="true" + mx.httpHost="${JMX.HOST}" + mx.httpPort="${JMX.PORT}" + protocol="AJP/1.3" /> + +

    +

    Tipp: With ${AJP.PORT}=0 no ajp connection where started. +

    +

    Note: MX4J JSR 160 RMI Adaptor to support JDK 1.4 currently not integrated. +

    +
  6. +
  7. Start your tomcat and look with a browser at http://${JMX.HOST}:${JMX.PORT}
  8. +
  9. With the mx connector parameter mx.authMode="basic" mx.authUser="tomcat" mx.authPassword="strange" + you can control the access!
  10. +
  11. A complete list of all tomcat core MBeans can you find at + http://jakarta.apache.org/tomcat/tomcat-5.5-doc/catalina/funcspecs/mbean-names.html.
  12. +
+

+ +
+ +
+

For simple tomcat ant task usage with ant 1.6.x we have integrate import and antlib support.

+

antlibCopy your catalina-ant.jar from $CATALINA_HOME/server/lib to $ANT_HOME/lib.

+

Following example show the JMX Accessor usage:

+ + +

+<project name="Catalina Ant JMX" 
+        xmlns:jmx="antlib:org.apache.catalina.ant.jmx" 
+        default="state"
+        basedir=".">
+    <property name="jmx.server.name" value="localhost" />
+    <property name="jmx.server.port" value="9012" />
+    <property name="cluster.server.address" value="192.168.1.75" />
+    <property name="cluster.server.port" value="9025" />
+ 
+    <target name="state" description="Show JMX Cluster state">
+        <jmx:open
+            host="${jmx.server.name}"
+            port="${jmx.server.port}"
+            username="controlRole"
+            password="tomcat"/>
+        <jmx:get
+            name="Catalina:type=IDataSender,host=localhost,senderAddress=${cluster.server.address},senderPort=${cluster.server.port}" 
+            attribute="connected"
+            resultproperty="IDataSender.backup.connected"
+            echo="false"
+        />
+       <jmx:get
+            name="Catalina:type=ClusterSender,host=localhost" 
+            attribute="senderObjectNames"
+            resultproperty="senderObjectNames"
+            echo="false"
+        />
+        <!-- get current maxActiveSession from ClusterTest application
+             echo it to ant output and store at 
+             property <em>clustertest.maxActiveSessions.orginal</em>
+        -->
+       <jmx:get
+            name="Catalina:type=Manager,path=/ClusterTest,host=localhost" 
+            attribute="maxActiveSessions"
+            resultproperty="clustertest.maxActiveSessions.orginal"
+            echo="true"
+        />
+        <!-- set maxActiveSession to 100
+        -->
+        <jmx:set
+            name="Catalina:type=Manager,path=/ClusterTest,host=localhost" 
+            attribute="maxActiveSessions"
+            value="100"
+            type="int"
+        />
+        <!-- get all sessions and split result as delimiter <em>SPACE</em> for easy
+             access all session ids directly with ant property sessions.[0..n].
+        -->
+        <jmx:invoke
+            name="Catalina:type=Manager,path=/ClusterTest,host=localhost" 
+            operation="listSessionIds"
+            resultproperty="sessions"
+            echo="false"
+            delimiter=" "
+        />
+        <!-- Access session attribute <em>Hello</em> from first session.
+        -->
+        <jmx:invoke
+            name="Catalina:type=Manager,path=/ClusterTest,host=localhost" 
+            operation="getSessionAttribute"
+            resultproperty="Hello"
+            echo="false"
+        >
+          <arg value="${sessions.0}"/>
+          <arg value="Hello"/>
+        </jmx:invoke> 
+        <!-- Query for all application manager.of the server from all hosts
+             and bind all attributes from all found manager mbeans.
+        -->
+        <jmx:query
+            name="Catalina:type=Manager,*" 
+            resultproperty="manager"
+            echo="true"
+            attributebinding="true"
+        />
+        <!-- echo the create properties -->
+        <echo>
+           senderObjectNames: ${senderObjectNames.0}
+           IDataSender.backup.connected: ${IDataSender.backup.connected}
+           session: ${sessions.0}
+           manager.length: ${manager.length}
+           manager.0.name: ${manager.0.name}
+           manager.1.name: ${manager.1.name}
+           hello: ${Hello}
+           manager.ClusterTest.0.name: ${manager.ClusterTest.0.name}
+           manager.ClusterTest.0.activeSessions: ${manager.ClusterTest.0.activeSessions}
+           manager.ClusterTest.0.counterSend_EVT_SESSION_EXPIRED: ${manager.ClusterTest.0.counterSend_EVT_SESSION_EXPIRED}
+           manager.ClusterTest.0.counterSend_EVT_GET_ALL_SESSIONS: ${manager.ClusterTest.0.counterSend_EVT_GET_ALL_SESSIONS}
+        </echo>   
+
+    </target>
+ 
+</project>
+   

+
+

import: Import the JMX Accessor Projekt with + <import file="${CATALINA.HOME}/bin/jmxaccessor-tasks.xml" /> and + reference the tasks with jmxOpen, jmxSet, jmxGet, + jmxQuery, jmxInvoke,jmxEquals and jmxCondition.

+ +
+ + + +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
urlSet jmx connection url - service:jmx:rmi:///jndi/rmi://localhost:8050/jmxrmi +
hostSet the host, shortcut the very long url syntax. + localhost
portSet the remote connection port + 8050
usernameremote jmx connection user name. +
passwordremote jmx connection password. +
refName of the internal connection referenz. With this attribute you can + configure more the one connection inside the same ant projekt. + jmx.server
echoEcho the command usage (for analyse access or debugging) + false
ifOnly execute if a property of the given name exists in the current project. +
unlessOnly execute if a property of the given name not exists in the current project. +
+

+

+Example to open a new jmx connection
+ + <jmx:open + host="${jmx.server.name}" + port="${jmx.server.port}" + /> + +

+

+Example to open a jmx connection from url, with authorisation and +store at other reference
+ + <jmx:open + url="service:jmx:rmi:///jndi/rmi://localhost:9024/jmxrmi" + ref="jmx.server.9024" + username="controlRole" + password="tomcat" + /> + +

+ +

+Example to open a jmx connection from url, with authorisation and +store at other reference, but only when property jmx.if exists and +jmx.unless not exists
+ + <jmx:open + url="service:jmx:rmi:///jndi/rmi://localhost:9024/jmxrmi" + ref="jmx.server.9024" + username="controlRole" + password="tomcat" + if="jmx.if" + unless="jmx.unless" + /> + +

+

Note: All properties from jmxOpen task also exists at all +other tasks and conditions. +

+ +
+ + + +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
nameFull qualified JMX ObjectName -- Catalina:type=Server +
attributeExisting Mbean attribute (see Tomcat mbean description above) +
refJMX Connection reference + jmx.server
echoEcho command usage (access and result) + false
resultpropertySave result at this project property +
delimiterSplit result with delimiter (java.util.StringTokenizier) + and use resultproperty as prefix to store tokens. +
separatearrayresultsWhen return value is an array, save result as property list + ($resultproperty.[0..N] and $resultproperty.lenght) + true
+

+

+Example to get remote mbean attribute from default jmx connection
+ + <jmx:get + name="Catalina:type=Manager,path=/servlets-examples,host=localhost" + attribute="maxActiveSessions" + resultproperty="servlets-examples.maxActiveSessions" + /> + +

+

+Example to get and result array and split it at separate properties
+ + <jmx:get + name="Catalina:type=ClusterSender,host=localhost" + attribute="senderObjectNames" + resultproperty="senderObjectNames" + /> + +Access the senderObjectNames properties with: + + ${senderObjectNames.lenght} give the number of returned sender list. + ${senderObjectNames.[0..N]} found all sender object names + +

+ +

+Example to get IDataSender attribute connected only when cluster is configured. + +<jmx:query + failonerror="false" + name="Catalina:type=Cluster,host=${tomcat.application.host}" + resultproperty="cluster" +/> +<jmx:get + name="Catalina:type=IDataSender,host=${tomcat.application.host},senderAddress=${cluster.backup.address},senderPort=${cluster.backup.port}" + attribute="connected" + resultproperty="datasender.connected" + if="cluster.0.name" /> + +

+ +
+ + + +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
nameFull qualified JMX ObjectName -- Catalina:type=Server +
attributeExisting Mbean attribute (see Tomcat mbean description above) +
valuevalue that set to attribute +
typetype of the attribute. + java.lang.String
refJMX Connection reference + jmx.server
echoEcho command usage (access and result) + false
+

+

+Example to set remote mbean attribute value
+ + <jmx:set + name="Catalina:type=Manager,path=/servlets-examples,host=localhost" + attribute="maxActiveSessions" + value="500" + type="int" + /> + +

+ +
+ + + +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
nameFull qualified JMX ObjectName -- Catalina:type=Server +
operationExisting Mbean operation (see Tomcat + + http://jakarta.apache.org/tomcat/tomcat-5.5-doc/catalina/funcspecs/fs-admin-opers.html. +
refJMX Connection reference + jmx.server
echoEcho command usage (access and result) + false
resultpropertySave result at this project property +
delimiterSplit result with delimiter (java.util.StringTokenizier) + and use resultproperty as prefix to store tokens. +
separatearrayresultsWhen return value is an array, save result as property list + ($resultproperty.[0..N] and $resultproperty.lenght) + true
+

+

+stop an application
+ + <jmx:invoke + name="Catalina:type=Manager,path=/servlets-examples,host=localhost" + operation="stop"/> + +Now you can find the sessionid at ${sessions.[0..N} properties and access the count +with ${sessions.lenght} property. +

+

+Example to get all sessionids
+ + <jmx:invoke + name="Catalina:type=Manager,path=/servlets-examples,host=localhost" + operation="listSessionIds" + resultproperty="sessions" + delimiter=" " + /> + +Now you can find the sessionid at ${sessions.[0..N} properties and access the count +with ${sessions.lenght} property. +

+

+Example to get remote mbean session attribute from session ${sessionid.0}
+ + <jmx:invoke + name="Catalina:type=Manager,path=/ClusterTest,host=localhost" + operation="getSessionAttribute" + resultproperty="hello"> + <arg value="${sessionid.0}"/> + <arg value="Hello" /> + </jmx:invoke> + +

+

+Example to create a new access logger valve at vhost localhost + + <jmx:invoke + name="Catalina:type=MBeanFactory" + operation="createAcccesLoggerValve" + resultproperty="acccesLoggerObjectName" + > + <arg value="Catalina:type=Host,host=localhost"/> + </jmx:invoke> + +Now you can find new Mbean with name stored at ${acccesLoggerObjectName} +proeprty. +

+ +
+ + + +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
nameJMX ObjectName query string -- Catalina:type=Manager,* +
refJMX Connection reference + jmx.server
echoEcho command usage (access and result) + false
resultpropertyPrefix project property name to all founded Mbeans (mbeans.[0..N].objectname) +
attributebinduingbind ALL MBean attributes in addition to name + false
delimiterSplit result with delimiter (java.util.StringTokenizier) + and use resultproperty as prefix to store tokens. +
separatearrayresultsWhen return value is an array, save result as property list + ($resultproperty.[0..N] and $resultproperty.lenght) + true
+

+

+Get all Manager ObjectNames from all services and Hosts
+ + <jmx:query + name="Catalina:type=Manager,* + resultproperty="manager" /> + +Now you can find the Session Manager at ${manager.[0..N].name} +properties and access the result object counter with ${manager.length} property. +

+

+Example to get the Manager from servlet-examples application an bind all mbean properties
+ + <jmx:query + name="Catalina:type=Manager,path=/servlet-examples,host=localhost*" + attributebinding="true" + resultproperty="manager.servletExamples" /> + +Now you can find the manager at ${manager.servletExamples.0.name} property +and can access all properties from this manager with ${manager.servletExamples.0.[manager attribute names]}. +The result object counter from MBeans is stored ad ${manager.length} property. +

+ +

+Example to get all MBeans from a server and store inside an external xml property file
+ +<project name="jmx.query" + xmlns:jmx="antlib:org.apache.catalina.ant.jmx" + default="query-all" basedir="."> +<property name="jmx.host" value="localhost"/> +<property name="jmx.port" value="8050"/> +<property name="jmx.username" value="controlRole"/> +<property name="jmx.password" value="tomcat"/> + +<target name="query-all" description="Query all MBeans of a server"> +<!-- Configure connection --> +<jmx:open + host="${jmx.host}" + port="${jmx.port}" + ref="jmx.server" + username="${jmx.username}" + password="${jmx.password}"/> +<!-- Query MBean list --> +<jmx:query + name="*:*" + resultproperty="mbeans" + attributebinding="false"/> + +<echoproperties + destfile="mbeans.properties" + prefix="mbeans." + format="xml"/> + +<!-- Print results --> +<echo + message="Number of MBeans in server ${jmx.host}:${jmx.port} is ${mbeans.length}"/> +</target> +</project> + +Now you can find all MBeans inside the file mbeans.properties. +

+ +
+ + + +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
nameFull qualified JMX ObjectName -- Catalina:type=MBeanFactory +
classNameExisting MBean full qualified classname (see Tomcat mbean description above) +
classLoaderObjectName of server or web application classloader
+ ( Catalina:type=ServerClassLoader,name=[server,common,shared] or
+ Catalina:type=WebappClassLoader,path=/myapps,host=localhost) +
refJMX Connection reference + jmx.server
echoEcho command usage (access and result) + false
+

+

+Example to create remote mbean
+ + <jmx:create + ref="${jmx.reference}" + name="Catalina:type=MBeanFactory" + className="org.apache.commons.modeler.BaseModelMBean" + classLoader="Catalina:type=ServerClassLoader,name=server"> + <Arg value="org.apache.catalina.mbeans.MBeanFactory" /> + </jmx:create> + +

+

+ Warning: A lot of tomcat mbeans can't be really create and connect with
+ the parent. The valve, cluster or realm Mbeans are not autconnect with there parent.
+ Use MBeanFacrory create operation instead. +

+ +
+ + + +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
nameFull qualified JMX ObjectName -- Catalina:type=MBeanFactory +
refJMX Connection reference + jmx.server
echoEcho command usage (access and result) + false
+

+

+Example to unregister remote mbean
+ + <jmx:unregister + name="Catalina:type=MBeanFactory" + /> + +

+

+ Warning: A lot of tomcat mbeans can't be really unregister.
+ The Mbeans are not deregister from parent. Use MBeanFacrory
+ remove operation instead. +

+ +
+ + + +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
urlSet jmx connection url - service:jmx:rmi:///jndi/rmi://localhost:8050/jmxrmi +
hostSet the host, shortcut the very long url syntax. + localhost
portSet the remote connection port + 8050
usernameremote jmx connection user name. +
passwordremote jmx connection password. +
refName of the internal connection reference. With this attribute you can + configure more the one connection inside the same ant projekt. + jmx.server
nameFull qualified JMX ObjectName -- Catalina:type=Server +
echoEcho condition usage (access and result) + false
ifOnly execute if a property of the given name exists in the current project. +
unlessOnly execute if a property of the given name not exists in the current project. +
value (requiered)Second arg for operation +
typeValue type to express operation (support long and double) + long
operation express one +
    +
  • == equals
  • +
  • != not equals
  • +
  • > greater than (&gt;)
  • +
  • >= greater than or equals (&gt;=)
  • +
  • < lesser than (&lt;)
  • +
  • <= lesser than or equals (&lt;=)
  • +
+
==
+

+

+Wait for server connection and that cluster backup node is accessable
+ + <target name="wait"> + <waitfor maxwait="${maxwait}" maxwaitunit="second" timeoutproperty="server.timeout" > + <and> + <socket server="${server.name}" port="${server.port}"/> + <http url="${url}"/> + <jmx:condition + operation="==" + host="localhost" + port="9014" + username="controlRole" + password="tomcat" + name="Catalina:type=IDataSender,host=localhost,senderAddress=192.168.111.1,senderPort=9025" + attribute="connected" + value="true" + /> + </and> + </waitfor> + <fail if="server.timeout" message="Server ${url} don't answer inside ${maxwait} sec" /> + <echo message="Server ${url} alive" /> + </target> + +

+ +
+ + + +
+

+List of Attributes
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionDefault value
urlSet jmx connection url - service:jmx:rmi:///jndi/rmi://localhost:8050/jmxrmi +
hostSet the host, shortcut the very long url syntax. + localhost
portSet the remote connection port + 8050
usernameremote jmx connection user name. +
passwordremote jmx connection password. +
refName of the internal connection referenz. With this attribute you can + configure more the one connection inside the same ant projekt. + jmx.server
nameFull qualified JMX ObjectName -- Catalina:type=Server +
echoEcho condition usage (access and result) + false
+

+

+Wait for server connection and that cluster backup node is accessable
+ + <target name="wait"> + <waitfor maxwait="${maxwait}" maxwaitunit="second" timeoutproperty="server.timeout" > + <and> + <socket server="${server.name}" port="${server.port}"/> + <http url="${url}"/> + <jmx:equals + host="localhost" + port="9014" + username="controlRole" + password="tomcat" + name="Catalina:type=IDataSender,host=localhost,senderAddress=192.168.111.1,senderPort=9025" + attribute="connected" + value="true" + /> + </and> + </waitfor> + <fail if="server.timeout" message="Server ${url} don't answer inside ${maxwait} sec" /> + <echo message="Server ${url} alive" /> + </target> + +

+ +
+ + +
diff --git a/webapps/docs/project.xml b/webapps/docs/project.xml new file mode 100644 index 000000000..7e9bbe363 --- /dev/null +++ b/webapps/docs/project.xml @@ -0,0 +1,72 @@ + + + + The Apache Tomcat 6.0 Servlet/JSP Container + + + The Apache Tomcat Servlet/JSP Container + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapps/docs/proxy-howto.xml b/webapps/docs/proxy-howto.xml new file mode 100644 index 000000000..0def1c958 --- /dev/null +++ b/webapps/docs/proxy-howto.xml @@ -0,0 +1,136 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Proxy Support HOW-TO + + + + + +
+ +

Using standard configurations of Tomcat, web applications can ask for +the server name and port number to which the request was directed for +processing. When Tomcat is running standalone with the +Coyote HTTP/1.1 Connector, it will generally +report the server name specified in the request, and the port number on +which the Connector is listening. The servlet API +calls of interest, for this purpose, are:

+
    +
  • ServletRequest.getServerName(): Returns the host name of the server to which the request was sent.
  • +
  • ServletRequest.getServerPort(): Returns the host name of the server to which the request was sent.
  • +
  • ServletRequest.getLocalName(): Returns the host name of the Internet Protocol (IP) interface on which the request was received.
  • +
  • ServletRequest.getLocalPort(): Returns the Internet Protocol (IP) port number of the interface on which the request was received.
  • +
+ +

When you are running behind a proxy server (or a web server that is +configured to behave like a proxy server), you will sometimes prefer to +manage the values returned by these calls. In particular, you will +generally want the port number to reflect that specified in the original +request, not the one on which the Connector itself is +listening. You can use the proxyName and proxyPort +attributes on the <Connector> element to configure +these values.

+ +

Proxy support can take many forms. The following sections describe +proxy configurations for several common cases.

+ +
+ +
+ +

Apache 1.3 supports an optional module (mod_proxy) that +configures the web server to act as a proxy server. This can be used to +forward requests for a particular web application to a Tomcat 5 instance, +without having to configure a web connector such as mod_jk. +To accomplish this, you need to perform the following tasks:

+
    +
  1. Configure your copy of Apache so that it includes the + mod_proxy module. If you are building from source, + the easiest way to do this is to include the + --enable-module=proxy directive on the + ./configure command line.
  2. +
  3. If not already added for you, make sure that you are loading the + mod_proxy module at Apache startup time, by using the + following directives in your httpd.conf file: + +LoadModule proxy_module {path-to-modules}/mod_proxy.so +AddModule mod_proxy.c +
  4. +
  5. Include two directives in your httpd.conf file for + each web application that you wish to forward to Tomcat 5. For + example, to forward an application at context path /myapp: + +ProxyPass /myapp http://localhost:8081/myapp +ProxyPassReverse /myapp http://localhost:8081/myapp + + which tells Apache to forward URLs of the form + http://localhost/myapp/* to the Tomcat 5 connector + listening on port 8081.
  6. +
  7. Configure your copy of Tomcat 5 to include a special + <Connector> element, with appropriate + proxy settings, for example: + +<Connector port="8081" ... + proxyName="www.mycompany.com" + proxyPort="80"/> + + which will cause servlets inside this web application to think that + all proxied requests were directed to www.mycompany.com + on port 80.
  8. +
  9. It is legal to omit the proxyName attribute from the + <Connector> element. If you do so, the value + returned by request.getServerName() will by the host + name on which Tomcat is running. In the example above, it would be + localhost.
  10. +
  11. If you also have a <Connector> listening on port + 8080 (nested within the same Service + element), the requests to either port will share the same set of + virtual hosts and web applications.
  12. +
  13. You might wish to use the IP filtering features of your operating + system to restrict connections to port 8081 (in this example) to + be allowed only from the server that is running + Apache.
  14. +
  15. Alternatively, you can set up a series of web applications that are + only available via proxying, as follows: +
      +
    • Configure another <Service> that contains + only a <Connector> for the proxy port.
    • +
    • Configure appropriate Engine, + Host, and + Context elements for the virtual hosts + and web applications accessible via proxying.
    • +
    • Optionally, protect port 8081 with IP filters as described + earlier.
    • +
  16. +
  17. When requests are proxied by Apache, the web server will be recording + these requests in its access log. Therefore, you will generally want to + disable any access logging performed by Tomcat itself.
  18. +
+ +

When requests are proxied in this manner, all requests +for the configured web applications will be processed by Tomcat (including +requests for static content). You can improve performance by using the +mod_jk web connector instead of mod_proxy. +mod_jk can be configured so that the web server serves static +content that is not processed by filters or security constraints defined +within the web application's deployment descriptor +(/WEB-INF/web.xml).

+ +
+ +
+The same instructions hold true as for 1.3. (Except in Apache 2.0, +you may omit AddModule mod_proxy.c) +
+ + + +
diff --git a/webapps/docs/realm-howto.xml b/webapps/docs/realm-howto.xml new file mode 100644 index 000000000..27d93d5e4 --- /dev/null +++ b/webapps/docs/realm-howto.xml @@ -0,0 +1,1422 @@ + + +]> + + + &project; + + + Craig R. McClanahan + Yoav Shapira + Andrew R. Jaquith + Realm Configuration HOW-TO + + + + + +
+ +

+Quick Start
+

+What is a Realm?
+Configuring a Realm
+
+Common Features
+
+Digested Passwords
+Example Application
+Manager Application
+Logging Within Realms
+
+ +Standard Realm Implementations
+
+JDBCRealm
+DataSourceRealm
+JNDIRealm
+MemoryRealm
+JAASRealm
+
+

+ +
+ +
+ +

This document describes how to configure Tomcat to support container +managed security, by connecting to an existing "database" of usernames, +passwords, and user roles. You only need to care about this if you are using +a web application that includes one or more +<security-constraint> elements, and a +<login-config> element defining how users are required +to authenticate themselves. If you are not utilizing these features, you can +safely skip this document.

+ +

For fundamental background information about container managed security, +see the Servlet +Specification (Version 2.4), Section 12.

+ +

For information about utilizing the Single Sign On feature of +Tomcat 5 (allowing a user to authenticate themselves once across the entire +set of web applications associated with a virtual host), see +here.

+ +
+ + +
+ + + + +

A Realm is a "database" of usernames and passwords that +identify valid users of a web application (or set of web applications), plus +an enumeration of the list of roles associated with each valid user. +You can think of roles as similar to groups in Unix-like operating +systems, because access to specific web application resources is granted to +all users possessing a particular role (rather than enumerating the list of +associated usernames). A particular user can have any number of roles +associated with their username.

+ +

Although the Servlet Specification describes a portable mechanism for +applications to declare their security requirements (in the +web.xml deployment descriptor), there is no portable API +defining the interface between a servlet container and the associated user +and role information. In many cases, however, it is desireable to "connect" +a servlet container to some existing authentication database or mechanism +that already exists in the production environment. Therefore, Tomcat 5 +defines a Java interface (org.apache.catalina.Realm) that +can be implemented by "plug in" components to establish this connection. +Five standard plug-ins are provided, supporting connections to various +sources of authentication information:

+
    +
  • JDBCRealm - Accesses authentication information + stored in a relational database, accessed via a JDBC driver.
  • +
  • DataSourceRealm - Accesses authentication + information stored in a relational database, accessed via a named JNDI + JDBC DataSource.
  • +
  • JNDIRealm - Accesses authentication information + stored in an LDAP based directory server, accessed via a JNDI provider. +
  • +
  • MemoryRealm - Accesses authentication + information stored in an in-memory object collection, which is initialized + from an XML document (conf/tomcat-users.xml).
  • +
  • JAASRealm - Accesses authentication information + through the Java Authentication & Authorization Service (JAAS) + framework.
  • +
+ +

It is also possible to write your own Realm implementation, +and integrate it with Tomcat 5. To do so, you need to: +

    +
  • Implement org.apache.catalina.Realm,
  • +
  • Place your compiled realm in $CATALINA_HOME/server/lib,
  • +
  • Declare your realm as described in the "Configuring a Realm" section below,
  • +
  • Declare your realm to the MBeans Descriptor.
  • +
+

+ +
+ + + + +

Before getting into the details of the standard Realm implementations, it is +important to understand, in general terms, how a Realm is configured. In +general, you will be adding an XML element to your conf/server.xml +configuration file, that looks something like this:

+ + +<Realm className="... class name for this implementation" + ... other attributes for this implementation .../> + + +

The <Realm> element can be nested inside any one of +of the following Container elements. The location of the +Realm element has a direct impact on the "scope" of that Realm +(i.e. which web applications will share the same authentication information): +

+
    +
  • Inside an <Engine> element - This Realm will be shared + across ALL web applications on ALL virtual hosts, UNLESS it is overridden + by a Realm element nested inside a subordinate <Host> + or <Context> element.
  • +
  • Inside a <Host> element - This Realm will be shared across + ALL web applications for THIS virtual host, UNLESS it is overridden + by a Realm element nested inside a subordinate <Context> + element.
  • +
  • Inside a <Context> element - This Realm will be used ONLY + for THIS web application.
  • +
+ + +
+ + +
+ + +
+ + + + +

For each of the standard Realm implementations, the +user's password (by default) is stored in clear text. In many +environments, this is undesireable because casual observers of the +authentication data can collect enough information to log on +successfully, and impersonate other users. To avoid this problem, the +standard implementations support the concept of digesting +user passwords. This allows the stored version of the passwords to be +encoded (in a form that is not easily reversible), but that the +Realm implementation can still utilize for +authentication.

+ +

When a standard realm authenticates by retrieving the stored +password and comparing it with the value presented by the user, you +can select digested passwords by specifying the digest +attribute on your <Realm> element. The value for +this attribute must be one of the digest algorithms supported by the +java.security.MessageDigest class (SHA, MD2, or MD5). +When you select this option, the contents of the password that is +stored in the Realm must be the cleartext version of the +password, as digested by the specified algorithm.

+ +

When the authenticate() method of the Realm is called, the +(cleartext) password specified by the user is itself digested by the same +algorithm, and the result is compared with the value returned by the +Realm. An equal match implies that the cleartext version of the +original password is the same as the one presented by the user, so that this +user should be authorized.

+ +

To calculate the digested value of a cleartext password, two convenience +techniques are supported:

+
    +
  • If you are writing an application that needs to calculate digested + passwords dynamically, call the static Digest() method of the + org.apache.catalina.realm.RealmBase class, passing the + cleartext password and the digest algorithm name as arguments. This + method will return the digested password.
  • +
  • If you want to execute a command line utility to calculate the digested + password, simply execute + +java org.apache.catalina.realm.RealmBase \ + -a {algorithm} {cleartext-password} + + and the digested version of this cleartext password will be returned to + standard output.
  • +
+ +

If using digested passwords with DIGEST authentication, the cleartext used + to generate the digest is different. In the examples above + {cleartext-password} must be replaced with + {username}:{realm}:{cleartext-password}. For example, in a + development environment this might take the form + testUser:localhost:8080:testPassword.

+ +

To use either of the above techniques, the +$CATALINA_HOME/server/lib/catalina.jar file will need to be +on your class path to make the RealmBase class available. In +addition, you will need the JMX jar and the commons-logging jar (either +commons-logging-api.jar or commons-logging.jar). Both of these are included +with the Tomcat distribution. +

+ +

Non-ASCII usernames and/or passwords are supported using +java org.apache.catalina.realm.RealmBase \ + -a {algorithm} -e {encoding} {input} + +but care is required to ensure that the non-ASCII input is +correctly passed to the digester. +The digester returns {input}:{digest}. If the input appears +corrupted in the return, the digest will be invalid.

+ +
+ + + + + +

The example application shipped with Tomcat 5 includes an area that is +protected by a security constraint, utilizing form-based login. To access it, +point your browser at +http://localhost:8080/jsp-examples/security/protected/ +and log on with one of the usernames and passwords described for the default +MemoryRealm.

+ +
+ + + + +

If you wish to use the Manager Application +to deploy and undeploy applications in a running Tomcat 5 installation, you +MUST add the "manager" role to at least one username in your selected Realm +implementation. This is because the manager web application itself uses a +security constraint that requires role "manager" to access ANY request URI +within that application.

+ +

For security reasons, no username in the default Realm (i.e. using +conf/tomcat-users.xml is assigned the "manager" role. Therfore, +no one will be able to utilize the features of this application until the +Tomcat administrator specifically assigns this role to one or more users.

+ +
+ + + +

Debugging and exception messages logged by a Realm will + be recorded by the logging configuration associated with the container + for the realm: its surrounding Context, + Host, or + Engine.

+ +
+ +
+ + +
+ + + +

Introduction

+ +

JDBCRealm is an implementation of the Tomcat 5 +Realm interface that looks up users in a relational database +accessed via a JDBC driver. There is substantial configuration flexibility +that lets you adapt to existing table and column names, as long as your +database structure conforms to the following requirements:

+
    +
  • There must be a table, referenced below as the users table, + that contains one row for every valid user that this Realm + should recognize.
  • +
  • The users table must contain at least two columns (it may + contain more if your existing applications required it): +
      +
    • Username to be recognized by Tomcat when the user logs in.
    • +
    • Password to be recognized by Tomcat when the user logs in. + This value may in cleartext or digested - see below for more + information.
    • +
  • +
  • There must be a table, referenced below as the user roles table, + that contains one row for every valid role that is assigned to a + particular user. It is legal for a user to have zero, one, or more than + one valid role.
  • +
  • The user roles table must contain at least two columns (it may + contain more if your existing applications required it): +
      +
    • Username to be recognized by Tomcat (same value as is specified + in the users table).
    • +
    • Role name of a valid role associated with this user.
    • +
  • +
+ +

Quick Start

+ +

To set up Tomcat to use JDBCRealm, you will need to follow these steps:

+
    +
  1. If you have not yet done so, create tables and columns in your database + that conform to the requirements described above.
  2. +
  3. Configure a database username and password for use by Tomcat, that has + at least read only access to the tables described above. (Tomcat will + never attempt to write to these tables.)
  4. +
  5. Place a copy of the JDBC driver you will be using inside the + $CATALINA_HOME/server/lib directory (if you do not need it + visible to web applications) or $CATALINA_HOME/common/lib + (if it will be used both by Tomcat 5 and by your apps). + Note that only JAR files are recognized!
  6. +
  7. Set up a <Realm> element, as described below, in your + $CATALINA_HOME/conf/server.xml file.
  8. +
  9. Restart Tomcat 5 if it is already running.
  10. +
+ +

Realm Element Attributes

+ +

To configure JDBCRealm, you will create a <Realm> +element and nest it in your $CATALINA_HOME/conf/server.xml file, +as described above. The following +attributes are supported by this implementation:

+ + + + +

The fully qualified Java class name of this Realm implementation. + You MUST specify the value + "org.apache.catalina.realm.JDBCRealm" here.

+
+ + +

The database username used to establish a JDBC connection.

+
+ + +

The database password used to establish a JDBC connection.

+
+ + +

The database URL used to establish a JDBC connection.

+
+ + +

The digest algorithm used to store passwords in non-plaintext formats. + Valid values are those accepted for the algorithm name by the + java.security.MessageDigest class. See + Digested Passwords for more + information. If not specified, passwords are stored in clear text.

+
+ + +

The fully qualified Java class name of the JDBC driver to be used. + Consult the documentation for your JDBC driver for the appropriate + value.

+
+ + +

The name of the column, in the user roles table, that + contains the name of a role assigned to this user.

+
+ + +

The name of the column, in the users table, that contains + the password for this user (either in clear text, or digested if the + digest attribute is set).

+
+ + +

The name of the column, in the users and user roles + tables, that contains the username of this user.

+
+ + +

The name of the table that contains one row for each role + assigned to a particular username. This table must include at + least the columns named by the userNameCol and + roleNameCol attributes.

+
+ + +

The name of the table that contains one row for each username + to be recognized by Tomcat. This table must include at least the columns + named by the userNameCol and userCredCol + attributes.

+
+ +
+ +

Example

+ +

An example SQL script to create the needed tables might look something +like this (adapt the syntax as required for your particular database):

+ +create table users ( + user_name varchar(15) not null primary key, + user_pass varchar(15) not null +); + +create table user_roles ( + user_name varchar(15) not null, + role_name varchar(15) not null, + primary key (user_name, role_name) +); + + +

Example Realm elements are included (commented out) in the +default $CATALINA_HOME/conf/server.xml file. Here's an example +for using a MySQL database called "authority", configured with the tables +described above, and accessed with username "dbuser" and password "dbpass":

+ +<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99" + driverName="org.gjt.mm.mysql.Driver" + connectionURL="jdbc:mysql://localhost/authority?user=dbuser&amp;password=dbpass" + userTable="users" userNameCol="user_name" userCredCol="user_pass" + userRoleTable="user_roles" roleNameCol="role_name"/> + + +

Additional Notes

+ +

JDBCRealm operates according to the following rules:

+
    +
  • When a user attempts to access a protected resource for the first time, + Tomcat 5 will call the authenticate() method of this + Realm. Thus, any changes you have made to the database + directly (new users, changed passwords or roles, etc.) will be immediately + reflected.
  • +
  • Once a user has been authenticated, the user (and his or her associated + roles) are cached within Tomcat for the duration of the user's login. + (For FORM-based authentication, that means until the session times out or + is invalidated; for BASIC authentication, that means until the user + closes their browser). The cached user is not saved and + restored across sessions serialisations. Any changes to the database + information for an already authenticated user will not be + reflected until the next time that user logs on again.
  • +
  • Administering the information in the users and user roles + table is the responsibility of your own applications. Tomcat does not + provide any built-in capabilities to maintain users and roles.
  • +
+ +
+ + + + +

Introduction

+ +

DataSourceRealm is an implementation of the Tomcat 5 +Realm interface that looks up users in a relational database +accessed via a JNDI named JDBC DataSource. There is substantial configuration +flexibility that lets you adapt to existing table and column names, as long +as your database structure conforms to the following requirements:

+
    +
  • There must be a table, referenced below as the users table, + that contains one row for every valid user that this Realm + should recognize.
  • +
  • The users table must contain at least two columns (it may + contain more if your existing applications required it): +
      +
    • Username to be recognized by Tomcat when the user logs in.
    • +
    • Password to be recognized by Tomcat when the user logs in. + This value may in cleartext or digested - see below for more + information.
    • +
  • +
  • There must be a table, referenced below as the user roles table, + that contains one row for every valid role that is assigned to a + particular user. It is legal for a user to have zero, one, or more than + one valid role.
  • +
  • The user roles table must contain at least two columns (it may + contain more if your existing applications required it): +
      +
    • Username to be recognized by Tomcat (same value as is specified + in the users table).
    • +
    • Role name of a valid role associated with this user.
    • +
  • +
+ +

Quick Start

+ +

To set up Tomcat to use DataSourceRealm, you will need to follow these steps:

+
    +
  1. If you have not yet done so, create tables and columns in your database + that conform to the requirements described above.
  2. +
  3. Configure a database username and password for use by Tomcat, that has + at least read only access to the tables described above. (Tomcat will + never attempt to write to these tables.)
  4. +
  5. Configure a JNDI named JDBC DataSource for your database. Refer to the + JNDI DataSource Example HOW-TO + for information on how to configure a JNDI named JDBC DataSource.
  6. +
  7. Set up a <Realm> element, as described below, in your + $CATALINA_HOME/conf/server.xml file.
  8. +
  9. Restart Tomcat 5 if it is already running.
  10. +
+ +

Realm Element Attributes

+ +

To configure DataSourceRealm, you will create a <Realm> +element and nest it in your $CATALINA_HOME/conf/server.xml file, +as described above. The following +attributes are supported by this implementation:

+ + + + +

The fully qualified Java class name of this Realm implementation. + You MUST specify the value + "org.apache.catalina.realm.DataSourceRealm" here.

+
+ + +

The JNDI named JDBC DataSource for your database. If the DataSource is + local to the context, the name is relative to java:/comp/env, + and otherwise the name should match the name used to define the global + DataSource.

+
+ + +

The digest algorithm used to store passwords in non-plaintext formats. + Valid values are those accepted for the algorithm name by the + java.security.MessageDigest class. See + Digested Passwords for more + information. If not specified, passwords are stored in clear text.

+
+ + +

When the realm is nested inside a Context element, this allows the + realm to use a DataSource defined for the Context rather than a global + DataSource. If not specified, the default is false: use a + global DataSource.

+
+ + +

The name of the column, in the user roles table, that + contains the name of a role assigned to this user.

+
+ + +

The name of the column, in the users table, that contains + the password for this user (either in clear text, or digested if the + digest attribute is set).

+
+ + +

The name of the column, in the users and user roles + tables, that contains the username of this user.

+
+ + +

The name of the table that contains one row for each role + assigned to a particular username. This table must include at + least the columns named by the userNameCol and + roleNameCol attributes.

+
+ + +

The name of the table that contains one row for each username + to be recognized by Tomcat. This table must include at least the columns + named by the userNameCol and userCredCol + attributes.

+
+ +
+ +

Example

+ +

An example SQL script to create the needed tables might look something +like this (adapt the syntax as required for your particular database):

+ +create table users ( + user_name varchar(15) not null primary key, + user_pass varchar(15) not null +); + +create table user_roles ( + user_name varchar(15) not null, + role_name varchar(15) not null, + primary key (user_name, role_name) +); + + +

Here is an example for using a MySQL database called "authority", configured +with the tables described above, and accessed with the JNDI JDBC DataSource with +name "java:/comp/env/jdbc/authority".

+ +<Realm className="org.apache.catalina.realm.DataSourceRealm" debug="99" + dataSourceName="jdbc/authority" + userTable="users" userNameCol="user_name" userCredCol="user_pass" + userRoleTable="user_roles" roleNameCol="role_name"/> + + +

Additional Notes

+ +

DataSourceRealm operates according to the following rules:

+
    +
  • When a user attempts to access a protected resource for the first time, + Tomcat 5 will call the authenticate() method of this + Realm. Thus, any changes you have made to the database + directly (new users, changed passwords or roles, etc.) will be immediately + reflected.
  • +
  • Once a user has been authenticated, the user (and his or her associated + roles) are cached within Tomcat for the duration of the user's login. + (For FORM-based authentication, that means until the session times out or + is invalidated; for BASIC authentication, that means until the user + closes their browser). The cached user is not saved and + restored across sessions serialisations. Any changes to the database + information for an already authenticated user will not be + reflected until the next time that user logs on again.
  • +
  • Administering the information in the users and user roles + table is the responsibility of your own applications. Tomcat does not + provide any built-in capabilities to maintain users and roles.
  • +
+ +
+ + + + +

Introduction

+ +

JNDIRealm is an implementation of the Tomcat 5 +Realm interface that looks up users in an LDAP directory +server accessed by a JNDI provider (typically, the standard LDAP +provider that is available with the JNDI API classes). The realm +supports a variety of approaches to using a directory for +authentication.

+ +

Connecting to the directory

+ +

The realm's connection to the directory is defined by the +connectionURL configuration attribute. This is a URL +whose format is defined by the JNDI provider. It is usually an LDAP +URL that specifies the domain name of the directory server to connect +to, and optionally the port number and distinguished name (DN) of the +required root naming context.

+ +

If you have more than one provider you can configure an +alternateURL. If a socket connection can not be +made to the provider at the connectionURL an +attempt will be made to use the alternateURL.

+ +

When making a connection in order to search the directory and +retrieve user and role information, the realm authenticates itself to +the directory with the username and password specified by the +connectionName and +connectionPassword properties. If these properties +are not specified the connection is anonymous. This is sufficient in +many cases. +

+ + +

Selecting the user's directory entry

+ +

Each user that can be authenticated must be represented in the +directory by an individual entry that corresponds to an element in the +initial DirContext defined by the +connectionURL attribute. This user entry must have an +attribute containing the username that is presented for +authentication.

+ +

Often the distinguished name of the user's entry contains the +username presented for authentication but is otherwise the same for +all users. In this case the userPattern attribute may +be used to specify the DN, with "{0}" marking where +the username should be substituted.

+ +

Otherwise the realm must search the directory to find a unique entry +containing the username. The following attributes configure this +search: + +

    +
  • userBase - the entry that is the base of + the subtree containing users. If not specified, the search + base is the top-level context.
  • + +
  • userSubtree - the search scope. Set to + true if you wish to search the entire subtree + rooted at the userBase entry. The default value + of false requests a single-level search + including only the top level.
  • + +
  • userSearch - pattern specifying the LDAP + search filter to use after substitution of the username.
  • + +
+

+ + +

Authenticating the user

+ +
    +
  • +

    Bind mode

    + +

    By default the realm authenticates a user by binding to +the directory with the DN of the entry for that user and the password +presented by the user. If this simple bind succeeds the user is considered to +be authenticated.

    + +

    For security reasons a directory may store a digest of the user's +password rather than the clear text version (see Digested Passwords for more information). In that case, +as part of the simple bind operation the directory automatically +computes the correct digest of the plaintext password presented by the +user before validating it against the stored value. In bind mode, +therefore, the realm is not involved in digest processing. The +digest attribute is not used, and will be ignored if +set.

    +
  • + +
  • +

    Comparison mode

    +

    Alternatively, the realm may retrieve the stored +password from the directory and compare it explicitly with the value +presented by the user. This mode is configured by setting the +userPassword attribute to the name of a directory +attribute in the user's entry that contains the password.

    + +

    Comparison mode has some disadvantages. First, the +connectionName and +connectionPassword attributes must be configured to +allow the realm to read users' passwords in the directory. For +security reasons this is generally undesirable; indeed many directory +implementations will not allow even the directory manager to read +these passwords. In addition, the realm must handle password digests +itself, including variations in the algorithms used and ways of +representing password hashes in the directory. However, the realm may +sometimes need access to the stored password, for example to support +HTTP Digest Access Authentication (RFC 2069). (Note that HTTP digest +authentication is different from the storage of password digests in +the repository for user information as discussed above). +

    +
  • +
+ +

Assigning roles to the user

+ +

The directory realm supports two approaches to the representation +of roles in the directory:

+ +
    +
  • +

    Roles as explicit directory entries

    + +

    Roles may be represented by explicit directory entries. A role +entry is usually an LDAP group entry with one attribute +containing the name of the role and another whose values are the +distinguished names or usernames of the users in that role. The +following attributes configure a directory search to +find the names of roles associated with the authenticated user:

    + +
      +
    • roleBase - the base entry for the role search. + If not specified, the search base is the top-level directory + context.
    • + +
    • roleSubtree - the search + scope. Set to true if you wish to search the entire + subtree rooted at the roleBase entry. The default + value of false requests a single-level search + including the top level only.
    • + +
    • roleSearch - the LDAP search filter for + selecting role entries. It optionally includes pattern + replacements "{0}" for the distinguished name and/or "{1}" for the + username of the authenticated user.
    • + +
    • roleName - the attribute in a role entry + containing the name of that role.
    • + +
    + +
  • +
+ +
    +
  • +

    Roles as an attribute of the user entry

    + +

    Role names may also be held as the values of an attribute in the +user's directory entry. Use userRoleName to specify +the name of this attribute.

    + +
  • +
+

A combination of both approaches to role representation may be used.

+ +

Quick Start

+ +

To set up Tomcat to use JNDIRealm, you will need to follow these steps:

+
    +
  1. Make sure your directory server is configured with a schema that matches + the requirements listed above.
  2. +
  3. If required, configure a username and password for use by Tomcat, that has + read only access to the information described above. (Tomcat will + never attempt to modify this information.)
  4. +
  5. Place a copy of the JNDI driver you will be using (typically + ldap.jar available with JNDI) inside the + $CATALINA_HOME/server/lib directory (if you do not need it + visible to web applications) or $CATALINA_HOME/common/lib + (if it will be used both by Tomcat 5 and by your apps).
  6. +
  7. Set up a <Realm> element, as described below, in your + $CATALINA_HOME/conf/server.xml file.
  8. +
  9. Restart Tomcat 5 if it is already running.
  10. +
+ +

Realm Element Attributes

+ +

To configure JNDIRealm, you will create a <Realm> +element and nest it in your $CATALINA_HOME/conf/server.xml file, +as described above. The following +attributes are supported by this implementation:

+ + + +

The fully qualified Java class name of this Realm implementation. + You MUST specify the value + "org.apache.catalina.realm.JNDIRealm" here.

+
+ + + +

The directory username to use when establishing a + connection to the directory for LDAP search operations. If not + specified an anonymous connection is made, which is often + sufficient unless you specify the userPassword + property.

+
+ + +

The directory password to use when establishing a + connection to the directory for LDAP search operations. If not + specified an anonymous connection is made, which is often + sufficient unless you specify the userPassword + property.

+
+ + +

The connection URL to be passed to the JNDI driver when + establishing a connection to the directory.

+
+ + +

The fully qualified Java class name of the JNDI context + factory to be used for this connection. By default, the standard + JNDI LDAP provider is used + (com.sun.jndi.ldap.LdapCtxFactory).

+
+ + +

The digest algorithm to apply to the plaintext password offered + by the user before comparing it with the value retrieved from the + directory. Valid values are those accepted for the algorithm name + by the java.security.MessageDigest class. See Digested Passwords for more + information. If not specified the plaintext password is assumed to + be retrieved. Not required unless userPassword is + specified

+
+ + +

The base directory entry for performing role searches. If + not specified, the top level element in the directory context + will be used.

+
+ + +

The name of the attribute that contains role names in the + directory entries found by a role search. In addition you can + use the userRoleName property to specify the name + of an attribute, in the user's entry, containing additional + role names. If roleName is not specified a role + search does not take place, and roles are taken only from the + user's entry.

+
+ + +

The LDAP filter expression used for performing role + searches, following the syntax supported by the + java.text.MessageFormat class. Use + {0} to substitute the distinguished name (DN) of + the user, and/or {1} to substitute the + username. If not specified a role search does not take place + and roles are taken only from the attribute in the user's + entry specified by the userRoleName property.

+
+ + +

Set to true if you want to search the entire + subtree of the element specified by the roleBase + property for role entries associated with the user. The + default value of false causes only the top level + to be searched.

+
+ + +

The base element for user searches performed using the + userSearch expression. If not specified, the top + level element in the directory context will be used. Not used + if you are using the userPattern expression.

+
+ + +

Name of the attribute in the user's entry containing the + user's password. If you specify this value, JNDIRealm will + bind to the directory using the values specified by + connectionName and + connectionPassword properties, and retrieve the + corresponding attribute for comparison to the value specified + by the user being authenticated. If the digest + attribute is set, the specified digest algorithm is applied to + the password offered by the user before comparing it with the + value retrieved from the directory. If you do + not specify this value, JNDIRealm will + attempt a simple bind to the directory using the DN of the + user's entry and password specified by the user, with a + successful bind being interpreted as an authenticated + user.

+
+ + +

A pattern for the distinguished name (DN) of the user's + directory entry, following the syntax supported by the + java.text.MessageFormat class with + {0} marking where the actual username should be + inserted. You can use this property instead of + userSearch, userSubtree and + userBase when the distinguished name contains the + username and is otherwise the same for all users.

+
+ + +

The name of an attribute in the user's directory entry + containing zero or more values for the names of roles assigned + to this user. In addition you can use the + roleName property to specify the name of an + attribute to be retrieved from individual role entries found + by searching the directory. If userRoleName is + not specified all the roles for a user derive from the role + search.

+
+ + +

The LDAP filter expression to use when searching for a + user's directory entry, with {0} marking where + the actual username should be inserted. Use this property + (along with the userBase and + userSubtree properties) instead of + userPattern to search the directory for the + user's entry.

+
+ + +

Set to true if you want to search the entire + subtree of the element specified by the userBase + property for the user's entry. The default value of + false causes only the top level to be searched. + Not used if you are using the userPattern + expression.

+
+ +
+ +

Example

+ +

Creation of the appropriate schema in your directory server is beyond the +scope of this document, because it is unique to each directory server +implementation. In the examples below, we will assume that you are using a +distribution of the OpenLDAP directory server (version 2.0.11 or later), which +can be downloaded from +http://www.openldap.org. Assume that +your slapd.conf file contains the following settings +(among others):

+ +database ldbm +suffix dc="mycompany",dc="com" +rootdn "cn=Manager,dc=mycompany,dc=com" +rootpw secret + + +

We will assume for connectionURL that the directory +server runs on the same machine as Tomcat. See http://java.sun.com/products/jndi/docs.html +for more information about configuring and using the JNDI LDAP +provider.

+ +

Next, assume that this directory server has been populated with elements +as shown below (in LDIF format):

+ + + +# Define top-level entry +dn: dc=mycompany,dc=com +objectClass: dcObject +dc:mycompany + +# Define an entry to contain people +# searches for users are based on this entry +dn: ou=people,dc=mycompany,dc=com +objectClass: organizationalUnit +ou: people + +# Define a user entry for Janet Jones +dn: uid=jjones,ou=people,dc=mycompany,dc=com +objectClass: inetOrgPerson +uid: jjones +sn: jones +cn: janet jones +mail: j.jones@mycompany.com +userPassword: janet + +# Define a user entry for Fred Bloggs +dn: uid=fbloggs,ou=people,dc=mycompany,dc=com +objectClass: inetOrgPerson +uid: fbloggs +sn: bloggs +cn: fred bloggs +mail: f.bloggs@mycompany.com +userPassword: fred + +# Define an entry to contain LDAP groups +# searches for roles are based on this entry +dn: ou=groups,dc=mycompany,dc=com +objectClass: organizationalUnit +ou: groups + +# Define an entry for the "tomcat" role +dn: cn=tomcat,ou=groups,dc=mycompany,dc=com +objectClass: groupOfUniqueNames +cn: tomcat +uniqueMember: uid=jjones,ou=people,dc=mycompany,dc=com +uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com + +# Define an entry for the "role1" role +dn: cn=role1,ou=groups,dc=mycompany,dc=com +objectClass: groupOfUniqueNames +cn: role1 +uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com + + +

An example Realm element for the OpenLDAP directory +server configured as described above might look like this, assuming +that users use their uid (e.g. jjones) to login to the +application and that an anonymous connection is sufficient to search +the directory and retrieve role information:

+ + +<Realm className="org.apache.catalina.realm.JNDIRealm" debug="99" + connectionURL="ldap://localhost:389" + userPattern="uid={0},ou=people,dc=mycompany,dc=com" + roleBase="ou=groups,dc=mycompany,dc=com" + roleName="cn" + roleSearch="(uniqueMember={0})" +/> + + +

With this configuration, the realm will determine the user's +distinguished name by substituting the username into the +userPattern, authenticate by binding to the directory +with this DN and the password received from the user, and search the +directory to find the user's roles.

+ +

Now suppose that users are expected to enter their email address +rather than their userid when logging in. In this case the realm must +search the directory for the user's entry. (A search is also necessary +when user entries are held in multiple subtrees corresponding perhaps +to different organizational units or company locations).

+ +

Further, suppose that in addition to the group entries you want to +use an attribute of the user's entry to hold roles. Now the entry for +Janet Jones might read as follows:

+ + +dn: uid=jjones,ou=people,dc=mycompany,dc=com +objectClass: inetOrgPerson +uid: jjones +sn: jones +cn: janet jones +mail: j.jones@mycompany.com +memberOf: role2 +memberOf: role3 +userPassword: janet + + +

This realm configuration would satisfy the new requirements:

+ + +<Realm className="org.apache.catalina.realm.JNDIRealm" debug="99" + connectionURL="ldap://localhost:389" + userBase="ou=people,dc=mycompany,dc=com" + userSearch="(mail={0})" + userRoleName="memberOf" + roleBase="ou=groups,dc=mycompany,dc=com" + roleName="cn" + roleSearch="(uniqueMember={0})" +/> + + +

Now when Janet Jones logs in as "j.jones@mycompany.com", the realm +searches the directory for a unique entry with that value as its mail +attribute and attempts to bind to the directory as +uid=jjones,ou=people,dc=mycompany,dc=com with the given +password. If authentication succeeds, she is assigned three roles: +"role2" and "role3", the values of the "memberOf" attribute in her +directory entry, and "tomcat", the value of the "cn" attribute in the +only group entry of which she is a member.

+ +

Finally, to authenticate the user by retrieving +the password from the directory and making a local comparison in the +realm, you might use a realm configuration like this:

+ + +<Realm className="org.apache.catalina.realm.JNDIRealm" debug="99" + connectionName="cn=Manager,dc=mycompany,dc=com" +connectionPassword="secret" + connectionURL="ldap://localhost:389" + userPassword="userPassword" + userPattern="uid={0},ou=people,dc=mycompany,dc=com" + roleBase="ou=groups,dc=mycompany,dc=com" + roleName="cn" + roleSearch="(uniqueMember={0})" +/> + + +

However, as discussed above, the default bind mode for +authentication is usually to be preferred.

+ +

Additional Notes

+ +

JNDIRealm operates according to the following rules:

+
    +
  • When a user attempts to access a protected resource for the first time, + Tomcat 5 will call the authenticate() method of this + Realm. Thus, any changes you have made to the directory + (new users, changed passwords or roles, etc.) will be immediately + reflected.
  • +
  • Once a user has been authenticated, the user (and his or her associated + roles) are cached within Tomcat for the duration of the user's login. + (For FORM-based authentication, that means until the session times out or + is invalidated; for BASIC authentication, that means until the user + closes their browser). The cached user is not saved and + restored across sessions serialisations. Any changes to the directory + information for an already authenticated user will not be + reflected until the next time that user logs on again.
  • +
  • Administering the information in the directory server + is the responsibility of your own applications. Tomcat does not + provide any built-in capabilities to maintain users and roles.
  • +
+ +
+ + + + +

Introduction

+ +

MemoryRealm is a simple demonstration implementation of the +Tomcat 5 Realm interface. It is not designed for production use. +At startup time, MemoryRealm loads information about all users, and their +corresponding roles, from an XML document (by default, this document is loaded from $CATALINA_HOME/conf/tomcat-users.xml). Changes to the data +in this file are not recognized until Tomcat is restarted.

+ +

Realm Element Attributes

+ +

To configure MemoryRealm, you will create a <Realm> +element and nest it in your $CATALINA_HOME/conf/server.xml file, +as described above. The following +attributes are supported by this implementation:

+ + + + +

The fully qualified Java class name of this Realm implementation. + You MUST specify the value + "org.apache.catalina.realm.MemoryRealm" here.

+
+ + +

The digest algorithm used to store passwords in non-plaintext formats. + Valid values are those accepted for the algorithm name by the + java.security.MessageDigest class. See + Digested Passwords for more + information. If not specified, passwords are stored in clear text.

+
+ + +

Absolute or relative (to $CATALINA_HOME) pathname of the XML document + containing our valid usernames, passwords, and roles. See below for more + information on the format of this file. If not specified, the value + conf/tomcat-users.xml is used.

+
+ +
+ +

User File Format

+ +

The users file (by default, conf/tomcat-users.xml must be an +XML document, with a root element <tomcat-users>. Nested +inside the root element will be a <user> element for each +valid user, consisting of the following attributes:

+
    +
  • name - Username this user must log on with.
  • +
  • password - Password this user must log on with (in + clear text if the digest attribute was not set on the + <Realm> element, or digested appropriately as + described here otherwise).
  • +
  • roles - Comma-delimited list of the role names + associated with this user.
  • +
+ +

Example

+ +

The default installation of Tomcat 5 is configured with a MemoryRealm +nested inside the <Engine> element, so that it applies +to all virtual hosts and web applications. The default contents of the +conf/tomcat-users.xml file is:

+ +<tomcat-users> + <user name="tomcat" password="tomcat" roles="tomcat" /> + <user name="role1" password="tomcat" roles="role1" /> + <user name="both" password="tomcat" roles="tomcat,role1" /> +</tomcat-users> + + +

Additional Notes

+ +

MemoryRealm operates according to the following rules:

+
    +
  • When Tomcat first starts up, it loads all defined users and their + associated information from the users file. Changes to the data in + this file will not be recognized until Tomcat is + restarted.
  • +
  • When a user attempts to access a protected resource for the first time, + Tomcat 5 will call the authenticate() method of this + Realm.
  • +
  • Once a user has been authenticated, the user (and his or her associated + roles) are cached within Tomcat for the duration of the user's login. + (For FORM-based authentication, that means until the session times out or + is invalidated; for BASIC authentication, that means until the user + closes their browser). The cached user is not saved and + restored across sessions serialisations.
  • +
  • Administering the information in the users file is the responsibility + of your application. Tomcat does not + provide any built-in capabilities to maintain users and roles.
  • +
+ + +
+ + + + +

Introduction

+ +

JAASRealm is an implementation of the Tomcat +4 Realm interface that authenticates users through the Java +Authentication & Authorization Service (JAAS) framework, a Java +package that is available as an optional package in Java 2 SDK 1.3 and +is fully integrated as of SDK 1.4 .

+

Using JAASRealm gives the developer the ability to combine +practically any conceivable security realm with Tomcat's CMA.

+

JAASRealm is prototype for Tomcat of the proposed JAAS-based +J2EE authentication framework for J2EE v1.4, based on the JCP Specification +Request 196 to enhance container-managed security and promote +'pluggable' authentication mechanisms whose implementations would be +container-independent. +

+

Based on the JAAS login module and principal (see javax.security.auth.spi.LoginModule +and javax.security.Principal), you can develop your own +security mechanism or wrap another third-party mechanism for +integration with the CMA as implemented by Tomcat. +

+ +

Quick Start

+

To set up Tomcat to use JAASRealm with your own JAAS login module, + you will need to follow these steps:

+
    +
  1. Write your own LoginModule, User and Role classes based +on JAAS (see +the +JAAS Authentication Tutorial and +the JAAS Login Module +Developer's Guide) to be managed by the JAAS Login +Context (javax.security.auth.login.LoginContext) +When developing your LoginModule, note that JAASRealm's built-in CallbackHandler ++only recognizes the NameCallback and PasswordCallback at present. +
  2. +
  3. Although not specified in JAAS, you should create +seperate classes to distinguish between users and roles, extending javax.security.Principal, +so that Tomcat can tell which Principals returned from your login +module are users and which are roles (see org.apache.catalina.realm.JAASRealm). +Regardless, the first Principal returned is always treated as the user Principal. +
  4. +
  5. Place the compiled classes on Tomcat's classpath +
  6. +
  7. Set up a login.config file for Java (see JAAS +LoginConfig file) and tell Tomcat where to find it by specifying +its location to the JVM, for instance by setting the environment +variable: JAVA_OPTS=-DJAVA_OPTS=-Djava.security.auth.login.config==$CATALINA_HOME/conf/jaas.config
  8. + +
  9. Configure your security-constraints in your web.xml for +the resources you want to protect
  10. +
  11. Configure the JAASRealm module in your server.xml
  12. +
  13. Restart Tomcat 5 if it is already running.
  14. +
+

Realm Element Attributes

+

To configure JAASRealm as for step 6 above, you create +a <Realm> element and nest it in your +$CATALINA_HOME/conf/server.xml +file within your <Engine> node. The following attributes +are supported by this implementation:

+ + + + +

The fully qualified Java class name of this Realm implementation. + You MUST specify the value + "org.apache.catalina.realm.JAASRealm" here.

+
+ + +

The name of the application as configured in your login configuration file + (JAAS LoginConfig).

+
+ + +

A comma-seperated list of the names of the classes that you have made + for your user Principals.

+
+ + +

A comma-seperated list of the names of the classes that you have made + for your role Principals.

+
+ + +

Instructs JAASRealm to use the context class loader for loading the user-specified + LoginModule class and associated Principal classes. The + default value is true, which is backwards-compatible with the way + Tomcat 4 works. To load classes using the container's classloader, specify + false.

+
+ +
+ +

Example

+ +

Here is an example of how your server.xml snippet should look.

+ + +<Realm className="org.apache.catalina.realm.JAASRealm" + appName="MyFooRealm" + userClassNames="org.foobar.realm.FooUser" + roleClassNames="org.foobar.realm.FooRole" + debug="99"/> + + +

It is the responsibility of your login module to create and save User and +Role objects representing Principals for the user +(javax.security.auth.Subject). If your login module doesn't +create a user object but also doesn't throw a login exception, then the +Tomcat CMA will break and you will be left at the +http://localhost:8080/myapp/j_security_check URI or at some other +unspecified location.

+ +

The flexibility of the JAAS approach is two-fold:

+
    +
  • you can carry out whatever processing you require behind +the scenes in your own login module.
  • +
  • you can plug in a completely different LoginModule by changing the configuration +and restarting the server, without any code changes to your application.
  • +
+ +

Additional Notes

+
    +
  • When a user attempts to access a protected resource for + the first time, Tomcat 5 will call the authenticate() + method of this Realm. Thus, any changes you have made in + the security mechanism directly (new users, changed passwords or + roles, etc.) will be immediately reflected.
  • +
  • Once a user has been authenticated, the user (and his or + her associated roles) are cached within Tomcat for the duration of + the user's login. For FORM-based authentication, that means until + the session times out or is invalidated; for BASIC authentication, + that means until the user closes their browser. Any changes to the + security information for an already authenticated user will not + be reflected until the next time that user logs on again.
  • +
  • As with other Realm implementations, digested passwords + are supported if the <Realm> element in server.xml + contains a digest attribute; JAASRealm's CallbackHandler + will digest the password prior to passing it back to the LoginModule
  • +
+ +
+ + +
+ + + +
diff --git a/webapps/docs/security-manager-howto.xml b/webapps/docs/security-manager-howto.xml new file mode 100644 index 000000000..d8eadec90 --- /dev/null +++ b/webapps/docs/security-manager-howto.xml @@ -0,0 +1,383 @@ + + +]> + + + &project; + + + Glenn Nielsen + Jean-Francois Arcand + Security Manager HOW-TO + + + + + +
+ +

The Java SecurityManager is what allows a web browser + to run an applet in its own sandbox to prevent untrusted code from + accessing files on the local file system, connecting to a host other + than the one the applet was loaded from, and so on. In the same way + the SecurityManager protects you from an untrusted applet running in + your browser, use of a SecurityManager while running Tomcat can protect + your server from trojan servlets, JSPs, JSP beans, and tag libraries. + Or even inadvertent mistakes.

+ +

Imagine if someone who is authorized to publish JSPs on your site + inadvertently included the following in their JSP:

+ +<% System.exit(1); %> + + +

Every time this JSP was executed by Tomcat, Tomcat would exit. + Using the Java SecurityManager is just one more line of defense a + system administrator can use to keep the server secure and reliable.

+ +

WARNING - A security audit + have been conducted using the Tomcat 5 codebase. Most of the critical + package have been protected and a new security package protection mechanism + has been implemented. Still, make sure that you are satisfied with your SecurityManager + configuration before allowing untrusted users to publish web applications, + JSPs, servlets, beans, or tag libraries. However, running with a + SecurityManager is definitely better than running without one.

+ +
+ + +
+ +

Permission classes are used to define what Permissions a class loaded + by Tomcat will have. There are a number of Permission classes that are + a standard part of the JDK, and you can create your own Permission class + for use in your own web applications. Both techniques are used in + Tomcat 5.

+ + + + +

This is just a short summary of the standard system SecurityManager + Permission classes applicable to Tomcat. See + http://java.sun.com/security/ + for more information.

+ +
    +
  • java.util.PropertyPermission - Controls read/write + access to JVM properties such as java.home.
  • +
  • java.lang.RuntimePermission - Controls use of + some System/Runtime functions like exit() and + exec(). Also control the package access/definition.
  • +
  • java.io.FilePermission - Controls read/write/execute + access to files and directories.
  • +
  • java.net.SocketPermission - Controls use of + network sockets.
  • +
  • java.net.NetPermission - Controls use of + multicast network connections.
  • +
  • java.lang.reflect.ReflectPermission - Controls + use of reflection to do class introspection.
  • +
  • java.security.SecurityPermission - Controls access + to Security methods.
  • +
  • java.security.AllPermission - Allows access to all + permissions, just as if you were running Tomcat without a + SecurityManager.
  • +
+ +
+ + + + +

Tomcat utilizes a custom permission class called + org.apache.naming.JndiPermission. This permission + controls read access to JNDI named file based resources. The permission + name is the JNDI name and there are no actions. A trailing "*" can be + used to do wild card matching for a JNDI named file resource when + granting permission. For example, you might include the following + in your policy file:

+ +permission org.apache.naming.JndiPermission "jndi://localhost/examples/*"; + + +

A Permission entry like this is generated dynamically for each web + application that is deployed, to allow it to read its own static resources + but disallow it from using file access to read any other files (unless + permissions for those files are explicitly granted).

+ +

Also, Tomcat always dynamically creates the following file permission:

+ +permission java.io.FilePermission "** your application context**", "read"; + +

Where **your application context** equals the folder(or WAR file) under which + your application has been deployed.

+ +
+ + +
+ + +
+ +

Policy File Format

+ +

The security policies implemented by the Java SecurityManager are + configured in the $CATALINA_HOME/conf/catalina.policy file. + This file completely replaces the java.policy file present + in your JDK system directories. The catalina.policy file + can be edited by hand, or you can use the + policytool + application that comes with Java 1.2 or later.

+ +

Entries in the catalina.policy file use the standard + java.policy file format, as follows:

+ +// Example policy file entry + +grant [signedBy <signer>,] [codeBase <code source>] { + permission <class> [<name> [, <action list>]]; +}; + + +

The signedBy and codeBase entries are + optional when granting permissions. Comment lines begin with "//" and + end at the end of the current line. The codeBase is in the + form of a URL, and for a file URL can use the ${java.home} + and ${catalina.home} properties (which are expanded out to + the directory paths defined for them by the JAVA_HOME and + CATALINA_HOME environment variables).

+ +

The Default Policy File

+ +

The default $CATALINA_HOME/conf/catalina.policy file + looks like this:

+ +// ============================================================================ +// catalina.corepolicy - Security Policy Permissions for Tomcat 5 +// +// This file contains a default set of security policies to be enforced (by the +// JVM) when Catalina is executed with the "-security" option. In addition +// to the permissions granted here, the following additional permissions are +// granted to the codebase specific to each web application: +// +// * Read access to the document root directory +// +// $Id: security-manager-howto.xml 301460 2003-01-15 03:40:45Z glenn $ +// ============================================================================ + + +// ========== SYSTEM CODE PERMISSIONS ========================================= + + +// These permissions apply to javac +grant codeBase "file:${java.home}/lib/-" { + permission java.security.AllPermission; +}; + +// These permissions apply to all shared system extensions +grant codeBase "file:${java.home}/jre/lib/ext/-" { + permission java.security.AllPermission; +}; + +// These permissions apply to javac when ${java.home] points at $JAVA_HOME/jre +grant codeBase "file:${java.home}/../lib/-" { + permission java.security.AllPermission; +}; + +// These permissions apply to all shared system extensions when +// ${java.home} points at $JAVA_HOME/jre +grant codeBase "file:${java.home}/lib/ext/-" { + permission java.security.AllPermission; +}; + + +// ========== CATALINA CODE PERMISSIONS ======================================= + + +// These permissions apply to the launcher code +grant codeBase "file:${catalina.home}/bin/commons-launcher.jar" { + permission java.security.AllPermission; +}; + +// These permissions apply to the server startup code +grant codeBase "file:${catalina.home}/bin/bootstrap.jar" { + permission java.security.AllPermission; +}; + +// These permissions apply to the servlet API classes +// and those that are shared across all class loaders +// located in the "common" directory +grant codeBase "file:${catalina.home}/common/-" { + permission java.security.AllPermission; +}; + +// These permissions apply to the container's core code, plus any additional +// libraries installed in the "server" directory +grant codeBase "file:${catalina.home}/server/-" { + permission java.security.AllPermission; +}; + +// ========== WEB APPLICATION PERMISSIONS ===================================== + + +// These permissions are granted by default to all web applications +// In addition, a web application will be given a read FilePermission +// and JndiPermission for all files and directories in its document root. +grant { + // Required for JNDI lookup of named JDBC DataSource's and + // javamail named MimePart DataSource used to send mail + permission java.util.PropertyPermission "java.home", "read"; + permission java.util.PropertyPermission "java.naming.*", "read"; + permission java.util.PropertyPermission "javax.sql.*", "read"; + + // OS Specific properties to allow read access + permission java.util.PropertyPermission "os.name", "read"; + permission java.util.PropertyPermission "os.version", "read"; + permission java.util.PropertyPermission "os.arch", "read"; + permission java.util.PropertyPermission "file.separator", "read"; + permission java.util.PropertyPermission "path.separator", "read"; + permission java.util.PropertyPermission "line.separator", "read"; + + // JVM properties to allow read access + permission java.util.PropertyPermission "java.version", "read"; + permission java.util.PropertyPermission "java.vendor", "read"; + permission java.util.PropertyPermission "java.vendor.url", "read"; + permission java.util.PropertyPermission "java.class.version", "read"; + permission java.util.PropertyPermission "java.specification.version", "read"; + permission java.util.PropertyPermission "java.specification.vendor", "read"; + permission java.util.PropertyPermission "java.specification.name", "read"; + + permission java.util.PropertyPermission "java.vm.specification.version", "read"; + permission java.util.PropertyPermission "java.vm.specification.vendor", "read"; + permission java.util.PropertyPermission "java.vm.specification.name", "read"; + permission java.util.PropertyPermission "java.vm.version", "read"; + permission java.util.PropertyPermission "java.vm.vendor", "read"; + permission java.util.PropertyPermission "java.vm.name", "read"; + + // Required for getting BeanInfo + permission java.lang.RuntimePermission "accessClassInPackage.sun.beans.*"; + + // Required for OpenJMX + permission java.lang.RuntimePermission "getAttribute"; + + // Allow read of JAXP compliant XML parser debug + permission java.util.PropertyPermission "jaxp.debug", "read"; +}; + + +// You can assign additional permissions to particular web applications by +// adding additional "grant" entries here, based on the code base for that +// application, /WEB-INF/classes/, or /WEB-INF/lib/ jar files. +// +// Different permissions can be granted to JSP pages, classes loaded from +// the /WEB-INF/classes/ directory, all jar files in the /WEB-INF/lib/ +// directory, or even to individual jar files in the /WEB-INF/lib/ directory. +// +// For instance, assume that the standard "examples" application +// included a JDBC driver that needed to establish a network connection to the +// corresponding database and used the scrape taglib to get the weather from +// the NOAA web server. You might create a "grant" entries like this: +// +// The permissions granted to the context root directory apply to JSP pages. +// grant codeBase "file:${catalina.home}/webapps/examples/-" { +// permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect"; +// permission java.net.SocketPermission "*.noaa.gov:80", "connect"; +// }; +// +// The permissions granted to the context WEB-INF/classes directory +// grant codeBase "file:${catalina.home}/webapps/examples/WEB-INF/classes/-" { +// }; +// +// The permission granted to your JDBC driver +// grant codeBase "jar:file:${catalina.home}/webapps/examples/WEB-INF/lib/driver.jar!/-" { +// permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect"; +// }; +// The permission granted to the scrape taglib +// grant codeBase "jar:file:${catalina.home}/webapps/examples/WEB-INF/lib/scrape.jar!/-" { +// permission java.net.SocketPermission "*.noaa.gov:80", "connect"; +// }; + + +

Starting Tomcat With A SecurityManager

+ +

Once you have configured the catalina.policy file for use + with a SecurityManager, Tomcat can be started with a SecurityManager in + place by using the "-security" option:

+ +$CATALINA_HOME/bin/catalina.sh start -security (Unix) +%CATALINA_HOME%\bin\catalina start -security (Windows) + + +
+
+

Starting with Tomcat 5, it is now possible to configure which Tomcat + internal package are protected againts package definition and access. See + + http://java.sun.com/security/seccodeguide.html + for more information.

+ + +

WARNING: Be aware that removing the default package protection + could possibly open a security hole

+ +

The Default Properties File

+ +

The default $CATALINA_HOME/conf/catalina.properties file + looks like this:

+ +# +# List of comma-separated packages that start with or equal this string +# will cause a security exception to be thrown when +# passed to checkPackageAccess unless the +# corresponding RuntimePermission ("accessClassInPackage."+package) has +# been granted. +package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat., +org.apache.jasper. +# +# List of comma-separated packages that start with or equal this string +# will cause a security exception to be thrown when +# passed to checkPackageDefinition unless the +# corresponding RuntimePermission ("defineClassInPackage."+package) has +# been granted. +# +# by default, no packages are restricted for definition, and none of +# the class loaders supplied with the JDK call checkPackageDefinition. +# +package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote., +org.apache.tomcat.,org.apache.jasper. + +

Once you have configured the catalina.properties file for use + with a SecurityManager, remember to re-start Tomcat.

+
+ +
+ +

If your web application attempts to execute an operation that is + prohibited by lack of a required Permission, it will throw an + AccessControLException or a SecurityException + when the SecurityManager detects the violation. Debugging the permission + that is missing can be challenging, and one option is to turn on debug + output of all security decisions that are made during execution. This + is done by setting a system property before starting Tomcat. The easiest + way to do this is via the CATALINA_OPTS environment variable. + Execute this command:

+ +export CATALINA_OPTS=-Djava.security.debug=all (Unix) +set CATALINA_OPTS=-Djava.security.debug=all (Windows) + + +

before starting Tomcat.

+ +

WARNING - This will generate many megabytes + of output! However, it can help you track down problems by searching + for the word "FAILED" and determining which permission was being checked + for. See the Java security documentation for more options that you can + specify here as well.

+ +
+ + + + +
diff --git a/webapps/docs/setup.xml b/webapps/docs/setup.xml new file mode 100644 index 000000000..a833b7edd --- /dev/null +++ b/webapps/docs/setup.xml @@ -0,0 +1,135 @@ + + +]> + + + &project; + + + Remy Maucherat + Tomcat Setup + + + + +
+

+ This document introduces several ways to set up Tomcat for running + on different platforms. Please note that some advanced setup issues + are not covered here: the full distribution (ZIP file or tarball) + includes a file called + RUNNING.txt which discusses these issues. We encourage you to refer + to it if the information below does not answer some of your questions. +

+
+ +
+ +

+ Installing Tomcat on Windows can be done easily using the Windows + installer. Its interface and functionality is similar to other wizard + based installers, with only a few items of interest. +

+ +

+

    +
  • Installation as a service: Tomcat will be + installed as a Windows + NT/2k/XP service no matter what setting is selected. Using the + checkbox on the component page sets the service as "auto" + startup, so that Tomcat is automatically started when Windows + starts. For optimal security, the service should be run as a + separate user, with reduced permissions (see the Windows Services + administration tool and its documentation).
  • +
  • Java location: The installer will use the registry + or the JAVA_HOME environment variable to determine the base path + of a J2SE 5 JRE. +
  • +
  • Tray icon: When Tomcat is run as a service, there + will not be any tray icon present when Tomcat is running. Note that + when choosing to run Tomcat at the end of installation, the tray + icon will be used even if Tomcat was installed as a service.
  • +
  • Refer to the + Windows Service HOW-TO + for information on how to manage Tomcat as Windows NT service. +
  • +
+

+ +

The installer will create shortcuts allowing starting and configuring + Tomcat. It is important to note that the Tomcat administration web + application can only be used when Tomcat is running.

+ +

If using a J2SE 1.4 JRE, the compatibility package must be downloaded and + expanded inside the folder where Tomcat was installed.

+ +
+ +
+ +

Tomcat can be run as a daemon using the jsvc tool from the + commons-daemon project. Source tarballs for jsvc are included with the + Tomcat binaries, and need to be compiled. Building jsvc requires + a C ANSI compiler (such as GCC), GNU Autoconf, and a JDK.

+ +

Before running the script, the JAVA_HOME environment + variable should be set to the base path of the JDK. Alternately, when + calling the ./configure script, the path of the JDK may + be specified using the --with-java parameter, such as + ./configure --with-java=/usr/java.

+ +

Using the following commands should result in a compiled jsvc binary, + located in the $CATALINA_HOME/bin folder. This assumes + that GNU TAR is used, and that CATALINA_HOME is an + environment variable pointing to the base path of the Tomcat + installation.

+ +

Please note that you should use the GNU make (gmake) instead of + the native BSD make on FreeBSD systems.

+ + + + cd $CATALINA_HOME/bin + tar xvfz jsvc.tar.gz + cd jsvc-src + autoconf + ./configure + make + cp jsvc .. + cd .. + + +

Tomcat can then be run as a daemon using the following commands.

+ + + cd $CATALINA_HOME + ./bin/jsvc -Djava.endorsed.dirs=./common/endorsed -cp ./bin/bootstrap.jar \ + -outfile ./logs/catalina.out -errfile ./logs/catalina.err \ + org.apache.catalina.startup.Bootstrap + + +

jsvc has other useful parameters, such as -user which + causes it to switch to another user after the daemon initialization is + complete. This allows, for example, running Tomcat as a non privileged + user while still being able to use privileged ports. + jsvc --help will return the full jsvc usage + information. In particular, the -debug option is useful + to debug issues running jsvc.

+ +

The file $CATALINA_HOME/bin/jsvc/native/tomcat.sh can be + used as a template for starting Tomcat automatically at boot time from + /etc/init.d. The file is currently setup for running + Tomcat 4.1.x, so it is necessary to edit it and change the classname + from BootstrapService to Bootstrap.

+ +

Note that the Commons-Daemon JAR file must be on your runtime classpath + to run Tomcat in this manner. The Commons-Daemon JAR file is in the Class-Path + entry of the bootstrap.jar manifest, but if you get a ClassNotFoundException + or a NoClassDefFoundError for a Commons-Daemon class, add the Commons-Daemon + JAR to the -cp argument when launching jsvc.

+ +
+ + +
diff --git a/webapps/docs/ssi-howto.xml b/webapps/docs/ssi-howto.xml new file mode 100644 index 000000000..d60d74769 --- /dev/null +++ b/webapps/docs/ssi-howto.xml @@ -0,0 +1,373 @@ + + +]> + + +&project; + + +Glenn L. Nielsen +SSI How To + + + + +
+ +

SSI (Server Side Includes) are directives that are placed in HTML pages, +and evaluated on the server while the pages are being served. They let you +add dynamically generated content to an existing HTML page, without having +to serve the entire page via a CGI program, or other dynamic technology. +

+ +

Within Tomcat SSI support can be added when using Tomcat as your +HTTP server and you require SSI support. Typically this is done +during development when you don't want to run a web server like Apache.

+ +

Tomcat SSI support implements the same SSI directives as Apache. See the + +Apache Introduction to SSI for information on using SSI directives.

+ +

SSI support is available as a servlet and as a filter. You should use one +or the other to provide SSI support but not both.

+ +

Servlet based SSI support is implemented using the class +org.apache.catalina.ssi.SSIServlet. Traditionally, this servlet +is mapped to the URL pattern "*.shtml".

+ +

Filter based SSI support is implemented using the class +org.apache.catalina.ssi.SSIFilter. Traditionally, this filter +is mapped to the URL pattern "*.shtml", though it can be mapped to "*" as +it will selectively enable/disable SSI processing based on mime types. The +contentType init param allows you to apply SSI processing to JSP pages, +javascript, or any other content you wish.

+

By default SSI support is disabled in Tomcat.

+
+ +
+ +

CAUTION - SSI directives can be used to execute programs +external to the Tomcat JVM. If you are using the Java SecurityManager this +will bypass your security policy configuration in catalina.policy. +

+ +

Rename $CATALINA_BASE/server/lib/servlets-ssi.renametojar +to $CATALINA_BASE/server/lib/servlets-ssi.jar.

+ +

To use the SSI servlet, remove the XML comments from around the SSI servlet +and servlet-mapping configuration in +$CATALINA_BASE/conf/web.xml.

+ +

To use the SSI filter, remove the XML comments from around the SSI filter +and filter-mapping configuration in +$CATALINA_BASE/conf/web.xml.

+ +
+ +
+ +

There are several servlet init parameters which can be used to +configure the behaviour of the SSI servlet. +

    +
  • buffered - Should output from this servlet be buffered? +(0=false, 1=true) Default 0 (false).
  • +
  • debug - Debugging detail level for messages logged +by this servlet. Default 0.
  • +
  • expires - The number of seconds before a page with SSI +directives will expire. Default behaviour is for all SSI directives to be +evaluated for every request.
  • +
  • isVirtualWebappRelative - Should "virtual" SSI directive +paths be interpreted as relative to the context root, instead of the server +root? (0=false, 1=true) Default 0 (false).
  • +
  • inputEncoding - The encoding to be assumed for SSI +resources if one cannot be determined from the resource itself. Default is +the default platform encoding.
  • +
  • outputEncoding - The encoding to be used for the result +of the SSI processing. Default is UTF-8.
  • +
+

+ +
+ +
+ +

There are several filter init parameters which can be used to +configure the behaviour of the SSI filter. +

    +
  • contentType - A regex pattern that must be matched before +SSI processing is applied. When crafting your own pattern, don't forget that a +mime content type may be followed by an optional character set in the form +"mime/type; charset=set" that you must take into account. Default is +"text/x-server-parsed-html(;.*)?".
  • +
  • debug - Debugging detail level for messages logged +by this servlet. Default 0.
  • +
  • expires - The number of seconds before a page with SSI +directives will expire. Default behaviour is for all SSI directives to be +evaluated for every request.
  • +
  • isVirtualWebappRelative - Should "virtual" SSI directive +paths be interpreted as relative to the context root, instead of the server +root? (0=false, 1=true) Default 0 (false).
  • +
+

+ +
+ +
+

Server Side Includes are invoked by embedding SSI directives in an HTML document + whose type will be processed by the SSI servlet. The directives take the form of an HTML + comment. The directive is replaced by the results of interpreting it before sending the + page to the client. The general form of a directive is:

+

<!--#directive [parm=value] -->

+

The directives are: +

    +
  • +config - <!--#config timefmt="%B %Y" --> +Used to set the format of dates and other items processed by SSI +
  • +
  • +echo - <!--#echo var="VARIABLE_NAME" --> +will be replaced bt the value of the variable. +
  • +
  • +exec - Used to run commands on the host system. +
  • +
  • +include - <!--#include virtual="file-name" --> +inserts the contents +
  • +
  • +flastmod - <!--#flastmod file="filename.shtml" --> +Returns the time that a file was lost modified. +
  • +
  • +fsize - <!--#fsize file="filename.shtml" --> +Returns the size of a file. +
  • +
  • +printenv - <!--#printenv --> +Returns the list of all the defined variables. +
  • +
  • +set - <!--#set var="foo" value="Bar" --> +is used to assign a value to a user-defind variable. +
  • +
  • +if elif endif else - Used to create conditional sections. For example:
  • +<!--#config timefmt="%A" -->
    + <!--#if expr="$DATE_LOCAL = /Monday/" -->
    + <p>Meeting at 10:00 on Mondays</p>
    + <!--#elif expr="$DATE_LOCAL = /Friday/" -->
    + <p>Turn in your time card</p>
    + <!--#else -->
    + <p>Yoga class at noon.</p>
    + <!--#endif -->
    +
+

+See the +

+Apache Introduction to SSI for more information on using SSI directives.

+
+ +
+

The SSI servlet currently implements the following variables: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable NameDescription
AUTH_TYPE + The type of authentication used for this user: BASIC, FORM, etc.
CONTENT_LENGTH + The length of the data (in bytes or the number of + characters) passed from a form.
CONTENT_TYPE + The MIME type of the query data, such as "text/html".
DATE_GMT +Current date and time in GMT
DATE_LOCAL +Current date and time in the local time zone
DOCUMENT_NAME +The current file
DOCUMENT_URI +Virtual path to the file
GATEWAY_INTERFACE + The revision of the Common Gateway Interface that the + server uses if enabled: "CGI/1.1".
HTTP_ACCEPT + A list of the MIME types that the client can accept.
HTTP_ACCEPT_ENCODING + A list of the compression types that the client can accept.
HTTP_ACCEPT_LANGUAGE + A list of the laguages that the client can accept.
HTTP_CONNECTION + The way that the connection from the client is being managed: + "Close" or "Keep-Alive".
HTTP_HOST + The web site that the client requested.
HTTP_REFERER + The URL of the document that the client linked from.
HTTP_USER_AGENT + The browser the client is using to issue the request.
LAST_MODIFIED +Last modification date and time for current file
PATH_INFO + Extra path information passed to a servlet.
PATH_TRANSLATED + The translated version of the path given by the + variable PATH_INFO.
QUERY_STRING +The query string that follows the "?" in the URL. +
QUERY_STRING_UNESCAPED +Undecoded query string with all shell metacharacters escaped +with "\"
REMOTE_ADDR + The remote IP address of the user making the request.
REMOTE_HOST + The remote hostname of the user making the request.
REMOTE_PORT + The port number at remote IP address of the user making the request.
REMOTE_USER + The authenticated name of the user.
REQUEST_METHOD + The method with which the information request was + issued: "GET", "POST" etc.
REQUEST_URI + The web page originally requested by the client.
SCRIPT_FILENAME + The location of the current web page on the server.
SCRIPT_NAME + The name of the web page.
SERVER_ADDR + The server's IP address.
SERVER_NAME + The server's hostname or IP address.
SERVER_PORT + The port on which the server received the request.
SERVER_PROTOCOL + The protocol used by the server. E.g. "HTTP/1.1".
SERVER_SOFTWARE + The name and version of the server software that is + answering the client request.
UNIQUE_ID + A token used to identify the current session if one + has been established.
+
+ + + +
diff --git a/webapps/docs/ssl-howto.xml b/webapps/docs/ssl-howto.xml new file mode 100644 index 000000000..b1e917ad2 --- /dev/null +++ b/webapps/docs/ssl-howto.xml @@ -0,0 +1,539 @@ + + +]> + + + &project; + + + Christopher Cain + Yoav Shapira + SSL Configuration HOW-TO + + + + + +
+ +

IMPORTANT NOTE: This Howto refers to usage of JSSE. When using APR, Tomcat will + use OpenSSL, which uses a different configuration.

+ +
+

The description below uses the variable name $CATALINA_HOME + to refer to the directory into which you have installed Tomcat 5, + and is the base directory against which most relative paths are + resolved. However, if you have configured Tomcat 5 for multiple + instances by setting a CATALINA_BASE directory, you should use + $CATALINA_BASE instead of $CATALINA_HOME for each of these + references.

+
+ +

To install and configure SSL support on Tomcat 5, you need to follow +these simple steps. For more information, read the rest of this HOW-TO.

+
    +
  1. If you are running a 1.3 JVM, download JSSE 1.0.3 (or later) from + http://java.sun.com/products/jsse/ + and either make it an installed extension on the system, or else + set an environment variable JSSE_HOME that points at the + directory into which you installed JSSE.


  2. +
  3. Create a certificate keystore by executing the following command: +

    Windows:

    + +%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA + +

    Unix:

    + +$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA + +

    + and specify a password value of "changeit".


  4. +
  5. Uncomment the "SSL HTTP/1.1 Connector" entry in + $CATALINA_HOME/conf/server.xml and tweak as necessary.
  6. +

    +
+ + +
+ + +
+ +

SSL, or Secure Socket Layer, is a technology which allows web browsers and +web servers to communicate over a secured connection. This means that the data +being sent is encrypted by one side, transmitted, then decrypted by the other +side before processing. This is a two-way process, meaning that both the +server AND the browser encrypt all traffic before sending out data.

+ +

Another important aspect of the SSL protocol is Authentication. This means +that during your initial attempt to communicate with a web server over a secure +connection, that server will present your web browser with a set of +credentials, in the form of a "Certificate", as proof the site is who and what +it claims to be. In certain cases, the server may also request a Certificate +from your web browser, asking for proof that you are who you claim +to be. This is known as "Client Authentication," although in practice this is +used more for business-to-business (B2B) transactions than with individual +users. Most SSL-enabled web servers do not request Client Authentication.

+ +
+ +
+ +

It is important to note that configuring Tomcat to take advantage of +secure sockets is usually only necessary when running it as a stand-alone +web server. When running Tomcat primarily as a Servlet/JSP container behind +another web server, such as Apache or Microsoft IIS, it is usually necessary +to configure the primary web server to handle the SSL connections from users. +Typically, this server will negotiate all SSL-related functionality, then +pass on any requests destined for the Tomcat container only after decrypting +those requests. Likewise, Tomcat will return cleartext responses, that will +be encrypted before being returned to the user's browser. In this environment, +Tomcat knows that communications between the primary web server and the +client are taking place over a secure connection (because your application +needs to be able to ask about this), but it does not participate in the +encryption or decryption itself.

+ +
+ +
+ +

In order to implement SSL, a web server must have an associated Certificate +for each external interface (IP address) that accepts secure connections. +The theory behind this design is that a server should provide some kind of +reasonable assurance that its owner is who you think it is, particularly +before receiving any sensitive information. While a broader explanation of +Certificates is beyond the scope of this document, think of a Certificate +as a "digital driver's license" for an Internet address. It states what +company the site is associated with, along with some basic contact +information about the site owner or administrator.

+ +

This "driver's license" is cryptographically signed by its owner, and is +therefore extremely difficult for anyone else to forge. For sites involved +in e-commerce, or any other business transaction in which authentication of +identity is important, a Certificate is typically purchased from a well-known +Certificate Authority (CA) such as VeriSign or Thawte. Such +certificates can be electronically verified -- in effect, the Certificate +Authority will vouch for the authenticity of the certificates that it grants, +so you can believe that that Certificate is valid if you trust the Certificate +Authority that granted it.

+ +

In many cases, however, authentication is not really a concern. An +administrator may simply want to ensure that the data being transmitted and +received by the server is private and cannot be snooped by anyone who may be +eavesdropping on the connection. Fortunately, Java provides a relatively +simple command-line tool, called keytool, which can easily create +a "self-signed" Certificate. Self-signed Certificates are simply user +generated Certificates which have not been officially registered with any +well-known CA, and are therefore not really guaranteed to be authentic at all. +Again, this may or may not even be important, depending on your needs.

+ +
+ +
+ +

The first time a user attempts to access a secured page on your site, +he or she is typically presented with a dialog containing the details of +the certificate (such as the company and contact name), and asked if he or she +wishes to accept the Certificate as valid and continue with the transaction. +Some browsers will provide an option for permanently accepting a given +Certificate as valid, in which case the user will not be bothered with a +prompt each time they visit your site. Other browsers do not provide this +option. Once approved by the user, a Certificate will be considered valid +for at least the entire browser session.

+ +

Also, while the SSL protocol was designed to be as efficient as securely +possible, encryption/decryption is a computationally expensive process from +a performance standpoint. It is not strictly necessary to run an entire +web application over SSL, and indeed a developer can pick and choose which +pages require a secure connection and which do not. For a reasonably busy +site, it is customary to only run certain pages under SSL, namely those +pages where sensitive information could possibly be exchanged. This would +include things like login pages, personal information pages, and shopping +cart checkouts, where credit card information could possibly be transmitted. +Any page within an application can be requested over a secure socket by +simply prefixing the address with https: instead of +http:. Any pages which absolutely require +a secure connection should check the protocol type associated with the +page request and take the appropriate action if https is not +specified.

+ +

Finally, using name-based virtual hosts on a secured connection can be +problematic. This is a design limitation of the SSL protocol itself. The SSL +handshake, where the client browser accepts the server certificate, must occur +before the HTTP request is accessed. As a result, the request information +containing the virtual host name cannot be determined prior to authentication, +and it is therefore not possible to assign multiple certificates to a single +IP address. If all virtual hosts on a single IP address need to authenticate +against the same certificate, the addition of multiple virtual hosts should not +interfere with normal SSL operations on the server. Be aware, however, that +most client browsers will compare the server's domain name against the domain +name listed in the certificate, if any (applicable primarily to official, +CA-signed certificates). If the domain names do not match, these browsers will +display a warning to the client user. In general, only address-based virtual +hosts are commonly used with SSL in a production environment.

+ +
+ +
+ + +

Note that JSSE is bundled with Sun's JDK 1.4 and later, so if you're using +JDK 1.4 and later, you can skip this step.

+ + +

Download the Java Secure Socket Extensions (JSSE) package, +version 1.0.3 or later, from +http://java.sun.com/products/jsse/. +If you built Tomcat from source, you have probably already downloaded this +package.

+ +

After expanding the package, there are two ways to make it available to +Tomcat (choose one or the other):

+
    +
  • Make JSSE an installed extension by copying all three JAR files + (jcert.jar, jnet.jar, and jsse.jar) + into your $JAVA_HOME/jre/lib/ext directory.
  • +
  • Create a new environment variable JSSE_HOME that contains + the absolute path to the directory into which you unpacked the + JSSE binary distribution.
  • +
+ +
+ + + +

Tomcat currently operates only on JKS or PKCS12 +format keystores. The JKS format +is Java's standard "Java KeyStore" format, and is the format created by the +keytool command-line utility. This tool is included in the JDK. +The PKCS12 format is an internet standard, and can be manipulated +via (among other things) OpenSSL and Microsoft's Key-Manager. However, +currently there are some limitations on the support for PKCS12. +

+ +

To import an existing certificate into a JKS keystore, please read the +documentation (in your JDK documentation package) about keytool. +

+

To import an existing certificate signed by your own CA into a PKCS12 +keystore using OpenSSL you would execute a command like: +openssl pkcs12 -export -in mycert.crt -inkey mykey.key \ + -out mycert.p12 -name tomcat -CAfile myCA.crt \ + -caname root -chain + +For more advanced cases, consult the OpenSSL +documententation. +

+

To create a new keystore from scratch, containing a single self-signed +Certificate, execute the following from a terminal command line:

+

Windows:

+ +%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA + +

Unix:

+ +$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA + + +

(The RSA algorithm should be preferred as a secure algorithm, and this +also ensures general compatibility with other servers and components.)

+ +

This command will create a new file, in the home directory of the user +under which you run it, named ".keystore". To specify a +different location or filename, add the -keystore parameter, +followed by the complete pathname to your keystore file, +to the keytool command shown above. You will also need to +reflect this new location in the server.xml configuration file, +as described later. For example:

+

Windows:

+ +%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA \ + -keystore \path\to\my\keystore + +

Unix:

+ +$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA \ + -keystore /path/to/my/keystore + + +

After executing this command, you will first be prompted for the keystore +password. The default password used by Tomcat is "changeit" +(all lower case), although you can specify a custom password if you like. +You will also need to specify the custom password in the +server.xml configuration file, as described later.

+ +

Next, you will be prompted for general information about this Certificate, +such as company, contact name, and so on. This information will be displayed +to users who attempt to access a secure page in your application, so make +sure that the information provided here matches what they will expect.

+ +

Finally, you will be prompted for the key password, which is the +password specifically for this Certificate (as opposed to any other +Certificates stored in the same keystore file). You MUST +use the same password here as was used for the keystore password itself. +(Currently, the keytool prompt will tell you that pressing the +ENTER key does this for you automatically.)

+ +

If everything was successful, you now have a keystore file with a +Certificate that can be used by your server.

+ +

Note: your private key password and keystore password +should be the same. If they differ, you will get an error along the lines +of java.io.IOException: Cannot recover key, as documented in +Bugzilla issue 38217, +which contains further references for this issue.

+ +
+ + + +

The final step is to configure your secure socket in the +$CATALINA_HOME/conf/server.xml file, where +$CATALINA_HOME represents the directory into which you +installed Tomcat 5. An example <Connector> element +for an SSL connector is included in the default server.xml +file installed with Tomcat. It will look something like this:

+ +<-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 --> +<!-- +<Connector + port="8443" minProcessors="5" maxProcessors="75" + enableLookups="true" disableUploadTimeout="true" + acceptCount="100" debug="0" scheme="https" secure="true"; + clientAuth="false" sslProtocol="TLS"/> +--> + + +

You will note that the Connector element itself is commented out by default, +so you will need to remove the comment tags around it. Then, you can +customize the specified attributes as necessary. For detailed information +about the various options, consult the +Server Configuration Reference. The +following discussion covers only those attributes of most interest when +setting up SSL communication.

+ +

The port attribute (default value is 8443) is the TCP/IP +port number on which Tomcat will listen for secure connections. You can +change this to any port number you wish (such as to the default port for +https communications, which is 443). However, special setup +(outside the scope of this document) is necessary to run Tomcat on port +numbers lower than 1024 on many operating systems.

+ +
+

If you change the port number here, you should also change the + value specified for the redirectPort attribute on the + non-SSL connector. This allows Tomcat to automatically redirect + users who attempt to access a page with a security constraint specifying + that SSL is required, as required by the Servlet 2.4 Specification.

+
+ +

There are addional option used to configure the SSL protocol. + You may need to add or change the following attribute +values, depending on how you configured your keystore earlier:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescription
clientAuthSet this value to true if you want Tomcat to require + all SSL clients to present a client Certificate in order to use + this socket. Set this value to want if you want Tomcat + to request a client Certificate, but not fail if one isn't presented. +
keystoreFileAdd this attribute if the keystore file you created is not in + the default place that Tomcat expects (a file named + .keystore in the user home directory under + which Tomcat is running). You can specify an absolute pathname, + or a relative pathname that is resolved against the + $CATALINA_BASE environment variable.
keystorePassAdd this element if you used a different keystore (and Certificate) + password than the one Tomcat expects (changeit).
keystoreTypeAdd this element if using a PKCS12 keystore. The valid values are + JKS and PKCS12.
sslProtocolThe encryption/decryption protocol to be used on this socket. + It is not recommended to change this value if you are using Sun's + JVM. It is reported that IBM's 1.4.1 implementation + of the TLS protocol is not compatible with some popular browsers. + In this case, use the value SSL.
ciphersThe comma separated list of encryption ciphers that this socket is + allowed to use. By default, any available cipher is allowed.
algorithmThe X509 algorithm to use. This defaults to the Sun + implementation (SunX509). For IBM JVMs you should use + the value IbmX509. For other vendors, consult the JVM + documentation for the correct value. +
truststoreFileThe TrustStore file to use to validate client certificates.
truststorePassThe password to access the TrustStore. This defaults to the value + of keystorePass.
truststoreTypeAdd this element if your are using a different format for the + TrustStore then you are using for the KeyStore. The valid values are + JKS and PKCS12.
+ +

After completing these configuration changes, you must restart Tomcat as +you normally do, and you should be in business. You should be able to access +any web application supported by Tomcat via SSL. For example, try:

+ +https://localhost:8443 + + +

and you should see the usual Tomcat splash page (unless you have modified +the ROOT web application). If this does not work, the following section +contains some troubleshooting tips.

+ +
+ +
+ +
+

To obstain and install a Certificate from a Certificate Authority (like verisign.com, thawte.com +or trustcenter.de) you should have read the previous section and then follow these instructions:

+ + +

In order to obtain a Certificate from the Certificate Authority of your choice +you have to create a so called Certificate Signing Request (CSR). That CSR will be used +by the Certificate Authority to create a Certificate that will identify your website +as "secure". To create a CSR follow these steps:

+
    +
  • Create a local Certificate (as described in the previous section): + keytool -genkey -alias tomcat -keyalg RSA \ + -keystore <your_keystore_filename> + Note: In some cases you will have to enter the domain of your website (i.e. www.myside.org) + in the field "first- and lastname" in order to create a working Certificate. +
  • +
  • The CSR is then created with: + keytool -certreq -keyalg RSA -alias tomcat -file certreq.csr \ + -keystore <your_keystore_filename> +
  • +
+

Now you have a file called certreq.csr that you can submit to the Certificate Authority (look at the +documentation of the Certificate Authority website on how to do this). In return you get a Certificate.

+
+ + +

Now that you have your Certificate you can import it into you local keystore. +First of all you have to import a so called Chain Certificate or Root Certificate into your keystore. +After that you can procede with importing your Certificate.

+ +
    +
  • Download a Chain Certificate from the Certificate Authority you obtained the Certificate from.
    + For Verisign.com commercial certificates go to: + http://www.verisign.com/support/install/intermediate.html
    + For Verisign.com trial certificates go to: + http://www.verisign.com/support/verisign-intermediate-ca/Trial_Secure_Server_Root/index.html + For Trustcenter.de go to: + http://www.trustcenter.de/certservices/cacerts/en/en.htm#server
    + For Thawte.com go to: + http://www.thawte.com/certs/trustmap.html
    +
  • +
  • Import the Chain Certificate into you keystore + keytool -import -alias root -keystore <your_keystore_filename> \ + -trustcacerts -file <filename_of_the_chain_certificate> +
  • +
  • And finally import your new Certificate + keytool -import -alias tomcat -keystore <your_keystore_filename> \ + -trustcacerts -file <your_certificate_filename> +
  • +
+
+
+ +
+ +

Here is a list of common problems that you may encounter when setting up +SSL communications, and what to do about them.

+ +
    + +
  • I get "java.security.NoSuchAlgorithmException" errors in my + log files. +
    +

    The JVM cannot find the JSSE JAR files. Follow all of the directions to + download and install JSSE.

    +
  • + +
  • When Tomcat starts up, I get an exception like + "java.io.FileNotFoundException: {some-directory}/{some-file} not found". +
    +

    A likely explanation is that Tomcat cannot find the keystore file + where it is looking. By default, Tomcat expects the keystore file to + be named .keystore in the user home directory under which + Tomcat is running (which may or may not be the same as yours :-). If + the keystore file is anywhere else, you will need to add a + keystoreFile attribute to the <Factory> + element in the Tomcat + configuration file.

    +
  • + +
  • When Tomcat starts up, I get an exception like + "java.io.FileNotFoundException: Keystore was tampered with, or + password was incorrect". +
    +

    Assuming that someone has not actually tampered with + your keystore file, the most likely cause is that Tomcat is using + a different password than the one you used when you created the + keystore file. To fix this, you can either go back and + recreate the keystore + file, or you can add or update the keystorePass + attribute on the <Connector> element in the + Tomcat configuration + file. REMINDER - Passwords are case sensitive!

    +
  • + +
+ +

If you are still having problems, a good source of information is the +TOMCAT-USER mailing list. You can find pointers to archives +of previous messages on this list, as well as subscription and unsubscription +information, at +http://jakarta.apache.org/site/mail.html".

+ +
+ +
+ +

To access the SSL session ID from the request, use:
+ + + String sslID = (String)request.getAttribute("javax.servlet.request.ssl_session"); + +
+For additional discussion on this area, please see +Bugzilla. +

+
+ + + +
diff --git a/webapps/docs/status.xml b/webapps/docs/status.xml new file mode 100644 index 000000000..fb5973dcc --- /dev/null +++ b/webapps/docs/status.xml @@ -0,0 +1,123 @@ + + +]> + + + &project; + + + Remy Maucherat + Yoav Shapira + Project Status + + + +
+

+ This document attempts to convey the current status of Tomcat development + in "big picture" terms. This is not the place to check if an individual + bug report has been addressed or when an individual feature will be available. +

+

+ This page is updated roughly once per every couple of Tomcat minor releases, + so for day-to-day status you should check the tomcat-user and tomcat-dev mailing + lists. You can always inquire there as to the availability or status of a + specific feature or component. +

+
+ +
+

+ Tomcat 5.0.27 was released on June 17th, 2004. At that time, the TOMCAT_5_0 + branch was tagged in CVS, and work on Tomcat 5.5 began. We have now had several + Tomcat 5.5 releases, including a couple of stable ones. Accordingly, Tomcat 5.5 + is now the focus on work. Tomcat 5.0 is in maintenance mode and its releases + will become less and less frequent. +

+

+ Tomcat 5.5 has several major goals. They are discussed in the tomcat-dev + mailing list's "5.next" thread: + MARC. + The status of some of these items is detailed below. Once 5.5 releases are + available, please refer to the Changelog accompanying each release for detailed + changes, enhancements, and fixes. +

+

+ Tomcat 4.1.x is no longer actively developed. It is maintained to address + only showstopper, security, and Servlet Specification compliance issues. Maintenance + for Tomcat 4.1.x will likely cease once a stable release or two of Tomcat 5.5 are out. + Users of Tomcat 4.1.x are strongly encouraged to upgrade to the latest stable Tomcat + 5.0 release. +

+

+ Tomcat 4.0.x is relatively old, and not actively maintained or supported. + It is strongly recommended that users of these releases upgrade to the latest + stable Tomcat 5.0 release or at least the latest stable Tomcat 4.1 release. +

+

+ Tomcat 3.3.x is in roughly the same maintenance mode as Tomcat 4.1.x. +

+

+ Tomcat 3.2 and earlier are in roughly the same support state as Tomcat 4.0.x. + Users should upgrade to Tomcat 3.3.x or the latest stable Tomcat 5.0.x. +

+
+ +
+ +

+ The columns in this report contain the following information: +

    +
  • Priority - A sense of how important it is to address this + issue in the short term.
  • +
  • Action Item - Concise description of the action item + to be completed. Where relevant, Java package names of the + primary classes involved are listed in [square brackets]
  • +
  • Volunteers - Login of those developers who + have volunteered to assist in the design, implementation, testing, and + documentation of this action item's changes to Tomcat.
  • +
+ Developers can nominate + themselves to work on particular action items by asking a Committer to + add their name address to those items. The developers + working on each item should discuss and agree upon the approach to be + used for implementing the item's changes to the project source code + and documentation, prior to completing those changes. Such discussions + should take place on the tomcat-dev mailing list so that everyone can + stay apprised of what is going on, or chime in if they want to + contribute ideas and suggestions. +

+ +
+ +
+ + + + Refactor ClassLoaders for Tomcat 5.5 to allow container plugins. + + + Enhance Cluster functionality for Tomcat 5.5. + + + Continue fixing bugs and updating docs. + + + +
+ +
+ +

+ The list of the bugs which are in an unresolved state for Tomcat 5 can be + seen + here. + Aspiring volunteers and others are strongly encouraged to attempt + to comment and help resolve these issues. +

+ +
+ + +
diff --git a/webapps/docs/tomcat-docs.xsl b/webapps/docs/tomcat-docs.xsl new file mode 100644 index 000000000..98fb06008 --- /dev/null +++ b/webapps/docs/tomcat-docs.xsl @@ -0,0 +1,436 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <xsl:value-of select="project/title"/> - <xsl:value-of select="properties/title"/> + + + + + + + + + + + + + + + + + PAGE HEADER + + + + + +
+ + + + + + + + + + + + PROJECT LOGO + + {$alt} + + + + +

+
+
+ APACHE LOGO + + + + + Apache Logo + +
+ + + + HEADER SEPARATOR + + + + + + + + + LEFT SIDE NAVIGATION + + + + RIGHT SIDE MAIN BODY + + + + + FOOTER SEPARATOR + + + + + PAGE FOOTER + + +
+
+
+ + + + + + + +
+

+

+
+ + + + + + + + + + + Printer Friendly Version +
print-friendly
version +
+
+
+ + + + + + +
+ +
+
+
+
+ Copyright © 1999-2006, Apache Software Foundation +
+
+ + + +
+ + + + +

+
    + +
+
+ + + + + + + +
  • +
    + + + + + + + + + + + + +
    + + + +
    + +
    +
    + + + + + + + + + + + + +
    + + + +
    + +
    +
    + + + + + + + +
    + + + + + + + + + + + + + + + + +
    + + + + + +
    + +
    +            
    +          
    + +
    + + + + + +
    +
    +
    + + + + + + + + + + + + + + + +
    + Attribute + + Description +
    + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + /images/add.gif + add + + + + + + + /images/update.gif + update + + + + + + + /images/design.gif + design + + + + + + + /images/docs.gif + docs + + + + + + + /images/fix.gif + fix + + + + + + + /images/code.gif + code + + + + + + + + + + + + + + + + + + + +
    + Priority + + Action Item + + Volunteers +
    + + + + + +
    +
    + + + + + + + + + + + + + + +
    diff --git a/webapps/docs/windows-service-howto.xml b/webapps/docs/windows-service-howto.xml new file mode 100644 index 000000000..82bf0485b --- /dev/null +++ b/webapps/docs/windows-service-howto.xml @@ -0,0 +1,352 @@ + + +]> + + + &project; + + + Mladen Turk + Windows service HOW-TO + + + + +
    +

    + This section of the documentation applies to procrun 1.0, and is now obsolete. +

    +
    +
    +

    + Tomcat5 is a service application for running Tomcat5 as NT service. +

    +
    +
    +

    + Tomcat5w is a GUI application for monitoring and configuring Tomcat + services. +

    +

    The available command line options are:

    +

    + + + + + + + + + +
    //ES//Edit service configurationThis is the default operation. It is called if the no option is + provided but the executable is renamed to servicenameW.exe
    //MS//Monitor servicePut the icon in the system try
    +

    +
    +
    +

    + Each command line directive is in the form of //XX//ServiceName +

    +

    The available command line options are:

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    //TS//Run the service as console applicationThis is the default operation. It is called if the no option is + provided. The ServiceName is the name of the executable without + exe sufix, meaning Tomcat5
    //RS//Run the serviceCalled only from ServiceManager
    //SS//Stop the service
    //US//Update service parameters
    //IS//Install service
    //DS//Delete serviceStops the service if running
    +

    +
    +
    +

    + Each command parameter is prefixed with --. + If the command line is prefixed with ++ then it's value will + be appended to the existing option. + If the environment variable with the same name as command line parameter but + prefixed with PR_ exists it will take precedence. + For example: +set PR_CLASSPATH=xx.jar +

    +

    is equivalent to providing +--Classpath=xx.jar +

    +

    as command line parameter.

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterNameDefaultDescription
    --DescriptionService name description (maximum 1024 characters)
    --DisplayNameServiceNameService display name
    --Installprocrun.exe //RS//ServiceNameInstall image
    --StartupmanualService startup mode can be either auto or manual
    --DependsOnList of services that this service depend on. Dependent services + are separated using either # or ; characters
    --EnvironmentList of environment variables that will be provided to the service + in the form key=value. They are separated using either + # or ; characters
    --UserUser account used for running executable. It is used only for + StartMode java or exe and enables running applications + as service under account without LogonAsService privilege.
    --PasswordPassword for user account set by --User parameter
    --JavaHomeJAVA_HOMESet a different JAVA_HOME then defined by JAVA_HOME environment + variable
    --JvmautoUse either auto or specify the full path to the jvm.dll. + You can use the environment variable expansion here.
    --JvmOptions-XrsList of options in the form of -D or -X that will be + passed to the JVM. The options are separated using either + # or ; characters.
    --ClasspathSet the Java classpath
    --JvmMsInitial memory pool size in MB
    --JvmMxMaximum memory pool size in MB
    --JvmSsThread stack size in KB
    --StartImageExecutable that will be run.
    --StartPathWorking path for the start image executable.
    --StartClassClass that will be used for startup.
    --StartParamsList of parameters that will be passed to either StartImage or + StartClass. Parameters are separated using either # or + ; character.
    --StartMethodMainMethod name if differs then main
    --StartModeexecutableCan one of jvm java or exe
    --StopImageExecutable that will be run on Stop service signal.
    --StopPathWorking path for the stop image executable.
    --StopClassClass that will be used on Stop service signal.
    --StopParamsList of parameters that will be passed to either StopImage or + StopClass. Parameters are separated using either # or + ; character.
    --StopMethodMainMethod name if differs then main
    --StopModeexecutableCan one of jvm java or exe
    --StopTimeoutNo TimeoutDefines the timeout in seconds that procrun waits for service to + exit gracefully.
    --LogPathworking pathDefines the path for logging
    --LogPrefixjakarta_serviceDefines the service log filename
    --LogLevelINFODefines the logging level and can be either error, + info, warn or debug
    --StdOutputRedirected stdout filename
    --StdErrorRedirected stderr filename
    +

    +
    +
    +

    +The safest way to manually install the service is to use the provided service.bat script. +

    +

    + +Install the service named 'Tomcat5' +C:\> service.bat install + +

    +

    +If using tomcat5.exe, you need to use the //IS// parameter. +

    +

    + +Install the service named 'Tomcat5' +C:\> tomcat5 //IS//Tomcat5 --DisplayName="Apache Tomcat 5" \ +C:\> --Install="C:\Program Files\Tomcat\bin\tomcat5.exe" --Jvm=auto \ +C:\> --StartMode=jvm --StopMode=jvm \ +C:\> --StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start \ +C:\> --StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop + +

    +
    +
    +

    +To update the service parameters, you need to use the //US// parameter. +

    +

    + +Update the service named 'Tomcat5 +C:\> tomcat5 //US//Tomcat5 --Description="Apache Tomcat Server - http://jakarta.apache.org/tomcat " \ +C:\> --Startup=auto --Classpath=%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\bin\bootstrap.jar + +

    +
    +
    +

    +To remove the service, you need to use the //DS// parameter.
    +If the service is running it will be stopped and then deleted. +

    +

    + +Remove the service named 'Tomcat5' +C:\> tomcat5 //DS//Tomcat5 + +

    +
    +
    +

    +To run the service in console mode, you need to use the //TS// parameter. +The service shutdown can be initiated by pressing CTRL+C or +CTRL+BREAK. +If you rename the tomcat5.exe to testservice.exe then you can just execute the +testservice.exe and this command mode will be executed by default. +

    +

    + +Run the service named 'Tomcat5' in console mode +C:\> tomcat5 //TS//Tomcat5 [additional arguments] +Or simply execute: +C:\> tomcat5 + +

    +
    + +
    diff --git a/webapps/host-manager/WEB-INF/web.xml b/webapps/host-manager/WEB-INF/web.xml new file mode 100644 index 000000000..6de1fc5e3 --- /dev/null +++ b/webapps/host-manager/WEB-INF/web.xml @@ -0,0 +1,95 @@ + + + + + + + Tomcat Manager Application + + A scriptable management web application for the Tomcat Web Server; + Manager lets you view, load/unload/etc particular web applications. + + + + + HostManager + org.apache.catalina.manager.host.HostManagerServlet + + debug + 2 + + + + HTMLHostManager + org.apache.catalina.manager.host.HTMLHostManagerServlet + + debug + 2 + + + + + + HostManager + /list + + + HostManager + /add + + + HostManager + /remove + + + HostManager + /start + + + HostManager + /stop + + + HTMLHostManager + /html/* + + + + + + HTMLHostManager and HostManager commands + /html/* + /list + /add + /remove + /start + /stop + + + + admin + + + + + + BASIC + Tomcat Host Manager Application + + + + + + The role that is required to log in to the Manager Application + + admin + + + diff --git a/webapps/host-manager/host-manager.xml b/webapps/host-manager/host-manager.xml new file mode 100644 index 000000000..729e64bb5 --- /dev/null +++ b/webapps/host-manager/host-manager.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/webapps/host-manager/images/add.gif b/webapps/host-manager/images/add.gif new file mode 100644 index 0000000000000000000000000000000000000000..0774d074e5e48291bdacfacb086506e6be117e51 GIT binary patch literal 1037 zcmZ?wbhEHb6k!lyc+SA^9|->a|M&0T|Nno1n4h0tnTz4o;>0&glV!LWO;{KX^ykTP zGrU;!o~1phVTD*cK_!)em>kR#mn&Z^0eO_xlSoe_rhTdU2{GAH%zidEYmsygkrvrz1CG(e()%elNK2f9s9cY)lOA zFHHY+vFYoj2~vCv9}m?1K3M+d$V54A1}%N3>6>p)KJ;Ph^-o+33=fX46z69#)mMIU zX`LuPvyQH3L))$XdH+|R`pLj3#K*_?|NDPF1}|^fSwWhMt)w~)6|3?yj#iYvY3u#U zz+k?5_Z0?4&i}vuGc&jbXzljryOSdOKilYUx!k$z`*f|fsunnK;giFW)5K{fr5eq4b7~gYAGEP z7#KS_xkU;zCM1>#7e(d>$#qP^BWE~tBtO4mJmGb}q literal 0 HcmV?d00001 diff --git a/webapps/host-manager/images/asf-logo.gif b/webapps/host-manager/images/asf-logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..22eb9d7358ef57c3488331845e680b72c9b7c8e2 GIT binary patch literal 7279 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 F{{tbU1q=WH literal 0 HcmV?d00001 diff --git a/webapps/host-manager/images/code.gif b/webapps/host-manager/images/code.gif new file mode 100644 index 0000000000000000000000000000000000000000..d27307b5c09467c2e45bbfcd1ff74989eb2e7d65 GIT binary patch literal 394 zcmZ?wbhEHb6k!lySjxcg|NsAg|Na>m7<~Bf;lYCk`uh5YhK2_Y90&`0TwMGlHulx| z^XKp1zrTO~{%OFIr0wCGk>*L_#l_fx07^78uf_y0eALxXeY&ZVS$tf_gsW5<=_ z#~&LR{Wx~~@qq*T{{8>o&~U}u`>TV)%Z7#qKR>_t`1lhio=8gm&d$CqCiY|X>Z2Pr zZ1DH@->~lav}tGl|Nm=XU^H>*6ylK%0}z1x!oarPp`pM-N2)dikZ=q-8iKhfFV&ot-Z?#bsK$q(mDRr`$3(c`=?^VUbBf3LBO?F*3FB z2rH&5?cP|btfH!>&Z(iPC8xdDk6A}sSMT=aD<1m#3{1+}>>KXh^JOqF2nv4n;e)*V JgAa}j)&TJ-upR&a literal 0 HcmV?d00001 diff --git a/webapps/host-manager/images/design.gif b/webapps/host-manager/images/design.gif new file mode 100644 index 0000000000000000000000000000000000000000..f5db0a9fc783924486176ce157924fba53df73fc GIT binary patch literal 608 zcmZ?wbhEHb6k!lyIL5&6|NsAgK=A*+y}iAiot?eCt%HMuEs*J8ujLw+y7Ptq{{K!J zf7q}4X0-UF?)+zRlW&T4U*v2)!e6yXwRo0{SJEe-5&!>cxrG=mdLiwZn4h0tkeBaZ zXTN^^`uFeOe|Y!)!-o&&&!6AFfB%LJ8x|~BuzKPA|Ns7#x-xkKyruV1%sHz7ZzCM7sKSh-eh--RQa&hK1ucJ=HF%O;;& z(71m>$AyWdcbfMc+`Vw!lBw%v)-7nyom8CNS*TU6fAIXF^#?X=1X{Rn{hEX8E?l^< zY2Dfj=YX!b$S}x&4#+*AxL{yE+Q87%#Ms=-#MIW++}hp8(Az(WfqCjw7G_pfW;S+? zK29!f9$r3v0YM>Q5mB)&afwAsB$uyTEw!$TO?uDXeKN9r%yRNakI5@2C^8>9BCn*Z zBB!dVrgo-TU7hjpQ4LKkZEYR#ysImZEe>aVg^r Vos(-!G%qcgJt^mrj0gvVH2@9_)ye<> literal 0 HcmV?d00001 diff --git a/webapps/host-manager/images/docs.gif b/webapps/host-manager/images/docs.gif new file mode 100644 index 0000000000000000000000000000000000000000..d64a4a18c405e2c10ab791363f9f7acd16f3d433 GIT binary patch literal 261 zcmZ?wbhEHb6k!lyXklRZ|NsBLfBy^&3_g7L@ZiA%eSLjHL&F0H4xB%K{{H>@`}gm^ zaN)w=|Nrz24bGiAckjXd0|)l~`~Sb8p~273FFrp0;lqa;Hf-?s_kVc*!TptFK^W zYAveoFcA_K5zXln5UZ$U78jG4CN@JuQj&p5NQ}L2!9raIDJdi4wVO8!3NGHP$Y2cs DYrJfE literal 0 HcmV?d00001 diff --git a/webapps/host-manager/images/fix.gif b/webapps/host-manager/images/fix.gif new file mode 100644 index 0000000000000000000000000000000000000000..d59ad642ba46c0bc1af17ebd2485722e92d6c70e GIT binary patch literal 345 zcmZ?wbhEHb6k!lySjxcg|NsAg|NhCz$;r#h*Vot2pFe-Xgb57|4F?V!*sx)Pf`Wp- zzyHC52YafE7nQ{H_?deNa@Yt7|Ns5_|Np=BjScHJZqShyb`oKj>}~Xa{jy+g9z6-E ze;_me7)uCF^D_FsZh9ae>;K=s{^BeQRBRf^&21nd@qhh{Kt8trzduj* zHV)$93F2e56B6$9w|uc@qp`Ti|35%m2ml=hAOQJ=fvwJ=K|nx4s{h22qR1Gdx!wm8 zv|72?TbvF$Sny2pWe}U_A+XHvXu`zQIrE#HnF2E`LX!mA98j7>H; OF){5sba63^6 literal 0 HcmV?d00001 diff --git a/webapps/host-manager/images/tomcat.gif b/webapps/host-manager/images/tomcat.gif new file mode 100644 index 0000000000000000000000000000000000000000..61756736b82350f64b5ea1b2bfc31ac57e30a3d3 GIT binary patch literal 1934 zcmV;92XXjENk%w1VS)f$0J8u9BOx8|@bIUTSMktri*Y8?)6=uFvqwTSxRM}|k&$m} zUC*>)|J-%bq#OVM0RR90A^8LV00000EC2ui0D=Hq000F4@X1N5y*TSF&na9eTE=0F zXsU9B<0{}PKjk~$IH$NSkmRDkjt2l5j{qL;bHo&qN=K|oO|=|D;;AZ0L=VX=cf2t; z0E?(g+|2R_2gi?0$9MsZxS9=g^A~*Hx%V1l1;r`f=TCCFQpUwJbcGuVNO5* z033iC=VVk|sm262%8iJ$T~RLNjfFUO=X z7y$9r1j~ITJ@%Cg5w5Vx0X#i0o;47Cm(hv??7-rS8NpHsixUZO4rn7Zf}q%;eh6AKO_#>7hkdO&B82UI#l<&{-#gQYYpCK(D2o$#mDQG+p=;6Rk`%z+Wd{&|Km*h)!J$o=XsD)mXQd*prmbNIPQep&1l&XMOM*vVNQRtzWwyMXc-cW=`PGZgHhL{^%fvbpv zs@m$Wm?j$PM+*33?6Jr0u;&1A=z@d)u3Vtn9vZ;@>QJW?5k>?}*}AC$v`t8>jR4iQ zn&_TCzJTJo*64v@no8Z1-Y3bfG^4BrekJFK@A|Re9UO$tPF7CU@s95 z4|IUOnF>3Umq}QB<{HNo4Q6mF6mX6QN+ydi$$zOg3^EqYv z*&t8Uy^Fh(2Ma*?*khk4Zm50kS0s(FarYV5H-JF-2tbs6?ui~CFimD z6ZMOn3lg}$vSE%dq!L9Z1aZLQsjgWKsgpW*?>l~bngdWhBzxH_MKe@1n0Fns9GM?d)eK20xbe0qYxKa%sv&t`E z37~t>5_{TPl|!J{giag}il^V0?{DX`8mDd3&BLt*qjsYWP3v54q^;#}DBg@0xc zngkPxE;R)b5x|B22!KhIs_=+A8R8|P@o)&_0+@pB?BNK4Qqn^>y0>N-6Hzw=LOp{O zQxy0z7xPTo&D_Z|0vPIHTeF!9%D2p=;EM;p%PGRxsZEyZE~rbHC{42?qKgV7K!5Cy zMzbiwips!xt`gr2ZkCN9hK#9aaA+Ifw}M9C52`oFr#2MIwXI^osleLLw}SR7I4N}m zmZ2sY5|#aJ7~;z(db3T(!02a#JaTCR9!*g_*D z=>o_O7fh%-H16tnZ~}>8i5vTTE_4H@y7gTl9iP>%3W~c!b+PNb)(Ee7$BRmzy7#?4 Ub;x?xOW1VGcfR$_MFaocxrG=mdLiwZn4h0tkeBaZ zXTN^^`uFeOe|Y!)!-o&&&!6AFfB%LJ8x|~BprD}e|KI zixKbaBa2L3t=6qucmCpq-3N9pT)$}Y+DUZ_>hmV#r_`iKsYvtb2q@R8MedK$FEQlQ z=a5vD+;`!~rt>?OoLxQp!m`Qd7Budkz+leWabaTVo#u#BStWN`r`%g8s3p4R;O>R% zmP}nYvu;6q?xf=E&O#{_89^-(t#bYP8*L_qrri462hSf`e_+E#pd0tCUvqFBkFL=A zvs*7*xUgy6+SLo^E6dAWI0y8^MUY>q3UnBN02CJt>^B-1nwl7!o0*u}x|& + + + + + diff --git a/webapps/manager/WEB-INF/web.xml b/webapps/manager/WEB-INF/web.xml new file mode 100644 index 000000000..95af36e23 --- /dev/null +++ b/webapps/manager/WEB-INF/web.xml @@ -0,0 +1,186 @@ + + + + + + Tomcat Manager Application + + A scriptable management web application for the Tomcat Web Server; + Manager lets you view, load/unload/etc particular web applications. + + + + + Manager + org.apache.catalina.manager.ManagerServlet + + debug + 2 + + + + HTMLManager + org.apache.catalina.manager.HTMLManagerServlet + + debug + 2 + + + + Status + org.apache.catalina.manager.StatusManagerServlet + + debug + 0 + + + + + JMXProxy + org.apache.catalina.manager.JMXProxyServlet + + + + + Manager + /list + + + Manager + /sessions + + + Manager + /start + + + Manager + /stop + + + Manager + /install + + + Manager + /remove + + + Manager + /deploy + + + Manager + /undeploy + + + Manager + /reload + + + Manager + /save + + + Manager + /serverinfo + + + Manager + /roles + + + Manager + /resources + + + Status + /status/* + + + JMXProxy + /jmxproxy/* + + + HTMLManager + /html/* + + + + + + Link to the UserDatabase instance from which we request lists of + defined role names. Typically, this will be connected to the global + user database with a ResourceLink element in server.xml or the context + configuration file for the Manager web application. + + users + + org.apache.catalina.UserDatabase + + + + + + + HTMLManger and Manager command + /jmxproxy/* + /html/* + /list + /sessions + /start + /stop + /install + /remove + /deploy + /undeploy + /reload + /save + /serverinfo + /status/* + /roles + /resources + + + + manager + + + + + + BASIC + Tomcat Manager Application + + + + + + The role that is required to log in to the Manager Application + + manager + + + diff --git a/webapps/manager/images/add.gif b/webapps/manager/images/add.gif new file mode 100644 index 0000000000000000000000000000000000000000..0774d074e5e48291bdacfacb086506e6be117e51 GIT binary patch literal 1037 zcmZ?wbhEHb6k!lyc+SA^9|->a|M&0T|Nno1n4h0tnTz4o;>0&glV!LWO;{KX^ykTP zGrU;!o~1phVTD*cK_!)em>kR#mn&Z^0eO_xlSoe_rhTdU2{GAH%zidEYmsygkrvrz1CG(e()%elNK2f9s9cY)lOA zFHHY+vFYoj2~vCv9}m?1K3M+d$V54A1}%N3>6>p)KJ;Ph^-o+33=fX46z69#)mMIU zX`LuPvyQH3L))$XdH+|R`pLj3#K*_?|NDPF1}|^fSwWhMt)w~)6|3?yj#iYvY3u#U zz+k?5_Z0?4&i}vuGc&jbXzljryOSdOKilYUx!k$z`*f|fsunnK;giFW)5K{fr5eq4b7~gYAGEP z7#KS_xkU;zCM1>#7e(d>$#qP^BWE~tBtO4mJmGb}q literal 0 HcmV?d00001 diff --git a/webapps/manager/images/asf-logo.gif b/webapps/manager/images/asf-logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..22eb9d7358ef57c3488331845e680b72c9b7c8e2 GIT binary patch literal 7279 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 F{{tbU1q=WH literal 0 HcmV?d00001 diff --git a/webapps/manager/images/code.gif b/webapps/manager/images/code.gif new file mode 100644 index 0000000000000000000000000000000000000000..d27307b5c09467c2e45bbfcd1ff74989eb2e7d65 GIT binary patch literal 394 zcmZ?wbhEHb6k!lySjxcg|NsAg|Na>m7<~Bf;lYCk`uh5YhK2_Y90&`0TwMGlHulx| z^XKp1zrTO~{%OFIr0wCGk>*L_#l_fx07^78uf_y0eALxXeY&ZVS$tf_gsW5<=_ z#~&LR{Wx~~@qq*T{{8>o&~U}u`>TV)%Z7#qKR>_t`1lhio=8gm&d$CqCiY|X>Z2Pr zZ1DH@->~lav}tGl|Nm=XU^H>*6ylK%0}z1x!oarPp`pM-N2)dikZ=q-8iKhfFV&ot-Z?#bsK$q(mDRr`$3(c`=?^VUbBf3LBO?F*3FB z2rH&5?cP|btfH!>&Z(iPC8xdDk6A}sSMT=aD<1m#3{1+}>>KXh^JOqF2nv4n;e)*V JgAa}j)&TJ-upR&a literal 0 HcmV?d00001 diff --git a/webapps/manager/images/design.gif b/webapps/manager/images/design.gif new file mode 100644 index 0000000000000000000000000000000000000000..f5db0a9fc783924486176ce157924fba53df73fc GIT binary patch literal 608 zcmZ?wbhEHb6k!lyIL5&6|NsAgK=A*+y}iAiot?eCt%HMuEs*J8ujLw+y7Ptq{{K!J zf7q}4X0-UF?)+zRlW&T4U*v2)!e6yXwRo0{SJEe-5&!>cxrG=mdLiwZn4h0tkeBaZ zXTN^^`uFeOe|Y!)!-o&&&!6AFfB%LJ8x|~BuzKPA|Ns7#x-xkKyruV1%sHz7ZzCM7sKSh-eh--RQa&hK1ucJ=HF%O;;& z(71m>$AyWdcbfMc+`Vw!lBw%v)-7nyom8CNS*TU6fAIXF^#?X=1X{Rn{hEX8E?l^< zY2Dfj=YX!b$S}x&4#+*AxL{yE+Q87%#Ms=-#MIW++}hp8(Az(WfqCjw7G_pfW;S+? zK29!f9$r3v0YM>Q5mB)&afwAsB$uyTEw!$TO?uDXeKN9r%yRNakI5@2C^8>9BCn*Z zBB!dVrgo-TU7hjpQ4LKkZEYR#ysImZEe>aVg^r Vos(-!G%qcgJt^mrj0gvVH2@9_)ye<> literal 0 HcmV?d00001 diff --git a/webapps/manager/images/docs.gif b/webapps/manager/images/docs.gif new file mode 100644 index 0000000000000000000000000000000000000000..d64a4a18c405e2c10ab791363f9f7acd16f3d433 GIT binary patch literal 261 zcmZ?wbhEHb6k!lyXklRZ|NsBLfBy^&3_g7L@ZiA%eSLjHL&F0H4xB%K{{H>@`}gm^ zaN)w=|Nrz24bGiAckjXd0|)l~`~Sb8p~273FFrp0;lqa;Hf-?s_kVc*!TptFK^W zYAveoFcA_K5zXln5UZ$U78jG4CN@JuQj&p5NQ}L2!9raIDJdi4wVO8!3NGHP$Y2cs DYrJfE literal 0 HcmV?d00001 diff --git a/webapps/manager/images/fix.gif b/webapps/manager/images/fix.gif new file mode 100644 index 0000000000000000000000000000000000000000..d59ad642ba46c0bc1af17ebd2485722e92d6c70e GIT binary patch literal 345 zcmZ?wbhEHb6k!lySjxcg|NsAg|NhCz$;r#h*Vot2pFe-Xgb57|4F?V!*sx)Pf`Wp- zzyHC52YafE7nQ{H_?deNa@Yt7|Ns5_|Np=BjScHJZqShyb`oKj>}~Xa{jy+g9z6-E ze;_me7)uCF^D_FsZh9ae>;K=s{^BeQRBRf^&21nd@qhh{Kt8trzduj* zHV)$93F2e56B6$9w|uc@qp`Ti|35%m2ml=hAOQJ=fvwJ=K|nx4s{h22qR1Gdx!wm8 zv|72?TbvF$Sny2pWe}U_A+XHvXu`zQIrE#HnF2E`LX!mA98j7>H; OF){5sba63^6 literal 0 HcmV?d00001 diff --git a/webapps/manager/images/tomcat.gif b/webapps/manager/images/tomcat.gif new file mode 100644 index 0000000000000000000000000000000000000000..61756736b82350f64b5ea1b2bfc31ac57e30a3d3 GIT binary patch literal 1934 zcmV;92XXjENk%w1VS)f$0J8u9BOx8|@bIUTSMktri*Y8?)6=uFvqwTSxRM}|k&$m} zUC*>)|J-%bq#OVM0RR90A^8LV00000EC2ui0D=Hq000F4@X1N5y*TSF&na9eTE=0F zXsU9B<0{}PKjk~$IH$NSkmRDkjt2l5j{qL;bHo&qN=K|oO|=|D;;AZ0L=VX=cf2t; z0E?(g+|2R_2gi?0$9MsZxS9=g^A~*Hx%V1l1;r`f=TCCFQpUwJbcGuVNO5* z033iC=VVk|sm262%8iJ$T~RLNjfFUO=X z7y$9r1j~ITJ@%Cg5w5Vx0X#i0o;47Cm(hv??7-rS8NpHsixUZO4rn7Zf}q%;eh6AKO_#>7hkdO&B82UI#l<&{-#gQYYpCK(D2o$#mDQG+p=;6Rk`%z+Wd{&|Km*h)!J$o=XsD)mXQd*prmbNIPQep&1l&XMOM*vVNQRtzWwyMXc-cW=`PGZgHhL{^%fvbpv zs@m$Wm?j$PM+*33?6Jr0u;&1A=z@d)u3Vtn9vZ;@>QJW?5k>?}*}AC$v`t8>jR4iQ zn&_TCzJTJo*64v@no8Z1-Y3bfG^4BrekJFK@A|Re9UO$tPF7CU@s95 z4|IUOnF>3Umq}QB<{HNo4Q6mF6mX6QN+ydi$$zOg3^EqYv z*&t8Uy^Fh(2Ma*?*khk4Zm50kS0s(FarYV5H-JF-2tbs6?ui~CFimD z6ZMOn3lg}$vSE%dq!L9Z1aZLQsjgWKsgpW*?>l~bngdWhBzxH_MKe@1n0Fns9GM?d)eK20xbe0qYxKa%sv&t`E z37~t>5_{TPl|!J{giag}il^V0?{DX`8mDd3&BLt*qjsYWP3v54q^;#}DBg@0xc zngkPxE;R)b5x|B22!KhIs_=+A8R8|P@o)&_0+@pB?BNK4Qqn^>y0>N-6Hzw=LOp{O zQxy0z7xPTo&D_Z|0vPIHTeF!9%D2p=;EM;p%PGRxsZEyZE~rbHC{42?qKgV7K!5Cy zMzbiwips!xt`gr2ZkCN9hK#9aaA+Ifw}M9C52`oFr#2MIwXI^osleLLw}SR7I4N}m zmZ2sY5|#aJ7~;z(db3T(!02a#JaTCR9!*g_*D z=>o_O7fh%-H16tnZ~}>8i5vTTE_4H@y7gTl9iP>%3W~c!b+PNb)(Ee7$BRmzy7#?4 Ub;x?xOW1VGcfR$_MFaocxrG=mdLiwZn4h0tkeBaZ zXTN^^`uFeOe|Y!)!-o&&&!6AFfB%LJ8x|~BprD}e|KI zixKbaBa2L3t=6qucmCpq-3N9pT)$}Y+DUZ_>hmV#r_`iKsYvtb2q@R8MedK$FEQlQ z=a5vD+;`!~rt>?OoLxQp!m`Qd7Budkz+leWabaTVo#u#BStWN`r`%g8s3p4R;O>R% zmP}nYvu;6q?xf=E&O#{_89^-(t#bYP8*L_qrri462hSf`e_+E#pd0tCUvqFBkFL=A zvs*7*xUgy6+SLo^E6dAWI0y8^MUY>q3UnBN02CJt>^B-1nwl7!o0*u}x|& + + + + + + + + diff --git a/webapps/manager/status.xsd b/webapps/manager/status.xsd new file mode 100644 index 000000000..0f266dee6 --- /dev/null +++ b/webapps/manager/status.xsd @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapps/manager/xform.xsl b/webapps/manager/xform.xsl new file mode 100644 index 000000000..c5ced3ba1 --- /dev/null +++ b/webapps/manager/xform.xsl @@ -0,0 +1,96 @@ + + + + + + + + + + + Tomcat Status + + + +
    Tomcat Status
    + + + + + +
    + + + + + + + + + + + + +
    JVM:free: total: max:

    +
    + + + Connector --
    + + + + +
    + + + + + + + + + + +
    threadInfo maxThreads: minSpareThreads: maxSpareThreads: currentThreadCount: currentThreadsBusy:

    +
    + + + + + + + + + + + +
    requestInfo maxTime: processingTime: requestCount: errorCount: bytesReceived: bytesSent:

    +
    + + + + + + +
    StageTimeB SentB RecvClientVHostRequest

    +
    + + + + + + + + + + ? + + + +
    -- 2.11.0
    +

    + +Using the JK native connector
    + +Using Apache HTTP Server 2.x and mod_proxy
    +Using the balancer webapp
    +

    +