/****************************************************************************** * 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.ArrayList; import java.util.Collection; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import java.util.Properties; import org.osgi.framework.ServiceRegistration; import org.springframework.core.InfrastructureProxy; import org.eclipse.gemini.blueprint.service.ServiceUnavailableException; import org.eclipse.gemini.blueprint.service.importer.ImportedOsgiServiceProxy; import org.eclipse.gemini.blueprint.service.importer.ServiceProxyDestroyedException; import org.eclipse.gemini.blueprint.service.importer.support.Cardinality; import org.eclipse.gemini.blueprint.service.importer.support.OsgiServiceCollectionProxyFactoryBean; public class MultiServiceProxyFactoryBeanTest extends ServiceBaseTest { private OsgiServiceCollectionProxyFactoryBean fb; protected void onSetUp() throws Exception { fb = new OsgiServiceCollectionProxyFactoryBean(); fb.setBundleContext(bundleContext); fb.setBeanClassLoader(getClass().getClassLoader()); } protected void onTearDown() throws Exception { fb.destroy(); fb = null; } // causes CGLIB problems public void testFactoryBeanForMultipleServicesAsInterfaces() throws Exception { fb.setCardinality(Cardinality.C_0__N); // look for collections fb.setInterfaces(new Class<?>[] { ArrayList.class }); fb.afterPropertiesSet(); List registrations = new ArrayList(3); try { Object result = fb.getObject(); assertTrue(result instanceof Collection); Collection col = (Collection) result; assertTrue(col.isEmpty()); Iterator iter = col.iterator(); assertFalse(iter.hasNext()); ArrayList a = new ArrayList(); a.add(new Long(10)); registrations.add(publishService(a, ArrayList.class.getName())); assertTrue(iter.hasNext()); Object service = iter.next(); assertTrue(service instanceof ArrayList); assertEquals(10, ((Number) ((Collection) service).toArray()[0]).intValue()); assertFalse(iter.hasNext()); a = new ArrayList(); a.add(new Long(100)); registrations.add(publishService(a, ArrayList.class.getName())); assertTrue(iter.hasNext()); service = iter.next(); assertTrue(service instanceof ArrayList); assertEquals(100, ((Number) ((Collection) service).toArray()[0]).intValue()); } finally { cleanRegistrations(registrations); } } public void testFactoryBeanForMultipleServicesAsClasses() throws Exception { fb.setCardinality(Cardinality.C_0__N); fb.setInterfaces(new Class<?>[] { Date.class }); fb.afterPropertiesSet(); List registrations = new ArrayList(3); long time = 321; Date dateA = new Date(time); try { Object result = fb.getObject(); assertTrue(result instanceof Collection); Collection col = (Collection) result; assertTrue(col.isEmpty()); Iterator iter = col.iterator(); assertFalse(iter.hasNext()); registrations.add(publishService(dateA)); try { iter.next(); fail("should have thrown exception"); } catch (NoSuchElementException ex) { // expected } assertTrue(iter.hasNext()); Object service = iter.next(); assertTrue(service instanceof Date); assertEquals(time, ((Date) service).getTime()); assertEquals(dateA, ((InfrastructureProxy) service).getWrappedObject()); assertFalse(iter.hasNext()); time = 111; Date dateB = new Date(time); registrations.add(publishService(dateB)); assertTrue(iter.hasNext()); service = iter.next(); assertTrue(service instanceof Date); assertEquals(time, ((Date) service).getTime()); assertFalse(dateA.equals(((InfrastructureProxy) service).getWrappedObject())); assertEquals(dateB, ((InfrastructureProxy) service).getWrappedObject()); } finally { cleanRegistrations(registrations); } } public void testIteratorWhenServiceGoesDown() throws Exception { fb.setCardinality(Cardinality.C_0__N); fb.setInterfaces(new Class<?>[] { Date.class }); fb.afterPropertiesSet(); long time = 123; Date date = new Date(time); Properties props = new Properties(); props.put("Moroccan", "Sunset"); List registrations = new ArrayList(3); try { Collection col = (Collection) fb.getObject(); Iterator iter = col.iterator(); assertFalse(iter.hasNext()); registrations.add(publishService(date, props)); assertTrue(iter.hasNext()); // deregister service ((ServiceRegistration) registrations.remove(0)).unregister(); // has to successed Object obj = iter.next(); assertTrue(obj instanceof ImportedOsgiServiceProxy); assertTrue(obj instanceof Date); assertTrue(obj instanceof InfrastructureProxy); // the properties will contain the ObjectClass also assertEquals(((ImportedOsgiServiceProxy) obj).getServiceReference().getProperty("Moroccan"), "Sunset"); try { // make sure the service is dead ((Date) obj).getTime(); fail("should have thrown exception"); } catch (ServiceUnavailableException ex) { // proxy is dead } } finally { cleanRegistrations(registrations); } } public void testProxyDestruction() throws Exception { fb.setCardinality(Cardinality.C_0__N); fb.setInterfaces(new Class<?>[] { Date.class }); fb.afterPropertiesSet(); long time = 123; Date date = new Date(time); Properties props = new Properties(); props.put("Moroccan", "Sunset"); ServiceRegistration reg = publishService(date, props); try { Collection col = (Collection) fb.getObject(); Iterator iter = col.iterator(); assertTrue(iter.hasNext()); Date proxy = (Date) iter.next(); assertEquals(proxy.toString(), date.toString()); fb.destroy(); try { proxy.getTime(); fail("should have thrown exception"); } catch (ServiceProxyDestroyedException spde) { // expected } } finally { reg.unregister(); } } private void cleanRegistrations(Collection list) { for (Iterator iter = list.iterator(); iter.hasNext();) { ((ServiceRegistration) iter.next()).unregister(); } } }