Package org.apache.tapestry5.ioc.test

Source Code of org.apache.tapestry5.ioc.test.TestRegistryManager

// 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.test;

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;
    }
  }
}
TOP

Related Classes of org.apache.tapestry5.ioc.test.TestRegistryManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.