/****************************************************************************** * 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.iandt.serviceproxy; import java.util.Date; import org.aopalliance.aop.Advice; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceRegistration; import org.springframework.aop.framework.ProxyFactory; import org.eclipse.gemini.blueprint.service.ServiceUnavailableException; import org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceDynamicInterceptor; import org.eclipse.gemini.blueprint.test.AbstractConfigurableBundleCreatorTests; import org.eclipse.gemini.blueprint.util.BundleDelegatingClassLoader; import org.eclipse.gemini.blueprint.util.OsgiFilterUtils; import org.springframework.util.ClassUtils; /** * @author Costin Leau * */ public abstract class ServiceProxyTst extends AbstractConfigurableBundleCreatorTests { protected String[] getTestBundlesNames() { return new String[] { "net.sourceforge.cglib, com.springsource.net.sf.cglib, 2.1.3" }; } protected String getManifestLocation() { return null; } private ServiceRegistration publishService(Object obj) throws Exception { return bundleContext.registerService(obj.getClass().getName(), obj, null); } private Object createProxy(final Class<?> clazz, Advice cardinalityInterceptor) { ProxyFactory factory = new ProxyFactory(); factory.setProxyTargetClass(true); factory.setOptimize(true); factory.setTargetClass(clazz); factory.addAdvice(cardinalityInterceptor); factory.setFrozen(true); return factory.getProxy(ProxyFactory.class.getClassLoader()); } private Advice createCardinalityAdvice(Class<?> clazz) { ClassLoader classLoader = BundleDelegatingClassLoader.createBundleClassLoaderFor(bundleContext.getBundle()); ServiceDynamicInterceptor interceptor = new ServiceDynamicInterceptor(bundleContext, null, OsgiFilterUtils.createFilter(OsgiFilterUtils.unifyFilter(clazz, null)), classLoader); // fast retry interceptor.setMandatoryService(true); interceptor.afterPropertiesSet(); interceptor.getRetryTemplate().reset(1); return interceptor; } public void testCglibLibraryVisibility() { // note that cglib is not declared inside this bundle but should be seen // by spring-core (which contains the util classes) assertTrue(ClassUtils.isPresent("net.sf.cglib.proxy.Enhancer", ProxyFactory.class.getClassLoader())); } public void testDynamicEndProxy() throws Exception { long time = 123456; Date date = new Date(time); ServiceRegistration reg = publishService(date); BundleContext ctx = bundleContext; try { ServiceReference ref = ctx.getServiceReference(Date.class.getName()); assertNotNull(ref); Date proxy = (Date) createProxy(Date.class, createCardinalityAdvice(Date.class)); assertEquals(time, proxy.getTime()); // take down service reg.unregister(); // reference is invalid assertNull(ref.getBundle()); try { proxy.getTime(); fail("should have thrown exception"); } catch (ServiceUnavailableException sue) { // service failed } // rebind the service reg = publishService(date); // retest the service assertEquals(time, proxy.getTime()); } finally { if (reg != null) try { reg.unregister(); } catch (Exception ex) { // ignore } } } }