Author: ltheussl
Date: Tue Jun  2 08:33:19 2009
New Revision: 780966

URL: http://svn.apache.org/viewvc?rev=780966&view=rev
Log:
Add a common method for parsing dates

Modified:
    
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/DoxiaUtils.java
    
maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/util/DoxiaUtilsTest.java

Modified: 
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/DoxiaUtils.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/DoxiaUtils.java?rev=780966&r1=780965&r2=780966&view=diff
==============================================================================
--- 
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/DoxiaUtils.java
 (original)
+++ 
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/DoxiaUtils.java
 Tue Jun  2 08:33:19 2009
@@ -20,6 +20,12 @@
  */
 
 import java.io.UnsupportedEncodingException;
+
+import java.text.ParseException;
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
+
+import java.util.Date;
 import java.util.Locale;
 
 /**
@@ -281,6 +287,61 @@
         return true;
     }
 
+    private static final SimpleDateFormat DATE_PARSER = new SimpleDateFormat();
+    private static final ParsePosition DATE_PARSE_POSITION = new 
ParsePosition( 0 );
+    private static final String[] DATE_PATTERNS = new String[]
+    {
+        "yyyy-MM-dd", "yyyy/MM/dd", "yyyyMMdd", "yyyy", "dd.MM.yyyy", "dd MMM 
yyyy",
+        "dd MMM. yyyy", "MMMM yyyy", "MMM. dd, yyyy", "MMM. yyyy", "MMMM dd, 
yyyy",
+        "MMM d, ''yy", "MMM. ''yy", "MMMM ''yy"
+    };
+
+    /**
+     * <p>Parses a string representing a date by trying different date 
patterns.</p>
+     *
+     * <p>The following date patterns are tried (in the given order):</p>
+     *
+     * <pre>"yyyy-MM-dd", "yyyy/MM/dd", "yyyyMMdd", "yyyy", "dd.MM.yyyy", "dd 
MMM yyyy",
+     *  "dd MMM. yyyy", "MMMM yyyy", "MMM. dd, yyyy", "MMM. yyyy", "MMMM dd, 
yyyy",
+     *  "MMM d, ''yy", "MMM. ''yy", "MMMM ''yy"</pre>
+     *
+     * <p>A parse is only sucessful if it parses the whole of the input string.
+     * If no parse patterns match, a ParseException is thrown.</p>
+     *
+     * <p>As a special case, the strings <code>"today"</code> and 
<code>"now"</code>
+     * (ignoring case) return the current date.</p>
+     *
+     * @param str the date to parse, not null.
+     * @return the parsed date, or the current date if the input String 
(ignoring case) was
+     *      <code>"today"</code> or <code>"now"</code>.
+     * @throws ParseException if no pattern matches.
+     *
+     * @since 1.1.1.
+     */
+    public static Date parseDate( String str )
+            throws ParseException
+    {
+        if ( "today".equals( str.toLowerCase( Locale.ENGLISH ) )
+                || "now".equals( str.toLowerCase( Locale.ENGLISH ) ) )
+        {
+            return new Date();
+        }
+
+        for ( int i = 0; i < DATE_PATTERNS.length; i++ )
+        {
+            DATE_PARSER.applyPattern( DATE_PATTERNS[i] );
+            DATE_PARSE_POSITION.setIndex( 0 );
+            final Date date = DATE_PARSER.parse( str, DATE_PARSE_POSITION );
+
+            if ( date != null && DATE_PARSE_POSITION.getIndex() == 
str.length() )
+            {
+                return date;
+            }
+        }
+
+        throw new ParseException( "Unable to parse date: " + str, -1 );
+    }
+
       //
      // private
     //

Modified: 
maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/util/DoxiaUtilsTest.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/util/DoxiaUtilsTest.java?rev=780966&r1=780965&r2=780966&view=diff
==============================================================================
--- 
maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/util/DoxiaUtilsTest.java
 (original)
+++ 
maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/util/DoxiaUtilsTest.java
 Tue Jun  2 08:33:19 2009
@@ -19,6 +19,11 @@
  * under the License.
  */
 
+import java.text.ParseException;
+
+import java.util.Date;
+import java.util.GregorianCalendar;
+
 import org.codehaus.plexus.PlexusTestCase;
 
 /**
@@ -184,4 +189,54 @@
         assertTrue( DoxiaUtils.isValidId( "index.html" ) );
         assertFalse( DoxiaUtils.isValidId( "Theußl" ) );
     }
+
+    /**
+     * Verify the expected results.
+     */
+    public void testParseDate()
+    {
+        final int year = 1973;
+        final int month = 1;
+        final int day = 27;
+
+        try
+        {
+            final Date feb27 = new GregorianCalendar( year, month, day 
).getTime();
+            assertEquals( feb27, DoxiaUtils.parseDate( "27.02.1973" ) );
+            assertEquals( feb27, DoxiaUtils.parseDate( "27. 02. 1973" ) );
+            assertEquals( feb27, DoxiaUtils.parseDate( "1973-02-27" ) );
+            assertEquals( feb27, DoxiaUtils.parseDate( "1973/02/27" ) );
+            assertEquals( feb27, DoxiaUtils.parseDate( "27 Feb 1973" ) );
+            assertEquals( feb27, DoxiaUtils.parseDate( "27 Feb. 1973" ) );
+            assertEquals( feb27, DoxiaUtils.parseDate( "Feb. 27, 1973" ) );
+            assertEquals( feb27, DoxiaUtils.parseDate( "Feb 27, '73" ) );
+            assertEquals( feb27, DoxiaUtils.parseDate( "February 27, 1973" ) );
+            assertEquals( feb27, DoxiaUtils.parseDate( "19730227" ) );
+
+            assertEquals( new GregorianCalendar( year, 0, 1 ).getTime(), 
DoxiaUtils.parseDate( "1973" ) );
+
+            final Date feb1 = new GregorianCalendar( year, 1, 1 ).getTime();
+            assertEquals( feb1, DoxiaUtils.parseDate( "February 1973" ) );
+            assertEquals( feb1, DoxiaUtils.parseDate( "Feb. 1973" ) );
+            assertEquals( feb1, DoxiaUtils.parseDate( "February '73" ) );
+            assertEquals( feb1, DoxiaUtils.parseDate( "Feb. '73" ) );
+
+            assertNotNull( DoxiaUtils.parseDate( "Today" ) );
+            assertNotNull( DoxiaUtils.parseDate( "NOW" ) );
+        }
+        catch ( ParseException ex )
+        {
+            fail( ex.getMessage() );
+        }
+
+        try
+        {
+            DoxiaUtils.parseDate( "yesterday" ).getTime();
+            fail();
+        }
+        catch ( ParseException ex )
+        {
+            assertNotNull( ex );
+        }
+    }
 }


Reply via email to