You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ma...@apache.org on 2008/03/03 16:33:25 UTC
svn commit: r633133 - in /maven/sandbox/trunk/shared/maven-runtime/src:
main/java/org/apache/maven/shared/runtime/
test/java/org/apache/maven/shared/runtime/ test/resources/testSingleJar2/
test/resources/testSingleJar2/src/ test/resources/testSingleJar...
Author: markh
Date: Mon Mar 3 07:33:20 2008
New Revision: 633133
URL: http://svn.apache.org/viewvc?rev=633133&view=rev
Log:
Added support for different class loader delegation strategies
Added:
maven/sandbox/trunk/shared/maven-runtime/src/test/java/org/apache/maven/shared/runtime/ChildDelegatingClassLoader.java (with props)
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/pom.xml (with props)
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/src/
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/src/main/
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/src/main/java/
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/src/main/java/DefaultPackageClass.java (with props)
Modified:
maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/ClassUtils.java
maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/MavenRuntimeVisitorUtils.java
maven/sandbox/trunk/shared/maven-runtime/src/test/java/org/apache/maven/shared/runtime/DefaultMavenRuntimeTest.java
Modified: maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/ClassUtils.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/ClassUtils.java?rev=633133&r1=633132&r2=633133&view=diff
==============================================================================
--- maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/ClassUtils.java (original)
+++ maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/ClassUtils.java Mon Mar 3 07:33:20 2008
@@ -26,9 +26,9 @@
/**
* Provides various utility methods for working with classes.
- *
+ *
* @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
- * @version $Id$
+ * @version $Id$
*/
final class ClassUtils
{
Modified: maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/MavenRuntimeVisitorUtils.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/MavenRuntimeVisitorUtils.java?rev=633133&r1=633132&r2=633133&view=diff
==============================================================================
--- maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/MavenRuntimeVisitorUtils.java (original)
+++ maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/MavenRuntimeVisitorUtils.java Mon Mar 3 07:33:20 2008
@@ -24,6 +24,11 @@
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
@@ -51,6 +56,24 @@
*/
private static final String[] XML_PATH_TOKENS = new String[] { "META-INF", "maven", null, null, "pom.xml" };
+ /**
+ * The path element index of a Maven project properties/XML file that contains the project group id.
+ */
+ private static final int GROUP_ID_TOKEN_INDEX = 2;
+
+ /**
+ * The path element index of a Maven project properties/XML file that contains the project artifact id.
+ */
+ private static final int ARTIFACT_ID_TOKEN_INDEX = 3;
+
+ /**
+ * List of known class loaders that are child-delegating.
+ */
+ private static final String[] CHILD_DELEGATING_CLASSLOADERS = new String [] {
+ "org.apache.maven.shared.runtime.ChildDelegatingClassLoader",
+ "org.apache.maven.surefire.booter.IsolatedClassLoader"
+ };
+
// constructors -----------------------------------------------------------
/**
@@ -76,13 +99,16 @@
public static void accept( ClassLoader classLoader, MavenRuntimeVisitor visitor )
throws MavenRuntimeException
{
- ClassLoader currentClassLoader = classLoader;
+ List classLoaders = getOrderedClassLoaders( classLoader );
+
+ Set visitedProjectProperties = new HashSet();
+ Set visitedProjectXML = new HashSet();
- while ( currentClassLoader != null )
+ for ( Iterator iterator = classLoaders.iterator(); iterator.hasNext(); )
{
- acceptClassLoader( currentClassLoader, visitor );
+ ClassLoader currentClassLoader = (ClassLoader) iterator.next();
- currentClassLoader = currentClassLoader.getParent();
+ acceptClassLoader( currentClassLoader, visitor, visitedProjectProperties, visitedProjectXML );
}
}
@@ -121,13 +147,69 @@
*/
public static void accept( URL url, MavenRuntimeVisitor visitor ) throws MavenRuntimeException
{
- if ( url.getPath().endsWith( ".jar" ) )
+ acceptURL( url, visitor, new HashSet(), new HashSet() );
+ }
+
+ // private methods --------------------------------------------------------
+
+ /**
+ * Gets the class loader hierarchy for the specified class loader in search order precedence. Precedence is
+ * determined by the hierarchy of class loaders and whether a class loader is deemed to be parent- or
+ * child-delegating. The method of delegation is determined by <code>isChildDelegating</code>.
+ *
+ * @param classLoader
+ * the class loader to obtain the ordered class loader hierarchy of
+ * @return the class loader hierarchy for the specified class loader in search order precedence
+ * @see #isChildDelegating(ClassLoader)
+ */
+ private static List getOrderedClassLoaders( ClassLoader classLoader )
+ {
+ List classLoaders = new ArrayList();
+ List childDelegatingClassLoaders = new ArrayList();
+
+ ClassLoader currentClassLoader = classLoader;
+
+ while ( currentClassLoader != null )
{
- acceptJar( url, visitor );
+ if ( isChildDelegating( currentClassLoader ) )
+ {
+ childDelegatingClassLoaders.add( currentClassLoader );
+ }
+ else
+ {
+ classLoaders.add( 0, currentClassLoader );
+ }
+
+ currentClassLoader = currentClassLoader.getParent();
}
+
+ classLoaders.addAll( 0, childDelegatingClassLoaders );
+
+ return classLoaders;
}
- // private methods --------------------------------------------------------
+ /**
+ * Gets whether the specified class loader is parent- or child-delegating.
+ *
+ * @param classLoader
+ * the class loader to examine
+ * @return <code>true</code> if the class loader is child-delegating or <code>false</code> if it is
+ * parent-delegating
+ */
+ private static boolean isChildDelegating( ClassLoader classLoader )
+ {
+ String className = classLoader.getClass().getName();
+
+ for ( int i = 0; i < CHILD_DELEGATING_CLASSLOADERS.length; i++ )
+ {
+ if ( CHILD_DELEGATING_CLASSLOADERS[i].equals( className ) )
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
/**
* Invokes the specified visitor on all Maven projects found within the specified class loader.
@@ -136,10 +218,15 @@
* the class loader to introspect
* @param visitor
* the visitor to invoke
+ * @param visitedProjectProperties
+ * the ids of projects' properties that have been visited
+ * @param visitedProjectXML
+ * the ids of projects' XML that have been visited
* @throws MavenRuntimeException
* if an error occurs visiting the projects
*/
- private static void acceptClassLoader( ClassLoader classLoader, MavenRuntimeVisitor visitor )
+ private static void acceptClassLoader( ClassLoader classLoader, MavenRuntimeVisitor visitor,
+ Set visitedProjectProperties, Set visitedProjectXML )
throws MavenRuntimeException
{
if ( classLoader instanceof URLClassLoader )
@@ -150,10 +237,33 @@
for ( int i = 0; i < urls.length; i++ )
{
- accept( urls[i], visitor );
+ acceptURL( urls[i], visitor, visitedProjectProperties, visitedProjectXML );
}
}
}
+
+ /**
+ * Invokes the specified visitor on all Maven projects found within the specified URL.
+ *
+ * @param url
+ * the URL to introspect
+ * @param visitor
+ * the visitor to invoke
+ * @param visitedProjectProperties
+ * the ids of projects' properties that have been visited
+ * @param visitedProjectXML
+ * the ids of projects' XML that have been visited
+ * @throws MavenRuntimeException
+ * if an error occurs visiting the projects
+ */
+ public static void acceptURL( URL url, MavenRuntimeVisitor visitor, Set visitedProjectProperties,
+ Set visitedProjectXML ) throws MavenRuntimeException
+ {
+ if ( url.getPath().endsWith( ".jar" ) )
+ {
+ acceptJar( url, visitor, visitedProjectProperties, visitedProjectXML );
+ }
+ }
/**
* Invokes the specified visitor on all Maven projects found within the specified Jar URL.
@@ -162,10 +272,15 @@
* the Jar URL to introspect
* @param visitor
* the visitor to invoke
+ * @param visitedProjectProperties
+ * the ids of projects' properties that have been visited
+ * @param visitedProjectXML
+ * the ids of projects' XML that have been visited
* @throws MavenRuntimeException
* if an error occurs visiting the projects
*/
- private static void acceptJar( URL url, MavenRuntimeVisitor visitor ) throws MavenRuntimeException
+ private static void acceptJar( URL url, MavenRuntimeVisitor visitor, Set visitedProjectProperties,
+ Set visitedProjectXML ) throws MavenRuntimeException
{
JarInputStream in = null;
@@ -180,7 +295,7 @@
while ( ( entry = in.getNextJarEntry() ) != null )
{
- acceptJarEntry( url, entry, visitor );
+ acceptJarEntry( url, entry, visitor, visitedProjectProperties, visitedProjectXML );
}
}
catch ( IOException exception )
@@ -203,10 +318,15 @@
* the Jar entry to introspect
* @param visitor
* the visitor to invoke
+ * @param visitedProjectProperties
+ * the ids of projects' properties that have been visited
+ * @param visitedProjectXML
+ * the ids of projects' XML that have been visited
* @throws MavenRuntimeException
* if an error occurs visiting the projects
*/
- private static void acceptJarEntry( URL jarURL, JarEntry entry, MavenRuntimeVisitor visitor )
+ private static void acceptJarEntry( URL jarURL, JarEntry entry, MavenRuntimeVisitor visitor,
+ Set visitedProjectProperties, Set visitedProjectXML )
throws MavenRuntimeException
{
String name = entry.getName();
@@ -217,17 +337,48 @@
if ( isProjectPropertiesPath( name ) )
{
- visitor.visitProjectProperties( url );
+ String projectId = getProjectId(name);
+
+ if ( !visitedProjectProperties.contains( projectId ) )
+ {
+ visitor.visitProjectProperties( url );
+
+ visitedProjectProperties.add( projectId );
+ }
}
else if ( isProjectXMLPath( name ) )
{
- visitor.visitProjectXML( url );
+ String projectId = getProjectId(name);
+
+ if ( !visitedProjectXML.contains( projectId ) )
+ {
+ visitor.visitProjectXML( url );
+
+ visitedProjectXML.add( projectId );
+ }
}
}
catch ( MalformedURLException exception )
{
throw new MavenRuntimeException( "Cannot read jar entry", exception );
}
+ }
+
+ /**
+ * Gets a unique project identifier for the specified Maven project properties/XML file.
+ *
+ * @param path
+ * the path to a Maven project properties/XML file
+ * @return the unique project identifier
+ */
+ private static String getProjectId( String path )
+ {
+ String[] tokens = path.split( "/" );
+
+ String groupId = tokens[GROUP_ID_TOKEN_INDEX];
+ String artifactId = tokens[ARTIFACT_ID_TOKEN_INDEX];
+
+ return groupId + ":" + artifactId;
}
/**
Added: maven/sandbox/trunk/shared/maven-runtime/src/test/java/org/apache/maven/shared/runtime/ChildDelegatingClassLoader.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/shared/maven-runtime/src/test/java/org/apache/maven/shared/runtime/ChildDelegatingClassLoader.java?rev=633133&view=auto
==============================================================================
--- maven/sandbox/trunk/shared/maven-runtime/src/test/java/org/apache/maven/shared/runtime/ChildDelegatingClassLoader.java (added)
+++ maven/sandbox/trunk/shared/maven-runtime/src/test/java/org/apache/maven/shared/runtime/ChildDelegatingClassLoader.java Mon Mar 3 07:33:20 2008
@@ -0,0 +1,86 @@
+package org.apache.maven.shared.runtime;
+
+/*
+ * 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 java.net.URL;
+import java.net.URLClassLoader;
+
+/**
+ * A child-delegating class loader for use by tests.
+ *
+ * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
+ * @version $Id$
+ */
+public class ChildDelegatingClassLoader extends URLClassLoader
+{
+ // constructors -----------------------------------------------------------
+
+ public ChildDelegatingClassLoader(URL[] urls)
+ {
+ super(urls);
+ }
+
+ public ChildDelegatingClassLoader(URL[] urls, ClassLoader parent)
+ {
+ super(urls, parent);
+ }
+
+ // ClassLoader methods ----------------------------------------------------
+
+ /**
+ * {@inheritDoc}
+ */
+ public Class loadClass( String name ) throws ClassNotFoundException
+ {
+ Class klass = findLoadedClass( name );
+
+ if ( klass == null )
+ {
+ try
+ {
+ klass = findClass( name );
+ }
+ catch ( ClassNotFoundException exception )
+ {
+ if ( getParent() != null)
+ {
+ klass = getParent().loadClass( name );
+ }
+ }
+ }
+
+ return klass;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public URL getResource( String name )
+ {
+ URL url = findResource( name );
+
+ if ( url == null && getParent() != null )
+ {
+ url = getParent().getResource( name );
+ }
+
+ return url;
+ }
+}
Propchange: maven/sandbox/trunk/shared/maven-runtime/src/test/java/org/apache/maven/shared/runtime/ChildDelegatingClassLoader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/shared/maven-runtime/src/test/java/org/apache/maven/shared/runtime/ChildDelegatingClassLoader.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Modified: maven/sandbox/trunk/shared/maven-runtime/src/test/java/org/apache/maven/shared/runtime/DefaultMavenRuntimeTest.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/shared/maven-runtime/src/test/java/org/apache/maven/shared/runtime/DefaultMavenRuntimeTest.java?rev=633133&r1=633132&r2=633133&view=diff
==============================================================================
--- maven/sandbox/trunk/shared/maven-runtime/src/test/java/org/apache/maven/shared/runtime/DefaultMavenRuntimeTest.java (original)
+++ maven/sandbox/trunk/shared/maven-runtime/src/test/java/org/apache/maven/shared/runtime/DefaultMavenRuntimeTest.java Mon Mar 3 07:33:20 2008
@@ -124,6 +124,90 @@
assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
}
+ public void testGetProjectPropertiesWithMultipleVersions()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2 } );
+
+ Class klass = classLoader.loadClass( "DefaultPackageClass" );
+
+ MavenProjectProperties properties = mavenRuntime.getProjectProperties( klass );
+
+ close( classLoader );
+
+ assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
+ }
+
+ public void testGetProjectPropertiesWithMultipleVersionsReversed()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( new File[] { jar2, jar1 } );
+
+ Class klass = classLoader.loadClass( "DefaultPackageClass" );
+
+ MavenProjectProperties properties = mavenRuntime.getProjectProperties( klass );
+
+ close( classLoader );
+
+ assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", properties );
+ }
+
+ public void testGetProjectPropertiesWithParentDelegation()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader1 = newClassLoader( jar1 );
+ URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1 );
+
+ Class klass = classLoader2.loadClass( "DefaultPackageClass" );
+
+ MavenProjectProperties properties = mavenRuntime.getProjectProperties( klass );
+
+ close( classLoader1 );
+ close( classLoader2 );
+
+ assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
+ }
+
+ public void testGetProjectPropertiesWithChildDelegation()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader1 = newClassLoader( jar1 );
+ URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1, true );
+
+ Class klass = classLoader2.loadClass( "DefaultPackageClass" );
+
+ MavenProjectProperties properties = mavenRuntime.getProjectProperties( klass );
+
+ close( classLoader1 );
+ close( classLoader2 );
+
+ assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", properties );
+ }
+
// getProjectsProperties tests --------------------------------------------
public void testGetProjectsPropertiesWithSingleJar()
@@ -165,6 +249,82 @@
"org.apache.maven.shared.runtime.tests:testMultipleJars3:1.0"
}, properties );
}
+
+ public void testGetProjectsPropertiesWithMultipleVersions()
+ throws TestToolsException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2 } );
+
+ List properties = mavenRuntime.getProjectsProperties( classLoader );
+
+ close( classLoader );
+
+ assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
+ }
+
+ public void testGetProjectsPropertiesWithMultipleVersionsReversed()
+ throws TestToolsException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( new File[] { jar2, jar1 } );
+
+ List properties = mavenRuntime.getProjectsProperties( classLoader );
+
+ close( classLoader );
+
+ assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", properties );
+ }
+
+ public void testGetProjectsPropertiesWithParentDelegation()
+ throws TestToolsException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader1 = newClassLoader( jar1 );
+ URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1 );
+
+ List properties = mavenRuntime.getProjectsProperties( classLoader2 );
+
+ close( classLoader1 );
+ close( classLoader2 );
+
+ assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
+ }
+
+ public void testGetProjectsPropertiesWithChildDelegation()
+ throws TestToolsException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader1 = newClassLoader( jar1 );
+ URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1, true );
+
+ List properties = mavenRuntime.getProjectsProperties( classLoader2 );
+
+ close( classLoader1 );
+ close( classLoader2 );
+
+ assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", properties );
+ }
// getProject tests -------------------------------------------------------
@@ -222,6 +382,90 @@
assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", project );
}
+ public void testGetProjectWithMultipleVersions()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2 } );
+
+ Class klass = classLoader.loadClass( "DefaultPackageClass" );
+
+ MavenProject project = mavenRuntime.getProject( klass );
+
+ close( classLoader );
+
+ assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", project );
+ }
+
+ public void testGetProjectWithMultipleVersionsReversed()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( new File[] { jar2, jar1 } );
+
+ Class klass = classLoader.loadClass( "DefaultPackageClass" );
+
+ MavenProject project = mavenRuntime.getProject( klass );
+
+ close( classLoader );
+
+ assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", project );
+ }
+
+ public void testGetProjectWithParentDelegation()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader1 = newClassLoader( jar1 );
+ URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1 );
+
+ Class klass = classLoader2.loadClass( "DefaultPackageClass" );
+
+ MavenProject project = mavenRuntime.getProject( klass );
+
+ close( classLoader1 );
+ close( classLoader2 );
+
+ assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", project );
+ }
+
+ public void testGetProjectWithChildDelegation()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader1 = newClassLoader( jar1 );
+ URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1, true );
+
+ Class klass = classLoader2.loadClass( "DefaultPackageClass" );
+
+ MavenProject project = mavenRuntime.getProject( klass );
+
+ close( classLoader1 );
+ close( classLoader2 );
+
+ assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", project );
+ }
+
// getProjects tests ------------------------------------------------------
public void testGetProjectsWithSingleJar()
@@ -264,6 +508,82 @@
}, projects );
}
+ public void testGetProjectsWithMultipleVersions()
+ throws TestToolsException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2 } );
+
+ List projects = mavenRuntime.getProjects( classLoader );
+
+ close( classLoader );
+
+ assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", projects );
+ }
+
+ public void testGetProjectsWithMultipleVersionsReversed()
+ throws TestToolsException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( new File[] { jar2, jar1 } );
+
+ List projects = mavenRuntime.getProjects( classLoader );
+
+ close( classLoader );
+
+ assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", projects );
+ }
+
+ public void testGetProjectsWithParentDelegation()
+ throws TestToolsException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader1 = newClassLoader( jar1 );
+ URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1 );
+
+ List projects = mavenRuntime.getProjects( classLoader2 );
+
+ close( classLoader1 );
+ close( classLoader2 );
+
+ assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", projects );
+ }
+
+ public void testGetProjectsWithChildDelegation()
+ throws TestToolsException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader1 = newClassLoader( jar1 );
+ URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1, true );
+
+ List projects = mavenRuntime.getProjects( classLoader2 );
+
+ close( classLoader1 );
+ close( classLoader2 );
+
+ assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", projects );
+ }
+
// getSortedProjects tests ------------------------------------------------
public void testGetSortedProjectsWithSingleJar()
@@ -328,6 +648,82 @@
}, projects );
}
+ public void testGetSortedProjectsWithMultipleVersions()
+ throws TestToolsException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2 } );
+
+ List projects = mavenRuntime.getSortedProjects( classLoader );
+
+ close( classLoader );
+
+ assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", projects );
+ }
+
+ public void testGetSortedProjectsWithMultipleVersionsReversed()
+ throws TestToolsException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( new File[] { jar2, jar1 } );
+
+ List projects = mavenRuntime.getSortedProjects( classLoader );
+
+ close( classLoader );
+
+ assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", projects );
+ }
+
+ public void testGetSortedProjectsWithParentDelegation()
+ throws TestToolsException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader1 = newClassLoader( jar1 );
+ URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1 );
+
+ List projects = mavenRuntime.getSortedProjects( classLoader2 );
+
+ close( classLoader1 );
+ close( classLoader2 );
+
+ assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", projects );
+ }
+
+ public void testGetSortedProjectsWithChildDelegation()
+ throws TestToolsException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+ packageProject( "testSingleJar2/pom.xml" );
+
+ File jar1 = getPackage( "testSingleJar/pom.xml" );
+ File jar2 = getPackage( "testSingleJar2/pom.xml" );
+
+ URLClassLoader classLoader1 = newClassLoader( jar1 );
+ URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1, true );
+
+ List projects = mavenRuntime.getSortedProjects( classLoader2 );
+
+ close( classLoader1 );
+ close( classLoader2 );
+
+ assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", projects );
+ }
+
// private methods --------------------------------------------------------
private void packageProject( String pomPath ) throws TestToolsException
@@ -358,11 +754,33 @@
private URLClassLoader newClassLoader( File file ) throws MalformedURLException
{
- return newClassLoader( new File[] { file } );
+ return newClassLoader( file, null );
+ }
+
+ private URLClassLoader newClassLoader( File file, ClassLoader parent ) throws MalformedURLException
+ {
+ return newClassLoader( file, parent, false );
+ }
+
+ private URLClassLoader newClassLoader( File file, ClassLoader parent, boolean childDelegation )
+ throws MalformedURLException
+ {
+ return newClassLoader( new File[] { file }, parent, childDelegation );
}
private URLClassLoader newClassLoader( File[] files ) throws MalformedURLException
{
+ return newClassLoader( files, null );
+ }
+
+ private URLClassLoader newClassLoader( File[] files, ClassLoader parent ) throws MalformedURLException
+ {
+ return newClassLoader( files, parent, false );
+ }
+
+ private URLClassLoader newClassLoader( File[] files, ClassLoader parent, boolean childDelegation )
+ throws MalformedURLException
+ {
URL[] urls = new URL[files.length];
for ( int i = 0; i < files.length; i++ )
@@ -370,7 +788,18 @@
urls[i] = files[i].toURI().toURL();
}
- return new URLClassLoader( urls, null );
+ URLClassLoader classLoader;
+
+ if ( childDelegation )
+ {
+ classLoader = new ChildDelegatingClassLoader( urls, parent );
+ }
+ else
+ {
+ classLoader = new URLClassLoader( urls, parent );
+ }
+
+ return classLoader;
}
private void close( URLClassLoader classLoader ) throws IOException
Added: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/pom.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/pom.xml?rev=633133&view=auto
==============================================================================
--- maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/pom.xml (added)
+++ maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/pom.xml Mon Mar 3 07:33:20 2008
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ ~ 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.
+ -->
+
+<project
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
+>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.apache.maven.shared.runtime.tests</groupId>
+ <artifactId>testSingleJar</artifactId>
+ <packaging>jar</packaging>
+ <version>2.0</version>
+
+</project>
Propchange: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/pom.xml
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/src/main/java/DefaultPackageClass.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/src/main/java/DefaultPackageClass.java?rev=633133&view=auto
==============================================================================
--- maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/src/main/java/DefaultPackageClass.java (added)
+++ maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/src/main/java/DefaultPackageClass.java Mon Mar 3 07:33:20 2008
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+/**
+ * Placeholder class for use by tests.
+ *
+ * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
+ * @version $Id$
+ */
+public class DefaultPackageClass
+{
+ // simple class
+}
Propchange: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/src/main/java/DefaultPackageClass.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar2/src/main/java/DefaultPackageClass.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"