package org.testng; import org.testng.collections.Lists; import org.testng.collections.Maps; import org.testng.internal.XmlMethodSelector; import java.util.List; import java.util.Map; import java.util.Set; /** * This class maintains a map of >. * It is used by TestWorkers to determine if the method they just ran * is the last of its class, in which case it's time to invoke all the * afterClass methods. * * @author Alex Popescu */ public class ClassMethodMap { private Map> m_classMap = Maps.newHashMap(); // These two variables are used throughout the workers to keep track // of what beforeClass/afterClass methods have been invoked private Map> m_beforeClassMethods = Maps.newHashMap(); private Map> m_afterClassMethods = Maps.newHashMap(); public ClassMethodMap(List methods, XmlMethodSelector xmlMethodSelector) { for (ITestNGMethod m : methods) { // Only add to the class map methods that are included in the // method selector. We can pass a null context here since the selector // should already have been initialized if (xmlMethodSelector != null){ if (! xmlMethodSelector.includeMethod(null, m, true)) continue; } Object instance = m.getInstance(); List l = m_classMap.get(instance); if (l == null) { l = Lists.newArrayList(); m_classMap.put(instance, l); } l.add(m); } } /** * Remove the method from this map and returns true if it is the last * of its class. */ public synchronized boolean removeAndCheckIfLast(ITestNGMethod m, Object instance) { List l = m_classMap.get(instance); if (l != null) { l.remove(m); // It's the last method of this class if all the methods remaining in the list belong to a // different class for (ITestNGMethod tm : l) { if (tm.getEnabled() && tm.getTestClass().equals(m.getTestClass())) return false; } return true; } else { throw new AssertionError("l should not be null"); } } private Class getMethodClass(ITestNGMethod m) { return m.getTestClass().getRealClass(); } public Map> getInvokedBeforeClassMethods() { return m_beforeClassMethods; } public Map> getInvokedAfterClassMethods() { return m_afterClassMethods; } public void clear() { for(Set instances: m_beforeClassMethods.values()) { instances.clear(); instances= null; } for(Set instances: m_afterClassMethods.values()) { instances.clear(); instances= null; } m_beforeClassMethods.clear(); m_afterClassMethods.clear(); } }