blob: fd8ac454fdd0401c3d413f47c35304d4a1650c0f [file] [log] [blame]
// 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;
}
}
}