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);
+        }
     }
+
 }


Reply via email to