View Javadoc

1   package org.apache.maven.surefire.testng.conf;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *     http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.lang.reflect.Method;
23  import java.util.ArrayList;
24  import java.util.HashMap;
25  import java.util.Iterator;
26  import java.util.List;
27  import java.util.Map;
28  
29  import org.apache.maven.surefire.testset.TestSetFailedException;
30  import org.apache.maven.surefire.util.NestedRuntimeException;
31  import org.testng.TestNG;
32  
33  public abstract class AbstractDirectConfigurator
34      implements Configurator
35  {
36      final Map setters;
37  
38      AbstractDirectConfigurator()
39      {
40          Map options = new HashMap();
41          options.put( "groups", new Setter( "setGroups", String.class ) );
42          options.put( "excludedgroups", new Setter( "setExcludedGroups", String.class ) );
43          options.put( "junit", new Setter( "setJUnit", Boolean.class ) );
44          options.put( "threadcount", new Setter( "setThreadCount", int.class ) );
45          options.put( "usedefaultlisteners", new Setter( "setUseDefaultListeners", boolean.class ) );
46          this.setters = options;
47      }
48  
49      public void configure( TestNG testng, Map options )
50          throws TestSetFailedException
51      {
52          // kind of ugly, but listeners are configured differently
53          final String listeners = (String) options.remove( "listener" );
54          // DGF In 4.7, default listeners dump XML files in the surefire-reports directory,
55          // confusing the report plugin.  This was fixed in later versions.
56          testng.setUseDefaultListeners( false );
57          for ( Iterator it = options.entrySet().iterator(); it.hasNext(); )
58          {
59              Map.Entry entry = (Map.Entry) it.next();
60              String key = (String) entry.getKey();
61              Object val = entry.getValue();
62  
63              Setter setter = (Setter) setters.get( key );
64              if ( setter != null )
65              {
66                  try
67                  {
68                      setter.invoke( testng, val );
69                  }
70                  catch ( Exception ex )
71                  {
72                      throw new NestedRuntimeException( "Cannot set option " + key + " with value " + val, ex );
73                  }
74  
75              }
76          }
77          // TODO: we should have the Profile so that we can decide if this is needed or not
78          testng.setListenerClasses( loadListenerClasses( listeners ) );
79      }
80  
81      public static List loadListenerClasses( String listenerClasses )
82          throws TestSetFailedException
83      {
84          if ( listenerClasses == null || "".equals( listenerClasses.trim() ) )
85          {
86              return new ArrayList();
87          }
88  
89          List classes = new ArrayList();
90          String[] classNames = listenerClasses.split( " *, *" );
91          for ( int i = 0; i < classNames.length; i++ )
92          {
93              String className = classNames[i];
94              Class clazz = loadClass( className );
95              classes.add( clazz );
96          }
97  
98          return classes;
99      }
100 
101     public static Class loadClass( String className )
102         throws TestSetFailedException
103     {
104         try
105         {
106             return Class.forName( className );
107         }
108         catch ( Exception ex )
109         {
110             throw new TestSetFailedException( "Cannot find listener class " + className, ex );
111         }
112     }
113 
114     public static final class Setter
115     {
116         private final String setterName;
117 
118         private final Class paramClass;
119 
120         public Setter( String name, Class clazz )
121         {
122             this.setterName = name;
123             this.paramClass = clazz;
124         }
125 
126         public void invoke( Object target, Object value )
127             throws Exception
128         {
129             Method setter = target.getClass().getMethod( this.setterName, new Class[] { this.paramClass } );
130             if ( setter != null )
131             {
132                 setter.invoke( target, new Object[] { convertValue( value ) } );
133             }
134         }
135 
136         Object convertValue( Object value )
137         {
138             if ( value == null )
139             {
140                 return value;
141             }
142             if ( this.paramClass.isAssignableFrom( value.getClass() ) )
143             {
144                 return value;
145             }
146 
147             if ( Boolean.class.equals( this.paramClass ) || boolean.class.equals( this.paramClass ) )
148             {
149                 return Boolean.valueOf( value.toString() );
150             }
151             if ( Integer.class.equals( this.paramClass ) || int.class.equals( this.paramClass ) )
152             {
153                 return new Integer( value.toString() );
154             }
155 
156             return value;
157         }
158     }
159 }