Author: jdcasey
Date: Fri Jun  1 12:12:58 2007
New Revision: 543579

URL: http://svn.apache.org/viewvc?view=rev&rev=543579
Log:
REOPENED - issue MNG-1910: Allow jdk 1.4+ as profile requirement 
http://jira.codehaus.org/browse/MNG-1910

Applied.

Added:
    
maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivatorTest.java
   (with props)
Modified:
    
maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivator.java

Modified: 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivator.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivator.java?view=diff&rev=543579&r1=543578&r2=543579
==============================================================================
--- 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivator.java
 (original)
+++ 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivator.java
 Fri Jun  1 12:12:58 2007
@@ -24,10 +24,13 @@
 import org.apache.maven.model.Profile;
 import org.codehaus.plexus.util.StringUtils;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class JdkPrefixProfileActivator
     extends DetectedProfileActivator
 {
-    
+
     public static final String JDK_VERSION = "java.version";
 
     public boolean isActive( Profile profile )
@@ -35,21 +38,39 @@
         Activation activation = profile.getActivation();
 
         String jdk = activation.getJdk();
-        
+
+        SystemBuildContext systemContext = 
SystemBuildContext.getSystemBuildContext( getBuildContextManager(), true );
+        String javaVersion = systemContext.getSystemProperty( JDK_VERSION );
+
+        return isActive( javaVersion, jdk );
+    }
+
+    public boolean isActive( String jdkVersion, String expression )
+    {
         boolean reverse = false;
-        
-        if ( jdk.startsWith( "!" ) )
+
+        if ( expression.startsWith( "!" ) )
         {
             reverse = true;
-            jdk = jdk.substring( 1 );
+            expression = expression.substring( 1 );
         }
-        
-        SystemBuildContext systemContext = 
SystemBuildContext.getSystemBuildContext( getBuildContextManager(), true );
-        String javaVersion = systemContext.getSystemProperty( JDK_VERSION );
 
         // null case is covered by canDetermineActivation(), so we can do a 
straight startsWith() here.
-        boolean result = javaVersion.startsWith( jdk );
-        
+        boolean result = false;
+        if ( expression.endsWith( "+" ) )
+        {
+            result = compareTo( asIntArray( jdkVersion ), asIntArray( 
expression ) ) >= 0;
+        }
+        else if ( expression.endsWith( "-" ) )
+        {
+            result = compareTo( asIntArray( jdkVersion ), asIntArray( 
expression ) ) <= 0;
+        }
+        else
+        {
+            // null case is covered by canDetermineActivation(), so we can do 
a straight startsWith() here.
+            result = jdkVersion.startsWith( expression );
+        }
+
         if ( reverse )
         {
             return !result;
@@ -62,7 +83,63 @@
 
     protected boolean canDetectActivation( Profile profile )
     {
-        return profile.getActivation() != null && StringUtils.isNotEmpty( 
profile.getActivation().getJdk() );
+        return ( profile.getActivation() != null ) && StringUtils.isNotEmpty( 
profile.getActivation().getJdk() );
+    }
+
+    private static void parseNum( List pList, StringBuffer pBuffer )
+    {
+        if ( pBuffer.length() > 0 )
+        {
+            pList.add( new Integer( pBuffer.toString() ) );
+            pBuffer.setLength( 0 );
+        }
+    }
+
+    /** This method transforms a string like "1.5.0_06" into
+     * new int[]{1, 5, 0, 6}.
+     */
+    private static int[] asIntArray( String pVersion )
+    {
+        List nums = new ArrayList();
+        StringBuffer sb = new StringBuffer();
+        while ( pVersion.length() > 0 )
+        {
+            char c = pVersion.charAt( 0 );
+            pVersion = pVersion.substring( 1 );
+            if ( Character.isDigit( c ) )
+            {
+                sb.append( c );
+            }
+            else
+            {
+                parseNum( nums, sb );
+            }
+        }
+        parseNum( nums, sb );
+        int[] result = new int[nums.size()];
+        for ( int i = 0; i < result.length; i++ )
+        {
+            result[i] = ( (Integer) nums.get( i ) ).intValue();
+        }
+        return result;
     }
 
+    /** This method compares to integer arrays, as created
+     * by [EMAIL PROTECTED] #asIntArray(String)}.
+     */
+    private static int compareTo( int[] pVersion1, int[] pVersion2 )
+    {
+        int len = Math.max( pVersion1.length, pVersion2.length );
+        for ( int i = 0; i < len; i++ )
+        {
+            int n1 = pVersion1.length > i ? pVersion1[i] : 0;
+            int n2 = pVersion2.length > i ? pVersion2[i] : 0;
+            int result = n1 - n2;
+            if ( result != 0 )
+            {
+                return result;
+            }
+        }
+        return 0;
+    }
 }

Added: 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivatorTest.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivatorTest.java?view=auto&rev=543579
==============================================================================
--- 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivatorTest.java
 (added)
+++ 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivatorTest.java
 Fri Jun  1 12:12:58 2007
@@ -0,0 +1,45 @@
+package org.apache.maven.profiles.activation;
+
+import junit.framework.TestCase;
+
+
+/** Test case for the [EMAIL PROTECTED] JdkPrefixProfileActivator}.
+ */
+public class JdkPrefixProfileActivatorTest extends TestCase
+{
+       /** Test for the basic match "equals".
+        */
+       public void testBasicMatch()
+       {
+               JdkPrefixProfileActivator activator = new 
JdkPrefixProfileActivator();
+               assertTrue( activator.isActive( "1.5", "1.5" ) );
+               assertFalse( activator.isActive( "1.4", "1.5" ) );
+               assertFalse( activator.isActive( "1.6", "1.5" ) );
+               assertTrue( activator.isActive( "1.5.0_06", "1.5" ) );
+               assertFalse( activator.isActive( "1.5.0_06", "1.5.1" ) );
+               assertFalse( activator.isActive( "1.5", "!1.5" ) );
+               assertTrue( activator.isActive( "1.4", "!1.5" ) );
+               assertTrue( activator.isActive( "1.6", "!1.5" ) );
+               assertFalse( activator.isActive( "1.5.0_06", "!1.5" ) );
+               assertTrue( activator.isActive( "1.5.0_06", "!1.5.1" ) );
+       }
+
+       /** Test for the match "greather than or equal".
+        */
+       public void testGreatherThanOrEqualMatch()
+       {
+               JdkPrefixProfileActivator activator = new 
JdkPrefixProfileActivator();
+               assertTrue( activator.isActive( "1.5.0_06", "1.5+" ) );
+               assertFalse( activator.isActive( "1.5.0_06", "!1.5+" ) );
+               assertTrue( activator.isActive( "1.5.0_06", "1.4+" ) );
+               assertFalse( activator.isActive( "1.5.0_06", "!1.4+" ) );
+               assertFalse( activator.isActive( "1.5.0_06", "1.6+" ) );
+               assertTrue( activator.isActive( "1.5.0_06", "!1.6+" ) );
+               assertTrue( activator.isActive( "1.5.0_06", "1.5.0.0+" ) );
+               assertFalse( activator.isActive( "1.5.0_06", "!1.5.0.0+" ) );
+               assertTrue( activator.isActive( "1.5.0_06", "1.5.0.6+" ) );
+               assertFalse( activator.isActive( "1.5.0_06", "!1.5.0.6+" ) );
+               assertFalse( activator.isActive( "1.5.0_06", "1.5.0.7+" ) );
+               assertTrue( activator.isActive( "1.5.0_06", "!1.5.0.7+" ) );
+       }
+}

Propchange: 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivatorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivatorTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision


Reply via email to