1 package org.testng;
2 
3 import org.testng.collections.Lists;
4 import org.testng.collections.Maps;
5 
6 import java.util.List;
7 import java.util.Map;
8 
9 /**
10  * A method interceptor that sorts its methods per instances (i.e. per class).
11  *
12  *
13  */
14 class InstanceOrderingMethodInterceptor implements IMethodInterceptor {
15 
16   @Override
intercept(List<IMethodInstance> methods, ITestContext context)17   public List<IMethodInstance> intercept(List<IMethodInstance> methods,
18       ITestContext context)  {
19     return groupMethodsByInstance(methods);
20   }
21 
22   /**
23    * The default method interceptor which sorts methods by instances (i.e. by class).
24    */
groupMethodsByInstance(List<IMethodInstance> methods)25   private List<IMethodInstance> groupMethodsByInstance(List<IMethodInstance> methods) {
26     List<Object> instanceList = Lists.newArrayList();
27     Map<Object, List<IMethodInstance>> map = Maps.newHashMap();
28     for (IMethodInstance mi : methods) {
29       Object[] methodInstances = mi.getInstances();
30       for (Object instance : methodInstances) {
31         if (!instanceList.contains(instance)) {
32           instanceList.add(instance);
33         }
34         List<IMethodInstance> l = map.get(instance);
35         if (l == null) {
36           l = Lists.newArrayList();
37           map.put(instance, l);
38         }
39         l.add(mi);
40       }
41     }
42 
43     List<IMethodInstance> result = Lists.newArrayList();
44     for (Object instance : instanceList) {
45       result.addAll(map.get(instance));
46     }
47 
48     return result;
49   }
50 
51 }
52