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/09 20:47:05 UTC

svn commit: r1057007 - in /maven/plugins/trunk/maven-doap-plugin/src/main: java/org/apache/maven/plugin/doap/DoapMojo.java mdo/doapOptions.mdo

Author: vsiveton
Date: Sun Jan  9 19:47:05 2011
New Revision: 1057007

URL: http://svn.apache.org/viewvc?rev=1057007&view=rev
Log:
o unify user messages using XML configuration 

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/mdo/doapOptions.mdo

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=1057007&r1=1057006&r2=1057007&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 Sun Jan  9 19:47:05 2011
@@ -396,18 +396,11 @@ public class DoapMojo
     private ExtOptions[] extOptions;
 
     /**
-     * All POM/DOAP error messages.
+     * All warn/error messages for the user.
      *
      * @since 1.1
      */
-    private List<String> errorMessages = new ArrayList<String>();
-
-    /**
-     * All POM/DOAP warn messages.
-     *
-     * @since 1.1
-     */
-    private List<String> warnMessages = new ArrayList<String>();
+    private UserMessages messages = new UserMessages();
 
     // ----------------------------------------------------------------------
     // Public methods
@@ -576,14 +569,14 @@ public class DoapMojo
         DoapUtil.writeStartElement( writer, "rdf", "RDF" );
         if ( Arrays.binarySearch( Locale.getISOLanguages(), lang ) < 0 )
         {
-            throw new MojoExecutionException( "The <doapOptions><lang>" + lang
-                + "</lang></doapOptions> parameter is not a valid ISO language." );
+            messages.addMessage( new String[] { "doapOptions", "lang" }, lang, UserMessages.INVALID_ISO_DATE );
+            throw new MojoExecutionException( messages.getErrorMessages().get( 0 ) );
         }
         writer.addAttribute( "xml:lang", lang );
         if ( StringUtils.isEmpty( doapOptions.getXmlnsNamespaceURI() ) )
         {
-            throw new MojoExecutionException( "The <doapOptions><xmlnsNamespaceURI/></doapOptions>"
-                + " parameter is required." );
+            messages.addMessage( new String[] { "doapOptions", "xmlnsNamespaceURI" }, null, UserMessages.REQUIRED );
+            throw new MojoExecutionException( messages.getErrorMessages().get( 0 ) );
         }
         writer.addAttribute( "xmlns"
                                  + ( StringUtils.isEmpty( doapOptions.getXmlnsPrefix() ) ? "" : ":"
@@ -594,13 +587,12 @@ public class DoapMojo
         {
             if ( StringUtils.isEmpty( asfExtOptions.getXmlnsPrefix() ) )
             {
-                throw new MojoExecutionException( "The <asfExtOptions><xmlnsPrefix/></asfExtOptions>"
-                    + " parameter is required." );
+                messages.addMessage( new String[] { "doapOptions", "xmlnsPrefix" }, null, UserMessages.REQUIRED );
+                throw new MojoExecutionException( messages.getErrorMessages().get( 0 ) );
             }
             if ( StringUtils.isEmpty( asfExtOptions.getXmlnsNamespaceURI() ) )
             {
-                throw new MojoExecutionException( "The <asfExtOptions><xmlnsNamespaceURI/></asfExtOptions>"
-                    + " parameter is required." );
+                messages.addMessage( new String[] { "doapOptions", "xmlnsNamespaceURI" }, null, UserMessages.REQUIRED );
             }
             writer.addAttribute( "xmlns"
                                      + ( StringUtils.isEmpty( asfExtOptions.getXmlnsPrefix() ) ? "" : ":"
@@ -612,13 +604,15 @@ public class DoapMojo
             {
                 if ( StringUtils.isEmpty( extOption.getXmlnsPrefix() ) )
                 {
-                    throw new MojoExecutionException( "The <extOptions><extOption><xmlnsPrefix/></extOption>"
-                        + "</extOptions> parameter is required." );
+                    messages.addMessage( new String[] { "extOptions", "extOption", "xmlnsPrefix" }, null,
+                                         UserMessages.REQUIRED );
+                    throw new MojoExecutionException( messages.getErrorMessages().get( 0 ) );
                 }
                 if ( StringUtils.isEmpty( extOption.getXmlnsNamespaceURI() ) )
                 {
-                    throw new MojoExecutionException( "The <extOptions><extOption><xmlnsNamespaceURI/></extOption>"
-                        + "</extOptions> parameter is required." );
+                    messages.addMessage( new String[] { "extOptions", "extOption", "xmlnsNamespaceURI" }, null,
+                                         UserMessages.REQUIRED );
+                    throw new MojoExecutionException( messages.getErrorMessages().get( 0 ) );
                 }
                 writer.addAttribute( "xmlns"
                                          + ( StringUtils.isEmpty( extOption.getXmlnsPrefix() ) ? "" : ":"
@@ -650,8 +644,8 @@ public class DoapMojo
 
             if ( !added )
             {
-                warnMessages.add( "The project's url from " + artifact.toStringConfiguration()
-                    + " is empty or not valid, using <about/> parameter." );
+                messages.getWarnMessages().add( "The project's url defined from " + artifact.toConfiguration()
+                                                    + " is empty or not valid, using <about/> parameter." );
             }
         }
 
@@ -667,15 +661,17 @@ public class DoapMojo
                 }
                 catch ( MalformedURLException e )
                 {
-                    errorMessages.add( "The <about/> parameter is not a valid URL." );
+                    messages.addMessage( new String[] { "about" }, null, UserMessages.INVALID_URL );
                 }
-            }
-            else
-            {
-                errorMessages.add( "The <about/> parameter is required." );
+                added = true;
             }
         }
 
+        if ( !added )
+        {
+            messages.addMessage( new String[] { "about" }, null, UserMessages.RECOMMENDED );
+        }
+
         // name
         writeName( writer, project );
 
@@ -747,7 +743,8 @@ public class DoapMojo
         List<Contributor> developers = project.getDevelopers();
         if ( developers == null || developers.isEmpty() )
         {
-            addPomMessage( "developers" );
+            messages.addMessage( new String[] { "project", "developers" }, null,
+                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
         }
         else
         {
@@ -785,18 +782,18 @@ public class DoapMojo
             throw new MojoExecutionException( "Error when closing the writer.", e );
         }
 
-        if ( !warnMessages.isEmpty() )
+        if ( !messages.getWarnMessages().isEmpty() )
         {
-            for ( String warn : warnMessages )
+            for ( String warn : messages.getWarnMessages() )
             {
                 getLog().warn( warn );
             }
         }
 
-        if ( !errorMessages.isEmpty() )
+        if ( !messages.getErrorMessages().isEmpty() )
         {
             getLog().error( "" );
-            for ( String error : errorMessages )
+            for ( String error : messages.getErrorMessages() )
             {
                 getLog().error( error );
             }
@@ -839,7 +836,7 @@ public class DoapMojo
         String name = interpolate( doapOptions.getName(), project, settings );
         if ( StringUtils.isEmpty( name ) )
         {
-            addDoapMessage( "name" );
+            messages.addMessage( new String[] { "doapOptions", "name" }, null, UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
             return;
         }
 
@@ -869,7 +866,8 @@ public class DoapMojo
         String description = interpolate( doapOptions.getDescription(), project, settings );
         if ( StringUtils.isEmpty( description ) )
         {
-            addDoapMessage( "description" );
+            messages.addMessage( new String[] { "doapOptions", "description" }, null,
+                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
         }
         else
         {
@@ -882,7 +880,8 @@ public class DoapMojo
         String shortdesc = interpolate( doapOptions.getShortdesc(), project, settings );
         if ( StringUtils.isEmpty( shortdesc ) )
         {
-            addDoapMessage( "shortdesc" );
+            messages.addMessage( new String[] { "doapOptions", "shortdesc" }, null,
+                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
             return;
         }
         if ( description.equals( shortdesc ) )
@@ -891,7 +890,8 @@ public class DoapMojo
             String sentence = StringUtils.split( shortdesc, "." )[0];
             if ( StringUtils.split( sentence, " " ).length > 10 )
             {
-                addDoapMessage( "shortdesc" );
+                messages.addMessage( new String[] { "doapOptions", "shortdesc" }, null,
+                                     UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
                 return;
             }
             if ( !addComment )
@@ -920,7 +920,8 @@ public class DoapMojo
         String created = interpolate( doapOptions.getCreated(), project, settings );
         if ( StringUtils.isEmpty( created ) )
         {
-            addDoapMessage( "created" );
+            messages.addMessage( new String[] { "doapOptions", "created" }, null,
+                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
             return;
         }
 
@@ -930,8 +931,7 @@ public class DoapMojo
         }
         catch ( ParseException e )
         {
-            errorMessages.add( "The <doapOptions><created>" + created
-                + "</created></doapOptions> parameter should be in YYYY-MM-DD." );
+            messages.addMessage( new String[] { "doapOptions", "created" }, null, UserMessages.INVALID_DATE );
             return;
         }
 
@@ -952,7 +952,8 @@ public class DoapMojo
         String homepage = interpolate( doapOptions.getHomepage(), project, settings );
         if ( StringUtils.isEmpty( homepage ) )
         {
-            addDoapMessage( "homepage" );
+            messages.addMessage( new String[] { "doapOptions", "homepage" }, null,
+                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
         }
         else
         {
@@ -965,8 +966,7 @@ public class DoapMojo
             }
             catch ( MalformedURLException e )
             {
-                errorMessages.add( "The <doapOptions><homepage>" + homepage
-                    + "</homepage></doapOptions> parameter is not a valid URL." );
+                messages.addMessage( new String[] { "doapOptions", "homepage" }, homepage, UserMessages.INVALID_URL );
             }
         }
 
@@ -987,8 +987,7 @@ public class DoapMojo
             }
             catch ( MalformedURLException e )
             {
-                errorMessages.add( "The <doapOptions><oldHomepage>" + oldHomepage
-                    + "</oldHomepage></doapOptions> parameter is not a valid URL." );
+                messages.addMessage( new String[] { "doapOptions", "oldHomepage" }, oldHomepage, UserMessages.INVALID_URL );
             }
         }
     }
@@ -1005,7 +1004,8 @@ public class DoapMojo
     {
         if ( StringUtils.isEmpty( doapOptions.getProgrammingLanguage() ) && StringUtils.isEmpty( language ) )
         {
-            addDoapMessage( "programmingLanguage" );
+            messages.addMessage( new String[] { "doapOptions", "programmingLanguage" }, null,
+                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
             return;
         }
 
@@ -1013,7 +1013,9 @@ public class DoapMojo
         String comment = "Programming language.";
         if ( StringUtils.isNotEmpty( language ) ) // backward compatible
         {
-            getLog().warn( "The <language/> parameter is deprecated, please use <doapOptions><programmingLanguage/></doapOptions> parameter instead of." );
+            getLog().warn( "The <language/> parameter is deprecated, please use "
+                               + messages.toConfiguration( new String[] { "doapOptions", "programmingLanguage" }, null )
+                               + " parameter instead of." );
 
             language = language.trim();
 
@@ -1022,9 +1024,11 @@ public class DoapMojo
                 String asfLanguage = ASFExtOptionsUtil.getProgrammingLanguageSupportedByASF( language );
                 if ( asfLanguage == null )
                 {
-                    errorMessages.add( "The deprecated <language>" + language
-                        + "</language> parameter is not supported by ASF. Should be one of "
-                        + Arrays.toString( ASFExtOptionsUtil.PROGRAMMING_LANGUAGES ) );
+                    messages.getErrorMessages().add( "The deprecated "
+                                                         + messages.toConfiguration( new String[] { "language" },
+                                                                                     language )
+                                                         + " parameter is not supported by ASF. Should be one of "
+                                                         + Arrays.toString( ASFExtOptionsUtil.PROGRAMMING_LANGUAGES ) );
                 }
                 else
                 {
@@ -1054,9 +1058,12 @@ public class DoapMojo
                     String asfLanguage = ASFExtOptionsUtil.getProgrammingLanguageSupportedByASF( language );
                     if ( asfLanguage == null )
                     {
-                        errorMessages.add( "The <doapOptions><programmingLanguage>" + language
-                            + "</programmingLanguage></doapOptions> parameter is not supported by ASF. "
-                            + "Should be one of " + Arrays.toString( ASFExtOptionsUtil.PROGRAMMING_LANGUAGES ) );
+                        messages.getErrorMessages().add( "The "
+                                                             + messages.toConfiguration( new String[] { "doapOptions",
+                                                                 "programmingLanguage" }, language )
+                                                             + " parameter is not supported by ASF. "
+                                                             + "Should be one of "
+                                                             + Arrays.toString( ASFExtOptionsUtil.PROGRAMMING_LANGUAGES ) );
                     }
                     else
                     {
@@ -1093,7 +1100,8 @@ public class DoapMojo
     {
         if ( StringUtils.isEmpty( doapOptions.getCategory() ) && StringUtils.isEmpty( category ) )
         {
-            addDoapMessage( "category" );
+            messages.addMessage( new String[] { "doapOptions", "category" }, null,
+                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
             return;
         }
 
@@ -1102,7 +1110,9 @@ public class DoapMojo
         String comment = "A category of project.";
         if ( StringUtils.isNotEmpty( category ) ) // backward compatible
         {
-            getLog().warn( "The <category/> parameter is deprecated, please use <doapOptions><category/></doapOptions> parameter instead of." );
+            getLog().warn( "The <category/> parameter is deprecated, please use "
+                               + messages.toConfiguration( new String[] { "doapOptions", "category" }, null )
+                               + " parameter instead of." );
 
             category = category.trim();
 
@@ -1111,9 +1121,11 @@ public class DoapMojo
                 String asfCategory = ASFExtOptionsUtil.getCategorySupportedByASF( category );
                 if ( asfCategory == null )
                 {
-                    errorMessages.add( "The deprecated <category>" + category
-                        + "</category> parameter is not supported by ASF. Should be one of "
-                        + Arrays.toString( ASFExtOptionsUtil.CATEGORIES ) );
+                    messages.getErrorMessages().add( "The deprecated "
+                                                         + messages.toConfiguration( new String[] { "category" },
+                                                                                     category )
+                                                         + " parameter is not supported by ASF. Should be one of "
+                                                         + Arrays.toString( ASFExtOptionsUtil.CATEGORIES ) );
                 }
                 else
                 {
@@ -1143,9 +1155,11 @@ public class DoapMojo
                     String asfCategory = ASFExtOptionsUtil.getCategorySupportedByASF( category );
                     if ( asfCategory == null )
                     {
-                        errorMessages.add( "The <doapOptions><category>" + category
-                            + "</category></doapOptions> parameter is not supported by ASF. Should be one of "
-                            + Arrays.toString( ASFExtOptionsUtil.CATEGORIES ) );
+                        messages.getErrorMessages().add( "The "
+                                                             + messages.toConfiguration( new String[] { "doapOptions",
+                                                                 "category" }, category )
+                                                             + " parameter is not supported by ASF. Should be one of "
+                                                             + Arrays.toString( ASFExtOptionsUtil.CATEGORIES ) );
                     }
                     else
                     {
@@ -1184,7 +1198,8 @@ public class DoapMojo
         String downloadPage = interpolate( doapOptions.getDownloadPage(), project, settings );
         if ( StringUtils.isEmpty( downloadPage ) )
         {
-            addDoapMessage( "downloadPage" );
+            messages.addMessage( new String[] { "doapOptions", "downloadPage" }, null,
+                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
             return;
         }
 
@@ -1197,8 +1212,7 @@ public class DoapMojo
         }
         catch ( MalformedURLException e )
         {
-            errorMessages.add( "The <doapOptions><downloadPage>" + downloadPage
-                + "</downloadPage></doapOptions> parameter is not a valid URL." );
+            messages.addMessage( new String[] { "doapOptions", "downloadPage" }, downloadPage, UserMessages.INVALID_URL );
         }
 
         if ( StringUtils.isNotEmpty( doapOptions.getDownloadMirror() ) )
@@ -1223,8 +1237,8 @@ public class DoapMojo
                 }
                 catch ( MalformedURLException e )
                 {
-                    errorMessages.add( "The <doapOptions><downloadMirror>" + downloadMirror
-                        + "</downloadMirror></doapOptions> parameter is not a valid URL." );
+                    messages.addMessage( new String[] { "doapOptions", "downloadMirror" }, downloadMirror,
+                                         UserMessages.INVALID_URL );
                 }
             }
         }
@@ -1273,8 +1287,7 @@ public class DoapMojo
         }
         catch ( MalformedURLException e )
         {
-            errorMessages.add( "The <doapOptions><screenshots>" + screenshots
-                + "</screenshots></doapOptions> parameter is not a valid URL." );
+            messages.addMessage( new String[] { "doapOptions", "screenshots" }, screenshots, UserMessages.INVALID_URL );
             return;
         }
 
@@ -1303,7 +1316,7 @@ public class DoapMojo
         }
         catch ( MalformedURLException e )
         {
-            errorMessages.add( "The <doapOptions><wiki>" + wiki + "</wiki></doapOptions> parameter is not a valid URL." );
+            messages.addMessage( new String[] { "doapOptions", "wiki" }, wiki, UserMessages.INVALID_URL );
             return;
         }
 
@@ -1322,7 +1335,7 @@ public class DoapMojo
     {
         if ( project.getLicenses() == null || project.getLicenses().isEmpty() )
         {
-            addPomMessage( "licenses" );
+            messages.addMessage( new String[] { "project", "licenses" }, null, UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
             return;
         }
 
@@ -1347,8 +1360,8 @@ public class DoapMojo
             }
             catch ( MalformedURLException e )
             {
-                errorMessages.add( "The POM <project><licenses><license><url>" + licenseUrl
-                    + "</url></license></licenses></project> value is not a valid URL." );
+                messages.addMessage( new String[] { "project", "licenses", "license", "url" }, licenseUrl,
+                                     UserMessages.INVALID_URL );
             }
         }
     }
@@ -1364,7 +1377,8 @@ public class DoapMojo
     {
         if ( project.getIssueManagement() == null || StringUtils.isEmpty( project.getIssueManagement().getUrl() ) )
         {
-            addPomMessage( "issueManagement" );
+            messages.addMessage( new String[] { "project", "issueManagement" }, null,
+                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
             return;
         }
 
@@ -1375,8 +1389,8 @@ public class DoapMojo
         }
         catch ( MalformedURLException e )
         {
-            errorMessages.add( "The POM <project><issueManagement><url>" + issueManagementUrl
-                + "</url></issueManagement></project> value is not a valid URL." );
+            messages.addMessage( new String[] { "project", "issueManagement", "url" }, issueManagementUrl,
+                                 UserMessages.INVALID_URL );
             return;
         }
 
@@ -1397,7 +1411,8 @@ public class DoapMojo
         String ml = interpolate( doapOptions.getMailingList(), project, settings );
         if ( StringUtils.isEmpty( ml ) )
         {
-            addDoapMessage( "mailingList" );
+            messages.addMessage( new String[] { "doapOptions", "mailingList" }, null,
+                                 UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
             return;
         }
 
@@ -1410,8 +1425,7 @@ public class DoapMojo
         }
         catch ( MalformedURLException e )
         {
-            errorMessages.add( "The <doapOptions><mailingList>" + ml
-                + "</mailingList></doapOptions> value is not a valid URL." );
+            messages.addMessage( new String[] { "project", "mailingList" }, ml, UserMessages.INVALID_URL );
         }
     }
 
@@ -1459,7 +1473,8 @@ public class DoapMojo
 
         if ( metadata.getMetadata().getVersioning() == null )
         {
-            warnMessages.add( "No versioning was found. Ignored DOAP <release/> tag." );
+            messages.getWarnMessages().add( "No versioning was found for " + artifact.getGroupId() + ":" + artifact.getArtifactId()
+                                                + ". Ignored DOAP <release/> tag." );
             return;
         }
 
@@ -1559,7 +1574,7 @@ public class DoapMojo
         Scm scm = project.getScm();
         if ( scm == null )
         {
-            addPomMessage( "scm" );
+            messages.addMessage( new String[] { "project", "scm" }, null, UserMessages.REQUIRED_BY_ASF_OR_RECOMMENDED );
             return;
         }
 
@@ -1787,8 +1802,8 @@ public class DoapMojo
         // Name is required to write doap
         if ( StringUtils.isEmpty( name ) )
         {
-            errorMessages.add( "The POM <project><developers|contributors><developer|contributor><name/>"
-                + "</developer|contributor></developers|contributors></project> value is missing." );
+            messages.addMessage( new String[] { "project", "developers|contributors", "developer|contributor", "name" },
+                                 null, UserMessages.REQUIRED );
             return;
         }
 
@@ -1816,9 +1831,8 @@ public class DoapMojo
             }
             else
             {
-                warnMessages.add( "The POM <project><developers|contributors><developer|contributor><email>"
-                    + email
-                    + "</email></developer|contributor></developers|contributors></project> value is not a valid email." );
+                messages.addMessage( new String[] { "project", "developers|contributors", "developer|contributor",
+                    "email" }, null, UserMessages.INVALID_EMAIL );
             }
         }
         if ( StringUtils.isNotEmpty( organization ) && StringUtils.isNotEmpty( organizationUrl ) )
@@ -1831,9 +1845,8 @@ public class DoapMojo
             }
             catch ( MalformedURLException e )
             {
-                errorMessages.add( "The POM <project><developers|contributors><developer|contributor><organizationUrl>"
-                    + organizationUrl
-                    + "</organizationUrl></developer|contributor></developers|contributors></project> value is not a valid URL." );
+                messages.addMessage( new String[] { "project", "developers|contributors", "developer|contributor",
+                    "organizationUrl" }, organizationUrl, UserMessages.INVALID_URL );
             }
         }
         if ( StringUtils.isNotEmpty( homepage ) )
@@ -1846,8 +1859,8 @@ public class DoapMojo
             }
             catch ( MalformedURLException e )
             {
-                errorMessages.add( "The POM <project><developers|contributors><developer|contributor><url>" + homepage
-                    + "</url></developer|contributor></developers|contributors></project> value is not a valid URL." );
+                messages.addMessage( new String[] { "project", "developers|contributors", "developer|contributor",
+                    "homepage" }, homepage, UserMessages.INVALID_URL );
             }
         }
         writer.endElement(); // foaf:Person
@@ -1914,7 +1927,7 @@ public class DoapMojo
         }
         else
         {
-            errorMessages.add( "A <asfExtOptions><pmc/></asfExtOptions> parameter is required by ASF." );
+            messages.addMessage( new String[] { "asfExtOptions", "pmc" }, null, UserMessages.REQUIRED_BY_ASF );
         }
 
         // asfext:name
@@ -1929,7 +1942,7 @@ public class DoapMojo
         }
         else
         {
-            errorMessages.add( "A <asfExtOptions><name/></asfExtOptions> parameter is required by ASF." );
+            messages.addMessage( new String[] { "asfExtOptions", "name" }, null, UserMessages.REQUIRED_BY_ASF );
         }
 
         String homepage = interpolate( doapOptions.getHomepage(), project, settings );
@@ -1943,15 +1956,14 @@ public class DoapMojo
             }
             catch ( MalformedURLException e )
             {
-                errorMessages.add( "The <doapOptions><homepage>" + homepage
-                    + "</homepage></doapOptions> parameter is not a valid URL." );
+                messages.addMessage( new String[] { "doapOptions", "homepage" }, homepage, UserMessages.INVALID_URL );
             }
         }
 
         // asfext:charter
         if ( StringUtils.isEmpty( asfExtOptions.getCharter() ) )
         {
-            errorMessages.add( "A <asfExtOptions><charter/></asfExtOptions> parameter is required by ASF." );
+            messages.addMessage( new String[] { "asfExtOptions", "charter" }, null, UserMessages.REQUIRED_BY_ASF );
         }
         else
         {
@@ -1983,7 +1995,7 @@ public class DoapMojo
             }
             else
             {
-                errorMessages.add( "A <asfExtOptions><chair/></asfExtOptions> parameter is required by ASF." );
+                messages.addMessage( new String[] { "asfExtOptions", "chair" }, null, UserMessages.REQUIRED_BY_ASF );
             }
         }
 
@@ -2026,43 +2038,46 @@ public class DoapMojo
 
             if ( StringUtils.isEmpty( standard.getTitle() ) )
             {
-                errorMessages.add( "A <asfExtOptions><standards><title/></standards></asfExtOptions> parameter is required by ASF." );
+                messages.addMessage( new String[] { "asfExtOptions", "standards", "title" }, null,
+                                     UserMessages.REQUIRED_BY_ASF );
             }
             else
             {
-                DoapUtil.writeElement( writer, asfExtOptions.getXmlnsPrefix(), "title", standard.getTitle() );
+                DoapUtil.writeElement( writer, asfExtOptions.getXmlnsPrefix(), "title", standard.getTitle().trim() );
             }
 
             if ( StringUtils.isEmpty( standard.getBody() ) )
             {
-                errorMessages.add( "A <asfExtOptions><standards><body/></standards></asfExtOptions> parameter is required by ASF." );
+                messages.addMessage( new String[] { "asfExtOptions", "standards", "body" }, null,
+                                     UserMessages.REQUIRED_BY_ASF );
             }
             else
             {
-                DoapUtil.writeElement( writer, asfExtOptions.getXmlnsPrefix(), "body", standard.getBody() );
+                DoapUtil.writeElement( writer, asfExtOptions.getXmlnsPrefix(), "body", standard.getBody().trim() );
             }
 
             if ( StringUtils.isEmpty( standard.getId() ) )
             {
-                errorMessages.add( "A <asfExtOptions><standards><id/></standards></asfExtOptions> parameter is required by ASF." );
+                messages.addMessage( new String[] { "asfExtOptions", "standards", "id" }, null,
+                                     UserMessages.REQUIRED_BY_ASF );
             }
             else
             {
-                DoapUtil.writeElement( writer, asfExtOptions.getXmlnsPrefix(), "id", standard.getId() );
+                DoapUtil.writeElement( writer, asfExtOptions.getXmlnsPrefix(), "id", standard.getId().trim() );
             }
 
             if ( StringUtils.isNotEmpty( standard.getUrl() ) )
             {
                 try
                 {
-                    new URL( standard.getUrl() );
+                    new URL( standard.getUrl().trim() );
 
-                    DoapUtil.writeElement( writer, asfExtOptions.getXmlnsPrefix(), "url", standard.getUrl() );
+                    DoapUtil.writeElement( writer, asfExtOptions.getXmlnsPrefix(), "url", standard.getUrl().trim() );
                 }
                 catch ( MalformedURLException e )
                 {
-                    errorMessages.add( "The <asfExtOptions><standards><url>" + standard.getUrl()
-                        + "<url></standards></asfExtOptions> parameter is not a valid URL." );
+                    messages.addMessage( new String[] { "asfExtOptions", "standards", "url" },
+                                         standard.getUrl().trim(), UserMessages.INVALID_URL );
                 }
             }
 
@@ -2110,7 +2125,8 @@ public class DoapMojo
                 }
                 catch ( MalformedURLException e )
                 {
-                    errorMessages.add( "The organization URL " + organization.getUrl() + " is not a valid URL." );
+                    messages.errorMessages.add( "The organization URL " + organization.getUrl()
+                        + " is not a valid URL." );
                 }
             }
             List<String> members = organization.getMembers();
@@ -2161,7 +2177,7 @@ public class DoapMojo
         }
         catch ( MalformedURLException e )
         {
-            errorMessages.add( "The <doapOptions><blog>" + blog + "</blog></doapOptions> parameter is not a valid URL." );
+            messages.addMessage( new String[] { "doapOptions", "blog" }, blog, UserMessages.INVALID_URL );
             return;
         }
 
@@ -2229,8 +2245,7 @@ public class DoapMojo
 
             if ( Arrays.binarySearch( Locale.getISOLanguages(), language ) < 0 )
             {
-                errorMessages.add( "The <doapOptions><languages>" + language
-                    + "</languages></doapOptions> parameter is not a valid ISO language." );
+                messages.addMessage( new String[] { "doapOptions", "languages" }, language, UserMessages.INVALID_ISO_DATE );
                 continue;
             }
 
@@ -2264,8 +2279,8 @@ public class DoapMojo
         }
         catch ( MalformedURLException e )
         {
-            errorMessages.add( "The <doapOptions><serviceEndpoint>" + serviceEndpoint
-                + "</serviceEndpoint></doapOptions> parameter is not a valid URL." );
+            messages.addMessage( new String[] { "doapOptions", "serviceEndpoint" }, serviceEndpoint,
+                                 UserMessages.INVALID_URL );
             return;
         }
 
@@ -2370,40 +2385,6 @@ public class DoapMojo
         }
     }
 
-    /**
-     * @param tag not null
-     * @since 1.1
-     */
-    private void addDoapMessage( String tag )
-    {
-        if ( asfExtOptions.isIncluded() )
-        {
-            errorMessages.add( "A <doapOptions><" + tag + "/></doapOptions> parameter is required by ASF." );
-        }
-        else
-        {
-            warnMessages.add( "No <doapOptions><" + tag
-                + "/></doapOptions> parameter defined, it is highly recommended to have one." );
-        }
-    }
-
-    /**
-     * @param tag not null
-     * @since 1.1
-     */
-    private void addPomMessage( String tag )
-    {
-        if ( asfExtOptions.isIncluded() )
-        {
-            errorMessages.add( "A POM <project><" + tag + "/></project> value is required by ASF." );
-        }
-        else
-        {
-            warnMessages.add( "No POM <project><" + tag
-                + "/></project> value defined, it is highly recommended to have one." );
-        }
-    }
-
     // ----------------------------------------------------------------------
     // Static methods
     // ----------------------------------------------------------------------
@@ -2547,4 +2528,174 @@ public class DoapMojo
             }
         } );
     }
+
+    /**
+     * Encapsulates all user messages.
+     *
+     * @since 1.1
+     */
+    private class UserMessages
+    {
+        public static final int REQUIRED = 10;
+
+        public static final int REQUIRED_BY_ASF_OR_RECOMMENDED = 11;
+
+        public static final int REQUIRED_BY_ASF = 12;
+
+        public static final int RECOMMENDED = 20;
+
+        public static final int INVALID_URL = 30;
+
+        public static final int INVALID_DATE = 31;
+
+        public static final int INVALID_ISO_DATE = 32;
+
+        public static final int INVALID_EMAIL = 33;
+
+        private List<String> errorMessages = new ArrayList<String>();
+
+        private List<String> warnMessages = new ArrayList<String>();
+
+        /**
+         * @return the error messages
+         */
+        public List<String> getErrorMessages()
+        {
+            return errorMessages;
+        }
+
+        /**
+         * @return the warn messages
+         */
+        public List<String> getWarnMessages()
+        {
+            return warnMessages;
+        }
+
+        /**
+         * @param tags not null
+         * @param value could be null
+         * @param errorId positive id
+         */
+        protected void addMessage( String[] tags, String value, int errorId )
+        {
+            if ( tags == null )
+            {
+                throw new IllegalArgumentException( "tags is required" );
+            }
+
+            boolean isPom = false;
+            if ( tags[0].equalsIgnoreCase( "project" ) )
+            {
+                isPom = true;
+            }
+            switch ( errorId )
+            {
+                case REQUIRED:
+                    errorMessages.add( "A " + toConfiguration( tags, null ) + "  parameter is required." );
+                    break;
+                case REQUIRED_BY_ASF_OR_RECOMMENDED:
+                    if ( isPom )
+                    {
+                        if ( asfExtOptions.isIncluded() )
+                        {
+                            errorMessages.add( "A POM " + toConfiguration( tags, null ) + " value is required by ASF." );
+                        }
+                        else
+                        {
+                            warnMessages.add( "No POM " + toConfiguration( tags, null )
+                                + " value is defined, it is highly recommended to have one." );
+                        }
+                    }
+                    else
+                    {
+                        if ( asfExtOptions.isIncluded() )
+                        {
+                            errorMessages.add( "A " + toConfiguration( tags, null ) + " parameter is required by ASF." );
+                        }
+                        else
+                        {
+                            warnMessages.add( "No " + toConfiguration( tags, null )
+                                + " parameter defined, it is highly recommended to have one." );
+                        }
+                    }
+                    break;
+                case REQUIRED_BY_ASF:
+                    if ( isPom )
+                    {
+                        errorMessages.add( "A POM " + toConfiguration( tags, null ) + " value is required by ASF." );
+                    }
+                    else
+                    {
+                        errorMessages.add( "A " + toConfiguration( tags, null ) + " parameter is required by ASF." );
+                    }
+                    break;
+                case RECOMMENDED:
+                    warnMessages.add( "No " + toConfiguration( tags, null )
+                        + " parameter defined, it is highly recommended to have one." );
+                    break;
+                case INVALID_URL:
+                    if ( isPom )
+                    {
+                        errorMessages.add( "The POM " + toConfiguration( tags, value ) + " value is not a valid URL." );
+                    }
+                    else
+                    {
+                        errorMessages.add( "The " + toConfiguration( tags, value ) + " parameter is not a valid URL." );
+                    }
+                    break;
+                case INVALID_DATE:
+                    errorMessages.add( "The " + toConfiguration( tags, value ) + " parameter should be in YYYY-MM-DD." );
+                    break;
+                case INVALID_EMAIL:
+                    errorMessages.add( "The POM " + toConfiguration( tags, value ) + " value is not a valid email." );
+                    break;
+                case INVALID_ISO_DATE:
+                    errorMessages.add( "The " + toConfiguration( tags, value )
+                        + " parameter is not a valid ISO language." );
+                    break;
+                default:
+                    throw new IllegalArgumentException( "Unknown errorId=" + errorId );
+            }
+        }
+
+        /**
+         * @param tags not null
+         * @param value of the last tag, could be null
+         * @return the XML configuration defined in tags.
+         */
+        protected String toConfiguration( String[] tags, String value )
+        {
+            if ( tags == null )
+            {
+                throw new IllegalArgumentException( "tags is required" );
+            }
+
+            StringBuffer sb = new StringBuffer();
+            for ( int i = 0; i < tags.length; i++ )
+            {
+                if ( i == tags.length - 1 && StringUtils.isEmpty( value ) )
+                {
+                    sb.append( "<" ).append( tags[i] ).append( "/>" );
+                }
+                else
+                {
+                    sb.append( "<" ).append( tags[i] ).append( ">" );
+                }
+            }
+            if ( StringUtils.isNotEmpty( value ) )
+            {
+                sb.append( value );
+            }
+            for ( int i = tags.length - 1; i >= 0; i-- )
+            {
+                if ( !( i == tags.length - 1 && StringUtils.isEmpty( value ) ) )
+                {
+                    sb.append( "</" ).append( tags[i] ).append( ">" );
+                }
+            }
+
+            return sb.toString();
+        }
+    }
 }

Modified: maven/plugins/trunk/maven-doap-plugin/src/main/mdo/doapOptions.mdo
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-doap-plugin/src/main/mdo/doapOptions.mdo?rev=1057007&r1=1057006&r2=1057007&view=diff
==============================================================================
--- maven/plugins/trunk/maven-doap-plugin/src/main/mdo/doapOptions.mdo (original)
+++ maven/plugins/trunk/maven-doap-plugin/src/main/mdo/doapOptions.mdo Sun Jan  9 19:47:05 2011
@@ -305,7 +305,7 @@ some POM options.
     /**
      * @return String the configuration of this class.
      */
-    public String toStringConfiguration()
+    public String toConfiguration()
     {
         java.lang.StringBuilder sb = new java.lang.StringBuilder();
         sb.append( "<artifact>" );