You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kr...@apache.org on 2012/08/17 16:01:39 UTC
svn commit: r1374269 - in
/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire:
AbstractSurefireMojo.java ClasspathCache.java SurefireDependencyResolver.java
Author: krosenvold
Date: Fri Aug 17 14:01:39 2012
New Revision: 1374269
URL: http://svn.apache.org/viewvc?rev=1374269&view=rev
Log:
o Added small cache of resolved classpaths.
Avoiding repeated lookup increses performance in multimodule builds
Added:
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ClasspathCache.java
Modified:
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java
Modified: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java?rev=1374269&r1=1374268&r2=1374269&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java (original)
+++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java Fri Aug 17 14:01:39 2012
@@ -19,18 +19,6 @@ package org.apache.maven.plugin.surefire
* under the License.
*/
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
@@ -81,6 +69,19 @@ import org.apache.maven.toolchain.Toolch
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.StringUtils;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
/**
* Abstract base class for running tests using Surefire.
*
@@ -735,7 +736,6 @@ public abstract class AbstractSurefireMo
showMap( getEnvironmentVariables(), "environment variable" );
}
-
Properties originalSystemProperties = (Properties) System.getProperties().clone();
try
{
@@ -1013,8 +1013,15 @@ public abstract class AbstractSurefireMo
try
{
provider.addProviderProperties();
+ // cache the provider lookup
String providerName = provider.getProviderName();
- Classpath providerClasspath = provider.getProviderClasspath();
+ Classpath providerClasspath = ClasspathCache.getCachedClassPath( providerName );
+ if ( providerClasspath == null )
+ {
+ providerClasspath = provider.getProviderClasspath();
+ ClasspathCache.setCachedClasspath( providerName, providerClasspath );
+
+ }
Classpath inprocClassPath = new Classpath( providerClasspath );
Artifact surefireArtifact = getCommonArtifact();
inprocClassPath.addClassPathElementUrl( surefireArtifact.getFile().getAbsolutePath() );
@@ -1024,8 +1031,8 @@ public abstract class AbstractSurefireMo
logClasspath( testClasspath, "test classpath" );
logClasspath( providerClasspath, "provider classpath" );
final ClasspathConfiguration classpathConfiguration =
- new ClasspathConfiguration( testClasspath, providerClasspath, inprocClassPath, effectiveIsEnableAssertions(),
- isChildDelegation() );
+ new ClasspathConfiguration( testClasspath, providerClasspath, inprocClassPath,
+ effectiveIsEnableAssertions(), isChildDelegation() );
return new StartupConfiguration( providerName, classpathConfiguration, classLoaderConfiguration,
isForking(), false );
@@ -1061,7 +1068,7 @@ public abstract class AbstractSurefireMo
void logClasspath( Classpath classpath, String descriptor )
{
getLog().debug( descriptor + " classpath:" );
- @SuppressWarnings( "unchecked" ) final List<String> classPath = classpath.getClassPath();
+ @SuppressWarnings("unchecked") final List<String> classPath = classpath.getClassPath();
for ( String classpathElement : classPath )
{
if ( classpathElement == null )
@@ -1144,7 +1151,7 @@ public abstract class AbstractSurefireMo
if ( plugin != null )
{
- @SuppressWarnings( "rawtypes" ) List executions = plugin.getExecutions();
+ @SuppressWarnings("rawtypes") List executions = plugin.getExecutions();
return executions != null && executions.size() > 1;
}
}
@@ -1246,9 +1253,10 @@ public abstract class AbstractSurefireMo
getArtifactClasspath( shadeFire != null ? shadeFire : surefireBooterArtifact );
return new ForkConfiguration( bootClasspathConfiguration, tmpDir, getEffectiveDebugForkedProcess(),
- getEffectiveJvm(),
- getWorkingDirectory() != null ? getWorkingDirectory() : getBasedir(), getArgLine(),
- getEnvironmentVariables(), getLog().isDebugEnabled(), getEffectiveForkCount() );
+ getEffectiveJvm(),
+ getWorkingDirectory() != null ? getWorkingDirectory() : getBasedir(),
+ getArgLine(), getEnvironmentVariables(), getLog().isDebugEnabled(),
+ getEffectiveForkCount() );
}
@@ -1380,7 +1388,7 @@ public abstract class AbstractSurefireMo
{
// A tribute to Linus Torvalds
String configChecksum = getConfigChecksum();
- @SuppressWarnings( "unchecked" ) Map<String, String> pluginContext = getPluginContext();
+ @SuppressWarnings("unchecked") Map<String, String> pluginContext = getPluginContext();
if ( pluginContext.containsKey( configChecksum ) )
{
getLog().info( "Skipping execution of surefire because it has already been run for this configuration" );
@@ -1420,7 +1428,7 @@ public abstract class AbstractSurefireMo
classpath.add( getClassesDirectory().getAbsolutePath() );
- @SuppressWarnings( "unchecked" ) Set<Artifact> classpathArtifacts = getProject().getArtifacts();
+ @SuppressWarnings("unchecked") Set<Artifact> classpathArtifacts = getProject().getArtifacts();
if ( getClasspathDependencyScopeExclude() != null && !getClasspathDependencyScopeExclude().equals( "" ) )
{
@@ -1551,20 +1559,26 @@ public abstract class AbstractSurefireMo
private Classpath getArtifactClasspath( Artifact surefireArtifact )
{
- ArtifactResolutionResult result = resolveArtifact( null, surefireArtifact );
-
- List<String> items = new ArrayList<String>();
- for ( Object o : result.getArtifacts() )
+ Classpath existing = ClasspathCache.getCachedClassPath( surefireArtifact.getArtifactId() );
+ if ( existing == null )
{
- Artifact artifact = (Artifact) o;
+ ArtifactResolutionResult result = resolveArtifact( null, surefireArtifact );
- getLog().debug(
- "Adding to " + getPluginName() + " booter test classpath: " + artifact.getFile().getAbsolutePath() +
- " Scope: " + artifact.getScope() );
+ List<String> items = new ArrayList<String>();
+ for ( Object o : result.getArtifacts() )
+ {
+ Artifact artifact = (Artifact) o;
+
+ getLog().debug(
+ "Adding to " + getPluginName() + " booter test classpath: " + artifact.getFile().getAbsolutePath() +
+ " Scope: " + artifact.getScope() );
- items.add( artifact.getFile().getAbsolutePath() );
+ items.add( artifact.getFile().getAbsolutePath() );
+ }
+ existing = new Classpath( items );
+ ClasspathCache.setCachedClasspath( surefireArtifact.getArtifactId(), existing );
}
- return new Classpath( items );
+ return existing;
}
private Properties getUserProperties()
@@ -1864,7 +1878,7 @@ public abstract class AbstractSurefireMo
return systemProperties;
}
- @SuppressWarnings( { "UnusedDeclaration", "deprecation" } )
+ @SuppressWarnings({ "UnusedDeclaration", "deprecation" })
public void setSystemProperties( Properties systemProperties )
{
this.systemProperties = systemProperties;
@@ -1875,7 +1889,7 @@ public abstract class AbstractSurefireMo
return systemPropertyVariables;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setSystemPropertyVariables( Map<String, String> systemPropertyVariables )
{
this.systemPropertyVariables = systemPropertyVariables;
@@ -1886,7 +1900,7 @@ public abstract class AbstractSurefireMo
return systemPropertiesFile;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setSystemPropertiesFile( File systemPropertiesFile )
{
this.systemPropertiesFile = systemPropertiesFile;
@@ -1907,7 +1921,7 @@ public abstract class AbstractSurefireMo
return pluginArtifactMap;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setPluginArtifactMap( Map<String, Artifact> pluginArtifactMap )
{
this.pluginArtifactMap = pluginArtifactMap;
@@ -1918,7 +1932,7 @@ public abstract class AbstractSurefireMo
return projectArtifactMap;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setProjectArtifactMap( Map<String, Artifact> projectArtifactMap )
{
this.projectArtifactMap = projectArtifactMap;
@@ -1930,7 +1944,7 @@ public abstract class AbstractSurefireMo
return reportNameSuffix;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setReportNameSuffix( String reportNameSuffix )
{
this.reportNameSuffix = reportNameSuffix;
@@ -1942,7 +1956,7 @@ public abstract class AbstractSurefireMo
return redirectTestOutputToFile;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setRedirectTestOutputToFile( boolean redirectTestOutputToFile )
{
this.redirectTestOutputToFile = redirectTestOutputToFile;
@@ -1964,7 +1978,7 @@ public abstract class AbstractSurefireMo
return forkMode;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setForkMode( String forkMode )
{
this.forkMode = forkMode;
@@ -1980,7 +1994,7 @@ public abstract class AbstractSurefireMo
return argLine;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setArgLine( String argLine )
{
this.argLine = argLine;
@@ -1992,7 +2006,7 @@ public abstract class AbstractSurefireMo
return environmentVariables;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setEnvironmentVariables( Map<String, String> environmentVariables )
{
this.environmentVariables = environmentVariables;
@@ -2003,7 +2017,7 @@ public abstract class AbstractSurefireMo
return workingDirectory;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setWorkingDirectory( File workingDirectory )
{
this.workingDirectory = workingDirectory;
@@ -2014,7 +2028,7 @@ public abstract class AbstractSurefireMo
return childDelegation;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setChildDelegation( boolean childDelegation )
{
this.childDelegation = childDelegation;
@@ -2025,7 +2039,7 @@ public abstract class AbstractSurefireMo
return groups;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setGroups( String groups )
{
this.groups = groups;
@@ -2036,7 +2050,7 @@ public abstract class AbstractSurefireMo
return excludedGroups;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setExcludedGroups( String excludedGroups )
{
this.excludedGroups = excludedGroups;
@@ -2047,7 +2061,7 @@ public abstract class AbstractSurefireMo
return suiteXmlFiles;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setSuiteXmlFiles( File[] suiteXmlFiles )
{
this.suiteXmlFiles = suiteXmlFiles;
@@ -2058,7 +2072,7 @@ public abstract class AbstractSurefireMo
return junitArtifactName;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setJunitArtifactName( String junitArtifactName )
{
this.junitArtifactName = junitArtifactName;
@@ -2069,7 +2083,7 @@ public abstract class AbstractSurefireMo
return testNGArtifactName;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setTestNGArtifactName( String testNGArtifactName )
{
this.testNGArtifactName = testNGArtifactName;
@@ -2080,7 +2094,7 @@ public abstract class AbstractSurefireMo
return threadCount;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setThreadCount( int threadCount )
{
this.threadCount = threadCount;
@@ -2091,7 +2105,7 @@ public abstract class AbstractSurefireMo
return perCoreThreadCount;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setPerCoreThreadCount( boolean perCoreThreadCount )
{
this.perCoreThreadCount = perCoreThreadCount;
@@ -2102,7 +2116,7 @@ public abstract class AbstractSurefireMo
return useUnlimitedThreads;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setUseUnlimitedThreads( boolean useUnlimitedThreads )
{
this.useUnlimitedThreads = useUnlimitedThreads;
@@ -2113,7 +2127,7 @@ public abstract class AbstractSurefireMo
return parallel;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setParallel( String parallel )
{
this.parallel = parallel;
@@ -2124,7 +2138,7 @@ public abstract class AbstractSurefireMo
return trimStackTrace;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setTrimStackTrace( boolean trimStackTrace )
{
this.trimStackTrace = trimStackTrace;
@@ -2135,7 +2149,7 @@ public abstract class AbstractSurefireMo
return artifactResolver;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setArtifactResolver( ArtifactResolver artifactResolver )
{
this.artifactResolver = artifactResolver;
@@ -2146,7 +2160,7 @@ public abstract class AbstractSurefireMo
return artifactFactory;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setArtifactFactory( ArtifactFactory artifactFactory )
{
this.artifactFactory = artifactFactory;
@@ -2157,7 +2171,7 @@ public abstract class AbstractSurefireMo
return remoteRepositories;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setRemoteRepositories( List<ArtifactRepository> remoteRepositories )
{
this.remoteRepositories = remoteRepositories;
@@ -2168,7 +2182,7 @@ public abstract class AbstractSurefireMo
return metadataSource;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setMetadataSource( ArtifactMetadataSource metadataSource )
{
this.metadataSource = metadataSource;
@@ -2180,7 +2194,7 @@ public abstract class AbstractSurefireMo
return disableXmlReport;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setDisableXmlReport( boolean disableXmlReport )
{
this.disableXmlReport = disableXmlReport;
@@ -2192,7 +2206,8 @@ public abstract class AbstractSurefireMo
return enableAssertions;
}
- public boolean effectiveIsEnableAssertions(){
+ public boolean effectiveIsEnableAssertions()
+ {
if ( getArgLine() != null )
{
List<String> args = Arrays.asList( getArgLine().split( " " ) );
@@ -2204,7 +2219,7 @@ public abstract class AbstractSurefireMo
return isEnableAssertions();
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setEnableAssertions( boolean enableAssertions )
{
this.enableAssertions = enableAssertions;
@@ -2215,7 +2230,7 @@ public abstract class AbstractSurefireMo
return session;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setSession( MavenSession session )
{
this.session = session;
@@ -2226,7 +2241,7 @@ public abstract class AbstractSurefireMo
return objectFactory;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setObjectFactory( String objectFactory )
{
this.objectFactory = objectFactory;
@@ -2237,7 +2252,7 @@ public abstract class AbstractSurefireMo
return toolchainManager;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setToolchainManager( ToolchainManager toolchainManager )
{
this.toolchainManager = toolchainManager;
@@ -2253,7 +2268,7 @@ public abstract class AbstractSurefireMo
return runOrder;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setRunOrder( String runOrder )
{
this.runOrder = runOrder;
@@ -2269,7 +2284,7 @@ public abstract class AbstractSurefireMo
return project;
}
- @SuppressWarnings( "UnusedDeclaration" )
+ @SuppressWarnings("UnusedDeclaration")
public void setProject( MavenProject project )
{
this.project = project;
Added: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ClasspathCache.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ClasspathCache.java?rev=1374269&view=auto
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ClasspathCache.java (added)
+++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ClasspathCache.java Fri Aug 17 14:01:39 2012
@@ -0,0 +1,41 @@
+package org.apache.maven.plugin.surefire;
+/*
+ * 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.
+ */
+
+import org.apache.maven.surefire.booter.Classpath;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author Kristian Rosenvold
+ */
+public class ClasspathCache
+{
+ private static final ConcurrentHashMap<String, Classpath> classpaths =
+ new ConcurrentHashMap<String, Classpath>( 4 );
+
+ public static Classpath getCachedClassPath( String artifactId )
+ {
+ return classpaths.get( artifactId );
+ }
+
+ public static void setCachedClasspath(String key, Classpath classpath){
+ classpaths.put(key, classpath);
+ }
+}
Modified: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java?rev=1374269&r1=1374268&r2=1374269&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java (original)
+++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java Fri Aug 17 14:01:39 2012
@@ -127,23 +127,30 @@ public class SurefireDependencyResolver
public Classpath getProviderClasspath( String provider, String version, Artifact filteredArtifact )
throws ArtifactNotFoundException, ArtifactResolutionException
{
- Artifact providerArtifact = artifactFactory.createDependencyArtifact( "org.apache.maven.surefire", provider,
- VersionRange.createFromVersion( version ),
- "jar", null, Artifact.SCOPE_TEST );
- ArtifactResolutionResult result = resolveArtifact( filteredArtifact, providerArtifact );
- List<String> files = new ArrayList<String>();
-
- for ( Object o : result.getArtifacts() )
+ Classpath classPath = ClasspathCache.getCachedClassPath( provider );
+ if ( classPath == null )
{
- Artifact artifact = (Artifact) o;
+ Artifact providerArtifact = artifactFactory.createDependencyArtifact( "org.apache.maven.surefire", provider,
+ VersionRange.createFromVersion(
+ version ), "jar", null,
+ Artifact.SCOPE_TEST );
+ ArtifactResolutionResult result = resolveArtifact( filteredArtifact, providerArtifact );
+ List<String> files = new ArrayList<String>();
+
+ for ( Object o : result.getArtifacts() )
+ {
+ Artifact artifact = (Artifact) o;
- log.debug(
- "Adding to " + pluginName + " test classpath: " + artifact.getFile().getAbsolutePath() + " Scope: "
- + artifact.getScope() );
+ log.debug(
+ "Adding to " + pluginName + " test classpath: " + artifact.getFile().getAbsolutePath() + " Scope: "
+ + artifact.getScope() );
- files.add( artifact.getFile().getAbsolutePath() );
+ files.add( artifact.getFile().getAbsolutePath() );
+ }
+ classPath = new Classpath( files );
+ ClasspathCache.setCachedClasspath( provider, classPath );
}
- return new Classpath( files );
+ return classPath;
}
public Classpath addProviderToClasspath( Map<String, Artifact> pluginArtifactMap, Artifact surefireArtifact )