/****************************************************************************** * 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.serviceProxyFactoryBean; import java.util.Date; import java.util.Dictionary; import java.util.Enumeration; import java.util.Map; import java.util.Properties; import org.osgi.framework.ServiceRegistration; import org.springframework.aop.SpringProxy; import org.springframework.core.InfrastructureProxy; import org.eclipse.gemini.blueprint.service.importer.ImportedOsgiServiceProxy; import org.eclipse.gemini.blueprint.service.importer.support.Cardinality; import org.eclipse.gemini.blueprint.service.importer.support.OsgiServiceProxyFactoryBean; import org.eclipse.gemini.blueprint.util.OsgiServiceReferenceUtils; /** * @author Costin Leau * */ public class ServiceRefAwareWithSingleServiceTest extends ServiceBaseTest { private OsgiServiceProxyFactoryBean fb; protected void onSetUp() throws Exception { fb = new OsgiServiceProxyFactoryBean(); fb.setBundleContext(bundleContext); // execute retries fast fb.setTimeout(1); fb.setBeanClassLoader(getClass().getClassLoader()); } protected void onTearDown() throws Exception { fb = null; } public void testProxyForUnaryCardinality() throws Exception { long time = 1234; Date date = new Date(time); ServiceRegistration reg = publishService(date); fb.setCardinality(Cardinality.C_1__1); fb.setInterfaces(new Class<?>[] { Date.class }); fb.afterPropertiesSet(); ImportedOsgiServiceProxy refAware = null; try { Object result = fb.getObject(); assertTrue(result instanceof Date); // check it's our object assertEquals(time, ((Date) result).getTime()); assertTrue(result instanceof SpringProxy); assertTrue(result instanceof ImportedOsgiServiceProxy); assertTrue(result instanceof InfrastructureProxy); refAware = (ImportedOsgiServiceProxy) result; assertNotNull(refAware.getServiceReference()); assertEquals("wrong target returned", date, ((InfrastructureProxy) result).getWrappedObject()); } finally { if (reg != null) reg.unregister(); } // test reference after the service went down assertNotNull(refAware.getServiceReference()); assertNull(refAware.getServiceReference().getBundle()); } public void testServiceReferenceProperties() throws Exception { long time = 1234; Date date = new Date(time); Dictionary dict = new Properties(); dict.put("foo", "bar"); dict.put("george", "michael"); ServiceRegistration reg = publishService(date, dict); fb.setCardinality(Cardinality.C_1__1); fb.setFilter("(&(foo=bar)(george=michael))"); fb.setInterfaces(new Class<?>[] { Date.class }); fb.afterPropertiesSet(); try { Object result = fb.getObject(); assertTrue(result instanceof Date); // check it's our object assertEquals(time, ((Date) result).getTime()); ImportedOsgiServiceProxy refAware = (ImportedOsgiServiceProxy) result; assertTrue(doesMapContainsDictionary(dict, OsgiServiceReferenceUtils.getServicePropertiesAsMap(refAware.getServiceReference()))); InfrastructureProxy targetAware = (InfrastructureProxy) result; assertEquals(date, targetAware.getWrappedObject()); } finally { if (reg != null) reg.unregister(); } } /** * Check if the 'test' map contains the original Dictionary. * * @param original * @param test * @return */ private boolean doesMapContainsDictionary(Dictionary original, Map test) { Enumeration enm = original.keys(); while (enm.hasMoreElements()) { if (!test.containsKey(enm.nextElement())) return false; } return true; } }