// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package org.apache.tapestry5.ioc.junit; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.tapestry5.ioc.RegistryBuilder; import org.junit.runners.model.InitializationError; /** * Helper class used by the {@link TapestryIOCJUnit4ClassRunner} to manage the test registry */ public class TestRegistryManager { private final Registry annotation; private final List<Method> moduleDefFactories; private org.apache.tapestry5.ioc.Registry registry; public TestRegistryManager(Class<?> type) throws InitializationError { super(); Registry annotation = type.getAnnotation(Registry.class); if (annotation == null) { throw new InitializationError(type.getName() + " does not specify a @Registry"); } this.annotation = annotation; this.moduleDefFactories = findModuleDefFactories(type); } protected List<Method> findModuleDefFactories(Class<?> type) throws InitializationError { List<Method> factoryMethods = new ArrayList<Method>(); for (Method method : type.getMethods()) { if (method.getAnnotation(ModuleDef.class) != null) { validateModuleDefMethod(method); factoryMethods.add(method); } } return factoryMethods.isEmpty() ? Collections.<Method> emptyList() : factoryMethods; } protected void validateModuleDefMethod(Method method) throws InitializationError { int modifiers = method.getModifiers(); if (method.getParameterTypes().length != 0 || !Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) { throw new InitializationError( String.format("@ModuleDef method %s must be public static and accept no arguments", method.getName())); } if (!org.apache.tapestry5.ioc.def.ModuleDef.class.isAssignableFrom(method.getReturnType())) { throw new InitializationError( String.format("@ModuleDef method %s return type %s is not valid", method.getName(), method.getReturnType().getName())); } } /** * Get the existing registry or create one if required. * @return The test Registry * @throws Exception */ public org.apache.tapestry5.ioc.Registry getOrCreateRegistry() throws Exception { if (registry == null) { RegistryBuilder builder = new RegistryBuilder(); if (annotation.modules() != null) { builder.add(annotation.modules()); } for (Method moduleDefFactory : moduleDefFactories) { try { org.apache.tapestry5.ioc.def.ModuleDef moduleDef = (org.apache.tapestry5.ioc.def.ModuleDef) moduleDefFactory.invoke(null); builder.add(moduleDef); } catch (InvocationTargetException e) { if (e.getTargetException() instanceof Exception) { throw (Exception) e.getTargetException(); } throw e; } } registry = builder.build(); registry.performRegistryStartup(); } return registry; } /** * Notify that the current test method has completed */ public void afterTestMethod() { if (annotation.shutdown() == RegistryShutdownType.AFTER_METHOD) { shutdownRegistry(); } } /** * Notify that the current test class has completed */ public void afterTestClass() { if (annotation.shutdown() == RegistryShutdownType.AFTER_CLASS) { shutdownRegistry(); } } protected void shutdownRegistry() { try { registry.shutdown(); } finally { registry = null; } } }