Author: sisbell
Date: Sat Sep 13 21:25:49 2008
New Revision: 695110

URL: http://svn.apache.org/viewvc?rev=695110&view=rev
Log:
Fix: MNG3747 - Added three phases to interpolation: (1) interpolate properties 
not using build/directory(s); (2) set absolute paths; (3) interpolate using 
build/directories.

Modified:
    
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/builder/PomClassicTransformer.java
    
maven/components/trunk/maven-shared-model/src/main/java/org/apache/maven/shared/model/ModelTransformer.java
    
maven/components/trunk/maven-shared-model/src/main/java/org/apache/maven/shared/model/ModelTransformerContext.java

Modified: 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/builder/PomClassicTransformer.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/builder/PomClassicTransformer.java?rev=695110&r1=695109&r2=695110&view=diff
==============================================================================
--- 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/builder/PomClassicTransformer.java
 (original)
+++ 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/builder/PomClassicTransformer.java
 Sat Sep 13 21:25:49 2008
@@ -243,10 +243,10 @@
     }
 
     /**
-     * @see ModelTransformer#transformToModelProperties(java.util.List, 
java.util.List)
+     * @see ModelTransformer#transformToModelProperties(java.util.List
      */
-    public List<ModelProperty> transformToModelProperties( List<DomainModel> 
domainModels, 
-                                                           
List<InterpolatorProperty> interpolatorProperties)
+    public List<ModelProperty> transformToModelProperties(List<DomainModel> 
domainModels
+    )
         throws IOException
     {
         if ( domainModels == null || domainModels.isEmpty() )
@@ -484,11 +484,17 @@
             modelProperties.removeAll( clearedProperties );
         }
 
-        interpolateModelProperties( modelProperties, interpolatorProperties, 
((PomClassicDomainModel) domainModels.get(0)) );
-        
         return modelProperties;
     }
 
+    public void interpolateModelProperties(List<ModelProperty> modelProperties,
+                                           List<InterpolatorProperty> 
interpolatorProperties,
+                                           DomainModel domainModel)
+            throws IOException
+    {
+        interpolateModelProperties( modelProperties, interpolatorProperties, 
(PomClassicDomainModel) domainModel);
+    }
+
     public static String interpolateXmlString( String xml, 
List<InterpolatorProperty> interpolatorProperties )
             throws IOException
     {
@@ -541,32 +547,36 @@
                                                    PomClassicDomainModel 
domainModel)
            throws IOException
     {
-        //RULE: No Self-Referential Properties
-        /*
+
+        Map<String, String> aliases = new HashMap<String, String>();
+        aliases.put( "project.", "pom.");
+
+        List<ModelProperty> firstPassModelProperties = new 
ArrayList<ModelProperty>();
+        List<ModelProperty> secondPassModelProperties = new 
ArrayList<ModelProperty>();
+
+        ModelProperty buildProperty = new ModelProperty(ProjectUri.Build.xUri, 
null);
         for(ModelProperty mp : modelProperties)
         {
-            if(mp.getUri().startsWith( ProjectUri.properties ) && 
mp.getValue() != null)
+            if( mp.getValue() != null && !mp.getUri().contains( "#property" ) 
&& !mp.getUri().contains( "#collection" ))
             {
-                String name = mp.getUri().substring( mp.getUri().lastIndexOf( 
"/" ) + 1, mp.getUri().length() );
-                if( mp.getValue().equals( "${" + name + "}") )
+                if( !buildProperty.isParentOf( mp ) || 
mp.getUri().equals(ProjectUri.Build.finalName ) )
                 {
-                    throw new IOException( "Self-Referential reference in pom: 
Name = " + name );
+                    firstPassModelProperties.add(mp);
+                }
+                else
+                {
+                    secondPassModelProperties.add(mp);
                 }
             }
         }
-        */
-        Map<String, String> aliases = new HashMap<String, String>();
-        aliases.put( "project.", "pom.");
-
-        List<InterpolatorProperty> ips = new 
ArrayList<InterpolatorProperty>(interpolatorProperties);
-        
ips.addAll(ModelTransformerContext.createInterpolatorProperties(modelProperties,
 ProjectUri.baseUri, aliases,
-                        false, false));
 
+        String basedir = domainModel.getProjectDirectory().getAbsolutePath();
+        List<InterpolatorProperty> standardInterpolatorProperties = new 
ArrayList<InterpolatorProperty>();
         if(domainModel.isPomInBuild())
         {
-            ips.add(new InterpolatorProperty("${project.basedir}", 
domainModel.getProjectDirectory().getAbsolutePath()));
-            ips.add(new InterpolatorProperty("${basedir}", 
domainModel.getProjectDirectory().getAbsolutePath()));
-            ips.add(new InterpolatorProperty("${pom.basedir}", 
domainModel.getProjectDirectory().getAbsolutePath()));
+            standardInterpolatorProperties.add(new 
InterpolatorProperty("${project.basedir}", basedir ));
+            standardInterpolatorProperties.add(new 
InterpolatorProperty("${basedir}", basedir ));
+            standardInterpolatorProperties.add(new 
InterpolatorProperty("${pom.basedir}", basedir ));
 
         }
 
@@ -575,12 +585,49 @@
             if(mp.getUri().startsWith(ProjectUri.properties) && mp.getValue() 
!= null )
             {
                 String uri = mp.getUri();
-                ips.add( new InterpolatorProperty( "${" + uri.substring( 
uri.lastIndexOf( "/" ) + 1,
+                standardInterpolatorProperties.add( new InterpolatorProperty( 
"${" + uri.substring( uri.lastIndexOf( "/" ) + 1,
                         uri.length() ) + "}", mp.getValue() ) );
             }
         }
 
-        ModelTransformerContext.interpolateModelProperties( modelProperties, 
ips );
+        //FIRST PASS - Withhold using build directories as interpolator 
properties
+        List<InterpolatorProperty> ips1 = new 
ArrayList<InterpolatorProperty>(interpolatorProperties);
+        
ips1.addAll(ModelTransformerContext.createInterpolatorProperties(firstPassModelProperties,
 ProjectUri.baseUri, aliases,
+                        false, false));
+        ips1.addAll(standardInterpolatorProperties);
+
+        ModelTransformerContext.interpolateModelProperties( modelProperties, 
ips1 );
+
+        //SECOND PASS - Set absolute paths on build directories
+        if( domainModel.isPomInBuild() )
+        {
+            Map<ModelProperty, ModelProperty> buildDirectories = new 
HashMap<ModelProperty, ModelProperty>();
+            for(ModelProperty mp : secondPassModelProperties)
+            {
+                if(mp.getUri().equals( ProjectUri.Build.directory ))
+                {
+                    File file = new File(mp.getResolvedValue());
+                    if( !file.isAbsolute() )
+                    {
+                        buildDirectories.put(mp, new 
ModelProperty(mp.getUri(), new File(basedir, 
file.getPath()).getAbsolutePath()));
+                    }
+                }
+            }
+
+            for ( Map.Entry<ModelProperty, ModelProperty> e : 
buildDirectories.entrySet() )
+            {
+                secondPassModelProperties.remove( e.getKey() );
+                secondPassModelProperties.add(e.getValue() );
+            }
+        }
+
+        //THIRD PASS - Use build directories as interpolator properties
+        List<InterpolatorProperty> ips2 = new 
ArrayList<InterpolatorProperty>(interpolatorProperties);
+        
ips2.addAll(ModelTransformerContext.createInterpolatorProperties(secondPassModelProperties,
 ProjectUri.baseUri, aliases,
+                        false, false));
+        ips2.addAll(standardInterpolatorProperties);
+
+        ModelTransformerContext.interpolateModelProperties( modelProperties, 
ips2 );
     }
 
     private static boolean hasExecutionId( ModelContainer executionContainer )

Modified: 
maven/components/trunk/maven-shared-model/src/main/java/org/apache/maven/shared/model/ModelTransformer.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-shared-model/src/main/java/org/apache/maven/shared/model/ModelTransformer.java?rev=695110&r1=695109&r2=695110&view=diff
==============================================================================
--- 
maven/components/trunk/maven-shared-model/src/main/java/org/apache/maven/shared/model/ModelTransformer.java
 (original)
+++ 
maven/components/trunk/maven-shared-model/src/main/java/org/apache/maven/shared/model/ModelTransformer.java
 Sat Sep 13 21:25:49 2008
@@ -49,8 +49,18 @@
      * @param domainModels list of domain models to transform to a list of 
model properties. List may not be null.
      * @return list of model properties
      */
-    List<ModelProperty> transformToModelProperties( List<DomainModel> 
domainModels,
-                                                    List<InterpolatorProperty> 
interpolatorProperties)
+    List<ModelProperty> transformToModelProperties(List<DomainModel> 
domainModels )
         throws IOException;
 
+    /**
+     *
+     * @param modelProperties
+     * @param interpolatorProperties
+     * @param domainModel
+     * @throws IOException
+     */
+    void interpolateModelProperties(List<ModelProperty> modelProperties,
+                                    List<InterpolatorProperty> 
interpolatorProperties,
+                                    DomainModel domainModel)
+        throws IOException;
 }

Modified: 
maven/components/trunk/maven-shared-model/src/main/java/org/apache/maven/shared/model/ModelTransformerContext.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-shared-model/src/main/java/org/apache/maven/shared/model/ModelTransformerContext.java?rev=695110&r1=695109&r2=695110&view=diff
==============================================================================
--- 
maven/components/trunk/maven-shared-model/src/main/java/org/apache/maven/shared/model/ModelTransformerContext.java
 (original)
+++ 
maven/components/trunk/maven-shared-model/src/main/java/org/apache/maven/shared/model/ModelTransformerContext.java
 Sat Sep 13 21:25:49 2008
@@ -201,7 +201,7 @@
     {
 
         List<ModelProperty> transformedProperties =
-                importModelProperties(importModels, 
fromModelTransformer.transformToModelProperties( domainModels, 
interpolatorProperties ));
+                importModelProperties(importModels, 
fromModelTransformer.transformToModelProperties( domainModels));
 
         String baseUriForModel = fromModelTransformer.getBaseUri();
         List<ModelProperty> modelProperties =
@@ -265,9 +265,10 @@
 
 
         List<ModelProperty> mps = modelDataSource.getModelProperties();
-        //interpolateModelProperties( mps, baseUriForModel );
         mps = sort( mps, baseUriForModel );
 
+        fromModelTransformer.interpolateModelProperties( mps, 
interpolatorProperties, domainModels.get(0));
+
         try
         {
             DomainModel domainModel = 
toModelTransformer.transformToDomainModel( mps );


Reply via email to