Author: krosenvold
Date: Tue Nov 30 19:09:04 2010
New Revision: 1040705
URL: http://svn.apache.org/viewvc?rev=1040705&view=rev
Log:
o Made the reflection proxy handle RunResult too
Modified:
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java
Modified:
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java
URL:
http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java?rev=1040705&r1=1040704&r2=1040705&view=diff
==============================================================================
---
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java
(original)
+++
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java
Tue Nov 30 19:09:04 2010
@@ -33,6 +33,7 @@ import org.apache.maven.surefire.booter.
import org.apache.maven.surefire.booter.SurefireReflector;
import org.apache.maven.surefire.booter.SurefireStarter;
import org.apache.maven.surefire.booter.SystemPropertyManager;
+import org.apache.maven.surefire.providerapi.SurefireProvider;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.cli.CommandLineException;
import org.codehaus.plexus.util.cli.CommandLineUtils;
@@ -132,11 +133,11 @@ public class ForkStarter
boolean showHeading = true;
final ProviderFactory providerFactory = new ProviderFactory(
booterConfiguration, surefireClassLoader );
- Object surefireProvider = providerFactory.createProvider(
testsClassLoader );
+ SurefireProvider surefireProvider = providerFactory.createProvider(
testsClassLoader );
Properties properties = new Properties();
- final Iterator suites = (Iterator) SurefireReflector.getSuites(
surefireProvider );
+ final Iterator suites = surefireProvider.getSuites();
while ( suites.hasNext() )
{
Object testSet = suites.next();
Modified:
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java
URL:
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java?rev=1040705&r1=1040704&r2=1040705&view=diff
==============================================================================
---
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java
(original)
+++
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java
Tue Nov 30 19:09:04 2010
@@ -27,6 +27,7 @@ import org.apache.maven.surefire.provide
import org.apache.maven.surefire.providerapi.TestClassLoaderAware;
import org.apache.maven.surefire.providerapi.TestSuiteDefinitionAware;
import org.apache.maven.surefire.report.ReporterConfiguration;
+import org.apache.maven.surefire.suite.RunResult;
import org.apache.maven.surefire.testset.DirectoryScannerParameters;
import org.apache.maven.surefire.testset.TestArtifactInfo;
import org.apache.maven.surefire.testset.TestRequest;
@@ -72,6 +73,9 @@ public class SurefireReflector
private final Class providerPropertiesAware;
+ private final Class runResult;
+
+ private static final Class[] noargs = new Class[0];
public SurefireReflector( ClassLoader surefireClassLoader )
{
@@ -90,6 +94,7 @@ public class SurefireReflector
testClassLoaderAware = surefireClassLoader.loadClass(
TestClassLoaderAware.class.getName() );
reporterConfigurationAware = surefireClassLoader.loadClass(
ReporterConfigurationAware.class.getName() );
providerPropertiesAware = surefireClassLoader.loadClass(
ProviderPropertiesAware.class.getName() );
+ runResult = surefireClassLoader.loadClass(
RunResult.class.getName() );
}
catch ( ClassNotFoundException e )
{
@@ -97,6 +102,21 @@ public class SurefireReflector
}
}
+ public Object convertIfRunResult( Object result )
+ {
+ if ( result == null || !isRunResult( result ) )
+ {
+ return result;
+ }
+ final Integer getCompletedCount1 = (Integer) invokeGetter( result,
"getCompletedCount" );
+ final Integer getErrors = (Integer) invokeGetter( result, "getErrors"
);
+ final Integer getSkipped = (Integer) invokeGetter( result,
"getSkipped" );
+ final Integer getFailures = (Integer) invokeGetter( result,
"getFailures" );
+ return new RunResult( getCompletedCount1.intValue(),
getErrors.intValue(), getSkipped.intValue(),
+ getFailures.intValue() );
+
+ }
+
/**
* @noinspection UnusedDeclaration
@@ -335,6 +355,28 @@ public class SurefireReflector
}
}
+ private static Object invokeGetter( Object instance, String methodName )
+ {
+ try
+ {
+ final Method method = instance.getClass().getMethod( methodName,
noargs );
+ final Object[] noargsValues = new Object[0];
+ return method.invoke( instance, noargsValues );
+ }
+ catch ( NoSuchMethodException e )
+ {
+ throw new RuntimeException( "When finding method " + methodName, e
);
+ }
+ catch ( InvocationTargetException e )
+ {
+ throw new RuntimeException( "When running method " + methodName, e
);
+ }
+ catch ( IllegalAccessException e )
+ {
+ throw new RuntimeException( "When accessing method " + methodName,
e );
+ }
+ }
+
private static Method getMethod( Object instance, String methodName,
Class[] parameters )
{
try
@@ -468,4 +510,8 @@ public class SurefireReflector
invokeSetter( o, setter, param );
}
+ public boolean isRunResult( Object o )
+ {
+ return runResult.isAssignableFrom( o.getClass() );
+ }
}
Modified:
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java
URL:
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java?rev=1040705&r1=1040704&r2=1040705&view=diff
==============================================================================
---
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java
(original)
+++
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java
Tue Nov 30 19:09:04 2010
@@ -19,9 +19,17 @@ package org.apache.maven.surefire.booter
* under the License.
*/
-import org.apache.maven.surefire.providerapi.DirectoryScannerParametersAware;
+import org.apache.maven.surefire.providerapi.SurefireProvider;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
/**
+ * Creates the surefire provider.
+ * <p/>
+ * Todo: This class does a little bit too little ;)
+ *
* @author Kristian Rosenvold
*/
public class ProviderFactory
@@ -30,28 +38,16 @@ public class ProviderFactory
private final ClassLoader surefireClassLoader;
- private final Class directoryScannerParametersAware;
-
private final SurefireReflector surefireReflector;
-
public ProviderFactory( BooterConfiguration booterConfiguration,
ClassLoader surefireClassLoader )
{
this.booterConfiguration = booterConfiguration;
this.surefireClassLoader = surefireClassLoader;
this.surefireReflector = new SurefireReflector( surefireClassLoader );
- try
- {
- directoryScannerParametersAware =
- surefireClassLoader.loadClass(
DirectoryScannerParametersAware.class.getName() );
- }
- catch ( ClassNotFoundException e )
- {
- throw new RuntimeException( "When loading class", e );
- }
}
- public Object createProvider( ClassLoader testClassLoader )
+ public SurefireProvider createProvider( ClassLoader testClassLoader )
{
ClassLoader context =
java.lang.Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader( surefireClassLoader );
@@ -65,16 +61,35 @@ public class ProviderFactory
surefireReflector.setTestClassLoaderAware( o, testClassLoader );
surefireReflector.setTestArtifactInfoAware( o,
booterConfiguration.getTestNg() );
- /*
- if ( o instanceof ReportingAware )
+ Thread.currentThread().setContextClassLoader( context );
+
+ return createClassLoaderProxy( o );
+ }
+
+ private SurefireProvider createClassLoaderProxy( Object target )
+ {
+ return (SurefireProvider) Proxy.newProxyInstance(
this.getClass().getClassLoader(),
+ new Class[]{
SurefireProvider.class },
+ new
ClassLoaderProxy( target ) );
+ }
+
+ private class ClassLoaderProxy
+ implements InvocationHandler
+ {
+ private final Object target;
+
+ public ClassLoaderProxy( Object delegate )
{
- ReporterManagerFactory reporterManagerFactory = new
ReporterManagerFactory2( booterConfiguration.getReports(), surefireClassLoader,
booterConfiguration.getReporterConfiguration() );
- ((ReportingAware) o).setReporterManagerFactory(
reporterManagerFactory );
+ this.target = delegate;
}
-*/
- Thread.currentThread().setContextClassLoader( context );
-
- return o;
+ public Object invoke( Object proxy, Method method, Object[] args )
+ throws Throwable
+ {
+ Method delegateMethod = target.getClass().getMethod(
method.getName(), method.getParameterTypes() );
+ final Object result = delegateMethod.invoke( target, args );
+ return surefireReflector.convertIfRunResult(result);
+ }
}
+
}