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"