blob: aa8909967dafb23a58675517695b2e85a6a4b1a3 [file] [log] [blame]
/******************************************************************************
* 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.internal.service.collection;
import java.util.Date;
import java.util.Dictionary;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import junit.framework.TestCase;
import org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceProxyCreator;
import org.eclipse.gemini.blueprint.service.importer.support.internal.collection.OsgiServiceCollection;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
import org.eclipse.gemini.blueprint.mock.MockBundleContext;
import org.eclipse.gemini.blueprint.mock.MockServiceReference;
import org.springframework.util.ClassUtils;
/**
* Base class for Osgi service dynamic collection tests.
*
* @author Costin Leau
*
*/
public abstract class AbstractOsgiCollectionTest extends TestCase {
protected MockBundleContext context;
protected Map services;
protected OsgiServiceCollection col;
public static interface Wrapper {
Object execute();
}
public static class DateWrapper implements Wrapper, Comparable {
private Date date;
public DateWrapper(long time) {
date = new Date(time);
}
public Object execute() {
return new Long(date.getTime());
}
public boolean equals(Object other) {
if (this == other)
return true;
if (other instanceof DateWrapper) {
DateWrapper oth = (DateWrapper) other;
return (date.equals(oth.date));
}
return false;
}
public int hashCode() {
return DateWrapper.class.hashCode() * 13 + date.hashCode();
}
public int compareTo(Object o) {
Wrapper wr = (Wrapper) o;
Long time = (Long) wr.execute();
return new Long(date.getTime()).compareTo(time);
}
};
protected void setUp() throws Exception {
services = new LinkedHashMap();
context = new MockBundleContext() {
public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
return new ServiceReference[0];
}
public Object getService(ServiceReference reference) {
Object service = services.get(reference);
return (service == null ? new Object() : service);
}
};
col = createCollection();
col.setRequiredAtStartup(false);
col.afterPropertiesSet();
}
abstract OsgiServiceCollection createCollection();
protected ServiceProxyCreator createProxyCreator(Class<?>[] classes) {
return new SimpleServiceJDKProxyCreator(context, classes, getClass().getClassLoader());
}
protected void tearDown() throws Exception {
services = null;
context = null;
}
protected void addService(Object service, Dictionary properties) {
ServiceReference ref = null;
ServiceEvent event = null;
Set intfs = ClassUtils.getAllInterfacesAsSet(service);
String[] clazzez = new String[intfs.size()];
int i = 0;
for (Iterator iter = intfs.iterator(); iter.hasNext();) {
clazzez[i++] = ((Class) iter.next()).getName();
}
ref = new MockServiceReference(null, properties, clazzez);
event = new ServiceEvent(ServiceEvent.REGISTERED, ref);
services.put(ref, service);
for (Iterator iter = context.getServiceListeners().iterator(); iter.hasNext();) {
ServiceListener listener = (ServiceListener) iter.next();
listener.serviceChanged(event);
}
}
protected void addService(Object service) {
addService(service, new Properties());
}
protected void removeService(Object service) {
ServiceReference ref = new MockServiceReference();
for (Iterator iter = services.entrySet().iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry) iter.next();
if (entry.getValue().equals(service)) {
ref = (ServiceReference) entry.getKey();
continue;
}
}
services.remove(ref);
ServiceEvent event = new ServiceEvent(ServiceEvent.UNREGISTERING, ref);
for (Iterator iter = context.getServiceListeners().iterator(); iter.hasNext();) {
ServiceListener listener = (ServiceListener) iter.next();
listener.serviceChanged(event);
}
}
}