Author: sisbell Date: Wed Apr 8 15:52:32 2009 New Revision: 763291 URL: http://svn.apache.org/viewvc?rev=763291&view=rev Log: [MNG-1957] jdk activation for profiles.
Added: maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/matchers/JdkMatcher.java maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/matchers/ maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/matchers/JdkMatcherTest.java maven/components/trunk/maven-project/src/test/resources-project-builder/jdk-activation/ maven/components/trunk/maven-project/src/test/resources-project-builder/jdk-activation/pom.xml Modified: maven/components/trunk/maven-project-builder/src/main/java/org/apache/maven/project/builder/profile/JdkMatcher.java maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/DefaultProfileManager.java maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/ProfileActivationContext.java maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/PomConstructionTest.java Modified: maven/components/trunk/maven-project-builder/src/main/java/org/apache/maven/project/builder/profile/JdkMatcher.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project-builder/src/main/java/org/apache/maven/project/builder/profile/JdkMatcher.java?rev=763291&r1=763290&r2=763291&view=diff ============================================================================== --- maven/components/trunk/maven-project-builder/src/main/java/org/apache/maven/project/builder/profile/JdkMatcher.java (original) +++ maven/components/trunk/maven-project-builder/src/main/java/org/apache/maven/project/builder/profile/JdkMatcher.java Wed Apr 8 15:52:32 2009 @@ -165,7 +165,7 @@ return ranges; } - private static class RangeValue + public static class RangeValue { private String value; Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/DefaultProfileManager.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/DefaultProfileManager.java?rev=763291&r1=763290&r2=763291&view=diff ============================================================================== --- maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/DefaultProfileManager.java (original) +++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/DefaultProfileManager.java Wed Apr 8 15:52:32 2009 @@ -27,6 +27,7 @@ import org.apache.maven.profiles.ProfileManager; import org.apache.maven.profiles.matchers.DefaultMatcher; import org.apache.maven.profiles.matchers.FileMatcher; +import org.apache.maven.profiles.matchers.JdkMatcher; import org.apache.maven.profiles.matchers.ProfileMatcher; import org.apache.maven.profiles.matchers.PropertyMatcher; import org.apache.maven.shared.model.InterpolatorProperty; @@ -50,7 +51,7 @@ private static final ProfileMatcher defaultMatcher = new DefaultMatcher(); private static final List<ProfileMatcher> matchers = - (List<ProfileMatcher>) Collections.unmodifiableList( Arrays.asList( new PropertyMatcher(), new FileMatcher() ) ); + (List<ProfileMatcher>) Collections.unmodifiableList( Arrays.asList( new PropertyMatcher(), new FileMatcher(), new JdkMatcher() ) ); /** * the properties passed to the profile manager are the props that @@ -197,11 +198,13 @@ List<Profile> projectProfiles = new ArrayList<Profile>(); ProfileManager externalProfileManager = config.getGlobalProfileManager(); - Properties props = new Properties(config.getExecutionProperties()); + Properties props = new Properties(); + props.putAll(config.getExecutionProperties()); props.putAll(config.getUserProperties()); - ProfileActivationContext profileActivationContext = (externalProfileManager == null) ? new ProfileActivationContext( props, false ): + ProfileActivationContext profileActivationContext = (externalProfileManager == null) ? new ProfileActivationContext( new Properties(), false ): externalProfileManager.getProfileActivationContext(); + profileActivationContext.getExecutionProperties().putAll(props); if(externalProfileManager != null) { Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/ProfileActivationContext.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/ProfileActivationContext.java?rev=763291&r1=763290&r2=763291&view=diff ============================================================================== --- maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/ProfileActivationContext.java (original) +++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/ProfileActivationContext.java Wed Apr 8 15:52:32 2009 @@ -40,7 +40,7 @@ public ProfileActivationContext( Properties executionProperties, boolean isCustomActivatorFailureSuppressed ) { - this.executionProperties = executionProperties; + this.executionProperties = (executionProperties != null) ? executionProperties : new Properties(); this.isCustomActivatorFailureSuppressed = isCustomActivatorFailureSuppressed; } Added: maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/matchers/JdkMatcher.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/matchers/JdkMatcher.java?rev=763291&view=auto ============================================================================== --- maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/matchers/JdkMatcher.java (added) +++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/matchers/JdkMatcher.java Wed Apr 8 15:52:32 2009 @@ -0,0 +1,191 @@ +package org.apache.maven.profiles.matchers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.apache.maven.model.Profile; +import org.apache.maven.shared.model.InterpolatorProperty; + +public class JdkMatcher + implements ProfileMatcher + { + + private static final String JDK_VERSION = "${java.version}"; + + public boolean isMatch(Profile profile, + List<InterpolatorProperty> properties) { + String version = null; + for(InterpolatorProperty ip : properties) + { + if(ip.getKey().equals(JDK_VERSION)) + { + version = ip.getValue(); + break; + } + } + if ( version == null ) + { + return false; + } + + org.apache.maven.model.Activation activation = profile.getActivation(); + if(activation == null || activation.getJdk() == null) + { + return false; + } + + String jdk = activation.getJdk(); + if ( jdk.startsWith( "!" ) ) + { + return !version.startsWith( jdk.replaceFirst( "!", "" ) ); + } + else if ( isRange( jdk ) ) + { + return isInRange( version, getRange( jdk ) ); + } + else + { + return version.startsWith( jdk ); + } + + } + + private static boolean isInRange( String value, List<RangeValue> range ) + { + int leftRelation = getRelationOrder( value, range.get( 0 ), true ); + + if ( leftRelation == 0 ) + { + return true; + } + + if ( leftRelation < 0 ) + { + return false; + } + + return getRelationOrder( value, range.get( 1 ), false ) <= 0; + } + + private static int getRelationOrder( String value, RangeValue rangeValue, boolean isLeft ) + { + if ( rangeValue.value.length() <= 0 ) + { + return isLeft ? 1 : -1; + } + + List<String> valueTokens = new ArrayList<String>( Arrays.asList( value.split( "\\." ) ) ); + List<String> rangeValueTokens = new ArrayList<String>( Arrays.asList( rangeValue.value.split( "\\." ) ) ); + + int max = Math.max( valueTokens.size(), rangeValueTokens.size() ); + addZeroTokens( valueTokens, max ); + addZeroTokens( rangeValueTokens, max ); + + if ( value.equals( rangeValue.value ) ) + { + if ( !rangeValue.isClosed() ) + { + return isLeft ? -1 : 1; + } + return 0; + } + + for ( int i = 0; i < valueTokens.size(); i++ ) + { + int x = Integer.parseInt( valueTokens.get( i ) ); + int y = Integer.parseInt( rangeValueTokens.get( i ) ); + if ( x < y ) + { + return -1; + } + else if ( x > y ) + { + return 1; + } + } + if ( !rangeValue.isClosed() ) + { + return isLeft ? -1 : 1; + } + return 0; + } + + private static void addZeroTokens( List<String> tokens, int max ) + { + if ( tokens.size() < max ) + { + for ( int i = 0; i < ( max - tokens.size() ); i++ ) + { + tokens.add( "0" ); + } + } + } + + private static boolean isRange( String value ) + { + return value.contains( "," ); + } + + private static List<RangeValue> getRange( String range ) + { + List<RangeValue> ranges = new ArrayList<RangeValue>(); + + for ( String token : range.split( "," ) ) + { + if ( token.startsWith( "[" ) ) + { + ranges.add( new RangeValue( token.replace( "[", "" ), true ) ); + } + else if ( token.startsWith( "(" ) ) + { + ranges.add( new RangeValue( token.replace( "(", "" ), false ) ); + } + else if ( token.endsWith( "]" ) ) + { + ranges.add( new RangeValue( token.replace( "]", "" ), true ) ); + } + else if ( token.endsWith( ")" ) ) + { + ranges.add( new RangeValue( token.replace( ")", "" ), false ) ); + } + else if ( token.length() <= 0 ) + { + ranges.add( new RangeValue( "", false ) ); + } + } + if ( ranges.size() < 2 ) + { + ranges.add( new RangeValue( "99999999", false ) ); + } + return ranges; + } + + private static class RangeValue + { + private String value; + + private boolean isClosed; + + RangeValue( String value, boolean isClosed ) + { + this.value = value.trim(); + this.isClosed = isClosed; + } + + public String getValue() + { + return value; + } + + public boolean isClosed() + { + return isClosed; + } + + public String toString() + { + return value; + } + } +} Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java?rev=763291&r1=763290&r2=763291&view=diff ============================================================================== --- maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java (original) +++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java Wed Apr 8 15:52:32 2009 @@ -440,8 +440,12 @@ List<String> inactiveProfileIds = ( projectBuilderConfiguration != null && projectBuilderConfiguration.getGlobalProfileManager() != null && projectBuilderConfiguration .getGlobalProfileManager().getProfileActivationContext() != null ) ? projectBuilderConfiguration.getGlobalProfileManager().getProfileActivationContext().getExplicitlyInactiveProfileIds() : new ArrayList<String>(); - - ProfileManagerInfo profileInfo = new ProfileManagerInfo(null, activeProfileIds, inactiveProfileIds); + + List<InterpolatorProperty> interpolatorProperties = new ArrayList<InterpolatorProperty>(); + interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( projectBuilderConfiguration.getExecutionProperties(), PomInterpolatorTag.EXECUTION_PROPERTIES.name() ) ); + interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( projectBuilderConfiguration.getUserProperties(), PomInterpolatorTag.USER_PROPERTIES.name() ) ); + + ProfileManagerInfo profileInfo = new ProfileManagerInfo(interpolatorProperties, activeProfileIds, inactiveProfileIds); PomClassicDomainModel domainModel = new PomClassicDomainModel( pomFile ); domainModel.setProjectDirectory( pomFile.getParentFile() ); domainModel.setMostSpecialized( true ); @@ -510,6 +514,7 @@ // Lineage count is inclusive to add the POM read in itself. transformedDomainModel.setLineageCount( lineageCount + 1 ); + Model m = transformedDomainModel.getModel(); transformedDomainModel.setParentFile( parentFile ); return transformedDomainModel; Added: maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/matchers/JdkMatcherTest.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/matchers/JdkMatcherTest.java?rev=763291&view=auto ============================================================================== --- maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/matchers/JdkMatcherTest.java (added) +++ maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/matchers/JdkMatcherTest.java Wed Apr 8 15:52:32 2009 @@ -0,0 +1,24 @@ +package org.apache.maven.profiles.matchers; + +import java.util.Collections; + +import org.apache.maven.model.Activation; +import org.apache.maven.model.Profile; +import org.apache.maven.shared.model.InterpolatorProperty; + +import junit.framework.TestCase; + +public class JdkMatcherTest extends TestCase +{ + public void testJdkMatch() + throws Exception + { + Profile p = new Profile(); + Activation a = new Activation(); + a.setJdk("(1.3,100)"); + p.setActivation(a); + + JdkMatcher m = new JdkMatcher(); + assertTrue(m.isMatch(p, Collections.singletonList(new InterpolatorProperty("${java.version}", "1.5.0_16")))); + } +} Modified: maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/PomConstructionTest.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/PomConstructionTest.java?rev=763291&r1=763290&r2=763291&view=diff ============================================================================== --- maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/PomConstructionTest.java (original) +++ maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/PomConstructionTest.java Wed Apr 8 15:52:32 2009 @@ -23,6 +23,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Properties; @@ -876,14 +877,10 @@ } /** MNG-4027*/ - /* FIXME*/ - public void testProfileInjectedDependencies() throws Exception { - //c.b,d,a PomTestWrapper pom = buildPom( "profile-injected-dependencies" ); - System.out.println(pom.getDomainModel().asString()); assertEquals( 4, ( (List<?>) pom.getValue( "dependencies" ) ).size() ); assertEquals( "a", pom.getValue( "dependencies[1]/artifactId" ) ); assertEquals( "c", pom.getValue( "dependencies[2]/artifactId" ) ); @@ -891,18 +888,14 @@ assertEquals( "d", pom.getValue( "dependencies[4]/artifactId" ) ); } - public void testDependencyInheritance() throws Exception { - //c.b,d,a PomTestWrapper pom = buildPom( "dependency-inheritance/sub" ); assertEquals(1, ( (List<?>) pom.getValue( "dependencies" ) ).size() ); assertEquals("4.4", pom.getValue("dependencies[1]/version") ); - System.out.println(pom.getDomainModel().asString()); } -//*/ /** MNG-4034 */ public void testManagedProfileDependency() throws Exception @@ -1334,6 +1327,20 @@ assertEquals("c", pom.getValue( "build/extensions[3]/artifactId" ) ); } + /*MNG-1957*/ + public void testJdkActivation() + throws Exception + { + Properties props = new Properties(); + props.put("java.version", "1.5.0_15"); + + PomTestWrapper pom = buildPom( "jdk-activation", props ); + assertEquals(3, pom.getMavenProject().getActiveProfiles().size()); + assertEquals("PASSED", pom.getValue("properties/jdkProperty3")); + assertEquals("PASSED", pom.getValue("properties/jdkProperty2")); + assertEquals("PASSED", pom.getValue("properties/jdkProperty1")); + } + /* MNG-2174 */ public void testProfilePluginMngDependencies() throws Exception @@ -1372,7 +1379,24 @@ { assertEquals( new File( value.toString() ).getPath(), value.toString() ); } - + + private PomTestWrapper buildPom( String pomPath, Properties properties) + throws Exception +{ + File pomFile = new File( testDirectory , pomPath ); + if ( pomFile.isDirectory() ) + { + pomFile = new File( pomFile, "pom.xml" ); + } + ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration(); + config.setLocalRepository(new DefaultArtifactRepository("default", "", new DefaultRepositoryLayout())); + ProfileActivationContext pCtx = new ProfileActivationContext(null, true); + + config.setExecutionProperties(properties); + config.setGlobalProfileManager(new DefaultProfileManager(this.getContainer(), pCtx)); + return new PomTestWrapper( pomFile, mavenProjectBuilder.build( pomFile, config ) ); +} + private PomTestWrapper buildPom( String pomPath, String... profileIds ) throws Exception { Added: maven/components/trunk/maven-project/src/test/resources-project-builder/jdk-activation/pom.xml URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/test/resources-project-builder/jdk-activation/pom.xml?rev=763291&view=auto ============================================================================== --- maven/components/trunk/maven-project/src/test/resources-project-builder/jdk-activation/pom.xml (added) +++ maven/components/trunk/maven-project/src/test/resources-project-builder/jdk-activation/pom.xml Wed Apr 8 15:52:32 2009 @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +<project> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.apache.maven.its.mng1957</groupId> + <artifactId>test</artifactId> + <version>1.0-SNAPSHOT</version> + + <name>Maven Integration Test :: MNG-1957</name> + <description> + Test that JDK profile activation allows version ranges. + </description> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.its.plugins</groupId> + <artifactId>maven-it-plugin-expression</artifactId> + <version>2.1-SNAPSHOT</version> + <executions> + <execution> + <phase>validate</phase> + <goals> + <goal>eval</goal> + </goals> + <configuration> + <outputFile>target/jdk.properties</outputFile> + <expressions> + <expression>project/properties</expression> + </expressions> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + + <profiles> + <profile> + <id>test-1</id> + <activation> + <jdk>[1.4,)</jdk> + </activation> + <properties> + <jdkProperty1>PASSED</jdkProperty1> + </properties> + </profile> + <profile> + <id>test-2</id> + <activation> + <jdk>(,100)</jdk> + </activation> + <properties> + <jdkProperty2>PASSED</jdkProperty2> + </properties> + </profile> + <profile> + <id>test-3</id> + <activation> + <jdk>(1.3,100)</jdk> + </activation> + <properties> + <jdkProperty3>PASSED</jdkProperty3> + </properties> + </profile> + <profile> + <id>test-4</id> + <activation> + <jdk>(100,)</jdk> + </activation> + <properties> + <jdkProperty4>FAILED</jdkProperty4> + </properties> + </profile> + <profile> + <id>test-5</id> + <activation> + <jdk>(,1.4)</jdk> + </activation> + <properties> + <jdkProperty5>FAILED</jdkProperty5> + </properties> + </profile> + </profiles> +</project>