Author: jdcasey
Date: Mon Feb 20 13:52:03 2006
New Revision: 379247

URL: http://svn.apache.org/viewcvs?rev=379247&view=rev
Log:
[MNG-2006] Changed the model inheritance assembler to allow the project builder 
to pass in a child path adjustment String, which is the module path of the 
child in the parent POM. This can be used to realign the URLs of the child POM 
in addition to simply appending the child path to the parent.

Modified:
    
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
    
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/MavenProject.java
    
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java
    
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/ModelInheritanceAssembler.java
    
maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssemblerTest.java

Modified: 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java?rev=379247&r1=379246&r2=379247&view=diff
==============================================================================
--- 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
 (original)
+++ 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
 Mon Feb 20 13:52:03 2006
@@ -686,6 +686,8 @@
         project.setOriginalModel( originalModel );
 
         // we don't have to force the collision exception for superModel here, 
it's already been done in getSuperModel()
+        MavenProject previousProject = superProject;
+        
         Model previous = superProject.getModel();
 
         for ( Iterator i = lineage.iterator(); i.hasNext(); )
@@ -693,10 +695,22 @@
             MavenProject currentProject = (MavenProject) i.next();
 
             Model current = currentProject.getModel();
+            
+            String pathAdjustment = null;
+            
+            try
+            {
+                pathAdjustment = previousProject.getModulePathAdjustment( 
currentProject );
+            }
+            catch ( IOException e )
+            {
+                getLogger().debug( "Cannot determine whether " + 
currentProject.getId() + " is a module of " + previousProject.getId() + ". 
Reason: " + e.getMessage(), e );
+            }
 
-            modelInheritanceAssembler.assembleModelInheritance( current, 
previous );
+            modelInheritanceAssembler.assembleModelInheritance( current, 
previous, pathAdjustment );
 
             previous = current;
+            previousProject = currentProject;
         }
 
         // only add the super repository if it wasn't overridden by a profile 
or project

Modified: 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/MavenProject.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/MavenProject.java?rev=379247&r1=379246&r2=379247&view=diff
==============================================================================
--- 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/MavenProject.java
 (original)
+++ 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/MavenProject.java
 Mon Feb 20 13:52:03 2006
@@ -135,6 +135,8 @@
     private Build buildOverlay;
 
     private boolean executionRoot;
+    
+    private Map moduleFiles;
 
     public MavenProject( Model model )
     {
@@ -187,6 +189,44 @@
         this.executionRoot = project.executionRoot;
 
         this.artifact = ArtifactUtils.copyArtifact( project.artifact );
+    }
+    
+    public String getModulePathAdjustment( MavenProject moduleProject ) throws 
IOException
+    {
+        File module = moduleProject.getFile();
+        
+        if ( module == null )
+        {
+            return null;
+        }
+        
+        module = module.getCanonicalFile();
+        
+        if ( moduleFiles == null )
+        {
+            moduleFiles = new HashMap();
+            
+            List modules = getModules();
+            File myFile = getFile();
+            
+            if ( myFile != null )
+            {
+                File myDir = myFile.getCanonicalFile().getParentFile();
+                if ( modules != null )
+                {
+                    for ( Iterator it = modules.iterator(); it.hasNext(); )
+                    {
+                        String modulePath = (String) it.next();
+
+                        File moduleFile = new File( myDir, modulePath 
).getCanonicalFile();
+
+                        moduleFiles.put( moduleFile, modulePath );
+                    }
+                }
+            }            
+        }
+        
+        return (String) moduleFiles.get( module );
     }
 
     // ----------------------------------------------------------------------

Modified: 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java?rev=379247&r1=379246&r2=379247&view=diff
==============================================================================
--- 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java
 (original)
+++ 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java
 Mon Feb 20 13:52:03 2006
@@ -16,6 +16,15 @@
  * limitations under the License.
  */
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
+
 import org.apache.maven.model.Build;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.DependencyManagement;
@@ -29,14 +38,6 @@
 import org.apache.maven.project.ModelUtils;
 import org.codehaus.plexus.util.StringUtils;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.TreeMap;
-
 /**
  * @author <a href="mailto:[EMAIL PROTECTED]">Jason van Zyl </a>
  * @version $Id: DefaultModelInheritanceAssembler.java,v 1.4 2004/08/23 
20:24:54
@@ -48,15 +49,20 @@
 {
     public void copyModel( Model dest, Model source )
     {
-        assembleModelInheritance( dest, source, false );
+        assembleModelInheritance( dest, source, null, false );
+    }
+
+    public void assembleModelInheritance( Model child, Model parent, String 
childPathAdjustment )
+    {
+        assembleModelInheritance( child, parent, childPathAdjustment, true );
     }
 
     public void assembleModelInheritance( Model child, Model parent )
     {
-        assembleModelInheritance( child, parent, true );
+        assembleModelInheritance( child, parent, null, true );
     }
 
-    private void assembleModelInheritance( Model child, Model parent, boolean 
appendPaths )
+    private void assembleModelInheritance( Model child, Model parent, String 
childPathAdjustment, boolean appendPaths )
     {
         // cannot inherit from null parent.
         if ( parent == null )
@@ -93,7 +99,7 @@
         {
             if ( parent.getUrl() != null )
             {
-                child.setUrl( appendPath( parent.getUrl(), 
child.getArtifactId(), appendPaths ) );
+                child.setUrl( appendPath( parent.getUrl(), 
child.getArtifactId(), childPathAdjustment, appendPaths ) );
             }
             else
             {
@@ -105,7 +111,7 @@
         // Distribution
         // 
----------------------------------------------------------------------
 
-        assembleDistributionInheritence( child, parent, appendPaths );
+        assembleDistributionInheritence( child, parent, childPathAdjustment, 
appendPaths );
 
         // issueManagement
         if ( child.getIssueManagement() == null )
@@ -126,7 +132,7 @@
         }
 
         // Scm
-        assembleScmInheritance( child, parent, appendPaths );
+        assembleScmInheritance( child, parent, childPathAdjustment, 
appendPaths );
 
         // ciManagement
         if ( child.getCiManagement() == null )
@@ -399,7 +405,7 @@
         }
     }
 
-    private void assembleScmInheritance( Model child, Model parent, boolean 
appendPaths )
+    private void assembleScmInheritance( Model child, Model parent, String 
childPathAdjustment, boolean appendPaths )
     {
         if ( parent.getScm() != null )
         {
@@ -416,7 +422,7 @@
 
             if ( StringUtils.isEmpty( childScm.getConnection() ) && 
!StringUtils.isEmpty( parentScm.getConnection() ) )
             {
-                childScm.setConnection( appendPath( parentScm.getConnection(), 
child.getArtifactId(), appendPaths ) );
+                childScm.setConnection( appendPath( parentScm.getConnection(), 
child.getArtifactId(), childPathAdjustment, appendPaths ) );
             }
 
             if ( StringUtils.isEmpty( childScm.getDeveloperConnection() ) &&
@@ -424,17 +430,17 @@
             {
                 childScm
                     .setDeveloperConnection(
-                        appendPath( parentScm.getDeveloperConnection(), 
child.getArtifactId(), appendPaths ) );
+                        appendPath( parentScm.getDeveloperConnection(), 
child.getArtifactId(), childPathAdjustment, appendPaths ) );
             }
 
             if ( StringUtils.isEmpty( childScm.getUrl() ) && 
!StringUtils.isEmpty( parentScm.getUrl() ) )
             {
-                childScm.setUrl( appendPath( parentScm.getUrl(), 
child.getArtifactId(), appendPaths ) );
+                childScm.setUrl( appendPath( parentScm.getUrl(), 
child.getArtifactId(), childPathAdjustment, appendPaths ) );
             }
         }
     }
 
-    private void assembleDistributionInheritence( Model child, Model parent, 
boolean appendPaths )
+    private void assembleDistributionInheritence( Model child, Model parent, 
String childPathAdjustment, boolean appendPaths )
     {
         if ( parent.getDistributionManagement() != null )
         {
@@ -465,7 +471,7 @@
 
                     if ( site.getUrl() != null )
                     {
-                        site.setUrl( appendPath( site.getUrl(), 
child.getArtifactId(), appendPaths ) );
+                        site.setUrl( appendPath( site.getUrl(), 
child.getArtifactId(), childPathAdjustment, appendPaths ) );
                     }
                 }
             }
@@ -508,23 +514,78 @@
         }
     }
 
-    private String appendPath( String url, String path, boolean appendPaths )
+    protected String appendPath( String parentPath, String childPath, String 
pathAdjustment, boolean appendPaths )
     {
+        List pathFragments = new ArrayList();
+        
+        String rootPath = parentPath;
+
+        String protocol = null;
+        int protocolIdx = rootPath.indexOf( "://" );
+        
+        if ( protocolIdx > -1 )
+        {
+            protocol = rootPath.substring( 0, protocolIdx + 3 );
+            rootPath = rootPath.substring( protocolIdx + 3 );
+        }
+        
+        pathFragments.add( rootPath );
+        
         if ( appendPaths )
         {
-            if ( url.endsWith( "/" ) )
+            if ( pathAdjustment != null )
             {
-                return url + path;
+                pathFragments.add( pathAdjustment );
             }
-            else
+            
+            pathFragments.add( childPath );
+        }
+        
+        StringBuffer cleanedPath = new StringBuffer();
+        
+        if ( protocol != null )
+        {
+            cleanedPath.append( protocol );
+        }
+        
+        if ( rootPath.startsWith( "/" ) )
+        {
+            cleanedPath.append( '/' );
+        }
+        
+        String lastToken = null;
+        String currentToken = null;
+        
+        for ( Iterator it = pathFragments.iterator(); it.hasNext(); )
+        {
+            String pathFragment = (String) it.next();
+            
+            StringTokenizer tokens = new StringTokenizer( pathFragment, "/" );
+            
+            while( tokens.hasMoreTokens() )
             {
-                return url + "/" + path;
+                lastToken = currentToken;
+                currentToken = tokens.nextToken();
+                
+                if ( "..".equals( currentToken ) )
+                {
+                    // trim the previous path part off...
+                    cleanedPath.setLength( cleanedPath.length() - ( 
lastToken.length() + 1 ) );
+                }
+                else if ( !".".equals( currentToken ) )
+                {
+                    // don't worry about /./ self-references.
+                    cleanedPath.append( currentToken ).append( '/' );
+                }
             }
         }
-        else
+        
+        if ( !childPath.endsWith( "/" ) && appendPaths )
         {
-            return url;
+            cleanedPath.setLength( cleanedPath.length() - 1 );
         }
+        
+        return cleanedPath.toString();
     }
 
 }

Modified: 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/ModelInheritanceAssembler.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/ModelInheritanceAssembler.java?rev=379247&r1=379246&r2=379247&view=diff
==============================================================================
--- 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/ModelInheritanceAssembler.java
 (original)
+++ 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/ModelInheritanceAssembler.java
 Mon Feb 20 13:52:03 2006
@@ -26,6 +26,8 @@
 {
     String ROLE = ModelInheritanceAssembler.class.getName();
 
+    void assembleModelInheritance( Model child, Model parent, String 
childPathAdjustment );
+
     void assembleModelInheritance( Model child, Model parent );
 
     void copyModel( Model dest, Model source );

Modified: 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssemblerTest.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssemblerTest.java?rev=379247&r1=379246&r2=379247&view=diff
==============================================================================
--- 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssemblerTest.java
 (original)
+++ 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssemblerTest.java
 Mon Feb 20 13:52:03 2006
@@ -43,6 +43,19 @@
     extends TestCase
 {
     private ModelInheritanceAssembler assembler = new 
DefaultModelInheritanceAssembler();
+    
+    public void testShouldAppendPathWithChildPathAdjustment()
+    {
+        String parentPath = 
"http://maven.apache.org/shared/maven-shared-parent";;
+        String childPath = "file-management";
+        String pathAdjustment = "..";
+        
+        String result = ((DefaultModelInheritanceAssembler) 
assembler).appendPath( parentPath, childPath, pathAdjustment, true );
+        
+        System.out.println( "Resulting path is: \'" + result + "\'" );
+        
+        assertEquals( "Append with path adjustment failed.", 
"http://maven.apache.org/shared/file-management";, result );
+    }
 
     public void testShouldOverrideUnitTestExcludesOnly()
     {


Reply via email to