You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ol...@apache.org on 2011/10/08 19:45:36 UTC
svn commit: r1180427 - in /tomcat/maven-plugin/trunk:
common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/
tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/
Author: olamy
Date: Sat Oct 8 17:45:36 2011
New Revision: 1180427
URL: http://svn.apache.org/viewvc?rev=1180427&view=rev
Log:
[MTOMCAT-62] tomcat7 support: move embedded registry and ExternalRepositoriesReloadableWebappLoader to common package.
Added:
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/EmbeddedRegistry.java (with props)
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ExternalRepositoriesReloadableWebappLoader.java (with props)
Modified:
tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/AbstractRunMojo.java
tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/RunMojo.java
tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/ShutdownMojo.java
Added: tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/EmbeddedRegistry.java
URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/EmbeddedRegistry.java?rev=1180427&view=auto
==============================================================================
--- tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/EmbeddedRegistry.java (added)
+++ tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/EmbeddedRegistry.java Sat Oct 8 17:45:36 2011
@@ -0,0 +1,181 @@
+package org.apache.tomcat.maven.common.run;
+
+/*
+ * 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.
+ */
+
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.startup.Embedded;
+import org.apache.maven.plugin.logging.Log;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * Registry which collects all embedded Tomcat Servers so that they will be shutdown
+ * through a shutdown hook when the JVM terminates or you can ask the registry to
+ * shutdown all started servers.
+ *
+ * @author Mark Michaelis
+ * @since 1.1
+ */
+public final class EmbeddedRegistry
+{
+ private static EmbeddedRegistry instance;
+
+ private Set<Object> containers = new HashSet<Object>(1);
+
+ /**
+ * Don't instantiate - use the instance through {@link #getInstance()}.
+ */
+ private EmbeddedRegistry()
+ {
+ // no op
+ }
+
+ /**
+ * Retrieve the lazily initialized instance of the registry.
+ *
+ * @return singleton instance of the registry
+ */
+ public static EmbeddedRegistry getInstance()
+ {
+ if ( instance == null )
+ {
+ instance = new EmbeddedRegistry();
+ Runtime.getRuntime().addShutdownHook(new Thread()
+ {
+ @Override
+ public void run()
+ {
+ try
+ {
+ getInstance().shutdownAll(null);
+ }
+ catch ( Exception e )
+ {
+ // ignore, the exception should already have been reported
+ }
+ }
+ });
+ }
+ return instance;
+ }
+
+ /**
+ * Adds the given container to the registry which automatically registers it for the shutdown
+ * hook.
+ *
+ * @param container the container to register
+ * @return true if it got added; false if not
+ */
+ public synchronized boolean register(final Embedded container)
+ {
+ return containers.add(container);
+ }
+
+ /**
+ * Shuts down all registered embedded tomcats. All tomcats which successfully shut down will be
+ * removed from the registry.
+ *
+ * @param log the log to write possible shutdown exceptions to
+ * @throws org.apache.catalina.LifecycleException
+ * the first exception which occurred will be rethrown
+ */
+ public synchronized void shutdownAll(final Log log)
+ throws Exception
+ {
+ Exception firstException = null;
+ for ( Iterator<Object> iterator = containers.iterator(); iterator.hasNext(); )
+ {
+ Object embedded = iterator.next();
+ try
+ {
+ Method method = embedded.getClass().getMethod("stop", null);
+ method.invoke(embedded, null);
+ iterator.remove();
+ }
+ catch ( NoSuchMethodException e )
+ {
+ if ( firstException == null )
+ {
+ firstException = e;
+ error(log, e, "no stop method in class " + embedded.getClass().getName());
+ }
+ else
+ {
+ error(log, e, "Error while shutting down embedded Tomcat.");
+ }
+ }
+ catch ( IllegalAccessException e )
+ {
+ if ( firstException == null )
+ {
+ firstException = e;
+ error(log, e, "IllegalAccessException for stop method in class " + embedded.getClass().getName());
+ }
+ else
+ {
+ error(log, e, "Error while shutting down embedded Tomcat.");
+ }
+ }
+ catch ( InvocationTargetException e )
+ {
+
+ if ( firstException == null )
+ {
+ firstException = e;
+ error(log, e, "IllegalAccessException for stop method in class " + embedded.getClass().getName());
+ }
+ else
+ {
+ error(log, e, "Error while shutting down embedded Tomcat.");
+ }
+ }
+ }
+ if ( firstException != null )
+ {
+ throw firstException;
+ }
+ }
+
+ /**
+ * Reports the exception. If a log is given (typically when called from within a Mojo) the
+ * message will be printed to the log. Otherwise it will be printed to StdErr.
+ *
+ * @param log the log to write the message to; null to write to stderr
+ * @param e exception which shall be reported
+ * @param message message which shall be reported
+ */
+ private void error(final Log log, final Exception e, final String message)
+ {
+ if ( log == null )
+ {
+ System.err.println("ERROR: " + message);
+ e.printStackTrace();
+ }
+ else
+ {
+ log.error(message, e);
+ }
+ }
+
+}
Propchange: tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/EmbeddedRegistry.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/EmbeddedRegistry.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ExternalRepositoriesReloadableWebappLoader.java
URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ExternalRepositoriesReloadableWebappLoader.java?rev=1180427&view=auto
==============================================================================
--- tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ExternalRepositoriesReloadableWebappLoader.java (added)
+++ tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ExternalRepositoriesReloadableWebappLoader.java Sat Oct 8 17:45:36 2011
@@ -0,0 +1,164 @@
+package org.apache.tomcat.maven.common.run;
+
+/*
+ * 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.
+ */
+
+import org.apache.catalina.loader.WebappLoader;
+import org.apache.maven.plugin.logging.Log;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A {@linkplain WebappLoader} implementation that allows scanning for changes to project classpath in support of
+ * context reloads.
+ *
+ * @author Ryan Connolly
+ * @since 2.0
+ * @version $Id: ExternalRepositoriesReloadableWebappLoader.java 13551 2011-02-09 16:05:47Z olamy $
+ */
+public class ExternalRepositoriesReloadableWebappLoader
+ extends WebappLoader
+{
+
+ /** Last modification times of all jar and class files. */
+ private Map<String, Long> modificationTimeMap = new HashMap<String, Long>();
+
+ private Log log;
+
+ /** Default Constructor. */
+ public ExternalRepositoriesReloadableWebappLoader()
+ {
+ super();
+ }
+
+
+ /**
+ * Convenience Constructor allows setting of a parent ClassLoader.
+ * @param parent the ClassLoader instance to set as this Loader's parent ClassLoader.
+ */
+ public ExternalRepositoriesReloadableWebappLoader(ClassLoader parent, Log log)
+ {
+ super( parent );
+ this.log = log;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void addRepository( String repository )
+ {
+ super.addRepository( repository );
+ try
+ {
+ File file = new File( new URL( repository ).getPath().replaceAll( "%20", " " ) );
+ if ( file.isDirectory() )
+ {
+ addClassDirectory( file );
+ }
+ else if ( file.isFile() && file.getName().endsWith( ".jar" ) )
+ {
+ addFile( file );
+ }
+ }
+ catch ( MalformedURLException muex )
+ {
+ throw new RuntimeException( muex );
+ }
+ }
+
+ /**
+ * Tracks modification times of files in the given class directory.
+ * @param directory the File directory to track modification times for.
+ */
+ private void addClassDirectory( File directory )
+ {
+ for ( File file : directory.listFiles() )
+ {
+ if ( file.isDirectory() )
+ {
+ //remember also directory last modification time
+ addFile( file );
+ addClassDirectory( file );
+ }
+ else if ( file.isFile() )
+ {
+ addFile( file );
+ }
+ }
+ }
+
+ /**
+ * Tracks last modification time of the given File.
+ * @param file the File for which to track last modification time.
+ */
+ private void addFile( File file )
+ {
+ modificationTimeMap.put( file.getAbsolutePath(), file.lastModified() );
+ }
+
+ /**
+ * Check if {@link WebappLoader} says modified(), if not then check files from added repositories.
+ */
+ @Override
+ public boolean modified()
+ {
+ boolean modified = super.modified();
+ if ( !modified )
+ {
+ if (log != null )
+ {
+ log.debug( "classPath scanning started at " + new Date().toString() );
+ }
+ for ( Map.Entry<String, Long> entry : modificationTimeMap.entrySet() )
+ {
+ String key = entry.getKey();
+ File file = new File( key );
+ if ( file.exists() )
+ {
+ // file could be deleted.
+ Long savedLastModified = modificationTimeMap.get( key );
+ if ( file.lastModified() > savedLastModified )
+ {
+ modified = true;
+ modificationTimeMap.put( key, file.lastModified() );
+
+ // directory last modification time can change when some class,
+ // jar or subdirectory was added or deleted.
+ if ( file.isDirectory() )
+ {
+ addClassDirectory( file );
+ }
+ }
+ }
+ }
+ }
+ if (log != null )
+ {
+ log.debug( "context " + modified + " at " + new Date().toString() );
+ }
+ return modified;
+ }
+
+}
Propchange: tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ExternalRepositoriesReloadableWebappLoader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ExternalRepositoriesReloadableWebappLoader.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/AbstractRunMojo.java
URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/AbstractRunMojo.java?rev=1180427&r1=1180426&r2=1180427&view=diff
==============================================================================
--- tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/AbstractRunMojo.java (original)
+++ tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/AbstractRunMojo.java Sat Oct 8 17:45:36 2011
@@ -34,6 +34,7 @@ import org.apache.maven.artifact.resolve
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
+import org.apache.tomcat.maven.common.run.EmbeddedRegistry;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.archiver.UnArchiver;
import org.codehaus.plexus.archiver.manager.ArchiverManager;
@@ -730,7 +731,7 @@ public abstract class AbstractRunMojo
container.start( );
}
- EmbeddedRegistry.getInstance( ).register( container );
+ EmbeddedRegistry.getInstance().register( container );
}
finally
{
Modified: tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/RunMojo.java
URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/RunMojo.java?rev=1180427&r1=1180426&r2=1180427&view=diff
==============================================================================
--- tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/RunMojo.java (original)
+++ tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/RunMojo.java Sat Oct 8 17:45:36 2011
@@ -57,12 +57,6 @@ public class RunMojo
// Mojo Parameters
// ----------------------------------------------------------------------
- /**
- * The classes directory for the web application being run.
- *
- * @parameter expression = "${project.build.outputDirectory}"
- */
- private File classesDir;
/**
* The set of dependencies for the web application being run.
@@ -186,7 +180,7 @@ public class RunMojo
return temporaryContextFile;
}
//----------------------------------------------------------------------------
- // context attributes backgroundProcessorDelay reloadable cannot be modifiec at runtime.
+ // context attributes backgroundProcessorDelay reloadable cannot be modified at runtime.
// It looks only values from the file ared used
// so here we create a temporary file with values modified
//----------------------------------------------------------------------------
Modified: tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/ShutdownMojo.java
URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/ShutdownMojo.java?rev=1180427&r1=1180426&r2=1180427&view=diff
==============================================================================
--- tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/ShutdownMojo.java (original)
+++ tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/ShutdownMojo.java Sat Oct 8 17:45:36 2011
@@ -21,6 +21,7 @@ package org.apache.tomcat.maven.plugin.t
import org.apache.catalina.LifecycleException;
import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.tomcat.maven.common.run.EmbeddedRegistry;
/**
@@ -51,7 +52,7 @@ public class ShutdownMojo
{
try
{
- EmbeddedRegistry.getInstance( ).shutdownAll( getLog( ) );
+ EmbeddedRegistry.getInstance().shutdownAll( getLog( ) );
}
catch ( LifecycleException e )
{
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org