You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by xu...@apache.org on 2010/05/03 10:33:53 UTC

svn commit: r940394 - in /geronimo/external/trunk/tomcat-parent-7.0.0: catalina/src/main/java/org/apache/catalina/ catalina/src/main/java/org/apache/catalina/connector/ catalina/src/main/java/org/apache/catalina/core/ catalina/src/main/java/org/apache/...

Author: xuhaihong
Date: Mon May  3 08:33:53 2010
New Revision: 940394

URL: http://svn.apache.org/viewvc?rev=940394&view=rev
Log:
Merge changes from Tomcat trunk to rev 940382

Added:
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/LifecycleMBeanRegistration.java   (with props)
Modified:
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/Globals.java
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/connector/Connector.java
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardEngine.java
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardServer.java
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardService.java
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardThreadExecutor.java
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/startup/Embedded.java
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/startup/Tomcat.java
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/util/LifecycleBase.java
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/resources/org/apache/catalina/core/LocalStrings.properties
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/resources/org/apache/catalina/util/LocalStrings.properties
    geronimo/external/trunk/tomcat-parent-7.0.0/util/src/main/java/org/apache/tomcat/util/buf/StringCache.java

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/Globals.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/Globals.java?rev=940394&r1=940393&r2=940394&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/Globals.java (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/Globals.java Mon May  3 08:33:53 2010
@@ -334,4 +334,9 @@ public final class Globals {
     public static final String ASYNC_SUPPORTED_ATTR = 
         "org.apache.catalina.ASYNC_SUPPORTED";
 
+    
+    /**
+     * Default domain for MBeans if none can be determined
+     */
+    public static final String DEFAULT_MBEAN_DOMAIN = "Catalina";
 }

Added: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/LifecycleMBeanRegistration.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/LifecycleMBeanRegistration.java?rev=940394&view=auto
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/LifecycleMBeanRegistration.java (added)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/LifecycleMBeanRegistration.java Mon May  3 08:33:53 2010
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.catalina;
+
+import javax.management.MBeanRegistration;
+import javax.management.ObjectName;
+
+/**
+ * This interface extends the {@link MBeanRegistration} interface and adds
+ * methods for obtaining the domain and object name used to register this
+ * component. This interface is intended to be implemented by components that
+ * already implement {@link Lifecycle} to indicate that they require
+ * registration during {@link Lifecycle#init()} and de-registration during
+ * {@link Lifecycle#destroy()}. 
+ */
+public interface LifecycleMBeanRegistration extends MBeanRegistration {
+
+    /**
+     * Obtain the {@link ObjectName} under which this component will be / has
+     * been registered.
+     */
+    public ObjectName getObjectName();
+
+
+    /**
+     * Obtain the domain under which this component will be / has been
+     * registered.
+     */
+    public String getDomain();
+
+    /**
+     * Specify the domain under which this component should be registered.
+     */
+    public void setDomain(String domain);
+}

Propchange: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/LifecycleMBeanRegistration.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/LifecycleMBeanRegistration.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/LifecycleMBeanRegistration.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/connector/Connector.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/connector/Connector.java?rev=940394&r1=940393&r2=940394&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/connector/Connector.java (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/connector/Connector.java Mon May  3 08:33:53 2010
@@ -25,7 +25,6 @@ import javax.management.MBeanServer;
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 
-import org.apache.catalina.Container;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.LifecycleState;
 import org.apache.catalina.Service;
@@ -99,12 +98,6 @@ public class Connector extends Lifecycle
 
 
     /**
-     * The Container used for processing requests received by this Connector.
-     */
-    protected Container container = null;
-
-
-    /**
      * The "enable DNS lookups" flag for this Connector.
      */
     protected boolean enableLookups = false;
@@ -330,7 +323,6 @@ public class Connector extends Lifecycle
     public void setService(Service service) {
 
         this.service = service;
-        // FIXME: setProperty("service", service);
 
     }
 
@@ -357,34 +349,7 @@ public class Connector extends Lifecycle
 
     }
 
-
-    /**
-     * Return the Container used for processing requests received by this
-     * Connector.
-     */
-    public Container getContainer() {
-        if( container==null ) {
-            // Lazy - maybe it was added later
-            findContainer();
-        }
-        return (container);
-
-    }
-
-
-    /**
-     * Set the Container used for processing requests received by this
-     * Connector.
-     *
-     * @param container The new Container to use
-     */
-    public void setContainer(Container container) {
-
-        this.container = container;
-
-    }
-
-
+    
     /**
      * Return the "enable DNS lookups" flag.
      */
@@ -855,8 +820,7 @@ public class Connector extends Lifecycle
     /**
      * Pause the connector.
      */
-    public void pause()
-        throws LifecycleException {
+    public void pause() {
         try {
             protocolHandler.pause();
         } catch (Exception e) {
@@ -869,8 +833,7 @@ public class Connector extends Lifecycle
     /**
      * Pause the connector.
      */
-    public void resume()
-        throws LifecycleException {
+    public void resume() {
         try {
             protocolHandler.resume();
         } catch (Exception e) {
@@ -990,15 +953,6 @@ public class Connector extends Lifecycle
     protected String domain;
     protected ObjectName oname;
     protected MBeanServer mserver;
-    ObjectName controller;
-
-    public ObjectName getController() {
-        return controller;
-    }
-
-    public void setController(ObjectName controller) {
-        this.controller = controller;
-    }
 
     public ObjectName getObjectName() {
         return oname;
@@ -1017,9 +971,11 @@ public class Connector extends Lifecycle
     }
 
     public void postRegister(Boolean registrationDone) {
+        // NOOP
     }
 
     public void preDeregister() throws Exception {
+        // NOOP
     }
 
     public void postDeregister() {
@@ -1032,56 +988,18 @@ public class Connector extends Lifecycle
         }
     }
 
-    protected void findContainer() {
-        try {
-            // Register to the service
-            ObjectName parentName=new ObjectName( domain + ":" +
-                    "type=Service");
-
-            if(log.isDebugEnabled())
-                log.debug("Adding to " + parentName );
-            if( mserver.isRegistered(parentName )) {
-                mserver.invoke(parentName, "addConnector", new Object[] { this },
-                        new String[] {"org.apache.catalina.connector.Connector"});
-                // As a side effect we'll get the container field set
-                // Also initialize will be called
-                //return;
-            }
-            // XXX Go directly to the Engine
-            // initialize(); - is called by addConnector
-            ObjectName engName=new ObjectName( domain + ":" + "type=Engine");
-            if( mserver.isRegistered(engName )) {
-                Object obj=mserver.getAttribute(engName, "managedResource");
-                if(log.isDebugEnabled())
-                      log.debug("Found engine " + obj + " " + obj.getClass());
-                container=(Container)obj;
-
-                if(log.isDebugEnabled())
-                    log.debug("Initialized");
-                // As a side effect we'll get the container field set
-                // Also initialize will be called
-                return;
-            }
-        } catch( Exception ex ) {
-            log.error( "Error finding container " + ex);
-        }
-    }
 
     @Override
     protected void initInternal() throws LifecycleException {
 
-        if( container==null ) {
-            findContainer();
-        }
-        
         if (oname == null) {
             try {
                 // we are loaded directly, via API - and no name was given to us
                 // Engine name is used as domain name for MBeans
-                oname = createObjectName(container.getName(), "Connector");
+                oname = createObjectName(
+                        getService().getContainer().getName(), "Connector");
                 Registry.getRegistry(null, null)
                     .registerComponent(this, oname, null);
-                controller=oname;
             } catch (Exception e) {
                 log.error( "Error registering connector ", e);
             }
@@ -1108,7 +1026,7 @@ public class Connector extends Lifecycle
 
     @Override
     protected void destroyInternal() {
-        if( oname!=null && controller==oname ) {
+        if (oname!=null) {
             if(log.isDebugEnabled())
                  log.debug("Unregister itself " + oname );
             Registry.getRegistry(null, null).unregisterComponent(oname);

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=940394&r1=940393&r2=940394&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java Mon May  3 08:33:53 2010
@@ -209,7 +209,7 @@ public class CoyoteAdapter implements Ad
                 req.getRequestProcessor().setWorkerThreadName(Thread.currentThread().getName());
                 
                 // Calling the container
-                connector.getContainer().getPipeline().getFirst().event(request, response, request.getEvent());
+                connector.getService().getContainer().getPipeline().getFirst().event(request, response, request.getEvent());
 
                 if (!error && !response.isClosed() && (request.getAttribute(Globals.EXCEPTION_ATTR) != null)) {
                     // An unexpected exception occurred while processing the event, so
@@ -217,7 +217,7 @@ public class CoyoteAdapter implements Ad
                     request.getEvent().setEventType(CometEvent.EventType.ERROR);
                     request.getEvent().setEventSubType(null);
                     error = true;
-                    connector.getContainer().getPipeline().getFirst().event(request, response, request.getEvent());
+                    connector.getService().getContainer().getPipeline().getFirst().event(request, response, request.getEvent());
                 }
                 if (response.isClosed() || !request.isComet()) {
                     if (status==SocketStatus.OPEN) {
@@ -225,7 +225,7 @@ public class CoyoteAdapter implements Ad
                         request.getEvent().setEventType(CometEvent.EventType.END);
                         request.getEvent().setEventSubType(null);
                         error = true;
-                        connector.getContainer().getPipeline().getFirst().event(request, response, request.getEvent());
+                        connector.getService().getContainer().getPipeline().getFirst().event(request, response, request.getEvent());
                     }
                     res.action(ActionCode.ACTION_COMET_END, null);
                 } else if (!error && read && request.getAvailable()) {
@@ -234,7 +234,7 @@ public class CoyoteAdapter implements Ad
                     request.getEvent().setEventType(CometEvent.EventType.ERROR);
                     request.getEvent().setEventSubType(CometEvent.EventSubType.IOEXCEPTION);
                     error = true;
-                    connector.getContainer().getPipeline().getFirst().event(request, response, request.getEvent());
+                    connector.getService().getContainer().getPipeline().getFirst().event(request, response, request.getEvent());
                 }
                 return (!error);
             } catch (Throwable t) {
@@ -289,7 +289,7 @@ public class CoyoteAdapter implements Ad
                     // Calling the container
                     try {
                         impl.complete();
-                        connector.getContainer().getPipeline().getFirst().invoke(request, response);
+                        connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);
                     } finally {
                         success = false;
                     }
@@ -305,10 +305,10 @@ public class CoyoteAdapter implements Ad
                 } else if (impl.getState()==AsyncContextImpl.AsyncState.ERROR_DISPATCHING) {
                     async = false;
                     success = false;
-                    connector.getContainer().getPipeline().getFirst().invoke(request, response);
+                    connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);
                 } else {
                     try {
-                        connector.getContainer().getPipeline().getFirst().invoke(request, response);
+                        connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);
                     } catch (RuntimeException x) {
                         impl.setErrorState(x);
                     }
@@ -406,9 +406,9 @@ public class CoyoteAdapter implements Ad
             req.getRequestProcessor().setWorkerThreadName(Thread.currentThread().getName());
             if (postParseRequest(req, request, res, response)) {
                 //check valves if we support async
-                request.setAsyncSupported(connector.getContainer().getPipeline().isAsyncSupported());
+                request.setAsyncSupported(connector.getService().getContainer().getPipeline().isAsyncSupported());
                 // Calling the container
-                connector.getContainer().getPipeline().getFirst().invoke(request, response);
+                connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);
 
                 if (request.isComet()) {
                     if (!response.isClosed() && !response.isError()) {

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardEngine.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardEngine.java?rev=940394&r1=940393&r2=940394&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardEngine.java (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardEngine.java Mon May  3 08:33:53 2010
@@ -367,10 +367,6 @@ public class StandardEngine
     @Override
     protected void destroyInternal() throws LifecycleException {
         
-        // if we created it, make sure it's also destroyed
-        // this call implizit this.stop()
-        ((StandardService)service).destroy();
-
         if( mbeans != null ) {
             try {
                 Registry.getRegistry(null, null)

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardServer.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardServer.java?rev=940394&r1=940393&r2=940394&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardServer.java (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardServer.java Mon May  3 08:33:53 2010
@@ -29,16 +29,20 @@ import java.net.Socket;
 import java.security.AccessControlException;
 import java.util.Random;
 
-import javax.management.MBeanRegistration;
 import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 
+import org.apache.catalina.Container;
 import org.apache.catalina.Context;
+import org.apache.catalina.Globals;
 import org.apache.catalina.LifecycleException;
+import org.apache.catalina.LifecycleMBeanRegistration;
 import org.apache.catalina.LifecycleState;
 import org.apache.catalina.Server;
 import org.apache.catalina.Service;
 import org.apache.catalina.deploy.NamingResources;
+import org.apache.catalina.mbeans.MBeanFactory;
 import org.apache.catalina.util.LifecycleBase;
 import org.apache.tomcat.util.res.StringManager;
 import org.apache.catalina.util.ServerInfo;
@@ -48,7 +52,6 @@ import org.apache.tomcat.util.buf.String
 import org.apache.tomcat.util.modeler.Registry;
 
 
-
 /**
  * Standard implementation of the <b>Server</b> interface, available for use
  * (but not required) when deploying and starting Catalina.
@@ -57,7 +60,7 @@ import org.apache.tomcat.util.modeler.Re
  * @version $Id$
  */
 public final class StandardServer extends LifecycleBase
-        implements Server, MBeanRegistration {
+        implements Server, LifecycleMBeanRegistration {
 
     private static final Log log = LogFactory.getLog(StandardServer.class);
    
@@ -682,65 +685,130 @@ public final class StandardServer extend
     @Override
     protected void initInternal() throws LifecycleException {
 
-        if( oname==null ) {
-            try {
-                oname=new ObjectName( "Catalina:type=Server");
-                Registry.getRegistry(null, null)
-                    .registerComponent(this, oname, null );
-            } catch (Exception e) {
-                log.error("Error registering ",e);
-            }
-        }
-        
         // Register global String cache
+        // Note although the cache is global, if there are multiple Servers
+        // present in the JVM (may happen when embedding) then the same cache
+        // will be registered under multiple names
         try {
-            ObjectName oname2 = 
+            onameStringCache = 
                 new ObjectName(oname.getDomain() + ":type=StringCache");
             Registry.getRegistry(null, null)
-                .registerComponent(new StringCache(), oname2, null );
+                .registerComponent(new StringCache(), onameStringCache, null);
         } catch (Exception e) {
             log.error("Error registering ",e);
         }
 
+        // Register the MBeanFactory
+        try {
+            onameMBeanFactory = 
+                new ObjectName(oname.getDomain() + ":type=MBeanFactory");
+            Registry.getRegistry(null, null)
+                .registerComponent(new MBeanFactory(), onameMBeanFactory, null);
+        } catch (Exception e) {
+            log.error("Error registering ",e);
+        }
+        
         // Initialize our defined Services
         for (int i = 0; i < services.length; i++) {
             services[i].init();
         }
     }
     
-    protected void destroyInternal() {
-        // NOOP
+    @Override
+    protected void destroyInternal() throws LifecycleException {
+        Registry registry = Registry.getRegistry(null, null);
+        
+        if (onameStringCache != null) {
+            registry.unregisterComponent(onameStringCache);
+        }
+        if (onameMBeanFactory != null) {
+            registry.unregisterComponent(onameMBeanFactory);
+        }
+        
+        // Destroy our defined Services
+        for (int i = 0; i < services.length; i++) {
+            services[i].destroy();
+        }
     }
 
-    protected String type;
-    protected String domain;
-    protected String suffix;
-    protected ObjectName oname;
+    protected volatile String domain;
+    protected volatile ObjectName oname;
     protected MBeanServer mserver;
+    private ObjectName onameStringCache;
+    private ObjectName onameMBeanFactory;
+    
+    /**
+     * Obtain the MBean domain for this server. The domain is obtained using
+     * the following search order:
+     * <ol>
+     * <li>Name of first {@link Engine}.</li>
+     * <li>Name of first {@link Service}.</li>
+     * <li>Global default defined by {@link Globals#DEFAULT_MBEAN_DOMAIN}</li>
+     * </ol>
+     */
+    public String getDomain() {
+        if (domain == null) {
+            Service[] services = findServices();
+            if (services.length > 0) {
+                Service service = services[0];
+                if (service != null) {
+                    Container container = service.getContainer();
+                    if (container != null) {
+                        domain = container.getName();
+                    } else {
+                        domain = service.getName();
+                    }
+                }
+            }
+            if (domain == null) {
+                domain = Globals.DEFAULT_MBEAN_DOMAIN;
+            }
+        }
+        return domain;
+    }
 
+    
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+    
+    
     public ObjectName getObjectName() {
+        if (oname == null) {
+            StringBuilder name = new StringBuilder(getDomain());
+            name.append(":type=Server");
+            
+            try {
+                oname = new ObjectName(name.toString());
+            } catch (MalformedObjectNameException e) {
+                log.warn(sm.getString("standardServer.onameFail", name), e);
+            } catch (NullPointerException e) {
+                // Never going to happen
+            }
+        }
+        
         return oname;
     }
 
-    public String getDomain() {
-        return domain;
-    }
 
     public ObjectName preRegister(MBeanServer server,
                                   ObjectName name) throws Exception {
-        oname=name;
-        mserver=server;
-        domain=name.getDomain();
+        oname = name;
+        mserver = server;
+        domain = name.getDomain();
         return name;
     }
 
     public void postRegister(Boolean registrationDone) {
+        // NOOP
     }
 
     public void preDeregister() throws Exception {
+        // NOOP
     }
 
     public void postDeregister() {
+        // NOOP
     }
     
 }

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardService.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardService.java?rev=940394&r1=940393&r2=940394&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardService.java (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardService.java Mon May  3 08:33:53 2010
@@ -21,13 +21,15 @@ package org.apache.catalina.core;
 
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
-import javax.management.MBeanRegistration;
 import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import org.apache.catalina.Container;
 import org.apache.catalina.Engine;
+import org.apache.catalina.Globals;
 import org.apache.catalina.Lifecycle;
 import org.apache.catalina.LifecycleException;
+import org.apache.catalina.LifecycleMBeanRegistration;
 import org.apache.catalina.LifecycleState;
 import org.apache.catalina.Server;
 import org.apache.catalina.Service;
@@ -50,7 +52,7 @@ import org.apache.catalina.Executor;
  */
 
 public class StandardService extends LifecycleBase
-        implements Service, MBeanRegistration {
+        implements Service, LifecycleMBeanRegistration {
 
     private static final Log log = LogFactory.getLog(StandardService.class);
    
@@ -141,10 +143,6 @@ public class StandardService extends Lif
                 // Ignore
             }
         }
-        synchronized (connectors) {
-            for (int i = 0; i < connectors.length; i++)
-                connectors[i].setContainer(this.container);
-        }
         if (getState().isAvailable() && (oldContainer != null)) {
             try {
                 oldContainer.stop();
@@ -234,7 +232,6 @@ public class StandardService extends Lif
     public void addConnector(Connector connector) {
 
         synchronized (connectors) {
-            connector.setContainer(this.container);
             connector.setService(this);
             Connector results[] = new Connector[connectors.length + 1];
             System.arraycopy(connectors, 0, results, 0, connectors.length);
@@ -312,7 +309,6 @@ public class StandardService extends Lif
                     log.error("Connector.stop", e);
                 }
             }
-            connectors[j].setContainer(null);
             connector.setService(null);
             int k = 0;
             Connector results[] = new Connector[connectors.length - 1];
@@ -503,19 +499,6 @@ public class StandardService extends Lif
                 executors.get(i).stop();
             }
         }
-
-
-        Registry.getRegistry(null, null).unregisterComponent(oname);
-        Executor[] executors = findExecutors();
-        for (int i = 0; i < executors.length; i++) {
-            try {
-                ObjectName executorObjectName = 
-                    new ObjectName(domain + ":type=Executor,name=" + executors[i].getName());
-                Registry.getRegistry(null, null).unregisterComponent(executorObjectName);
-            } catch (Exception e) {
-                // Ignore (invalid ON, which cannot happen)
-            }
-        }
     }
 
 
@@ -526,84 +509,124 @@ public class StandardService extends Lif
     @Override
     protected void initInternal() throws LifecycleException {
 
-        if( oname==null ) {
-            try {
-                // Hack - Server should be deprecated...
-                Container engine=this.getContainer();
-                domain = engine.getName();
-                oname=new ObjectName(domain + ":type=Service");
-                Registry.getRegistry(null, null)
-                    .registerComponent(this, oname, null);
-                
-                Executor[] executors = findExecutors();
-                for (int i = 0; i < executors.length; i++) {
-                    ObjectName executorObjectName = 
-                        new ObjectName(domain + ":type=Executor,name=" + executors[i].getName());
-                    Registry.getRegistry(null, null)
-                        .registerComponent(executors[i], executorObjectName, null);
-                }
-                
-            } catch (Exception e) {
-                log.error(sm.getString("standardService.register.failed",domain),e);
-            }
-            
-            
+        if (container != null) {
+            container.init();
         }
-        if( server==null ) {
-            // If no server was defined - create one
-            server = new StandardServer();
-            server.addService(this);
+
+        // Initialize any Executors
+        for (Executor executor : findExecutors()) {
+            if (executor instanceof LifecycleMBeanRegistration) {
+                ((LifecycleMBeanRegistration) executor).setDomain(getDomain());
+            }
+            executor.init();
         }
-               
 
         // Initialize our defined Connectors
         synchronized (connectors) {
-                for (int i = 0; i < connectors.length; i++) {
-                    try {
-                        connectors[i].init();
-                    } catch (Exception e) {
-                        log.error(sm.getString(
-                                "standardService.connector.failed",
-                                connectors[i]), e);
-                    }
+            for (Connector connector : connectors) {
+                try {
+                    connector.init();
+                } catch (Exception e) {
+                    log.error(sm.getString(
+                            "standardService.connector.initFailed", connector),
+                            e);
                 }
+            }
         }
     }
     
     @Override
-    protected void destroyInternal() {
-        // FIXME unregister should be here probably -- stop doing that ?
-    }
+    protected void destroyInternal() throws LifecycleException {
+        Registry.getRegistry(null, null).unregisterComponent(oname);
+        
+        // Destroy our defined Connectors
+        synchronized (connectors) {
+            for (Connector connector : connectors) {
+                try {
+                    connector.destroy();
+                } catch (Exception e) {
+                    log.error(sm.getString(
+                            "standardService.connector.destroyfailed",
+                            connector), e);
+                }
+            }
+        }
 
-    protected String type;
-    protected String domain;
-    protected String suffix;
-    protected ObjectName oname;
-    protected MBeanServer mserver;
+        // Destroy any Executors
+        for (Executor executor : findExecutors()) {
+            executor.destroy();
+        }
+
+        if (container != null) {
+            container.destroy();
+        }
 
-    public ObjectName getObjectName() {
-        return oname;
     }
 
+    protected volatile String domain;
+    protected volatile ObjectName oname;
+
+    /**
+     * Obtain the MBean domain for this server. The domain is obtained using
+     * the following search order:
+     * <ol>
+     * <li>Name of the {@link Engine}.</li>
+     * <li>Name of the {@link Service}.</li>
+     * <li>Global default defined by {@link Globals#DEFAULT_MBEAN_DOMAIN}</li>
+     * </ol>
+     */
     public String getDomain() {
+        if (domain == null) {
+            Container container = getContainer();
+            if (container != null) {
+                domain = container.getName();
+            } else {
+                domain = getName();
+            }
+            if (domain == null) {
+                domain = Globals.DEFAULT_MBEAN_DOMAIN;
+            }
+        }
         return domain;
     }
 
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+    
+    public ObjectName getObjectName() {
+        if (oname == null) {
+            StringBuilder name = new StringBuilder(getDomain());
+            name.append(":type=Service");
+            
+            try {
+                oname = new ObjectName(name.toString());
+            } catch (MalformedObjectNameException e) {
+                log.warn(sm.getString("standardService.onameFail", name), e);
+            } catch (NullPointerException e) {
+                // Never going to happen
+            }
+        }
+        
+        return oname;
+    }
     public ObjectName preRegister(MBeanServer server,
                                   ObjectName name) throws Exception {
         oname=name;
-        mserver=server;
         domain=name.getDomain();
         return name;
     }
 
     public void postRegister(Boolean registrationDone) {
+        // NOOP
     }
 
     public void preDeregister() throws Exception {
+        // NOOP
     }
 
     public void postDeregister() {
+        // NOOP
     }
 
 }

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardThreadExecutor.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardThreadExecutor.java?rev=940394&r1=940393&r2=940394&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardThreadExecutor.java (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardThreadExecutor.java Mon May  3 08:33:53 2010
@@ -20,18 +20,35 @@ package org.apache.catalina.core;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.TimeUnit;
 
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
 import org.apache.catalina.Executor;
 import org.apache.catalina.LifecycleException;
+import org.apache.catalina.LifecycleMBeanRegistration;
 import org.apache.catalina.LifecycleState;
 import org.apache.catalina.util.LifecycleBase;
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.res.StringManager;
 import org.apache.tomcat.util.threads.ResizableExecutor;
 import org.apache.tomcat.util.threads.TaskQueue;
 import org.apache.tomcat.util.threads.TaskThreadFactory;
 import org.apache.tomcat.util.threads.ThreadPoolExecutor;
 
 public class StandardThreadExecutor extends LifecycleBase
-        implements Executor, ResizableExecutor {
+        implements Executor, ResizableExecutor, LifecycleMBeanRegistration {
+    
+    private static final Log log =
+        LogFactory.getLog(StandardThreadExecutor.class);
     
+    /**
+     * The string manager for this package.
+     */
+    private static final StringManager sm =
+        StringManager.getManager(Constants.Package);
+
     // ---------------------------------------------- Properties
     /**
      * Default thread priority
@@ -290,6 +307,58 @@ public class StandardThreadExecutor exte
         return false;
     }
     
+
+    protected volatile String domain;
+    protected volatile ObjectName oname;
+
+    /**
+     * Obtain the MBean domain for this server. The domain is set by the
+     * containing Service.
+     */
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+    
+    public ObjectName getObjectName() {
+        if (oname == null) {
+            StringBuilder name = new StringBuilder(getDomain());
+            name.append(":type=Executor,name=");
+            name.append(getName());
+            
+            try {
+                oname = new ObjectName(name.toString());
+            } catch (MalformedObjectNameException e) {
+                log.warn(sm.getString(
+                        "standardThreadExecutor.onameFail", name), e);
+            } catch (NullPointerException e) {
+                // Never going to happen
+            }
+        }
+        
+        return oname;
+    }
     
+    public ObjectName preRegister(MBeanServer server,
+                                  ObjectName name) throws Exception {
+        oname=name;
+        domain=name.getDomain();
+        return name;
+    }
+
+    public void postRegister(Boolean registrationDone) {
+        // NOOP
+    }
+
+    public void preDeregister() throws Exception {
+        // NOOP
+    }
+
+    public void postDeregister() {
+        // NOOP
+    }
     
 }

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/startup/Embedded.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/startup/Embedded.java?rev=940394&r1=940393&r2=940394&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/startup/Embedded.java (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/startup/Embedded.java Mon May  3 08:33:53 2010
@@ -655,7 +655,7 @@ public class Embedded  extends StandardS
         while (true) {
             int n = -1;
             for (int i = 0; i < connectors.length; i++) {
-                if (connectors[i].getContainer() == engine) {
+                if (connectors[i].getService().getContainer() == engine) {
                     n = i;
                     break;
                 }

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/startup/Tomcat.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/startup/Tomcat.java?rev=940394&r1=940393&r2=940394&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/startup/Tomcat.java (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/startup/Tomcat.java Mon May  3 08:33:53 2010
@@ -278,11 +278,22 @@ public class Tomcat {
         return sw;
     }
     
+
+    /**
+     * Initialise the server.
+     * 
+     * @throws LifecycleException
+     */
+    public void init() throws LifecycleException {
+        getServer();
+        getConnector();
+        server.init();
+    }
+    
     
     /**
-     * Initialize and start the server, assuming that the Server implementation
-     * implements {@link Lifecycle} (the standard implementation does). If it
-     * does not, the {@link Server} must be started directly.
+     * Start the server.
+     * 
      * @throws LifecycleException 
      */
     public void start() throws LifecycleException {
@@ -292,9 +303,8 @@ public class Tomcat {
     }
 
     /** 
-     * Stop the server, assuming that the Server implementation implements
-     * {@link Lifecycle} (the standard implementation does). If it does not, the
-     * {@link Server} must be stopped directly.
+     * Stop the server.
+     * 
      * @throws LifecycleException 
      */
     public void stop() throws LifecycleException {
@@ -303,6 +313,16 @@ public class Tomcat {
     }
 
 
+    /**
+     * Destroy the server. This object cannot be used once this method has been
+     * called.
+     */
+    public void destroy() throws LifecycleException {
+        getServer();
+        server.destroy();
+        // Could null out obejcts here
+    }
+    
     /** 
      * Add a user for the in-memory realm. All created apps use this 
      * by default, can be replaced using setRealm().

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/util/LifecycleBase.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/util/LifecycleBase.java?rev=940394&r1=940393&r2=940394&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/util/LifecycleBase.java (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/util/LifecycleBase.java Mon May  3 08:33:53 2010
@@ -17,12 +17,16 @@
 
 package org.apache.catalina.util;
 
+import javax.management.ObjectName;
+
 import org.apache.catalina.Lifecycle;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.LifecycleMBeanRegistration;
 import org.apache.catalina.LifecycleState;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.modeler.Registry;
 import org.apache.tomcat.util.res.StringManager;
 
 
@@ -95,7 +99,19 @@ public abstract class LifecycleBase impl
             invalidTransition(Lifecycle.INIT_EVENT);
         }
 
-        // TODO - Check for JMX support and register if required
+        // Register MBean if required
+        if (this instanceof LifecycleMBeanRegistration) {
+            ObjectName oname =
+                ((LifecycleMBeanRegistration) this).getObjectName();
+            
+            try {
+                Registry.getRegistry(null, null).registerComponent(
+                        this, oname, null);
+            } catch (Exception e) {
+                log.warn(sm.getString("lifecycleBase.initMBeanFail", toString(),
+                        oname), e);
+            }
+        }
         
         initInternal();
         
@@ -242,15 +258,34 @@ public abstract class LifecycleBase impl
 
 
     public synchronized final void destroy() throws LifecycleException {
+        if (LifecycleState.DESTROYED.equals(state)) {
+
+            if (log.isDebugEnabled()) {
+                Exception e = new LifecycleException();
+                log.debug(sm.getString("lifecycleBase.alreadyDestroyed",
+                        toString()), e);
+            } else if (log.isInfoEnabled()) {
+                log.info(sm.getString("lifecycleBase.alreadyDestroyed",
+                        toString()));
+            }
+            
+            return;
+        }
+        
         if (!state.equals(LifecycleState.STOPPED) &&
                 !state.equals(LifecycleState.FAILED)) {
             invalidTransition(Lifecycle.DESTROY_EVENT);
         }
 
-        // TODO - Check for JMX support and de-register if required
-        
         destroyInternal();
         
+        // De-register MBean if required
+        if (this instanceof LifecycleMBeanRegistration) {
+            ObjectName oname =
+                ((LifecycleMBeanRegistration) this).getObjectName();
+            Registry.getRegistry(null, null).unregisterComponent(oname);
+        }
+
         setState(LifecycleState.DESTROYED);
     }
     

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/resources/org/apache/catalina/core/LocalStrings.properties
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/resources/org/apache/catalina/core/LocalStrings.properties?rev=940394&r1=940393&r2=940394&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/resources/org/apache/catalina/core/LocalStrings.properties (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/resources/org/apache/catalina/core/LocalStrings.properties Mon May  3 08:33:53 2010
@@ -188,12 +188,16 @@ standardHost.warRequired=URL to web appl
 standardHost.warURL=Invalid URL for web application archive: {0}
 standardHost.validationEnabled=XML validation enabled
 standardHost.validationDisabled=XML validation disabled
+standardServer.onameFail=MBean name specified for Server [{0}] is not valid
 standardServer.shutdownViaPort=A valid shutdown command was received via the shutdown port. Stopping the Server instance.
-standardService.connector.failed=Failed to start connector [{0}]
+standardService.connector.initFailed=Failed to initialise connector [{0}]
+standardService.connector.destroyFailed=Failed to destroy connector [{0}]
 standardService.initialize.failed=Service initializing at {0} failed
+standardService.onameFail=MBean name specified for Service [{0}] is not valid
 standardService.register.failed=Error registering Service at domain {0}
 standardService.start.name=Starting service {0}
 standardService.stop.name=Stopping service {0}
+standardThreadExecutor.onameFail=MBean name specified for Thread Executor [{0}] is not valid
 standardWrapper.allocate=Error allocating a servlet instance
 standardWrapper.allocateException=Allocate exception for servlet {0}
 standardWrapper.containerServlet=Loading container servlet {0}

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/resources/org/apache/catalina/util/LocalStrings.properties
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/resources/org/apache/catalina/util/LocalStrings.properties?rev=940394&r1=940393&r2=940394&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/resources/org/apache/catalina/util/LocalStrings.properties (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/resources/org/apache/catalina/util/LocalStrings.properties Mon May  3 08:33:53 2010
@@ -22,8 +22,10 @@ extensionValidator.web-application-manif
 extensionValidator.extension-not-found-error=ExtensionValidator[{0}][{1}]: Required extension [{2}] not found.
 extensionValidator.extension-validation-error=ExtensionValidator[{0}]: Failure to find [{1}] required extension(s).
 extensionValidator.failload=Failure loading extension [{0}]
+lifecycleBase.initMBeanFail=Failed to register component [{0}] with MBean name [{1}]
 lifecycleBase.alreadyStarted=The start() method was called on component [{0}] after start() had already been called. The second call will be ignored.
 lifecycleBase.alreadyStopped=The stop() method was called on component [{0}] after stop() had already been called. The second call will be ignored.
+lifecycleBase.alreadyDestroyed=The destroy() method was called on component [{0}] after destroy() had already been called. The second call will be ignored.
 lifecycleBase.invalidTransition=An invalid Lifecycle transition was attempted ([{0}]) for component [{1}] in state [{2}]
 requestUtil.convertHexDigit.notHex=[{0}] is not a hexadecimal digit
 requestUtil.parseParameters.uee=Unable to parse the parameters since the encoding [{0}] is not supported.

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/util/src/main/java/org/apache/tomcat/util/buf/StringCache.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/util/src/main/java/org/apache/tomcat/util/buf/StringCache.java?rev=940394&r1=940393&r2=940394&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/util/src/main/java/org/apache/tomcat/util/buf/StringCache.java (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/util/src/main/java/org/apache/tomcat/util/buf/StringCache.java Mon May  3 08:33:53 2010
@@ -40,24 +40,24 @@ public class StringCache {
     /**
      * Enabled ?
      */
-    protected static boolean byteEnabled = 
-        ("true".equals(System.getProperty("tomcat.util.buf.StringCache.byte.enabled", "false")));
+    protected static boolean byteEnabled = ("true".equals(System.getProperty(
+            "tomcat.util.buf.StringCache.byte.enabled", "false")));
 
     
-    protected static boolean charEnabled = 
-        ("true".equals(System.getProperty("tomcat.util.buf.StringCache.char.enabled", "false")));
+    protected static boolean charEnabled = ("true".equals(System.getProperty(
+            "tomcat.util.buf.StringCache.char.enabled", "false")));
 
     
-    protected static int trainThreshold = 
-        Integer.parseInt(System.getProperty("tomcat.util.buf.StringCache.trainThreshold", "20000"));
+    protected static int trainThreshold = Integer.parseInt(System.getProperty(
+            "tomcat.util.buf.StringCache.trainThreshold", "20000"));
     
 
-    protected static int cacheSize = 
-        Integer.parseInt(System.getProperty("tomcat.util.buf.StringCache.cacheSize", "200"));
+    protected static int cacheSize = Integer.parseInt(System.getProperty(
+            "tomcat.util.buf.StringCache.cacheSize", "200"));
     
 
-    protected static int maxStringSize = 
-        Integer.parseInt(System.getProperty("tomcat.util.buf.StringCache.maxStringSize", "128"));
+    protected static int maxStringSize = Integer.parseInt(System.getProperty(
+            "tomcat.util.buf.StringCache.maxStringSize", "128"));
     
 
    /**
@@ -220,20 +220,20 @@ public class StringCache {
                 // If training, everything is synced
                 synchronized (bcStats) {
                     // If the cache has been generated on a previous invocation
-                    // while waiting for the lock, just return the toString value
-                    // we just calculated
+                    // while waiting for the lock, just return the toString
+                    // value we just calculated
                     if (bcCache != null) {
                         return value;
                     }
-                    // Two cases: either we just exceeded the train count, in which
-                    // case the cache must be created, or we just update the count for
-                    // the string
+                    // Two cases: either we just exceeded the train count, in
+                    // which case the cache must be created, or we just update
+                    // the count for the string
                     if (bcCount > trainThreshold) {
                         long t1 = System.currentTimeMillis();
                         // Sort the entries according to occurrence
                         TreeMap<Integer,ArrayList<ByteEntry>> tempMap =
                             new TreeMap<Integer,ArrayList<ByteEntry>>();
-                        for (Entry<ByteEntry, int[]> item : bcStats.entrySet()) {
+                        for (Entry<ByteEntry,int[]> item : bcStats.entrySet()) {
                             ByteEntry entry = item.getKey();
                             int[] countA = item.getValue();
                             Integer count = new Integer(countA[0]);
@@ -261,13 +261,16 @@ public class StringCache {
                             ArrayList<ByteEntry> list = tempMap.get(key);
                             for (int i = 0; i < list.size() && n < size; i++) {
                                 ByteEntry entry = list.get(i);
-                                tempChunk.setBytes(entry.name, 0, entry.name.length);
-                                int insertPos = findClosest(tempChunk, tempbcCache, n);
+                                tempChunk.setBytes(entry.name, 0,
+                                        entry.name.length);
+                                int insertPos = findClosest(tempChunk,
+                                        tempbcCache, n);
                                 if (insertPos == n) {
                                     tempbcCache[n + 1] = entry;
                                 } else {
-                                    System.arraycopy(tempbcCache, insertPos + 1, tempbcCache, 
-                                            insertPos + 2, n - insertPos - 1);
+                                    System.arraycopy(tempbcCache, insertPos + 1,
+                                            tempbcCache, insertPos + 2,
+                                            n - insertPos - 1);
                                     tempbcCache[insertPos + 1] = entry;
                                 }
                                 n++;
@@ -279,7 +282,8 @@ public class StringCache {
                         bcCache = tempbcCache;
                         if (log.isDebugEnabled()) {
                             long t2 = System.currentTimeMillis();
-                            log.debug("ByteCache generation time: " + (t2 - t1) + "ms");
+                            log.debug("ByteCache generation time: " +
+                                    (t2 - t1) + "ms");
                         }
                     } else {
                         bcCount++;
@@ -292,7 +296,8 @@ public class StringCache {
                             int start = bc.getStart();
                             // Create byte array and copy bytes
                             entry.name = new byte[bc.getLength()];
-                            System.arraycopy(bc.getBuffer(), start, entry.name, 0, end - start);
+                            System.arraycopy(bc.getBuffer(), start, entry.name,
+                                    0, end - start);
                             // Set encoding
                             entry.enc = bc.getEncoding();
                             // Initialize occurrence count to one 
@@ -332,20 +337,20 @@ public class StringCache {
                 // If training, everything is synced
                 synchronized (ccStats) {
                     // If the cache has been generated on a previous invocation
-                    // while waiting fot the lock, just return the toString value
-                    // we just calculated
+                    // while waiting for the lock, just return the toString
+                    // value we just calculated
                     if (ccCache != null) {
                         return value;
                     }
-                    // Two cases: either we just exceeded the train count, in which
-                    // case the cache must be created, or we just update the count for
-                    // the string
+                    // Two cases: either we just exceeded the train count, in
+                    // which case the cache must be created, or we just update
+                    // the count for the string
                     if (ccCount > trainThreshold) {
                         long t1 = System.currentTimeMillis();
                         // Sort the entries according to occurrence
                         TreeMap<Integer,ArrayList<CharEntry>> tempMap =
                             new TreeMap<Integer,ArrayList<CharEntry>>();
-                        for (Entry<CharEntry, int[]> item : ccStats.entrySet()) {
+                        for (Entry<CharEntry,int[]> item : ccStats.entrySet()) {
                             CharEntry entry = item.getKey();
                             int[] countA = item.getValue();
                             Integer count = new Integer(countA[0]);
@@ -373,13 +378,16 @@ public class StringCache {
                             ArrayList<CharEntry> list = tempMap.get(key);
                             for (int i = 0; i < list.size() && n < size; i++) {
                                 CharEntry entry = list.get(i);
-                                tempChunk.setChars(entry.name, 0, entry.name.length);
-                                int insertPos = findClosest(tempChunk, tempccCache, n);
+                                tempChunk.setChars(entry.name, 0,
+                                        entry.name.length);
+                                int insertPos = findClosest(tempChunk,
+                                        tempccCache, n);
                                 if (insertPos == n) {
                                     tempccCache[n + 1] = entry;
                                 } else {
-                                    System.arraycopy(tempccCache, insertPos + 1, tempccCache, 
-                                            insertPos + 2, n - insertPos - 1);
+                                    System.arraycopy(tempccCache, insertPos + 1,
+                                            tempccCache, insertPos + 2,
+                                            n - insertPos - 1);
                                     tempccCache[insertPos + 1] = entry;
                                 }
                                 n++;
@@ -391,7 +399,8 @@ public class StringCache {
                         ccCache = tempccCache;
                         if (log.isDebugEnabled()) {
                             long t2 = System.currentTimeMillis();
-                            log.debug("CharCache generation time: " + (t2 - t1) + "ms");
+                            log.debug("CharCache generation time: " +
+                                    (t2 - t1) + "ms");
                         }
                     } else {
                         ccCount++;
@@ -404,7 +413,8 @@ public class StringCache {
                             int start = cc.getStart();
                             // Create char array and copy chars
                             entry.name = new char[cc.getLength()];
-                            System.arraycopy(cc.getBuffer(), start, entry.name, 0, end - start);
+                            System.arraycopy(cc.getBuffer(), start, entry.name,
+                                    0, end - start);
                             // Initialize occurrence count to one 
                             count = new int[1];
                             count[0] = 1;
@@ -469,7 +479,8 @@ public class StringCache {
 
     
     /**
-     * Find an entry given its name in the cache and return the associated String.
+     * Find an entry given its name in the cache and return the associated
+     * String.
      */
     protected static final String find(ByteChunk name) {
         int pos = findClosest(name, bcCache, bcCache.length);
@@ -487,7 +498,8 @@ public class StringCache {
      * This will return the index for the closest inferior or equal item in the
      * given array.
      */
-    protected static final int findClosest(ByteChunk name, ByteEntry[] array, int len) {
+    protected static final int findClosest(ByteChunk name, ByteEntry[] array,
+            int len) {
 
         int a = 0;
         int b = len - 1;
@@ -562,7 +574,8 @@ public class StringCache {
 
     
     /**
-     * Find an entry given its name in the cache and return the associated String.
+     * Find an entry given its name in the cache and return the associated
+     * String.
      */
     protected static final String find(CharChunk name) {
         int pos = findClosest(name, ccCache, ccCache.length);
@@ -579,7 +592,8 @@ public class StringCache {
      * This will return the index for the closest inferior or equal item in the
      * given array.
      */
-    protected static final int findClosest(CharChunk name, CharEntry[] array, int len) {
+    protected static final int findClosest(CharChunk name, CharEntry[] array,
+            int len) {
 
         int a = 0;
         int b = len - 1;