You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by js...@apache.org on 2007/08/16 15:55:35 UTC
svn commit: r566722 - in
/activemq/camel/trunk/tooling/maven/camel-maven-plugin: ./
src/main/java/org/apache/camel/maven/
Author: jstrachan
Date: Thu Aug 16 06:55:34 2007
New Revision: 566722
URL: http://svn.apache.org/viewvc?view=rev&rev=566722
Log:
got the maven plugin to work nicely at the 'mvn site' goal; running camel embedded to generate the DOT files, then turning them into HTML/PNG etc
Added:
activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/EmbeddedMojo.java (contents, props changed)
- copied, changed from r566528, activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunCamelMojo.java
activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunMojo.java (contents, props changed)
- copied, changed from r566528, activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunCamelMojo.java
Removed:
activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunCamelMojo.java
Modified:
activemq/camel/trunk/tooling/maven/camel-maven-plugin/pom.xml
activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/DotMojo.java
Modified: activemq/camel/trunk/tooling/maven/camel-maven-plugin/pom.xml
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/tooling/maven/camel-maven-plugin/pom.xml?view=diff&rev=566722&r1=566721&r2=566722
==============================================================================
--- activemq/camel/trunk/tooling/maven/camel-maven-plugin/pom.xml (original)
+++ activemq/camel/trunk/tooling/maven/camel-maven-plugin/pom.xml Thu Aug 16 06:55:34 2007
@@ -30,11 +30,17 @@
<name>Camel :: Maven Camel Plugin</name>
<dependencies>
+<!--
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-spring</artifactId>
+ </dependency>
+-->
+
<dependency>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1-beta-1</version>
- <!--<version>1.0.2</version>-->
</dependency>
<dependency>
Modified: activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/DotMojo.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/DotMojo.java?view=diff&rev=566722&r1=566721&r2=566722
==============================================================================
--- activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/DotMojo.java (original)
+++ activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/DotMojo.java Thu Aug 16 06:55:34 2007
@@ -17,6 +17,7 @@
*/
package org.apache.camel.maven;
+import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.doxia.sink.Sink;
import org.apache.maven.doxia.siterenderer.Renderer;
import org.apache.maven.plugin.MojoExecutionException;
@@ -42,11 +43,14 @@
import java.util.ResourceBundle;
/**
- * Converts the DOT files into another format such as PNG
+ * Runs Camel embedded with META-INF/services/*.xml spring files to try create DOT files for the
+ * routing rules, then converts the DOT files into another format such as PNG
*
* @version $Revision: 1.1 $
* @goal dot
+ * @requiresDependencyResolution runtime
* @phase prepare-package
+ * @execute phase="test-compile"
* @see <a href="http://www.graphviz.org/">GraphViz</a>
*/
public class DotMojo extends AbstractMavenReport {
@@ -55,6 +59,7 @@
* Subdirectory for report.
*/
protected static final String SUBDIRECTORY = "cameldoc";
+ private StringWriter htmlBuffer = new StringWriter();
/**
* Reference to Maven 2 Project.
*
@@ -112,7 +117,31 @@
* @component
*/
private Renderer renderer;
- StringWriter htmlBuffer = new StringWriter();
+ //
+ // For running Camel embedded
+ //-------------------------------------------------------------------------
+ //
+ /**
+ * The duration to run the application for which by default is in milliseconds.
+ *
+ * @parameter expression="2s"
+ * @readonly
+ */
+ protected String duration;
+ /**
+ * The DOT File name used to generate the DOT diagram of the route definitions
+ *
+ * @parameter expression="${project.build.directory}/site/cameldoc/routes.dot"
+ * @readonly
+ */
+ protected String dotFile;
+ /**
+ * Whether we should boot up camel with the META-INF/services/*.xml to generate the DOT file
+ *
+ * @parameter expression="true"
+ * @readonly
+ */
+ protected boolean runCamel;
/**
* @param locale report locale.
@@ -180,6 +209,12 @@
* @throws MojoExecutionException if there were any execution errors.
*/
protected void execute(final File outputDir, final Locale locale) throws MojoExecutionException {
+ try {
+ runCamelEmbedded(outputDir);
+ }
+ catch (DependencyResolutionRequiredException e) {
+ throw new MojoExecutionException("Failed: " + e, e);
+ }
outputDir.mkdirs();
List<File> files = new ArrayList<File>();
@@ -219,8 +254,29 @@
}
}
+ protected void runCamelEmbedded(File outputDir) throws DependencyResolutionRequiredException, MojoExecutionException {
+ if (runCamel) {
+ getLog().info("Running Camel embedded to load META-INF/spring/*.xml files");
+
+ List list = project.getTestClasspathElements();
+ getLog().debug("Using classpath: " + list);
+
+ EmbeddedMojo mojo = new EmbeddedMojo();
+ mojo.setClasspathElements(list);
+ mojo.setDotEnabled(true);
+ mojo.setDotFile(dotFile);
+ mojo.setDuration(duration);
+ mojo.setLog(getLog());
+ mojo.setOutputDirectory(outputDir);
+ mojo.setPluginContext(getPluginContext());
+ mojo.execute();
+ }
+ }
+
protected void writeIndexHtmlFile() throws IOException {
- File html = new File(new File(outputDirectory, SUBDIRECTORY), "index.html");
+ File dir = new File(outputDirectory, SUBDIRECTORY);
+ dir.mkdirs();
+ File html = new File(dir, "index.html");
PrintWriter out = null;
try {
out = new PrintWriter(new FileWriter(html));
@@ -246,7 +302,7 @@
protected void printHtmlFileHeader(PrintWriter out, File file) {
out.println("<p>");
- out.println(" <img src='" + removeFileExtension(file.getName()) + ".png' usemap='#G'>");
+ out.println(" <img src='" + removeFileExtension(file.getName()) + ".png' usemap='#CamelRoutes'>");
}
protected void printHtmlFileFooter(PrintWriter out, File file) {
Copied: activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/EmbeddedMojo.java (from r566528, activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunCamelMojo.java)
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/EmbeddedMojo.java?view=diff&rev=566722&p1=activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunCamelMojo.java&r1=566528&p2=activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/EmbeddedMojo.java&r2=566722
==============================================================================
--- activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunCamelMojo.java (original)
+++ activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/EmbeddedMojo.java Thu Aug 16 06:55:34 2007
@@ -16,77 +16,51 @@
*/
package org.apache.camel.maven;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter;
-import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
-import org.apache.maven.artifact.versioning.VersionRange;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.model.Exclusion;
import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectBuilder;
-import org.apache.maven.project.artifact.MavenMetadataSource;
import org.codehaus.mojo.exec.AbstractExecMojo;
-import org.codehaus.mojo.exec.ExecutableDependency;
-import org.codehaus.mojo.exec.Property;
import java.io.File;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
-import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
-import java.util.Properties;
-import java.util.Set;
/**
* Runs a CamelContext using any Spring XML configuration files found in
- * <code>META-INF/spring/*.xml</code> and starting up the context.
- *
- * @goal run
+ * <code>META-INF/spring/*.xml</code> and starting up the context; then generating
+ * the DOT file before closing the context down.
+ *
+ * @goal embedded
* @requiresDependencyResolution runtime
* @execute phase="test-compile"
*/
-public class RunCamelMojo extends AbstractExecMojo {
-
- // TODO
- // this code is based on a copy-and-paste of maven-exec-plugin
- //
- // If we could avoid the mega-cut-n-paste it would really really help!
- // ideally all I wanna do is auto-default 2 values!
- // namely the main and the command line arguments..
-
+public class EmbeddedMojo extends AbstractExecMojo {
/**
- * The maven project.
- *
- * @parameter expression="${project}"
+ * Project classpath.
+ *
+ * @parameter expression="${project.testClasspathElements}"
* @required
* @readonly
*/
- protected MavenProject project;
-
+ private List classpathElements;
+ /**
+ * The path where the generated artifacts will be placed.
+ *
+ * @parameter expression="${basedir}/target/site/cameldoc"
+ * @required
+ * @readonly
+ */
+ private File outputDirectory;
/**
* The duration to run the application for which by default is in milliseconds.
- * A value <= 0 will
*
* @parameter expression="-1"
* @readonly
*/
protected String duration;
-
/**
* The DOT File name used to generate the DOT diagram of the route definitions
*
@@ -94,7 +68,6 @@
* @readonly
*/
protected String dotFile;
-
/**
* Allows the DOT file generation to be disabled
*
@@ -104,670 +77,113 @@
protected boolean dotEnabled;
/**
- * @component
- */
- private ArtifactResolver artifactResolver;
-
- /**
- * @component
- */
- private ArtifactFactory artifactFactory;
-
- /**
- * @component
- */
- private ArtifactMetadataSource metadataSource;
-
- /**
- * @parameter expression="${localRepository}"
- * @required
- * @readonly
- */
- private ArtifactRepository localRepository;
-
- /**
- * @parameter expression="${project.remoteArtifactRepositories}"
- */
- private List remoteRepositories;
-
- /**
- * @component
- */
- private MavenProjectBuilder projectBuilder;
-
- /**
- * @parameter expression="${plugin.artifacts}"
- * @readonly
- */
- private List pluginDependencies;
-
- /**
- * The main class to execute.
- *
- * @parameter expression="${camel.mainClass}"
- * default-value="org.apache.camel.spring.Main"
- * @required
- */
- private String mainClass;
-
- /**
- * The class arguments.
- *
- * @parameter expression="${camel.applicationContext}"
- */
- private String[] arguments;
-
- /**
- * A list of system properties to be passed. Note: as the execution is not
- * forked, some system properties required by the JVM cannot be passed here.
- * Use MAVEN_OPTS or the exec:exec instead. See the user guide for more
- * information.
- *
- * @parameter
+ * This method will run the mojo
*/
- private Property[] systemProperties;
-
- /**
- * Deprecated; this is not needed anymore. Indicates if mojo should be kept
- * running after the mainclass terminates. Usefull for serverlike apps with
- * deamonthreads.
- *
- * @parameter expression="${camel.keepAlive}" default-value="false"
- */
- private boolean keepAlive;
-
- /**
- * Indicates if the project dependencies should be used when executing the
- * main class.
- *
- * @parameter expression="${camel.includeProjectDependencies}"
- * default-value="true"
- */
- private boolean includeProjectDependencies;
-
- /**
- * Indicates if this plugin's dependencies should be used when executing the
- * main class. <p/> This is useful when project dependencies are not
- * appropriate. Using only the plugin dependencies can be particularly
- * useful when the project is not a java project. For example a mvn project
- * using the csharp plugins only expects to see dotnet libraries as
- * dependencies.
- *
- * @parameter expression="${camel.includePluginDependencies}"
- * default-value="false"
- */
- private boolean includePluginDependencies;
-
- /**
- * If provided the ExecutableDependency identifies which of the plugin
- * dependencies contains the executable class. This will have the affect of
- * only including plugin dependencies required by the identified
- * ExecutableDependency. <p/> If includeProjectDependencies is set to
- * <code>true</code>, all of the project dependencies will be included on
- * the executable's classpath. Whether a particular project dependency is a
- * dependency of the identified ExecutableDependency will be irrelevant to
- * its inclusion in the classpath.
- *
- * @parameter
- * @optional
- */
- private ExecutableDependency executableDependency;
-
- /**
- * Wether to interrupt/join and possibly stop the daemon threads upon
- * quitting. <br/> If this is <code>false</code>, maven does nothing
- * about the daemon threads. When maven has no more work to do, the VM will
- * normally terminate any remaining daemon threads.
- * <p>
- * In certain cases (in particular if maven is embedded), you might need to
- * keep this enabled to make sure threads are properly cleaned up to ensure
- * they don't interfere with subsequent activity. In that case, see
- * {@link #daemonThreadJoinTimeout} and
- * {@link #stopUnresponsiveDaemonThreads} for further tuning.
- * </p>
- *
- * @parameter expression="${camel.cleanupDaemonThreads} default-value="true"
- */
- private boolean cleanupDaemonThreads;
-
- /**
- * This defines the number of milliseconds to wait for daemon threads to
- * quit following their interruption.<br/> This is only taken into account
- * if {@link #cleanupDaemonThreads} is <code>true</code>. A value <=0
- * means to not timeout (i.e. wait indefinitely for threads to finish).
- * Following a timeout, a warning will be logged.
- * <p>
- * Note: properly coded threads <i>should</i> terminate upon interruption
- * but some threads may prove problematic: as the VM does interrupt daemon
- * threads, some code may not have been written to handle interruption
- * properly. For example java.util.Timer is known to not handle
- * interruptions in JDK <= 1.6. So it is not possible for us to
- * infinitely wait by default otherwise maven could hang. A sensible default
- * value has been chosen, but this default value <i>may change</i> in the
- * future based on user feedback.
- * </p>
- *
- * @parameter expression="${camel.daemonThreadJoinTimeout}"
- * default-value="15000"
- */
- private long daemonThreadJoinTimeout;
-
- /**
- * Wether to call {@link Thread#stop()} following a timing out of waiting
- * for an interrupted thread to finish. This is only taken into account if
- * {@link #cleanupDaemonThreads} is <code>true</code> and the
- * {@link #daemonThreadJoinTimeout} threshold has been reached for an
- * uncooperative thread. If this is <code>false</code>, or if
- * {@link Thread#stop()} fails to get the thread to stop, then a warning is
- * logged and Maven will continue on while the affected threads (and related
- * objects in memory) linger on. Consider setting this to <code>true</code>
- * if you are invoking problematic code that you can't fix. An example is
- * {@link java.util.Timer} which doesn't respond to interruption. To have
- * <code>Timer</code> fixed, vote for <a
- * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6336543">this
- * bug</a>.
- *
- * @parameter expression="${camel.stopUnresponsiveDaemonThreads}
- * default-value="false"
- */
- private boolean stopUnresponsiveDaemonThreads;
-
- /**
- * Deprecated this is not needed anymore.
- *
- * @parameter expression="${camel.killAfter}" default-value="-1"
- */
- private long killAfter;
-
- private Properties originalSystemProperties;
-
- /**
- * Execute goal.
- *
- * @throws MojoExecutionException execution of the main class or one of the
- * threads it generated failed.
- * @throws MojoFailureException something bad happened...
- */
- public void execute() throws MojoExecutionException, MojoFailureException {
- if (killAfter != -1) {
- getLog().warn("Warning: killAfter is now deprecated. Do you need it ? Please comment on MEXEC-6.");
- }
-
- // lets create the command line arguments to pass in...
- List<String> args = new ArrayList<String>();
- if (dotFile != null && dotEnabled) {
- args.add("-f");
- args.add(dotFile);
- }
- args.add("-d");
- args.add(duration);
- if (arguments != null) {
- args.addAll(Arrays.asList(arguments));
- }
- arguments = new String[args.size()];
- args.toArray(arguments);
-
- if (getLog().isDebugEnabled()) {
- StringBuffer msg = new StringBuffer("Invoking : ");
- msg.append(mainClass);
- msg.append(".main(");
- for (int i = 0; i < arguments.length; i++) {
- if (i > 0) {
- msg.append(", ");
- }
- msg.append(arguments[i]);
- }
- msg.append(")");
- getLog().debug(msg);
- }
-
- IsolatedThreadGroup threadGroup = new IsolatedThreadGroup(mainClass /* name */);
- Thread bootstrapThread = new Thread(threadGroup, new Runnable() {
- public void run() {
- try {
- Method main = Thread.currentThread().getContextClassLoader().loadClass(mainClass).getMethod("main", new Class[] {String[].class});
- if (!main.isAccessible()) {
- getLog().debug("Setting accessibility to true in order to invoke main().");
- main.setAccessible(true);
- }
- main.invoke(main, new Object[] {arguments});
- } catch (Exception e) { // just pass it on
- Thread.currentThread().getThreadGroup().uncaughtException(Thread.currentThread(), e);
- }
- }
- }, mainClass + ".main()");
- bootstrapThread.setContextClassLoader(getClassLoader());
- setSystemProperties();
-
- bootstrapThread.start();
- joinNonDaemonThreads(threadGroup);
- // It's plausible that spontaneously a non-daemon thread might be
- // created as we try and shut down,
- // but it's too late since the termination condition (only daemon
- // threads) has been triggered.
- if (keepAlive) {
- getLog().warn("Warning: keepAlive is now deprecated and obsolete. Do you need it? Please comment on MEXEC-6.");
- waitFor(0);
- }
-
- if (cleanupDaemonThreads) {
-
- terminateThreads(threadGroup);
-
- try {
- threadGroup.destroy();
- } catch (IllegalThreadStateException e) {
- getLog().warn("Couldn't destroy threadgroup " + threadGroup, e);
- }
- }
-
- if (originalSystemProperties != null) {
- System.setProperties(originalSystemProperties);
- }
-
- synchronized (threadGroup) {
- if (threadGroup.uncaughtException != null) {
- throw new MojoExecutionException(null, threadGroup.uncaughtException);
- }
- }
-
- registerSourceRoots();
- }
-
- class IsolatedThreadGroup extends ThreadGroup {
- Throwable uncaughtException; // synchronize access to this
-
- public IsolatedThreadGroup(String name) {
- super(name);
- }
-
- public void uncaughtException(Thread thread, Throwable throwable) {
- if (throwable instanceof ThreadDeath) {
- return; // harmless
- }
- boolean doLog = false;
- synchronized (this) {
- // only remember the first one
- if (uncaughtException == null) {
- uncaughtException = throwable; // will be reported
- // eventually
- } else {
- doLog = true;
- }
- }
- if (doLog) {
- getLog().warn("an additional exception was thrown", throwable);
- }
- }
- }
-
- private void joinNonDaemonThreads(ThreadGroup threadGroup) {
- boolean foundNonDaemon;
- do {
- foundNonDaemon = false;
- Collection threads = getActiveThreads(threadGroup);
- for (Iterator iter = threads.iterator(); iter.hasNext();) {
- Thread thread = (Thread)iter.next();
- if (thread.isDaemon()) {
- continue;
- }
- foundNonDaemon = true; // try again; maybe more threads were
- // created while we were busy
- joinThread(thread, 0);
- }
- } while (foundNonDaemon);
- }
-
- private void joinThread(Thread thread, long timeoutMsecs) {
+ public void execute() throws MojoExecutionException {
+ ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
try {
- getLog().debug("joining on thread " + thread);
- thread.join(timeoutMsecs);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt(); // good practice if don't throw
- getLog().warn("interrupted while joining against thread " + thread, e); // not
- // expected!
+ ClassLoader newLoader = createClassLoader(oldClassLoader);
+ Thread.currentThread().setContextClassLoader(newLoader);
+ runCamel(newLoader);
}
- // generally abnormal
- if (thread.isAlive()) {
- getLog().warn("thread " + thread + " was interrupted but is still alive after waiting at least " + timeoutMsecs + "msecs");
+ catch (Exception e) {
+ throw new MojoExecutionException("Failed: " + e, e);
}
- }
-
- private void terminateThreads(ThreadGroup threadGroup) {
- long startTime = System.currentTimeMillis();
- Set uncooperativeThreads = new HashSet(); // these were not responsive
- // to interruption
- for (Collection threads = getActiveThreads(threadGroup); !threads.isEmpty(); threads = getActiveThreads(threadGroup), threads.removeAll(uncooperativeThreads)) {
- // Interrupt all threads we know about as of this instant (harmless
- // if spuriously went dead (! isAlive())
- // or if something else interrupted it ( isInterrupted() ).
- for (Iterator iter = threads.iterator(); iter.hasNext();) {
- Thread thread = (Thread)iter.next();
- getLog().debug("interrupting thread " + thread);
- thread.interrupt();
- }
- // Now join with a timeout and call stop() (assuming flags are set
- // right)
- for (Iterator iter = threads.iterator(); iter.hasNext();) {
- Thread thread = (Thread)iter.next();
- if (!thread.isAlive()) {
- continue; // and, presumably it won't show up in
- // getActiveThreads() next iteration
- }
- if (daemonThreadJoinTimeout <= 0) {
- joinThread(thread, 0); // waits until not alive; no timeout
- continue;
- }
- long timeout = daemonThreadJoinTimeout - (System.currentTimeMillis() - startTime);
- if (timeout > 0) {
- joinThread(thread, timeout);
- }
- if (!thread.isAlive()) {
- continue;
- }
- uncooperativeThreads.add(thread); // ensure we don't process
- // again
- if (stopUnresponsiveDaemonThreads) {
- getLog().warn("thread " + thread + " will be Thread.stop()'ed");
- thread.stop();
- } else {
- getLog().warn("thread " + thread + " will linger despite being asked to die via interruption");
- }
- }
- }
- if (!uncooperativeThreads.isEmpty()) {
- getLog().warn(
- "NOTE: " + uncooperativeThreads.size() + " thread(s) did not finish despite being asked to "
- + " via interruption. This is not a problem with exec:java, it is a problem with the running code." + " Although not serious, it should be remedied.");
- } else {
- int activeCount = threadGroup.activeCount();
- if (activeCount != 0) {
- // TODO this may be nothing; continue on anyway; perhaps don't
- // even log in future
- Thread[] threadsArray = new Thread[1];
- threadGroup.enumerate(threadsArray);
- getLog().debug("strange; " + activeCount + " thread(s) still active in the group " + threadGroup + " such as " + threadsArray[0]);
- }
+ finally {
+ Thread.currentThread().setContextClassLoader(oldClassLoader);
}
}
- private Collection getActiveThreads(ThreadGroup threadGroup) {
- Thread[] threads = new Thread[threadGroup.activeCount()];
- int numThreads = threadGroup.enumerate(threads);
- Collection result = new ArrayList(numThreads);
- for (int i = 0; i < threads.length && threads[i] != null; i++) {
- result.add(threads[i]);
- }
- // note: result should be modifiable
- return result;
- }
+ // Properties
+ //-------------------------------------------------------------------------
/**
- * Pass any given system properties to the java system properties.
+ * Getter for property output directory.
+ *
+ * @return The value of output directory.
*/
- private void setSystemProperties() {
- if (systemProperties != null) {
- originalSystemProperties = System.getProperties();
- for (int i = 0; i < systemProperties.length; i++) {
- Property systemProperty = systemProperties[i];
- String value = systemProperty.getValue();
- System.setProperty(systemProperty.getKey(), value == null ? "" : value);
- }
- }
+ public File getOutputDirectory() {
+ return outputDirectory;
}
/**
- * Set up a classloader for the execution of the main class.
- *
- * @return the classloader
- * @throws MojoExecutionException
+ * Setter for the output directory.
+ *
+ * @param inOutputDirectory The value of output directory.
*/
- private ClassLoader getClassLoader() throws MojoExecutionException {
- List classpathURLs = new ArrayList();
- this.addRelevantPluginDependenciesToClasspath(classpathURLs);
- this.addRelevantProjectDependenciesToClasspath(classpathURLs);
- return new URLClassLoader((URL[])classpathURLs.toArray(new URL[classpathURLs.size()]));
+ public void setOutputDirectory(final File inOutputDirectory) {
+ this.outputDirectory = inOutputDirectory;
}
- /**
- * Add any relevant project dependencies to the classpath. Indirectly takes
- * includePluginDependencies and ExecutableDependency into consideration.
- *
- * @param path classpath of {@link java.net.URL} objects
- * @throws MojoExecutionException
- */
- private void addRelevantPluginDependenciesToClasspath(List path) throws MojoExecutionException {
- if (hasCommandlineArgs()) {
- arguments = parseCommandlineArgs();
- }
-
- try {
- Iterator iter = this.determineRelevantPluginDependencies().iterator();
- while (iter.hasNext()) {
- Artifact classPathElement = (Artifact)iter.next();
- getLog().debug("Adding plugin dependency artifact: " + classPathElement.getArtifactId() + " to classpath");
- path.add(classPathElement.getFile().toURL());
- }
- } catch (MalformedURLException e) {
- throw new MojoExecutionException("Error during setting up classpath", e);
- }
+ public List getClasspathElements() {
+ return classpathElements;
+ }
+ public void setClasspathElements(List classpathElements) {
+ this.classpathElements = classpathElements;
}
- /**
- * Add any relevant project dependencies to the classpath. Takes
- * includeProjectDependencies into consideration.
- *
- * @param path classpath of {@link java.net.URL} objects
- * @throws MojoExecutionException
- */
- private void addRelevantProjectDependenciesToClasspath(List path) throws MojoExecutionException {
- if (this.includeProjectDependencies) {
- try {
- getLog().debug("Project Dependencies will be included.");
-
- URL mainClasses = new File(project.getBuild().getOutputDirectory()).toURL();
- getLog().debug("Adding to classpath : " + mainClasses);
- path.add(mainClasses);
-
- URL testClasses = new File(project.getBuild().getTestOutputDirectory()).toURL();
- getLog().debug("Adding to classpath : " + testClasses);
- path.add(testClasses);
-
- Set dependencies = project.getArtifacts();
-
- // system scope dependencies are not returned by maven 2.0. See
- // MEXEC-17
- dependencies.addAll(getSystemScopeDependencies());
-
- Iterator iter = dependencies.iterator();
- while (iter.hasNext()) {
- Artifact classPathElement = (Artifact)iter.next();
- getLog().debug("Adding project dependency artifact: " + classPathElement.getArtifactId() + " to classpath");
- path.add(classPathElement.getFile().toURL());
- }
-
- } catch (MalformedURLException e) {
- throw new MojoExecutionException("Error during setting up classpath", e);
- }
- } else {
- getLog().debug("Project Dependencies will be excluded.");
- }
+ public boolean isDotEnabled() {
+ return dotEnabled;
+ }
+ public void setDotEnabled(boolean dotEnabled) {
+ this.dotEnabled = dotEnabled;
}
- private Collection getSystemScopeDependencies() throws MojoExecutionException {
- List systemScopeArtifacts = new ArrayList();
+ public String getDotFile() {
+ return dotFile;
+ }
- for (Iterator artifacts = getAllDependencies().iterator(); artifacts.hasNext();) {
- Artifact artifact = (Artifact)artifacts.next();
+ public void setDotFile(String dotFile) {
+ this.dotFile = dotFile;
+ }
- if (artifact.getScope().equals(Artifact.SCOPE_SYSTEM)) {
- systemScopeArtifacts.add(artifact);
- }
- }
- return systemScopeArtifacts;
+ public String getDuration() {
+ return duration;
}
- // generic method to retrieve all the transitive dependencies
- private Collection getAllDependencies() throws MojoExecutionException {
- List artifacts = new ArrayList();
-
- for (Iterator dependencies = project.getDependencies().iterator(); dependencies.hasNext();) {
- Dependency dependency = (Dependency)dependencies.next();
-
- String groupId = dependency.getGroupId();
- String artifactId = dependency.getArtifactId();
-
- VersionRange versionRange;
- try {
- versionRange = VersionRange.createFromVersionSpec(dependency.getVersion());
- } catch (InvalidVersionSpecificationException e) {
- throw new MojoExecutionException("unable to parse version", e);
- }
-
- String type = dependency.getType();
- if (type == null) {
- type = "jar"; //$NON-NLS-1$
- }
- String classifier = dependency.getClassifier();
- boolean optional = dependency.isOptional();
- String scope = dependency.getScope();
- if (scope == null) {
- scope = Artifact.SCOPE_COMPILE;
- }
-
- Artifact art = this.artifactFactory.createDependencyArtifact(groupId, artifactId, versionRange, type, classifier, scope, optional);
-
- if (scope.equalsIgnoreCase(Artifact.SCOPE_SYSTEM)) {
- art.setFile(new File(dependency.getSystemPath()));
- }
-
- List exclusions = new ArrayList();
- for (Iterator j = dependency.getExclusions().iterator(); j.hasNext();) {
- Exclusion e = (Exclusion)j.next();
- exclusions.add(e.getGroupId() + ":" + e.getArtifactId()); //$NON-NLS-1$
- }
+ public void setDuration(String duration) {
+ this.duration = duration;
+ }
- ArtifactFilter newFilter = new ExcludesArtifactFilter(exclusions);
+ // Implementation methods
+ //-------------------------------------------------------------------------
- art.setDependencyFilter(newFilter);
+ protected void runCamel(ClassLoader newLoader) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, MojoExecutionException {
+ Class<?> type = newLoader.loadClass("org.apache.camel.spring.Main");
+ Method method = type.getMethod("main", String[].class);
+ String[] arguments = createArguments();
+ getLog().debug("Starting the Camel Main with arguments: " + Arrays.asList(arguments));
- artifacts.add(art);
+ try {
+ method.invoke(null, new Object[]{arguments});
}
-
- return artifacts;
- }
-
- /**
- * Determine all plugin dependencies relevant to the executable. Takes
- * includePlugins, and the executableDependency into consideration.
- *
- * @return a set of Artifact objects. (Empty set is returned if there are no
- * relevant plugin dependencies.)
- * @throws MojoExecutionException
- */
- private Set determineRelevantPluginDependencies() throws MojoExecutionException {
- Set relevantDependencies;
- if (this.includePluginDependencies) {
- if (this.executableDependency == null) {
- getLog().debug("All Plugin Dependencies will be included.");
- relevantDependencies = new HashSet(this.pluginDependencies);
- } else {
- getLog().debug("Selected plugin Dependencies will be included.");
- Artifact executableArtifact = this.findExecutableArtifact();
- Artifact executablePomArtifact = this.getExecutablePomArtifact(executableArtifact);
- relevantDependencies = this.resolveExecutableDependencies(executablePomArtifact);
- }
- } else {
- relevantDependencies = Collections.EMPTY_SET;
- getLog().debug("Plugin Dependencies will be excluded.");
+ catch (InvocationTargetException e) {
+ Throwable t = e.getTargetException();
+ throw new MojoExecutionException("Failed: " + t, t);
}
- return relevantDependencies;
- }
-
- /**
- * Get the artifact which refers to the POM of the executable artifact.
- *
- * @param executableArtifact this artifact refers to the actual assembly.
- * @return an artifact which refers to the POM of the executable artifact.
- */
- private Artifact getExecutablePomArtifact(Artifact executableArtifact) {
- return this.artifactFactory.createBuildArtifact(executableArtifact.getGroupId(), executableArtifact.getArtifactId(), executableArtifact.getVersion(), "pom");
}
- /**
- * Examine the plugin dependencies to find the executable artifact.
- *
- * @return an artifact which refers to the actual executable tool (not a
- * POM)
- * @throws MojoExecutionException
- */
- private Artifact findExecutableArtifact() throws MojoExecutionException {
- // ILimitedArtifactIdentifier execToolAssembly =
- // this.getExecutableToolAssembly();
-
- Artifact executableTool = null;
- for (Iterator iter = this.pluginDependencies.iterator(); iter.hasNext();) {
- Artifact pluginDep = (Artifact)iter.next();
- if (this.executableDependency.matches(pluginDep)) {
- executableTool = pluginDep;
- break;
- }
+ protected String[] createArguments() {
+ if (dotEnabled) {
+ return new String[]{"-duration", duration, "-file", dotFile};
}
-
- if (executableTool == null) {
- throw new MojoExecutionException("No dependency of the plugin matches the specified executableDependency." + " Specified executableToolAssembly is: " + executableDependency.toString());
+ else {
+ return new String[]{"-duration", duration};
}
-
- return executableTool;
}
- private Set resolveExecutableDependencies(Artifact executablePomArtifact) throws MojoExecutionException {
-
- Set executableDependencies;
- try {
- MavenProject executableProject = this.projectBuilder.buildFromRepository(executablePomArtifact, this.remoteRepositories, this.localRepository);
-
- // get all of the dependencies for the executable project
- List dependencies = executableProject.getDependencies();
-
- // make Artifacts of all the dependencies
- Set dependencyArtifacts = MavenMetadataSource.createArtifacts(this.artifactFactory, dependencies, null, null, null);
+ protected ClassLoader createClassLoader(ClassLoader parent) throws MalformedURLException {
+ getLog().debug("Using classpath: " + classpathElements);
- // not forgetting the Artifact of the project itself
- dependencyArtifacts.add(executableProject.getArtifact());
-
- // resolve all dependencies transitively to obtain a comprehensive
- // list of assemblies
- ArtifactResolutionResult result = artifactResolver.resolveTransitively(dependencyArtifacts, executablePomArtifact, Collections.EMPTY_MAP, this.localRepository, this.remoteRepositories,
- metadataSource, null, Collections.EMPTY_LIST);
- executableDependencies = result.getArtifacts();
-
- } catch (Exception ex) {
- throw new MojoExecutionException("Encountered problems resolving dependencies of the executable " + "in preparation for its execution.", ex);
+ int size = classpathElements.size();
+ URL[] urls = new URL[size];
+ for (int i = 0; i < size; i++) {
+ String name = (String) classpathElements.get(i);
+ File file = new File(name);
+ urls[i] = file.toURL();
}
-
- return executableDependencies;
+ return new URLClassLoader(urls, parent);
}
-
- /**
- * Stop program execution for nn millis.
- *
- * @param millis the number of millis-seconds to wait for, <code>0</code>
- * stops program forever.
- */
- private void waitFor(long millis) {
- Object lock = new Object();
- synchronized (lock) {
- try {
- lock.wait(millis);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt(); // good practice if don't
- // throw
- getLog().warn("Spuriously interrupted while waiting for " + millis + "ms", e);
- }
- }
- }
-
-}
+}
\ No newline at end of file
Propchange: activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/EmbeddedMojo.java
------------------------------------------------------------------------------
svn:eol-style = native
Copied: activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunMojo.java (from r566528, activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunCamelMojo.java)
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunMojo.java?view=diff&rev=566722&p1=activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunCamelMojo.java&r1=566528&p2=activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunMojo.java&r2=566722
==============================================================================
--- activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunCamelMojo.java (original)
+++ activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunMojo.java Thu Aug 16 06:55:34 2007
@@ -60,7 +60,7 @@
* @requiresDependencyResolution runtime
* @execute phase="test-compile"
*/
-public class RunCamelMojo extends AbstractExecMojo {
+public class RunMojo extends AbstractExecMojo {
// TODO
// this code is based on a copy-and-paste of maven-exec-plugin
Propchange: activemq/camel/trunk/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RunMojo.java
------------------------------------------------------------------------------
svn:eol-style = native