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/02/29 17:14:43 UTC
svn commit: r632372 - in /maven/sandbox/trunk/shared/maven-runtime/src:
main/java/org/apache/maven/shared/runtime/
test/java/org/apache/maven/shared/runtime/
test/resources/testSingleJar/src/ test/resources/testSingleJar/src/main/
test/resources/testSi...
Author: markh
Date: Fri Feb 29 08:14:34 2008
New Revision: 632372
URL: http://svn.apache.org/viewvc?rev=632372&view=rev
Log:
Added methods to MavenRuntime to get Maven project XML/properties from a Class
Added:
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/DefaultPackageClass.java (with props)
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/PackagedClass.java (with props)
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/b/
maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/b/SubPackagedClass.java (with props)
Modified:
maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/DefaultMavenRuntime.java
maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/MavenRuntime.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/DefaultMavenRuntime.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/DefaultMavenRuntime.java?rev=632372&r1=632371&r2=632372&view=diff
==============================================================================
--- maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/DefaultMavenRuntime.java (original)
+++ maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/DefaultMavenRuntime.java Fri Feb 29 08:14:34 2008
@@ -21,6 +21,8 @@
import java.util.List;
+import org.apache.maven.project.MavenProject;
+
/**
* Default implementation of <code>MavenRuntime</code>.
*
@@ -32,6 +34,18 @@
public class DefaultMavenRuntime implements MavenRuntime
{
// MavenRuntime methods ---------------------------------------------------
+
+ /**
+ * {@inheritDoc}
+ */
+ public MavenProjectProperties getProjectProperties( Class klass ) throws MavenRuntimeException
+ {
+ PropertiesMavenRuntimeVisitor visitor = new PropertiesMavenRuntimeVisitor();
+
+ MavenRuntimeVisitorUtils.accept( klass, visitor );
+
+ return (MavenProjectProperties) first( visitor.getProjects() );
+ }
/**
* {@inheritDoc}
@@ -44,6 +58,18 @@
return visitor.getProjects();
}
+
+ /**
+ * {@inheritDoc}
+ */
+ public MavenProject getProject( Class klass ) throws MavenRuntimeException
+ {
+ XMLMavenRuntimeVisitor visitor = new XMLMavenRuntimeVisitor();
+
+ MavenRuntimeVisitorUtils.accept( klass, visitor );
+
+ return (MavenProject) first( visitor.getProjects() );
+ }
/**
* {@inheritDoc}
@@ -67,5 +93,19 @@
MavenRuntimeVisitorUtils.accept( classLoader, visitor );
return visitor.getSortedProjects();
+ }
+
+ // private methods --------------------------------------------------------
+
+ /**
+ * Gets the first element in the specified list or <code>null</code> if it is empty.
+ *
+ * @param list
+ * the list to examine
+ * @return the first item in the list, or <code>null</code> if it is empty
+ */
+ private Object first( List list )
+ {
+ return !list.isEmpty() ? list.get( 0 ) : null;
}
}
Modified: maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/MavenRuntime.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/MavenRuntime.java?rev=632372&r1=632371&r2=632372&view=diff
==============================================================================
--- maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/MavenRuntime.java (original)
+++ maven/sandbox/trunk/shared/maven-runtime/src/main/java/org/apache/maven/shared/runtime/MavenRuntime.java Fri Feb 29 08:14:34 2008
@@ -21,6 +21,8 @@
import java.util.List;
+import org.apache.maven.project.MavenProject;
+
/**
* Provides methods to introspect the current Maven runtime environment.
*
@@ -39,6 +41,17 @@
// public methods ---------------------------------------------------------
/**
+ * Gets the properties for the specified class's Maven project.
+ *
+ * @param klass
+ * the class to introspect
+ * @return the properties for the specified class's Maven project
+ * @throws MavenRuntimeException
+ * if an error occurred introspecting the Maven runtime environment
+ */
+ MavenProjectProperties getProjectProperties( Class klass ) throws MavenRuntimeException;
+
+ /**
* Obtains a list of simple properties for each Maven project running within the specified class loader.
*
* @param classLoader
@@ -49,6 +62,17 @@
* if an error occurred introspecting the Maven runtime environment
*/
List getProjectProperties( ClassLoader classLoader ) throws MavenRuntimeException;
+
+ /**
+ * Gets the specified class's Maven project.
+ *
+ * @param klass
+ * the class to introspect
+ * @return the specified class's Maven project
+ * @throws MavenRuntimeException
+ * if an error occurred introspecting the Maven runtime environment
+ */
+ MavenProject getProject( Class klass ) throws MavenRuntimeException;
/**
* Obtains a list of Maven projects running within the specified class loader.
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=632372&r1=632371&r2=632372&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 Fri Feb 29 08:14:34 2008
@@ -28,6 +28,7 @@
import java.util.jar.JarInputStream;
import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.StringUtils;
/**
* Provides various methods of applying Maven runtime visitors.
@@ -87,6 +88,29 @@
}
/**
+ * Invokes the specified visitor on the specified class's Maven project.
+ *
+ * @param klass
+ * the class to introspect
+ * @param visitor
+ * the visitor to invoke
+ * @throws MavenRuntimeException
+ * if an error occurs visiting the projects
+ */
+ public static void accept( Class klass, MavenRuntimeVisitor visitor )
+ throws MavenRuntimeException
+ {
+ try
+ {
+ accept( getBaseURL( klass ), visitor );
+ }
+ catch ( MalformedURLException exception )
+ {
+ throw new MavenRuntimeException( "Cannot obtain base URL for class: " + klass.getName(), exception );
+ }
+ }
+
+ /**
* Invokes the specified visitor on all Maven projects found within the specified URL.
*
* @param url
@@ -257,5 +281,58 @@
}
return true;
+ }
+
+ /**
+ * Gets a URL to the specified class's default package. For example, if the class <code>foo.Bar</code> is
+ * supplied, then a URL to the directory above <code>foo</code> is returned. If the class's default package
+ * resides at the root of a Jar, then a URL to the Jar file itself is returned.
+ *
+ * @param klass
+ * the class to obtain the base URL for
+ * @return a URL to the class's default package, or a URL to the owning Jar file if the default package resides at
+ * the root of a Jar
+ * @throws MalformedURLException
+ * if the base URL cannot be determined
+ */
+ private static URL getBaseURL( Class klass )
+ throws MalformedURLException
+ {
+ URL url = getURL( klass );
+
+ String className = klass.getName();
+
+ int n = StringUtils.countMatches( className, "." );
+ String relativePath = StringUtils.repeat( "../", n );
+
+ URL baseURL = new URL( url, relativePath );
+
+ // unwrap Jar URL if at the root
+ if ( "jar".equals( baseURL.getProtocol() ) && baseURL.getPath().endsWith( "!/" ) )
+ {
+ String basePath = baseURL.getPath();
+
+ basePath = basePath.substring( 0, basePath.length() - "!/".length() );
+
+ baseURL = new URL( basePath );
+ }
+
+ return baseURL;
+ }
+
+ /**
+ * Gets a URL to the specified class.
+ *
+ * @param klass
+ * the class to obtain the URL for
+ * @return a URL to the class, or <code>null</code> if it cannot be found
+ */
+ private static URL getURL( Class klass )
+ {
+ ClassLoader classLoader = klass.getClassLoader();
+
+ String path = klass.getName().replace( '.', '/' ) + ".class";
+
+ return classLoader.getResource( path );
}
}
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=632372&r1=632371&r2=632372&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 Fri Feb 29 08:14:34 2008
@@ -70,6 +70,114 @@
// tests ------------------------------------------------------------------
+ public void testGetProjectPropertiesWithDefaultPackageClass()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+
+ File jar = getPackage( "testSingleJar/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( jar );
+
+ 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 testGetProjectPropertiesWithPackagedClass()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+
+ File jar = getPackage( "testSingleJar/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( jar );
+
+ Class klass = classLoader.loadClass( "a.PackagedClass" );
+
+ MavenProjectProperties properties = mavenRuntime.getProjectProperties( klass );
+
+ close( classLoader );
+
+ assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
+ }
+
+ public void testGetProjectPropertiesWithSubPackagedClass()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+
+ File jar = getPackage( "testSingleJar/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( jar );
+
+ Class klass = classLoader.loadClass( "a.b.SubPackagedClass" );
+
+ MavenProjectProperties properties = mavenRuntime.getProjectProperties( klass );
+
+ close( classLoader );
+
+ assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
+ }
+
+ public void testGetProjectWithDefaultPackageClass()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+
+ File jar = getPackage( "testSingleJar/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( jar );
+
+ 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 testGetProjectWithPackagedClass()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+
+ File jar = getPackage( "testSingleJar/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( jar );
+
+ Class klass = classLoader.loadClass( "a.PackagedClass" );
+
+ MavenProject project = mavenRuntime.getProject( klass );
+
+ close( classLoader );
+
+ assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", project );
+ }
+
+ public void testGetProjectWithSubPackagedClass()
+ throws TestToolsException, ClassNotFoundException, MavenRuntimeException, IOException
+ {
+ packageProject( "testSingleJar/pom.xml" );
+
+ File jar = getPackage( "testSingleJar/pom.xml" );
+
+ URLClassLoader classLoader = newClassLoader( jar );
+
+ Class klass = classLoader.loadClass( "a.b.SubPackagedClass" );
+
+ MavenProject project = mavenRuntime.getProject( klass );
+
+ close( classLoader );
+
+ assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", project );
+ }
+
public void testGetSortedProjectsWithSingleJar()
throws TestToolsException, MavenRuntimeException, IOException
{
@@ -187,6 +295,23 @@
}
}
+ private void assertMavenProjectProperties( String id, MavenProjectProperties properties )
+ {
+ String[] tokens = id.split( ":" );
+
+ assertMavenProjectProperties( tokens[0], tokens[1], tokens[2], properties );
+ }
+
+ private void assertMavenProjectProperties( String groupId, String artifactId, String version,
+ MavenProjectProperties properties )
+ {
+ assertNotNull( "Project properties are null", properties );
+
+ assertEquals( "Group id", groupId, properties.getGroupId() );
+ assertEquals( "Artifact id", artifactId, properties.getArtifactId() );
+ assertEquals( "Version", version, properties.getVersion() );
+ }
+
private void assertMavenProjects( String id, List projects )
{
assertMavenProjects( new String[] { id }, projects );
Added: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/DefaultPackageClass.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/DefaultPackageClass.java?rev=632372&view=auto
==============================================================================
--- maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/DefaultPackageClass.java (added)
+++ maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/DefaultPackageClass.java Fri Feb 29 08:14:34 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/testSingleJar/src/main/java/DefaultPackageClass.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/DefaultPackageClass.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/PackagedClass.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/PackagedClass.java?rev=632372&view=auto
==============================================================================
--- maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/PackagedClass.java (added)
+++ maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/PackagedClass.java Fri Feb 29 08:14:34 2008
@@ -0,0 +1,31 @@
+package a;
+
+/*
+ * 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 PackagedClass
+{
+ // simple class
+}
Propchange: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/PackagedClass.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/PackagedClass.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/b/SubPackagedClass.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/b/SubPackagedClass.java?rev=632372&view=auto
==============================================================================
--- maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/b/SubPackagedClass.java (added)
+++ maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/b/SubPackagedClass.java Fri Feb 29 08:14:34 2008
@@ -0,0 +1,31 @@
+package a.b;
+
+/*
+ * 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 SubPackagedClass
+{
+ // simple class
+}
Propchange: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/b/SubPackagedClass.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/shared/maven-runtime/src/test/resources/testSingleJar/src/main/java/a/b/SubPackagedClass.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"