You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by vs...@apache.org on 2011/01/11 14:28:29 UTC

svn commit: r1057614 - in /maven/plugins/trunk/maven-doap-plugin/src: main/java/org/apache/maven/plugin/doap/ test/java/org/apache/maven/plugin/doap/ test/resources/unit/doap-configuration/

Author: vsiveton
Date: Tue Jan 11 13:28:29 2011
New Revision: 1057614

URL: http://svn.apache.org/viewvc?rev=1057614&view=rev
Log:
o moved interpolate() to DoapUtil and take care of array
o using interpolate in doapOptions parameters
o improved/added test cases

Modified:
    maven/plugins/trunk/maven-doap-plugin/src/main/java/org/apache/maven/plugin/doap/DoapMojo.java
    maven/plugins/trunk/maven-doap-plugin/src/main/java/org/apache/maven/plugin/doap/DoapUtil.java
    maven/plugins/trunk/maven-doap-plugin/src/test/java/org/apache/maven/plugin/doap/DoapMojoTest.java
    maven/plugins/trunk/maven-doap-plugin/src/test/java/org/apache/maven/plugin/doap/DoapUtilTest.java
    maven/plugins/trunk/maven-doap-plugin/src/test/resources/unit/doap-configuration/doap-configuration-plugin-config.xml

Modified: maven/plugins/trunk/maven-doap-plugin/src/main/java/org/apache/maven/plugin/doap/DoapMojo.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-doap-plugin/src/main/java/org/apache/maven/plugin/doap/DoapMojo.java?rev=1057614&r1=1057613&r2=1057614&view=diff
==============================================================================
--- maven/plugins/trunk/maven-doap-plugin/src/main/java/org/apache/maven/plugin/doap/DoapMojo.java (original)
+++ maven/plugins/trunk/maven-doap-plugin/src/main/java/org/apache/maven/plugin/doap/DoapMojo.java Tue Jan 11 13:28:29 2011
@@ -52,7 +52,6 @@ import org.apache.maven.artifact.resolve
 import org.apache.maven.model.Contributor;
 import org.apache.maven.model.Developer;
 import org.apache.maven.model.License;
-import org.apache.maven.model.Scm;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.doap.options.ASFExtOptions;
@@ -72,11 +71,6 @@ import org.apache.maven.scm.repository.S
 import org.apache.maven.scm.repository.ScmRepositoryException;
 import org.apache.maven.settings.Settings;
 import org.codehaus.plexus.i18n.I18N;
-import org.codehaus.plexus.interpolation.EnvarBasedValueSource;
-import org.codehaus.plexus.interpolation.InterpolationException;
-import org.codehaus.plexus.interpolation.PrefixedObjectValueSource;
-import org.codehaus.plexus.interpolation.PropertiesBasedValueSource;
-import org.codehaus.plexus.interpolation.RegexBasedInterpolator;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.WriterFactory;
@@ -645,7 +639,7 @@ public class DoapMojo
             if ( !added )
             {
                 messages.getWarnMessages().add( "The project's url defined from " + artifact.toConfiguration()
-                                                    + " is empty or not valid, using <about/> parameter." );
+                                                    + " is empty or not a valid URL, using <about/> parameter." );
             }
         }
 
@@ -661,7 +655,7 @@ public class DoapMojo
                 }
                 catch ( MalformedURLException e )
                 {
-                    messages.addMessage( new String[] { "about" }, null, UserMessages.INVALID_URL );
+                    messages.addMessage( new String[] { "about" }, about, UserMessages.INVALID_URL );
                 }
                 added = true;
             }
@@ -741,15 +735,7 @@ public class DoapMojo
         // Developers
         @SuppressWarnings( "unchecked" )
         List<Contributor> developers = project.getDevelopers();
-        if ( developers == null || developers.isEmpty() )
-        {
-            messages.addMessage( new String[] { "project", "developers" }, null,
-                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
-        }
-        else
-        {
-            writeContributors( writer, developers );
-        }
+        writeContributors( writer, developers );
 
         // Contributors
         @SuppressWarnings( "unchecked" )
@@ -833,23 +819,20 @@ public class DoapMojo
      */
     private void writeName( XMLWriter writer, MavenProject project )
     {
-        String name = interpolate( doapOptions.getName(), project, settings );
+        String name = DoapUtil.interpolate( doapOptions.getName(), project, settings );
         if ( StringUtils.isEmpty( name ) )
         {
-            messages.addMessage( new String[] { "doapOptions", "name" }, null, UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
+            messages.addMessage( new String[] { "doapOptions", "name" }, null,
+                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
             return;
         }
 
         DoapUtil.writeComment( writer, "A name of something." );
-
-        if ( asfExtOptions.isIncluded() && !name.toLowerCase( Locale.ENGLISH ).startsWith( "apache" ) )
-        {
-            DoapUtil.writeElement( writer, doapOptions.getXmlnsPrefix(), "name", "Apache " + name );
-        }
-        else
+        if ( ASFExtOptionsUtil.isASFProject( project ) && !name.toLowerCase( Locale.ENGLISH ).startsWith( "apache" ) )
         {
-            DoapUtil.writeElement( writer, doapOptions.getXmlnsPrefix(), "name", name );
+            name = "Apache " + name;
         }
+        DoapUtil.writeElement( writer, doapOptions.getXmlnsPrefix(), "name", name );
     }
 
     /**
@@ -863,7 +846,7 @@ public class DoapMojo
     private void writeDescription( XMLWriter writer, MavenProject project )
     {
         boolean addComment = false;
-        String description = interpolate( doapOptions.getDescription(), project, settings );
+        String description = DoapUtil.interpolate( doapOptions.getDescription(), project, settings );
         if ( StringUtils.isEmpty( description ) )
         {
             messages.addMessage( new String[] { "doapOptions", "description" }, null,
@@ -877,7 +860,7 @@ public class DoapMojo
         }
 
         String comment = "Short plain text description of a project.";
-        String shortdesc = interpolate( doapOptions.getShortdesc(), project, settings );
+        String shortdesc = DoapUtil.interpolate( doapOptions.getShortdesc(), project, settings );
         if ( StringUtils.isEmpty( shortdesc ) )
         {
             messages.addMessage( new String[] { "doapOptions", "shortdesc" }, null,
@@ -917,7 +900,7 @@ public class DoapMojo
      */
     private void writeCreated( XMLWriter writer, MavenProject project )
     {
-        String created = interpolate( doapOptions.getCreated(), project, settings );
+        String created = DoapUtil.interpolate( doapOptions.getCreated(), project, settings );
         if ( StringUtils.isEmpty( created ) )
         {
             messages.addMessage( new String[] { "doapOptions", "created" }, null,
@@ -949,7 +932,7 @@ public class DoapMojo
      */
     private void writeHomepage( XMLWriter writer, MavenProject project )
     {
-        String homepage = interpolate( doapOptions.getHomepage(), project, settings );
+        String homepage = DoapUtil.interpolate( doapOptions.getHomepage(), project, settings );
         if ( StringUtils.isEmpty( homepage ) )
         {
             messages.addMessage( new String[] { "doapOptions", "homepage" }, null,
@@ -972,7 +955,7 @@ public class DoapMojo
 
         if ( StringUtils.isNotEmpty( doapOptions.getOldHomepage() ) )
         {
-            String oldHomepage = interpolate( doapOptions.getOldHomepage(), project, settings );
+            String oldHomepage = DoapUtil.interpolate( doapOptions.getOldHomepage(), project, settings );
             if ( StringUtils.isEmpty( oldHomepage ) )
             {
                 return;
@@ -987,7 +970,8 @@ public class DoapMojo
             }
             catch ( MalformedURLException e )
             {
-                messages.addMessage( new String[] { "doapOptions", "oldHomepage" }, oldHomepage, UserMessages.INVALID_URL );
+                messages.addMessage( new String[] { "doapOptions", "oldHomepage" }, oldHomepage,
+                                     UserMessages.INVALID_URL );
             }
         }
     }
@@ -1195,7 +1179,7 @@ public class DoapMojo
      */
     private void writeDownloadPage( XMLWriter writer, MavenProject project )
     {
-        String downloadPage = interpolate( doapOptions.getDownloadPage(), project, settings );
+        String downloadPage = DoapUtil.interpolate( doapOptions.getDownloadPage(), project, settings );
         if ( StringUtils.isEmpty( downloadPage ) )
         {
             messages.addMessage( new String[] { "doapOptions", "downloadPage" }, null,
@@ -1253,16 +1237,17 @@ public class DoapMojo
      */
     private void writeOS( XMLWriter writer, MavenProject project )
     {
-        if ( StringUtils.isEmpty( doapOptions.getOs() ) )
+        String os = DoapUtil.interpolate( doapOptions.getOs(), project, settings );
+        if ( StringUtils.isEmpty( os ) )
         {
             return;
         }
 
         DoapUtil.writeComment( writer, "Operating system that a project is limited to." );
-        String[] oses = StringUtils.split( doapOptions.getOs(), "," );
-        for ( String os : oses )
+        String[] oses = StringUtils.split( os, "," );
+        for ( String os_ : oses )
         {
-            DoapUtil.writeElement( writer, doapOptions.getXmlnsPrefix(), "os", os.trim() );
+            DoapUtil.writeElement( writer, doapOptions.getXmlnsPrefix(), "os", os_.trim() );
         }
     }
 
@@ -1275,12 +1260,13 @@ public class DoapMojo
      */
     private void writeScreenshots( XMLWriter writer, MavenProject project )
     {
-        if ( StringUtils.isEmpty( doapOptions.getScreenshots() ) )
+        String screenshots = DoapUtil.interpolate( doapOptions.getScreenshots(), project, settings );
+        if ( StringUtils.isEmpty( screenshots ) )
         {
             return;
         }
 
-        String screenshots = doapOptions.getScreenshots().trim();
+        screenshots = screenshots.trim();
         try
         {
             new URL( screenshots );
@@ -1304,12 +1290,13 @@ public class DoapMojo
      */
     private void writeWiki( XMLWriter writer, MavenProject project )
     {
-        if ( StringUtils.isEmpty( doapOptions.getWiki() ) )
+        String wiki = DoapUtil.interpolate( doapOptions.getWiki(), project, settings );
+        if ( StringUtils.isEmpty( wiki ) )
         {
             return;
         }
 
-        String wiki = doapOptions.getWiki().trim();
+        wiki = wiki.trim();
         try
         {
             new URL( wiki );
@@ -1333,36 +1320,55 @@ public class DoapMojo
      */
     private void writeLicenses( XMLWriter writer, MavenProject project )
     {
-        if ( project.getLicenses() == null || project.getLicenses().isEmpty() )
-        {
-            messages.addMessage( new String[] { "project", "licenses" }, null, UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
-            return;
-        }
-
-        DoapUtil.writeComment( writer, "The URI of the license the software is distributed under." );
-        // TODO: how to map to usefulinc site, or if this is necessary, the OSI page might
-        // be more appropriate.
-        @SuppressWarnings( "unchecked" )
-        List<License> licenses = project.getLicenses();
-        for ( License license : licenses )
+        String license = DoapUtil.interpolate( doapOptions.getLicense(), project, settings );
+        if ( StringUtils.isEmpty( license ) )
         {
-            if ( StringUtils.isEmpty( license.getUrl() ) )
+            boolean added = false;
+            @SuppressWarnings( "unchecked" )
+            List<License> licenses = project.getLicenses();
+            if ( licenses.size() > 1 )
             {
-                continue;
-            }
+                for ( int i = 1; i < licenses.size(); i++ )
+                {
+                    if ( StringUtils.isEmpty( licenses.get( i ).getUrl() ) )
+                    {
+                        continue;
+                    }
 
-            String licenseUrl = license.getUrl().trim();
-            try
-            {
-                new URL( licenseUrl );
+                    String licenseUrl = licenses.get( i ).getUrl().trim();
+                    try
+                    {
+                        new URL( licenseUrl );
 
-                DoapUtil.writeRdfResourceElement( writer, doapOptions.getXmlnsPrefix(), "license", licenseUrl );
+                        DoapUtil.writeRdfResourceElement( writer, doapOptions.getXmlnsPrefix(), "license", licenseUrl );
+                        added = true;
+                    }
+                    catch ( MalformedURLException e )
+                    {
+                        messages.addMessage( new String[] { "project", "licenses", "license", "url" }, licenseUrl,
+                                             UserMessages.INVALID_URL );
+                    }
+                }
             }
-            catch ( MalformedURLException e )
+
+            if ( !added )
             {
-                messages.addMessage( new String[] { "project", "licenses", "license", "url" }, licenseUrl,
-                                     UserMessages.INVALID_URL );
+                messages.addMessage( new String[] { "doapOptions", "license" }, null,
+                                     UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
             }
+            return;
+        }
+
+        try
+        {
+            new URL( license );
+
+            DoapUtil.writeComment( writer, "The URI of the license the software is distributed under." );
+            DoapUtil.writeRdfResourceElement( writer, doapOptions.getXmlnsPrefix(), "license", license );
+        }
+        catch ( MalformedURLException e )
+        {
+            messages.addMessage( new String[] { "doapOptions", "license" }, license, UserMessages.INVALID_URL );
         }
     }
 
@@ -1375,27 +1381,25 @@ public class DoapMojo
      */
     private void writeBugDatabase( XMLWriter writer, MavenProject project )
     {
-        if ( project.getIssueManagement() == null || StringUtils.isEmpty( project.getIssueManagement().getUrl() ) )
+        String bugDatabase = DoapUtil.interpolate( doapOptions.getBugDatabase(), project, settings );
+        if ( StringUtils.isEmpty( bugDatabase ) )
         {
-            messages.addMessage( new String[] { "project", "issueManagement" }, null,
+            messages.addMessage( new String[] { "doapOptions", "bugDatabase" }, null,
                                  UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
             return;
         }
 
-        String issueManagementUrl = project.getIssueManagement().getUrl().trim();
         try
         {
-            new URL( issueManagementUrl );
+            new URL( bugDatabase );
+
+            DoapUtil.writeComment( writer, "Bug database." );
+            DoapUtil.writeRdfResourceElement( writer, doapOptions.getXmlnsPrefix(), "bug-database", bugDatabase );
         }
         catch ( MalformedURLException e )
         {
-            messages.addMessage( new String[] { "project", "issueManagement", "url" }, issueManagementUrl,
-                                 UserMessages.INVALID_URL );
-            return;
+            messages.addMessage( new String[] { "doapOptions", "bugDatabase" }, bugDatabase, UserMessages.INVALID_URL );
         }
-
-        DoapUtil.writeComment( writer, "Bug database." );
-        DoapUtil.writeRdfResourceElement( writer, doapOptions.getXmlnsPrefix(), "bug-database", issueManagementUrl );
     }
 
     /**
@@ -1408,7 +1412,7 @@ public class DoapMojo
      */
     private void writeMailingList( XMLWriter writer, MavenProject project )
     {
-        String ml = interpolate( doapOptions.getMailingList(), project, settings );
+        String ml = DoapUtil.interpolate( doapOptions.getMailingList(), project, settings );
         if ( StringUtils.isEmpty( ml ) )
         {
             messages.addMessage( new String[] { "doapOptions", "mailingList" }, null,
@@ -1425,7 +1429,7 @@ public class DoapMojo
         }
         catch ( MalformedURLException e )
         {
-            messages.addMessage( new String[] { "project", "mailingList" }, ml, UserMessages.INVALID_URL );
+            messages.addMessage( new String[] { "doapOptions", "mailingList" }, ml, UserMessages.INVALID_URL );
         }
     }
 
@@ -1473,8 +1477,8 @@ public class DoapMojo
 
         if ( metadata.getMetadata().getVersioning() == null )
         {
-            messages.getWarnMessages().add( "No versioning was found for " + artifact.getGroupId() + ":" + artifact.getArtifactId()
-                                                + ". Ignored DOAP <release/> tag." );
+            messages.getWarnMessages().add( "No versioning was found for " + artifact.getGroupId() + ":"
+                                                + artifact.getArtifactId() + ". Ignored DOAP <release/> tag." );
             return;
         }
 
@@ -1571,25 +1575,56 @@ public class DoapMojo
      */
     private void writeSourceRepositories( XMLWriter writer, MavenProject project )
     {
-        Scm scm = project.getScm();
-        if ( scm == null )
+        String anonymousConnection = DoapUtil.interpolate( doapOptions.getScmAnonymous(), project, settings );
+        if ( StringUtils.isEmpty( anonymousConnection ) )
         {
-            messages.addMessage( new String[] { "project", "scm" }, null, UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
-            return;
+            messages.addMessage( new String[] { "doapOptions", "scmAnonymousConnection" }, null,
+                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
         }
-
-        String anonymousConnection = scm.getConnection();
-        if ( StringUtils.isNotEmpty( anonymousConnection ) )
+        else
         {
-            DoapUtil.writeComment( writer, "Anonymous Source Repository" );
-            writeSourceRepository( writer, project, anonymousConnection );
+            DoapUtil.writeComment( writer, "Anonymous Source Repository." );
+
+            try
+            {
+                new URL( anonymousConnection );
+
+                DoapUtil.writeStartElement( writer, doapOptions.getXmlnsPrefix(), "repository" );
+                DoapUtil.writeStartElement( writer, doapOptions.getXmlnsPrefix(), "Repository" );
+                DoapUtil.writeRdfResourceElement( writer, doapOptions.getXmlnsPrefix(), "location", anonymousConnection );
+                writer.endElement(); // Repository
+                writer.endElement(); // repository
+            }
+            catch ( MalformedURLException e )
+            {
+                writeSourceRepository( writer, project, anonymousConnection );
+            }
         }
 
-        String developerConnection = scm.getDeveloperConnection();
-        if ( StringUtils.isNotEmpty( developerConnection ) )
+        String devConnection = DoapUtil.interpolate( doapOptions.getScmDeveloper(), project, settings );
+        if ( StringUtils.isEmpty( devConnection ) )
         {
-            DoapUtil.writeComment( writer, "Developer Source Repository" );
-            writeSourceRepository( writer, project, developerConnection );
+            messages.addMessage( new String[] { "doapOptions", "scmDeveloperConnection" }, null,
+                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
+        }
+        else
+        {
+            DoapUtil.writeComment( writer, "Developer Source Repository." );
+
+            try
+            {
+                new URL( devConnection );
+
+                DoapUtil.writeStartElement( writer, doapOptions.getXmlnsPrefix(), "repository" );
+                DoapUtil.writeStartElement( writer, doapOptions.getXmlnsPrefix(), "Repository" );
+                DoapUtil.writeRdfResourceElement( writer, doapOptions.getXmlnsPrefix(), "location", devConnection );
+                writer.endElement(); // Repository
+                writer.endElement(); // repository
+            }
+            catch ( MalformedURLException e )
+            {
+                writeSourceRepository( writer, project, devConnection );
+            }
         }
     }
 
@@ -1669,18 +1704,17 @@ public class DoapMojo
     {
         if ( contributors == null || contributors.isEmpty() )
         {
-            // no msg there, only dev are req
             return;
         }
 
         boolean isDeveloper = Developer.class.isAssignableFrom( contributors.get( 0 ).getClass() );
         if ( isDeveloper )
         {
-            DoapUtil.writeComment( writer, "Main committers" );
+            DoapUtil.writeComment( writer, "Main committers." );
         }
         else
         {
-            DoapUtil.writeComment( writer, "Contributed persons" );
+            DoapUtil.writeComment( writer, "Contributed persons." );
         }
 
         List<Contributor> maintainers = DoapUtil.getContributorsWithMaintainerRole( i18n, contributors );
@@ -1917,10 +1951,10 @@ public class DoapMojo
             return;
         }
 
-        DoapUtil.writeComment( writer, "ASF extension" );
+        DoapUtil.writeComment( writer, "ASF extension." );
 
         // asfext:pmc
-        String pmc = interpolate( asfExtOptions.getPmc(), project, settings );
+        String pmc = DoapUtil.interpolate( asfExtOptions.getPmc(), project, settings );
         if ( StringUtils.isNotEmpty( pmc ) )
         {
             DoapUtil.writeRdfResourceElement( writer, asfExtOptions.getXmlnsPrefix(), "pmc", pmc );
@@ -1931,7 +1965,7 @@ public class DoapMojo
         }
 
         // asfext:name
-        String name = interpolate( asfExtOptions.getName(), project, settings );
+        String name = DoapUtil.interpolate( asfExtOptions.getName(), project, settings );
         if ( StringUtils.isNotEmpty( name ) )
         {
             if ( !name.toLowerCase( Locale.ENGLISH ).trim().startsWith( "apache" ) )
@@ -1945,7 +1979,7 @@ public class DoapMojo
             messages.addMessage( new String[] { "asfExtOptions", "name" }, null, UserMessages.REQUIRED_BY_ASF );
         }
 
-        String homepage = interpolate( doapOptions.getHomepage(), project, settings );
+        String homepage = DoapUtil.interpolate( doapOptions.getHomepage(), project, settings );
         if ( StringUtils.isNotEmpty( homepage ) )
         {
             try
@@ -2068,16 +2102,17 @@ public class DoapMojo
 
             if ( StringUtils.isNotEmpty( standard.getUrl() ) )
             {
+                String standardUrl = standard.getUrl().trim();
                 try
                 {
-                    new URL( standard.getUrl().trim() );
+                    new URL( standardUrl );
 
-                    DoapUtil.writeElement( writer, asfExtOptions.getXmlnsPrefix(), "url", standard.getUrl().trim() );
+                    DoapUtil.writeElement( writer, asfExtOptions.getXmlnsPrefix(), "url", standardUrl );
                 }
                 catch ( MalformedURLException e )
                 {
-                    messages.addMessage( new String[] { "asfExtOptions", "standards", "url" },
-                                         standard.getUrl().trim(), UserMessages.INVALID_URL );
+                    messages.addMessage( new String[] { "asfExtOptions", "standards", "url" }, standardUrl,
+                                         UserMessages.INVALID_URL );
                 }
             }
 
@@ -2147,13 +2182,14 @@ public class DoapMojo
      */
     private void writeAudience( XMLWriter writer )
     {
-        if ( StringUtils.isEmpty( doapOptions.getAudience() ) )
+        String audience = DoapUtil.interpolate( doapOptions.getAudience(), project, settings );
+        if ( StringUtils.isEmpty( audience ) )
         {
             return;
         }
 
         DoapUtil.writeComment( writer, "Audience." );
-        DoapUtil.writeElement( writer, doapOptions.getXmlnsPrefix(), "audience", doapOptions.getAudience().trim() );
+        DoapUtil.writeElement( writer, doapOptions.getXmlnsPrefix(), "audience", audience );
     }
 
     /**
@@ -2165,12 +2201,13 @@ public class DoapMojo
      */
     private void writeBlog( XMLWriter writer )
     {
+        String blog = DoapUtil.interpolate( doapOptions.getBlog(), project, settings );
         if ( StringUtils.isEmpty( doapOptions.getBlog() ) )
         {
             return;
         }
 
-        String blog = doapOptions.getBlog().trim();
+        blog = blog.trim();
         try
         {
             new URL( blog );
@@ -2199,8 +2236,12 @@ public class DoapMojo
             return;
         }
 
-        DoapUtil.writeComment( writer, "Plateform." );
-        DoapUtil.writeElement( writer, doapOptions.getXmlnsPrefix(), "plateform", doapOptions.getPlatform().trim() );
+        DoapUtil.writeComment( writer, "Platform." );
+        String[] platforms = StringUtils.split( doapOptions.getPlatform(), "," );
+        for ( String platform : platforms )
+        {
+            DoapUtil.writeElement( writer, doapOptions.getXmlnsPrefix(), "platform", platform.trim() );
+        }
     }
 
     /**
@@ -2213,7 +2254,7 @@ public class DoapMojo
      */
     private void writeVendor( XMLWriter writer, MavenProject project )
     {
-        String vendor = interpolate( doapOptions.getVendor(), project, settings );
+        String vendor = DoapUtil.interpolate( doapOptions.getVendor(), project, settings );
         if ( StringUtils.isEmpty( vendor ) )
         {
             return;
@@ -2245,7 +2286,8 @@ public class DoapMojo
 
             if ( Arrays.binarySearch( Locale.getISOLanguages(), language ) < 0 )
             {
-                messages.addMessage( new String[] { "doapOptions", "languages" }, language, UserMessages.INVALID_ISO_DATE );
+                messages.addMessage( new String[] { "doapOptions", "languages" }, language,
+                                     UserMessages.INVALID_ISO_DATE );
                 continue;
             }
 
@@ -2267,12 +2309,13 @@ public class DoapMojo
      */
     private void writeServiceEndpoint( XMLWriter writer )
     {
-        if ( StringUtils.isEmpty( doapOptions.getServiceEndpoint() ) )
+        String serviceEndpoint = DoapUtil.interpolate( doapOptions.getServiceEndpoint(), project, settings );
+        if ( StringUtils.isEmpty( serviceEndpoint ) )
         {
             return;
         }
 
-        String serviceEndpoint = doapOptions.getServiceEndpoint().trim();
+        serviceEndpoint = serviceEndpoint.trim();
         try
         {
             new URL( serviceEndpoint );
@@ -2339,7 +2382,7 @@ public class DoapMojo
                 continue;
             }
 
-            String interpolatedValue = interpolate( value, project, settings );
+            String interpolatedValue = DoapUtil.interpolate( value, project, settings );
             if ( interpolatedValue == null )
             {
                 continue;
@@ -2416,62 +2459,6 @@ public class DoapMojo
     }
 
     /**
-     * Interpolate a string with project and settings.
-     *
-     * @param value not null
-     * @param project not null
-     * @param settings not null
-     * @return the value trimmed and interpolated or null if interpolation doesn't work.
-     * @since 1.1
-     */
-    private static String interpolate( String value, MavenProject project, Settings settings )
-    {
-        if ( StringUtils.isEmpty( value ) || project == null )
-        {
-            throw new IllegalArgumentException( "parameters are required" );
-        }
-
-        if ( !value.contains( "${" ) )
-        {
-            return value.trim();
-        }
-
-        RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
-        try
-        {
-            interpolator.addValueSource( new EnvarBasedValueSource() );
-        }
-        catch ( IOException e )
-        {
-        }
-
-        interpolator.addValueSource( new PropertiesBasedValueSource( System.getProperties() ) );
-        interpolator.addValueSource( new PropertiesBasedValueSource( project.getProperties() ) );
-        interpolator.addValueSource( new PrefixedObjectValueSource( "project", project ) );
-        interpolator.addValueSource( new PrefixedObjectValueSource( "pom", project ) );
-        if ( settings != null )
-        {
-            interpolator.addValueSource( new PrefixedObjectValueSource( "settings", settings ) );
-        }
-
-        String interpolatedValue = value;
-        try
-        {
-            interpolatedValue = interpolator.interpolate( value );
-        }
-        catch ( InterpolationException e )
-        {
-        }
-
-        if ( interpolatedValue.contains( "${" ) )
-        {
-            return null;
-        }
-
-        return interpolatedValue.trim();
-    }
-
-    /**
      * Sort Contributor by name or Developer by id.
      *
      * @param contributors not null

Modified: maven/plugins/trunk/maven-doap-plugin/src/main/java/org/apache/maven/plugin/doap/DoapUtil.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-doap-plugin/src/main/java/org/apache/maven/plugin/doap/DoapUtil.java?rev=1057614&r1=1057613&r2=1057614&view=diff
==============================================================================
--- maven/plugins/trunk/maven-doap-plugin/src/main/java/org/apache/maven/plugin/doap/DoapUtil.java (original)
+++ maven/plugins/trunk/maven-doap-plugin/src/main/java/org/apache/maven/plugin/doap/DoapUtil.java Tue Jan 11 13:28:29 2011
@@ -23,17 +23,21 @@ import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.SocketTimeoutException;
 import java.net.URL;
 import java.text.DateFormat;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.WeakHashMap;
 import java.util.Map.Entry;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -50,13 +54,21 @@ import org.apache.commons.httpclient.met
 import org.apache.commons.httpclient.params.HttpClientParams;
 import org.apache.commons.httpclient.params.HttpMethodParams;
 import org.apache.maven.model.Contributor;
+import org.apache.maven.project.MavenProject;
 import org.apache.maven.settings.Proxy;
 import org.apache.maven.settings.Settings;
 import org.apache.maven.wagon.proxy.ProxyInfo;
 import org.apache.maven.wagon.proxy.ProxyUtils;
 import org.codehaus.plexus.i18n.I18N;
+import org.codehaus.plexus.interpolation.EnvarBasedValueSource;
+import org.codehaus.plexus.interpolation.InterpolationException;
+import org.codehaus.plexus.interpolation.ObjectBasedValueSource;
+import org.codehaus.plexus.interpolation.PrefixedObjectValueSource;
+import org.codehaus.plexus.interpolation.PropertiesBasedValueSource;
+import org.codehaus.plexus.interpolation.RegexBasedInterpolator;
 import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.introspection.ClassMap;
 import org.codehaus.plexus.util.xml.XMLWriter;
 import org.codehaus.plexus.util.xml.XmlWriterUtil;
 
@@ -583,6 +595,84 @@ public class DoapUtil
         }
     }
 
+    /**
+     * Interpolate a string with project and settings.
+     *
+     * @param value could be null
+     * @param project not null
+     * @param settings could be null
+     * @return the value trimmed and interpolated or null if the interpolation doesn't work.
+     * @since 1.1
+     */
+    public static String interpolate( String value, final MavenProject project, Settings settings )
+    {
+        if ( project == null )
+        {
+            throw new IllegalArgumentException( "project is required" );
+        }
+
+        if ( value == null )
+        {
+            return value;
+        }
+
+        if ( !value.contains( "${" ) )
+        {
+            return value.trim();
+        }
+
+        RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
+        try
+        {
+            interpolator.addValueSource( new EnvarBasedValueSource() );
+        }
+        catch ( IOException e )
+        {
+        }
+        interpolator.addValueSource( new PropertiesBasedValueSource( System.getProperties() ) );
+        interpolator.addValueSource( new PropertiesBasedValueSource( project.getProperties() ) );
+        interpolator.addValueSource( new PrefixedObjectValueSource( "project", project ) );
+        interpolator.addValueSource( new PrefixedObjectValueSource( "pom", project ) );
+        interpolator.addValueSource( new ObjectBasedValueSource( project )
+        {
+            @Override
+            public Object getValue( String expression )
+            {
+                try
+                {
+                    return ReflectionValueExtractor.evaluate( expression, project, true );
+                }
+                catch ( Exception e )
+                {
+                    addFeedback( "Failed to extract \'" + expression + "\' from: " + project, e );
+                }
+
+                return null;
+            }
+        } );
+
+        if ( settings != null )
+        {
+            interpolator.addValueSource( new PrefixedObjectValueSource( "settings", settings ) );
+        }
+
+        String interpolatedValue = value;
+        try
+        {
+            interpolatedValue = interpolator.interpolate( value ).trim();
+        }
+        catch ( InterpolationException e )
+        {
+        }
+
+        if ( interpolatedValue.startsWith( "${" ) )
+        {
+            return null;
+        }
+
+        return interpolatedValue;
+    }
+
     // ----------------------------------------------------------------------
     // Private methods
     // ----------------------------------------------------------------------
@@ -731,4 +821,130 @@ public class DoapUtil
             IOUtil.close( is );
         }
     }
+
+    /**
+     * Fork of {@link org.codehaus.plexus.interpolation.reflection.ReflectionValueExtractor} to care of list or arrays.
+     */
+    static class ReflectionValueExtractor
+    {
+        @SuppressWarnings( "rawtypes" )
+        private static final Class[] CLASS_ARGS = new Class[0];
+
+        private static final Object[] OBJECT_ARGS = new Object[0];
+
+        /**
+         * Use a WeakHashMap here, so the keys (Class objects) can be garbage collected. This approach prevents permgen
+         * space overflows due to retention of discarded classloaders.
+         */
+        @SuppressWarnings( "rawtypes" )
+        private static final Map<Class,ClassMap> classMaps = new WeakHashMap<Class,ClassMap>();
+
+        private ReflectionValueExtractor()
+        {
+        }
+
+        public static Object evaluate( String expression, Object root )
+            throws Exception
+        {
+            return evaluate( expression, root, true );
+        }
+
+        // TODO: don't throw Exception
+        public static Object evaluate( String expression, Object root, boolean trimRootToken )
+            throws Exception
+        {
+            // if the root token refers to the supplied root object parameter, remove it.
+            if ( trimRootToken )
+            {
+                expression = expression.substring( expression.indexOf( '.' ) + 1 );
+            }
+
+            Object value = root;
+
+            // ----------------------------------------------------------------------
+            // Walk the dots and retrieve the ultimate value desired from the
+            // MavenProject instance.
+            // ----------------------------------------------------------------------
+
+            StringTokenizer parser = new StringTokenizer( expression, "." );
+
+            while ( parser.hasMoreTokens() )
+            {
+                String token = parser.nextToken();
+                if ( value == null )
+                {
+                    return null;
+                }
+
+                StringTokenizer parser2 = new StringTokenizer( token, "[]" );
+                int index = -1;
+                if ( parser2.countTokens() > 1 )
+                {
+                    token = parser2.nextToken();
+                    try
+                    {
+                        index = Integer.valueOf( parser2.nextToken() ).intValue();
+                    }
+                    catch ( NumberFormatException e )
+                    {
+                    }
+                }
+
+                final ClassMap classMap = getClassMap( value.getClass() );
+
+                final String methodBase = StringUtils.capitalizeFirstLetter( token );
+
+                String methodName = "get" + methodBase;
+
+                Method method = classMap.findMethod( methodName, CLASS_ARGS );
+
+                if ( method == null )
+                {
+                    // perhaps this is a boolean property??
+                    methodName = "is" + methodBase;
+
+                    method = classMap.findMethod( methodName, CLASS_ARGS );
+                }
+
+                if ( method == null )
+                {
+                    return null;
+                }
+
+                value = method.invoke( value, OBJECT_ARGS );
+                if ( value == null )
+                {
+                    return null;
+                }
+                if ( Collection.class.isAssignableFrom( value.getClass() ) )
+                {
+                    ClassMap classMap2 = getClassMap( value.getClass() );
+
+                    Method method2 = classMap2.findMethod( "toArray", CLASS_ARGS );
+
+                    value = method2.invoke( value, OBJECT_ARGS );
+                }
+                if ( value.getClass().isArray() )
+                {
+                    value = ( (Object[]) value )[index];
+                }
+            }
+
+            return value;
+        }
+
+        private static ClassMap getClassMap( Class<? extends Object> clazz )
+        {
+            ClassMap classMap = classMaps.get( clazz );
+
+            if ( classMap == null )
+            {
+                classMap = new ClassMap( clazz );
+
+                classMaps.put( clazz, classMap );
+            }
+
+            return classMap;
+        }
+    }
 }

Modified: maven/plugins/trunk/maven-doap-plugin/src/test/java/org/apache/maven/plugin/doap/DoapMojoTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-doap-plugin/src/test/java/org/apache/maven/plugin/doap/DoapMojoTest.java?rev=1057614&r1=1057613&r2=1057614&view=diff
==============================================================================
--- maven/plugins/trunk/maven-doap-plugin/src/test/java/org/apache/maven/plugin/doap/DoapMojoTest.java (original)
+++ maven/plugins/trunk/maven-doap-plugin/src/test/java/org/apache/maven/plugin/doap/DoapMojoTest.java Tue Jan 11 13:28:29 2011
@@ -24,6 +24,7 @@ import java.io.FileReader;
 import java.io.IOException;
 
 import org.apache.maven.plugin.doap.options.DoapArtifact;
+import org.apache.maven.plugin.doap.options.DoapOptions;
 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.util.IOUtil;
@@ -85,13 +86,37 @@ public class DoapMojoTest
         assertTrue( readed.contains( "<rdf:RDF xml:lang=\"en\" xmlns=\"http://usefulinc.com/ns/doap#\" "
             + "xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" "
             + "xmlns:foaf=\"http://xmlns.com/foaf/0.1/\">" ) );
-        if ( StringUtils.isNotEmpty( mavenProject.getUrl() ) )
-        {
-            assertTrue( readed.contains( "<Project rdf:about=\"" + mavenProject.getUrl() + "\">" ) );
-            assertTrue( readed.contains( "<homepage rdf:resource=\"" + mavenProject.getUrl() + "\"/>" ) );
-        }
+        assertTrue( readed.contains( "<Project rdf:about=\"" + mavenProject.getUrl() + "\">" ) );
+        assertTrue( readed.contains( "<description xml:lang=\"en\">Test the DOAP plugin</description>" ) );
+        assertTrue( readed.contains( "<shortdesc xml:lang=\"en\">Test the DOAP plugin</shortdesc>" ) );
+        assertTrue( readed.contains( "<homepage rdf:resource=\"" + mavenProject.getUrl() + "\"/>" ) );
+        assertTrue( readed.contains( "<category>library</category>" ) );
+        assertTrue( readed.contains( "<created>2008-01-01</created>" ) );
         assertTrue( readed.contains( "<name>" + mavenProject.getName() + "</name>" ) );
-        assertTrue( readed.contains( "<programming-language>java</programming-language>" ) );
+        assertTrue( readed.contains( "<download-page rdf:resource=\"http://foo.org/download.html\"/>" ) );
+        assertTrue( readed.contains( "<programming-language>Java</programming-language>" ) );
+        assertTrue( readed.contains( "<bug-database rdf:resource=\"http://jira.codehaus.org/browse/MDOAPTEST\"/>" ) );
+        assertTrue( readed.contains( "<license rdf:resource=\"http://www.apache.org/licenses/LICENSE-2.0.txt\"/>" ) );
+        assertTrue( readed.contains( "<SVNRepository>" ) );
+        assertTrue( readed.contains( "<location rdf:resource=\"http://svn.foo.org/repos/asf/maven/plugins/trunk/maven-doap-plugin/src/test/resources/unit/doap-configuration\"/>" ) );
+        assertTrue( readed.contains( "<browse rdf:resource=\"http://svn.foo.org/viewvc/maven/plugins/trunk/maven-doap-plugin/src/test/resources/unit/doap-configuration\"/>" ) );
+        assertTrue( readed.contains( "<location rdf:resource=\"https://svn.foo.org/repos/asf/maven/plugins/trunk/maven-doap-plugin/src/test/resources/unit/doap-configuration\"/>" ) );
+
+        // conf
+        assertTrue( readed.contains( "<audience>developers</audience>" ) );
+        assertTrue( readed.contains( "<blog rdf:resource=\"http://myblog.foo.org\"/>" ) );
+        assertTrue( readed.contains( "<implements>JSR-foo</implements>" ) );
+        assertTrue( readed.contains( "<language>en</language>" ) );
+        assertTrue( readed.contains( "<language>fr</language>" ) );
+        assertTrue( readed.contains( "<old-homepage rdf:resource=\"http://old.foo.org\"/>" ) );
+        assertTrue( readed.contains( "<os>windows</os>" ) );
+        assertTrue( readed.contains( "<os>linux</os>" ) );
+        assertTrue( readed.contains( "<os>mac</os>" ) );
+        assertTrue( readed.contains( "<platform>java</platform>" ) );
+        assertTrue( readed.contains( "<platform>firefox</platform>" ) );
+        assertTrue( readed.contains( "<screenshots rdf:resource=\"" + mavenProject.getUrl() +"/screenshots.html\"/>" ) );
+        assertTrue( readed.contains( "<service-endpoint rdf:resource=\"http://webservice.foo.org\"/>" ) );
+        assertTrue( readed.contains( "<wiki rdf:resource=\"http://wiki.foo.org\"/>" ) );
 
         // ASF ext
         assertFalse( readed.contains( "<asfext:pmc rdf:resource=\"" + mavenProject.getUrl() + "\"/>" ) );
@@ -109,10 +134,9 @@ public class DoapMojoTest
     /**
      * @throws Exception if any
      */
-    public void testLangParameters()
+    public void testLangParameter()
         throws Exception
     {
-
         File pluginXmlFile =
             new File( getBasedir(), "src/test/resources/unit/doap-configuration/doap-configuration-plugin-config.xml" );
         DoapMojo mojo = (DoapMojo) lookupMojo( "generate", pluginXmlFile );
@@ -181,6 +205,11 @@ public class DoapMojoTest
         // Set some Mojo parameters
         setVariableValueToObject( mojo, "remoteRepositories", mavenProject.getRemoteArtifactRepositories() );
         setVariableValueToObject( mojo, "about", mavenProject.getUrl() );
+        DoapOptions doapOptions = (DoapOptions)getVariableValueFromObject(  mojo, "doapOptions" );
+        doapOptions.setDescription( "Common Utilities" );
+        doapOptions.setShortdesc( "Common Utilities" );
+        doapOptions.setDownloadPage( "http://plexus.codehaus.org/download-binaries.html" );
+        setVariableValueToObject( mojo, "doapOptions", doapOptions );
 
         DoapArtifact artifact = new DoapArtifact();
         artifact.setGroupId( "org.codehaus.plexus" );
@@ -202,7 +231,111 @@ public class DoapMojoTest
         assertTrue( readed.contains( "<rdf:RDF xml:lang=\"en\" xmlns=\"http://usefulinc.com/ns/doap#\" "
             + "xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" "
             + "xmlns:foaf=\"http://xmlns.com/foaf/0.1/\">" ) );
+        assertTrue( readed.contains( "<Project rdf:about=\"http://plexus.codehaus.org/plexus-utils\">" ) );
         assertTrue( readed.contains( "<name>Plexus Common Utilities</name>" ) );
+        assertTrue( readed.contains( "<description xml:lang=\"en\">Common Utilities</description>" ) );
+        assertTrue( readed.contains( "<shortdesc xml:lang=\"en\">Common Utilities</shortdesc>" ) );
+        assertTrue( readed.contains( "<created>2001-01-01</created>" ) );
+        assertTrue( readed.contains( "<download-page rdf:resource=\"http://plexus.codehaus.org/download-binaries.html\"/>" ) );
+        assertTrue( readed.contains( "<programming-language>Java</programming-language>" ) );
+        assertTrue( readed.contains( "<bug-database rdf:resource=\"http://jira.codehaus.org/browse/PLXUTILS\"/>" ) );
+        assertTrue( readed.contains( "<license rdf:resource=\"http://www.apache.org/licenses/LICENSE-2.0.txt\"/>" ) );
+        assertTrue( readed.contains( "<SVNRepository>" ) );
+        assertTrue( readed.contains( "<location rdf:resource=\"http://svn.codehaus.org/plexus/plexus-utils/tags/plexus-utils-1.5.5\"/>" ) );
+        assertTrue( readed.contains( "<browse rdf:resource=\"http://fisheye.codehaus.org/browse/plexus/plexus-utils/tags/plexus-utils-1.5.5\"/>" ) );
+
+        // conf
+        assertTrue( readed.contains( "<audience>developers</audience>" ) );
+        assertTrue( readed.contains( "<blog rdf:resource=\"http://myblog.foo.org\"/>" ) );
+        assertTrue( readed.contains( "<implements>JSR-foo</implements>" ) );
+        assertTrue( readed.contains( "<language>en</language>" ) );
+        assertTrue( readed.contains( "<language>fr</language>" ) );
+        assertTrue( readed.contains( "<old-homepage rdf:resource=\"http://old.foo.org\"/>" ) );
+        assertTrue( readed.contains( "<os>windows</os>" ) );
+        assertTrue( readed.contains( "<os>linux</os>" ) );
+        assertTrue( readed.contains( "<os>mac</os>" ) );
+        assertTrue( readed.contains( "<platform>java</platform>" ) );
+        assertTrue( readed.contains( "<screenshots rdf:resource=\"http://plexus.codehaus.org/plexus-utils/screenshots.html\"/>" ) );
+        assertTrue( readed.contains( "<service-endpoint rdf:resource=\"http://webservice.foo.org\"/>" ) );
+        assertTrue( readed.contains( "<wiki rdf:resource=\"http://wiki.foo.org\"/>" ) );
+    }
+
+    /**
+     * Verify the generation of a DOAP file from a minimalist artifact.
+     *
+     * @throws Exception if any
+     */
+    public void testGeneratedDoapArtifactMinimalist()
+        throws Exception
+    {
+        File pluginXmlFile =
+            new File( getBasedir(), "src/test/resources/unit/doap-configuration/doap-configuration-plugin-config.xml" );
+        DoapMojo mojo = (DoapMojo) lookupMojo( "generate", pluginXmlFile );
+        assertNotNull( "Mojo found.", mojo );
+
+        MavenProject mavenProject = (MavenProject) getVariableValueFromObject( mojo, "project" );
+        assertNotNull( mavenProject );
+
+        // Set some Mojo parameters
+        setVariableValueToObject( mojo, "remoteRepositories", mavenProject.getRemoteArtifactRepositories() );
+        setVariableValueToObject( mojo, "about", "foo" );
+        DoapOptions doapOptions = new DoapOptions();
+        doapOptions.setName( "XStream" );
+        doapOptions.setDescription( "XStream is a simple library to serialize objects to XML and back again." );
+        doapOptions.setShortdesc( "XML Serializer" );
+        doapOptions.setHomepage( "http://xstream.codehaus.org/" );
+        doapOptions.setDownloadPage( "http://xstream.codehaus.org/download.html" );
+        doapOptions.setBugDatabase( "http://jira.codehaus.org/browse/XSTR" );
+        doapOptions.setLicense( "http://xstream.codehaus.org/license.html" );
+        doapOptions.setScmDeveloper( "http://svn.codehaus.org/xstream/trunk/xstream" );
+        doapOptions.setMailingList( "http://xstream.codehaus.org/list-user.html" );
+        doapOptions.setCreated( "2000-01-01");
+        setVariableValueToObject( mojo, "doapOptions", doapOptions );
+
+        DoapArtifact artifact = new DoapArtifact();
+        artifact.setGroupId( "xstream" );
+        artifact.setArtifactId( "xstream" );
+        artifact.setVersion( "1.1" );
+        setVariableValueToObject( mojo, "artifact", artifact );
+        setVariableValueToObject( mojo, "outputDirectory", "target/test/unit/doap-configuration/" );
+
+        mojo.execute();
+
+        File doapFile = new File( getBasedir(), "target/test/unit/doap-configuration/doap_xstream.rdf" );
+        assertTrue( "Doap File was not generated!", doapFile.exists() );
+
+        String readed = readFile( doapFile );
+
+        // Validate
+
+        // Pure DOAP
+        assertTrue( readed.contains( "<rdf:RDF xml:lang=\"en\" xmlns=\"http://usefulinc.com/ns/doap#\" "
+            + "xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" "
+            + "xmlns:foaf=\"http://xmlns.com/foaf/0.1/\">" ) );
+        assertTrue( readed.contains( "<Project>" ) );
+        assertTrue( readed.contains( "<name>XStream</name>" ) );
+        assertTrue( readed.contains( "<description xml:lang=\"en\">XStream is a simple library to serialize objects to XML and back again.</description>" ) );
+        assertTrue( readed.contains( "<shortdesc xml:lang=\"en\">XML Serializer</shortdesc>" ) );
+        assertTrue( readed.contains( "<created>2000-01-01</created>" ) );
+        assertTrue( readed.contains( "<download-page rdf:resource=\"http://xstream.codehaus.org/download.html\"/>" ) );
+        assertTrue( readed.contains( "<programming-language>Java</programming-language>" ) );
+        assertTrue( readed.contains( "<bug-database rdf:resource=\"http://jira.codehaus.org/browse/XSTR\"/>" ) );
+        assertTrue( readed.contains( "<license rdf:resource=\"http://xstream.codehaus.org/license.html\"/>" ) );
+        assertTrue( readed.contains( "<Repository>" ) );
+        assertTrue( readed.contains( "<location rdf:resource=\"http://svn.codehaus.org/xstream/trunk/xstream\"/>" ) );
+        assertTrue( readed.contains( "<mailing-list rdf:resource=\"http://xstream.codehaus.org/list-user.html\"/>" ) );
+
+        // conf
+        assertFalse( readed.contains( "<audience>" ) );
+        assertFalse( readed.contains( "<blog rdf:resource=" ) );
+        assertFalse( readed.contains( "<implements>" ) );
+        assertFalse( readed.contains( "<language>" ) );
+        assertFalse( readed.contains( "<old-homepage rdf:resource=" ) );
+        assertFalse( readed.contains( "<os>" ) );
+        assertFalse( readed.contains( "<platform>" ) );
+        assertFalse( readed.contains( "<screenshots rdf:resource=" ) );
+        assertFalse( readed.contains( "<service-endpoint rdf:resource=" ) );
+        assertFalse( readed.contains( "<wiki rdf:resource=" ) );
     }
 
     /**
@@ -246,10 +379,13 @@ public class DoapMojoTest
         }
         assertTrue( readed.contains( "<name>Apache " + mavenProject.getName() + "</name>" ) );
         assertTrue( readed.contains( "<programming-language>Java</programming-language>" ) );
+        assertTrue( readed.contains( "<category rdf:resource=\"http://projects.apache.org/category/library\"/>" ) );
 
         // ASF ext
         assertTrue( readed.contains( "<asfext:pmc rdf:resource=\"" + mavenProject.getUrl() + "\"/>" ) );
         assertTrue( readed.contains( "<asfext:name>Apache " + mavenProject.getName() + "</asfext:name>" ) );
+        assertTrue( readed.contains( "<asfext:charter>" ) );
+        assertTrue( readed.contains( "<asfext:chair>" ) );
     }
 
     /**

Modified: maven/plugins/trunk/maven-doap-plugin/src/test/java/org/apache/maven/plugin/doap/DoapUtilTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-doap-plugin/src/test/java/org/apache/maven/plugin/doap/DoapUtilTest.java?rev=1057614&r1=1057613&r2=1057614&view=diff
==============================================================================
--- maven/plugins/trunk/maven-doap-plugin/src/test/java/org/apache/maven/plugin/doap/DoapUtilTest.java (original)
+++ maven/plugins/trunk/maven-doap-plugin/src/test/java/org/apache/maven/plugin/doap/DoapUtilTest.java Tue Jan 11 13:28:29 2011
@@ -22,10 +22,13 @@ package org.apache.maven.plugin.doap;
 import java.io.File;
 import java.io.StringWriter;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.maven.model.Contributor;
 import org.apache.maven.model.Developer;
+import org.apache.maven.model.License;
+import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.PlexusTestCase;
 import org.codehaus.plexus.i18n.I18N;
 import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter;
@@ -201,4 +204,47 @@ public class DoapUtilTest
         File doapFile = new File( getBasedir(), "src/test/resources/generated-doap-1.0.rdf" );
         assertFalse( DoapUtil.validate( doapFile ).isEmpty() );
     }
+
+    /**
+     * Test method for:
+     * {@link DoapUtil#interpolate(String, MavenProject, org.apache.maven.settings.Settings)}
+     *
+     * @throws Exception if any
+     */
+    public void testInterpolate()
+        throws Exception
+    {
+        License license = new License();
+        license.setName( "licenseName" );
+        license.setUrl( "licenseUrl" );
+
+        List<Developer> developers = new ArrayList<Developer>();
+        Developer developer1 = new Developer();
+        developer1.setId( "id1" );
+        developer1.setName( "developerName1" );
+        developers.add( developer1 );
+        Developer developer2 = new Developer();
+        developer2.setId( "id1" );
+        developer2.setName( "developerName2" );
+        developers.add( developer2 );
+
+        MavenProject project = new MavenProject();
+        project.setName( "projectName" );
+        project.setDescription( "projectDescription" );
+        project.setLicenses( Collections.singletonList( license ) );
+        project.setDevelopers( developers );
+        project.getProperties().put( "myKey", "myValue" );
+
+        assertEquals( DoapUtil.interpolate( "${project.name}", project, null ), "projectName" );
+        assertEquals( DoapUtil.interpolate( "my name is ${project.name}", project, null ), "my name is projectName" );
+        assertEquals( DoapUtil.interpolate( "my name is ${project.invalid}", project, null ), "my name is ${project.invalid}" );
+        assertEquals( DoapUtil.interpolate( "${pom.description}", project, null ), "projectDescription" );
+        assertNull( DoapUtil.interpolate( "${project.licenses.name}", project, null ) );
+        assertEquals( DoapUtil.interpolate( "${project.licenses[0].name}", project, null ), "licenseName" );
+        assertNull( DoapUtil.interpolate( "${project.licenses[1].name}", project, null ) );
+        assertNotNull( DoapUtil.interpolate( "${project.developers}", project, null ) );
+        assertEquals( DoapUtil.interpolate( "${project.developers[0].name}", project, null ), "developerName1" );
+        assertEquals( DoapUtil.interpolate( "${project.developers[1].name}", project, null ), "developerName2" );
+        assertEquals( DoapUtil.interpolate( "${myKey}", project, null ), "myValue" );
+    }
 }

Modified: maven/plugins/trunk/maven-doap-plugin/src/test/resources/unit/doap-configuration/doap-configuration-plugin-config.xml
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-doap-plugin/src/test/resources/unit/doap-configuration/doap-configuration-plugin-config.xml?rev=1057614&r1=1057613&r2=1057614&view=diff
==============================================================================
--- maven/plugins/trunk/maven-doap-plugin/src/test/resources/unit/doap-configuration/doap-configuration-plugin-config.xml (original)
+++ maven/plugins/trunk/maven-doap-plugin/src/test/resources/unit/doap-configuration/doap-configuration-plugin-config.xml Tue Jan 11 13:28:29 2011
@@ -92,15 +92,13 @@ under the License.
           <doapOptions>
             <audience>developers</audience>
             <blog>http://myblog.foo.org</blog>
-            <category>library</category>
             <downloadMirror>http://mirror.foo.org</downloadMirror>
             <implementations>JSR-foo</implementations>
             <language>en,fr</language>
             <oldHomepage>http://old.foo.org</oldHomepage>
             <os>windows,linux,mac</os>
-            <platform>java</platform>
-            <programmingLanguage>java</programmingLanguage>
-            <screenshots>http://screenshot.foo.org</screenshots>
+            <platform>java,firefox</platform>
+            <screenshots>${project.url}/screenshots.html</screenshots>
             <serviceEndpoint>http://webservice.foo.org</serviceEndpoint>
             <wiki>http://wiki.foo.org</wiki>
           </doapOptions>