/****************************************************************************** * Copyright (c) 2006, 2010 VMware Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0 * is available at http://www.opensource.org/licenses/apache2.0.php. * You may elect to redistribute this code under either of these licenses. * * Contributors: * VMware Inc. *****************************************************************************/ package org.eclipse.gemini.blueprint.test.internal.holder; import java.lang.reflect.Method; import org.springframework.util.Assert; import org.springframework.util.ReflectionUtils; /** * OSGi adapter for the information holder. Overrides the methods used inside * OSGi to use reflection and avoid CCE. * * @author Costin Leau * */ class ReflectionOsgiHolder extends OsgiTestInfoHolder { private final Object instance; private final Method GET_TEST_BUNDLE_ID, GET_TEST_CLASS_NAME, GET_TEST_METHOD_NAME, ADD_TEST_ERROR, ADD_TEST_FAILURE; /** * Constructs a new <code>OsgiTestInfoHolder</code> instance wrapping the * given object and accessing it through reflection. This constructor is * used for accessing the instance loaded outside OSGi, from within OSGi. * * @param twinInstance */ ReflectionOsgiHolder(Object twinInstance) { Assert.notNull(twinInstance); this.instance = twinInstance; Class<?> clazz = instance.getClass(); GET_TEST_BUNDLE_ID = ReflectionUtils.findMethod(clazz, "getTestBundleId"); GET_TEST_CLASS_NAME = ReflectionUtils.findMethod(clazz, "getTestClassName"); GET_TEST_METHOD_NAME = ReflectionUtils.findMethod(clazz, "getTestMethodName"); ADD_TEST_ERROR = ReflectionUtils.findMethod(clazz, "addTestError", new Class<?>[] { Throwable.class }); ADD_TEST_FAILURE = ReflectionUtils.findMethod(clazz, "addTestFailure", new Class<?>[] { Throwable.class }); } public Long getTestBundleId() { return (Long) ReflectionUtils.invokeMethod(GET_TEST_BUNDLE_ID, instance); } public String getTestClassName() { return (String) ReflectionUtils.invokeMethod(GET_TEST_CLASS_NAME, instance); } public String getTestMethodName() { return (String) ReflectionUtils.invokeMethod(GET_TEST_METHOD_NAME, instance); } public void addTestError(Throwable testProblem) { ReflectionUtils.invokeMethod(ADD_TEST_ERROR, instance, new Object[] { testProblem }); } public void addTestFailure(Throwable testProblem) { ReflectionUtils.invokeMethod(ADD_TEST_FAILURE, instance, new Object[] { testProblem }); } }