| /******************************************************************************* |
| * Copyright (c) 2008, 2010 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.osgi.tests.serviceregistry; |
| |
| import java.util.*; |
| import junit.framework.*; |
| import org.eclipse.osgi.tests.OSGiTestsActivator; |
| import org.eclipse.osgi.tests.bundles.AbstractBundleTests; |
| import org.osgi.framework.*; |
| import org.osgi.framework.hooks.service.*; |
| |
| public class ServiceHookTests extends AbstractBundleTests { |
| public static Test suite() { |
| return new TestSuite(ServiceHookTests.class); |
| } |
| |
| public void testFindHook01() { |
| final String testMethodName = "testFindHook01"; //$NON-NLS-1$ |
| // test the FindHook is called and can remove a reference from the results |
| Runnable runIt = new Runnable() { |
| public void run() { |
| // nothing |
| } |
| }; |
| final BundleContext testContext = OSGiTestsActivator.getContext(); |
| // register services |
| Hashtable props = new Hashtable(); |
| props.put("name", testMethodName); //$NON-NLS-1$ |
| props.put(Constants.SERVICE_DESCRIPTION, "service 1"); //$NON-NLS-1$ |
| final ServiceRegistration reg1 = testContext.registerService(Runnable.class.getName(), runIt, props); |
| |
| props.put(Constants.SERVICE_DESCRIPTION, "service 2"); //$NON-NLS-1$ |
| final ServiceRegistration reg2 = testContext.registerService(Runnable.class.getName(), runIt, props); |
| |
| props.put(Constants.SERVICE_DESCRIPTION, "service 3"); //$NON-NLS-1$ |
| final ServiceRegistration reg3 = testContext.registerService(Runnable.class.getName(), runIt, props); |
| |
| final int[] hookCalled = new int[] {0, 0, 0, 0, 0}; |
| final boolean[] startTest = new boolean[] {false}; |
| final AssertionFailedError[] hookError = new AssertionFailedError[] {null, null, null, null}; |
| |
| // register find hook 1 |
| props.put(Constants.SERVICE_DESCRIPTION, "find hook 1"); //$NON-NLS-1$ |
| props.put(Constants.SERVICE_DESCRIPTION, "min value"); //$NON-NLS-1$ |
| props.put(Constants.SERVICE_RANKING, new Integer(Integer.MIN_VALUE)); |
| ServiceRegistration regHook1 = testContext.registerService(FindHook.class.getName(), new FindHook() { |
| public void find(BundleContext context, String name, String filter, boolean allServices, Collection references) { |
| try { |
| synchronized (hookCalled) { |
| if (!startTest[0]) |
| return; |
| hookCalled[++hookCalled[0]] = 1; |
| } |
| assertEquals("wrong context in hook", testContext, context); //$NON-NLS-1$ |
| assertEquals("wrong name in hook", Runnable.class.getName(), name); //$NON-NLS-1$ |
| assertEquals("wrong filter in hook", "(name=" + testMethodName + ")", filter); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| assertEquals("wrong allservices in hook", false, allServices); //$NON-NLS-1$ |
| assertEquals("wrong number of services in hook", 1, references.size()); //$NON-NLS-1$ |
| Iterator iter = references.iterator(); |
| while (iter.hasNext()) { |
| ServiceReference ref = (ServiceReference) iter.next(); |
| if (ref.equals(reg1.getReference())) { |
| fail("service 1 is present"); //$NON-NLS-1$ |
| } |
| if (ref.equals(reg2.getReference())) { |
| fail("service 2 is present"); //$NON-NLS-1$ |
| } |
| } |
| |
| try { |
| references.add(reg1.getReference()); |
| fail("add to collection succeeded"); //$NON-NLS-1$ |
| } catch (UnsupportedOperationException e) { |
| // should get an exception |
| } catch (Exception e) { |
| fail("incorrect exception", e); //$NON-NLS-1$ |
| } |
| try { |
| references.addAll(Arrays.asList(new ServiceReference[] {reg1.getReference()})); |
| fail("addAll to collection succeeded"); //$NON-NLS-1$ |
| } catch (UnsupportedOperationException e) { |
| // should get an exception |
| } catch (Exception e) { |
| fail("incorrect exception", e); //$NON-NLS-1$ |
| } |
| } catch (AssertionFailedError a) { |
| hookError[0] = a; |
| return; |
| } |
| } |
| }, props); |
| |
| // register find hook 2 |
| props.put(Constants.SERVICE_DESCRIPTION, "find hook 2"); //$NON-NLS-1$ |
| props.put(Constants.SERVICE_DESCRIPTION, "max value first"); //$NON-NLS-1$ |
| props.put(Constants.SERVICE_RANKING, new Integer(Integer.MAX_VALUE)); |
| ServiceRegistration regHook2 = testContext.registerService(FindHook.class.getName(), new FindHook() { |
| public void find(BundleContext context, String name, String filter, boolean allServices, Collection references) { |
| try { |
| synchronized (hookCalled) { |
| if (!startTest[0]) |
| return; |
| hookCalled[++hookCalled[0]] = 2; |
| } |
| assertEquals("wrong context in hook", testContext, context); //$NON-NLS-1$ |
| assertEquals("wrong name in hook", Runnable.class.getName(), name); //$NON-NLS-1$ |
| assertEquals("wrong filter in hook", "(name=" + testMethodName + ")", filter); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| assertEquals("wrong allservices in hook", false, allServices); //$NON-NLS-1$ |
| assertEquals("wrong number of services in hook", 3, references.size()); //$NON-NLS-1$ |
| Iterator iter = references.iterator(); |
| while (iter.hasNext()) { |
| ServiceReference ref = (ServiceReference) iter.next(); |
| if (ref.equals(reg2.getReference())) { |
| iter.remove(); |
| } |
| } |
| |
| try { |
| references.add(reg2.getReference()); |
| fail("add to collection succeeded"); //$NON-NLS-1$ |
| } catch (UnsupportedOperationException e) { |
| // should get an exception |
| } catch (Exception e) { |
| fail("incorrect exception", e); //$NON-NLS-1$ |
| } |
| try { |
| references.addAll(Arrays.asList(new ServiceReference[] {reg2.getReference()})); |
| fail("addAll to collection succeeded"); //$NON-NLS-1$ |
| } catch (UnsupportedOperationException e) { |
| // should get an exception |
| } catch (Exception e) { |
| fail("incorrect exception", e); //$NON-NLS-1$ |
| } |
| } catch (AssertionFailedError a) { |
| hookError[1] = a; |
| return; |
| } |
| } |
| }, props); |
| |
| // register find hook 3 |
| props.put(Constants.SERVICE_DESCRIPTION, "find hook 3"); //$NON-NLS-1$ |
| props.put(Constants.SERVICE_DESCRIPTION, "max value second"); //$NON-NLS-1$ |
| props.put(Constants.SERVICE_RANKING, new Integer(Integer.MAX_VALUE)); |
| ServiceRegistration regHook3 = testContext.registerService(FindHook.class.getName(), new FindHook() { |
| public void find(BundleContext context, String name, String filter, boolean allServices, Collection references) { |
| try { |
| synchronized (hookCalled) { |
| if (!startTest[0]) |
| return; |
| hookCalled[++hookCalled[0]] = 3; |
| } |
| assertEquals("wrong context in hook", testContext, context); //$NON-NLS-1$ |
| assertEquals("wrong name in hook", Runnable.class.getName(), name); //$NON-NLS-1$ |
| assertEquals("wrong filter in hook", "(name=" + testMethodName + ")", filter); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| assertEquals("wrong allservices in hook", false, allServices); //$NON-NLS-1$ |
| assertEquals("wrong number of services in hook", 2, references.size()); //$NON-NLS-1$ |
| Iterator iter = references.iterator(); |
| while (iter.hasNext()) { |
| ServiceReference ref = (ServiceReference) iter.next(); |
| if (ref.equals(reg2.getReference())) { |
| fail("service 2 is present"); //$NON-NLS-1$ |
| } |
| } |
| |
| try { |
| references.add(reg2.getReference()); |
| fail("add to collection succeeded"); //$NON-NLS-1$ |
| } catch (UnsupportedOperationException e) { |
| // should get an exception |
| } catch (Exception e) { |
| fail("incorrect exception", e); //$NON-NLS-1$ |
| } |
| try { |
| references.addAll(Arrays.asList(new ServiceReference[] {reg2.getReference()})); |
| fail("addAll to collection succeeded"); //$NON-NLS-1$ |
| } catch (UnsupportedOperationException e) { |
| // should get an exception |
| } catch (Exception e) { |
| fail("incorrect exception", e); //$NON-NLS-1$ |
| } |
| } catch (AssertionFailedError a) { |
| hookError[2] = a; |
| return; |
| } |
| // throw an exception from the hook to test that the next hooks are called. |
| throw new RuntimeException(testMethodName); |
| } |
| }, props); |
| |
| // register find hook 4 |
| props.put(Constants.SERVICE_DESCRIPTION, "find hook 4"); //$NON-NLS-1$ |
| props.put(Constants.SERVICE_DESCRIPTION, "max value third"); //$NON-NLS-1$ |
| props.put(Constants.SERVICE_RANKING, new Integer(Integer.MAX_VALUE)); |
| ServiceRegistration regHook4 = testContext.registerService(FindHook.class.getName(), new FindHook() { |
| public void find(BundleContext context, String name, String filter, boolean allServices, Collection references) { |
| try { |
| synchronized (hookCalled) { |
| if (!startTest[0]) |
| return; |
| hookCalled[++hookCalled[0]] = 4; |
| } |
| assertEquals("wrong context in hook", testContext, context); //$NON-NLS-1$ |
| assertEquals("wrong name in hook", Runnable.class.getName(), name); //$NON-NLS-1$ |
| assertEquals("wrong filter in hook", "(name=" + testMethodName + ")", filter); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| assertEquals("wrong allservices in hook", false, allServices); //$NON-NLS-1$ |
| assertEquals("wrong number of services in hook", 2, references.size()); //$NON-NLS-1$ |
| Iterator iter = references.iterator(); |
| while (iter.hasNext()) { |
| ServiceReference ref = (ServiceReference) iter.next(); |
| if (ref.equals(reg1.getReference())) { |
| iter.remove(); |
| } |
| if (ref.equals(reg2.getReference())) { |
| fail("service 2 is present"); //$NON-NLS-1$ |
| } |
| } |
| |
| try { |
| references.add(reg2.getReference()); |
| fail("add to collection succeeded"); //$NON-NLS-1$ |
| } catch (UnsupportedOperationException e) { |
| // should get an exception |
| } catch (Exception e) { |
| fail("incorrect exception", e); //$NON-NLS-1$ |
| } |
| try { |
| references.addAll(Arrays.asList(new ServiceReference[] {reg2.getReference()})); |
| fail("addAll to collection succeeded"); //$NON-NLS-1$ |
| } catch (UnsupportedOperationException e) { |
| // should get an exception |
| } catch (Exception e) { |
| fail("incorrect exception", e); //$NON-NLS-1$ |
| } |
| } catch (AssertionFailedError a) { |
| hookError[3] = a; |
| return; |
| } |
| } |
| }, props); |
| |
| startTest[0] = true; |
| // get reference and hook removes some services |
| try { |
| ServiceReference[] refs = null; |
| try { |
| refs = testContext.getServiceReferences(Runnable.class.getName(), "(name=" + testMethodName + ")"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } catch (InvalidSyntaxException e) { |
| fail("Unexpected syntax error", e); //$NON-NLS-1$ |
| } |
| assertEquals("all hooks not called", 4, hookCalled[0]); //$NON-NLS-1$ |
| assertEquals("hook 2 not called first", 2, hookCalled[1]); //$NON-NLS-1$ |
| assertEquals("hook 3 not called second", 3, hookCalled[2]); //$NON-NLS-1$ |
| assertEquals("hook 4 not called third", 4, hookCalled[3]); //$NON-NLS-1$ |
| assertEquals("hook 1 not called fourth ", 1, hookCalled[4]); //$NON-NLS-1$ |
| for (int i = 0; i < hookError.length; i++) { |
| if (hookError[i] != null) { |
| throw hookError[i]; |
| } |
| } |
| assertNotNull("service refs is null", refs); //$NON-NLS-1$ |
| assertEquals("Wrong number of references", 1, refs.length); //$NON-NLS-1$ |
| |
| // test removed services are not in the result |
| List refList = Arrays.asList(refs); |
| assertFalse("contains service 1", refList.contains(reg1.getReference())); //$NON-NLS-1$ |
| assertFalse("contains service 2", refList.contains(reg2.getReference())); //$NON-NLS-1$ |
| assertTrue("missing service 3", refList.contains(reg3.getReference())); //$NON-NLS-1$ |
| |
| startTest[0] = false; |
| // remove the hooks |
| regHook1.unregister(); |
| regHook1 = null; |
| regHook2.unregister(); |
| regHook2 = null; |
| regHook3.unregister(); |
| regHook3 = null; |
| regHook4.unregister(); |
| regHook4 = null; |
| |
| // get services and make sure none are filtered |
| refs = null; |
| hookCalled[0] = 0; |
| |
| startTest[0] = true; |
| try { |
| refs = testContext.getServiceReferences(Runnable.class.getName(), "(name=" + testMethodName + ")"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } catch (InvalidSyntaxException e) { |
| fail("Unexpected syntax error", e); //$NON-NLS-1$ |
| } |
| assertEquals("hooks called", 0, hookCalled[0]); //$NON-NLS-1$ |
| assertNotNull("service refs is null", refs); //$NON-NLS-1$ |
| assertEquals("Wrong number of references", 3, refs.length); //$NON-NLS-1$ |
| |
| // test result contains all expected services |
| refList = Arrays.asList(refs); |
| assertTrue("missing service 1", refList.contains(reg1.getReference())); //$NON-NLS-1$ |
| assertTrue("missing service 2", refList.contains(reg2.getReference())); //$NON-NLS-1$ |
| assertTrue("missing service 3", refList.contains(reg3.getReference())); //$NON-NLS-1$ |
| } finally { |
| // unregister hook and services |
| if (regHook1 != null) |
| regHook1.unregister(); |
| if (regHook2 != null) |
| regHook2.unregister(); |
| if (regHook3 != null) |
| regHook3.unregister(); |
| if (regHook4 != null) |
| regHook4.unregister(); |
| if (reg1 != null) |
| reg1.unregister(); |
| if (reg2 != null) |
| reg2.unregister(); |
| if (reg3 != null) |
| reg3.unregister(); |
| } |
| } |
| |
| public void testEventHook01() { |
| final String testMethodName = "testEventHook01"; //$NON-NLS-1$ |
| // test the EventHook is called and can remove a reference from the results |
| Runnable runIt = new Runnable() { |
| public void run() { |
| // nothing |
| } |
| }; |
| final BundleContext testContext = OSGiTestsActivator.getContext(); |
| |
| final int[] hookCalled = new int[] {0, 0}; |
| final AssertionFailedError[] hookError = new AssertionFailedError[] {null}; |
| final List events = new ArrayList(); |
| |
| final ServiceListener sl = new ServiceListener() { |
| public void serviceChanged(ServiceEvent event) { |
| synchronized (events) { |
| events.add(event); |
| } |
| } |
| }; |
| |
| final String filterString = "(&(name=" + testMethodName + ")(objectClass=java.lang.Runnable))"; //$NON-NLS-1$ //$NON-NLS-2$ |
| Filter tmpFilter = null; |
| try { |
| tmpFilter = testContext.createFilter(filterString); |
| testContext.addServiceListener(sl, filterString); |
| } catch (InvalidSyntaxException e) { |
| fail("Unexpected syntax error", e); //$NON-NLS-1$ |
| } |
| |
| final Filter filter = tmpFilter; |
| EventHook hook1 = new EventHook() { |
| public void event(ServiceEvent event, Collection contexts) { |
| try { |
| if (!filter.match(event.getServiceReference())) { |
| return; |
| } |
| synchronized (hookCalled) { |
| hookCalled[++hookCalled[0]] = 1; |
| } |
| assertTrue("does not contain test context", contexts.contains(testContext)); //$NON-NLS-1$ |
| |
| try { |
| contexts.add(testContext.getBundle(0).getBundleContext()); |
| fail("add to collection succeeded"); //$NON-NLS-1$ |
| } catch (UnsupportedOperationException e) { |
| // should get an exception |
| } catch (Exception e) { |
| fail("incorrect exception", e); //$NON-NLS-1$ |
| } |
| try { |
| contexts.addAll(Arrays.asList(new BundleContext[] {testContext.getBundle(0).getBundleContext()})); |
| fail("addAll to collection succeeded"); //$NON-NLS-1$ |
| } catch (UnsupportedOperationException e) { |
| // should get an exception |
| } catch (Exception e) { |
| fail("incorrect exception", e); //$NON-NLS-1$ |
| } |
| } catch (AssertionFailedError a) { |
| hookError[0] = a; |
| return; |
| } |
| } |
| }; |
| EventHook hook2 = new EventHook() { |
| public void event(ServiceEvent event, Collection contexts) { |
| try { |
| if (!filter.match(event.getServiceReference())) { |
| return; |
| } |
| synchronized (hookCalled) { |
| hookCalled[++hookCalled[0]] = 1; |
| } |
| assertTrue("does not contain test context", contexts.contains(testContext)); //$NON-NLS-1$ |
| contexts.remove(testContext); |
| try { |
| contexts.add(testContext.getBundle(0).getBundleContext()); |
| fail("add to collection succeeded"); //$NON-NLS-1$ |
| } catch (UnsupportedOperationException e) { |
| // should get an exception |
| } catch (Exception e) { |
| fail("incorrect exception", e); //$NON-NLS-1$ |
| } |
| try { |
| contexts.addAll(Arrays.asList(new BundleContext[] {testContext.getBundle(0).getBundleContext()})); |
| fail("addAll to collection succeeded"); //$NON-NLS-1$ |
| } catch (UnsupportedOperationException e) { |
| // should get an exception |
| } catch (Exception e) { |
| fail("incorrect exception", e); //$NON-NLS-1$ |
| } |
| } catch (AssertionFailedError a) { |
| hookError[0] = a; |
| return; |
| } |
| } |
| }; |
| |
| Hashtable props = new Hashtable(); |
| props.put("name", testMethodName); //$NON-NLS-1$ |
| // register event hook 1 |
| props.put(Constants.SERVICE_DESCRIPTION, "event hook 1"); //$NON-NLS-1$ |
| ServiceRegistration regHook = testContext.registerService(EventHook.class.getName(), hook1, props); |
| |
| ServiceRegistration reg1 = null; |
| try { |
| props.put(Constants.SERVICE_DESCRIPTION, "service 1"); //$NON-NLS-1$ |
| synchronized (events) { |
| events.clear(); |
| } |
| reg1 = testContext.registerService(Runnable.class.getName(), runIt, props); |
| assertEquals("all hooks not called", 1, hookCalled[0]); //$NON-NLS-1$ |
| assertEquals("hook 1 not called first", 1, hookCalled[1]); //$NON-NLS-1$ |
| for (int i = 0; i < hookError.length; i++) { |
| if (hookError[i] != null) { |
| throw hookError[i]; |
| } |
| } |
| synchronized (events) { |
| assertEquals("listener not called once", 1, events.size()); //$NON-NLS-1$ |
| Iterator iter = events.iterator(); |
| while (iter.hasNext()) { |
| ServiceEvent event = (ServiceEvent) iter.next(); |
| assertEquals("type not registered", ServiceEvent.REGISTERED, event.getType()); //$NON-NLS-1$ |
| assertEquals("wrong service", reg1.getReference(), event.getServiceReference()); //$NON-NLS-1$ |
| } |
| } |
| |
| regHook.unregister(); |
| regHook = null; |
| |
| synchronized (events) { |
| events.clear(); |
| } |
| hookCalled[0] = 0; |
| props.put(Constants.SERVICE_DESCRIPTION, "service 2"); //$NON-NLS-1$ |
| reg1.setProperties(props); |
| synchronized (events) { |
| assertEquals("listener not called once", 1, events.size()); //$NON-NLS-1$ |
| Iterator iter = events.iterator(); |
| while (iter.hasNext()) { |
| ServiceEvent event = (ServiceEvent) iter.next(); |
| assertEquals("type not registered", ServiceEvent.MODIFIED, event.getType()); //$NON-NLS-1$ |
| assertEquals("wrong service", reg1.getReference(), event.getServiceReference()); //$NON-NLS-1$ |
| } |
| } |
| assertEquals("hooks called", 0, hookCalled[0]); //$NON-NLS-1$ |
| |
| props.put(Constants.SERVICE_DESCRIPTION, "event hook 2"); //$NON-NLS-1$ |
| regHook = testContext.registerService(EventHook.class.getName(), hook2, props); |
| |
| synchronized (events) { |
| events.clear(); |
| } |
| hookCalled[0] = 0; |
| reg1.unregister(); |
| reg1 = null; |
| synchronized (events) { |
| assertEquals("listener called", 0, events.size()); //$NON-NLS-1$ |
| } |
| assertEquals("all hooks not called", 1, hookCalled[0]); //$NON-NLS-1$ |
| assertEquals("hook 1 not called first", 1, hookCalled[1]); //$NON-NLS-1$ |
| for (int i = 0; i < hookError.length; i++) { |
| if (hookError[i] != null) { |
| throw hookError[i]; |
| } |
| } |
| |
| } finally { |
| // unregister hook and services |
| if (regHook != null) |
| regHook.unregister(); |
| if (reg1 != null) |
| reg1.unregister(); |
| if (sl != null) |
| testContext.removeServiceListener(sl); |
| } |
| } |
| |
| public void testListenerHook01() { |
| final String testMethodName = "testListenerHook01"; //$NON-NLS-1$ |
| // test the ListenerHook is called |
| final BundleContext testContext = OSGiTestsActivator.getContext(); |
| final Collection result = new ArrayList(); |
| final int[] hookCalled = new int[] {0, 0}; |
| |
| ListenerHook hook1 = new ListenerHook() { |
| public void added(Collection listeners) { |
| synchronized (hookCalled) { |
| hookCalled[0]++; |
| } |
| result.addAll(listeners); |
| } |
| |
| public void removed(Collection listeners) { |
| synchronized (hookCalled) { |
| hookCalled[1]++; |
| } |
| result.removeAll(listeners); |
| } |
| }; |
| |
| Hashtable props = new Hashtable(); |
| props.put("name", testMethodName); //$NON-NLS-1$ |
| // register listener hook 1 |
| props.put(Constants.SERVICE_DESCRIPTION, "listener hook 1"); //$NON-NLS-1$ |
| ServiceRegistration regHook = testContext.registerService(ListenerHook.class.getName(), hook1, props); |
| |
| try { |
| assertFalse("no service listeners found", result.isEmpty()); //$NON-NLS-1$ |
| assertEquals("added not called", 1, hookCalled[0]); //$NON-NLS-1$ |
| assertEquals("removed called", 0, hookCalled[1]); //$NON-NLS-1$ |
| |
| int size = result.size(); |
| ServiceListener testSL = new ServiceListener() { |
| public void serviceChanged(ServiceEvent event) { |
| // do nothing |
| } |
| }; |
| String filterString1 = "(foo=bar)"; //$NON-NLS-1$ |
| testContext.addServiceListener(testSL, filterString1); |
| assertEquals("added not called", 2, hookCalled[0]); //$NON-NLS-1$ |
| assertEquals("removed called", 0, hookCalled[1]); //$NON-NLS-1$ |
| assertEquals("listener not added", size + 1, result.size()); //$NON-NLS-1$ |
| Iterator iter = result.iterator(); |
| boolean found = false; |
| while (iter.hasNext()) { |
| ListenerHook.ListenerInfo info = (ListenerHook.ListenerInfo) iter.next(); |
| BundleContext c = info.getBundleContext(); |
| String f = info.getFilter(); |
| if ((c == testContext) && (filterString1.equals(f))) { |
| if (found) { |
| fail("found more than once"); //$NON-NLS-1$ |
| } |
| found = true; |
| } |
| } |
| if (!found) { |
| fail("listener not found"); //$NON-NLS-1$ |
| } |
| |
| String filterString2 = "(bar=foo)"; //$NON-NLS-1$ |
| testContext.addServiceListener(testSL, filterString2); |
| assertEquals("added not called", 3, hookCalled[0]); //$NON-NLS-1$ |
| assertEquals("removed not called", 1, hookCalled[1]); //$NON-NLS-1$ |
| assertEquals("listener not removed and added", size + 1, result.size()); //$NON-NLS-1$ |
| iter = result.iterator(); |
| found = false; |
| while (iter.hasNext()) { |
| ListenerHook.ListenerInfo info = (ListenerHook.ListenerInfo) iter.next(); |
| BundleContext c = info.getBundleContext(); |
| String f = info.getFilter(); |
| if ((c == testContext) && (filterString2.equals(f))) { |
| if (found) { |
| fail("found more than once"); //$NON-NLS-1$ |
| } |
| found = true; |
| } |
| if ((c == testContext) && (filterString1.equals(f))) { |
| fail("first listener not removed"); //$NON-NLS-1$ |
| } |
| } |
| if (!found) { |
| fail("listener not found"); //$NON-NLS-1$ |
| } |
| |
| testContext.removeServiceListener(testSL); |
| assertEquals("added called", 3, hookCalled[0]); //$NON-NLS-1$ |
| assertEquals("removed not called", 2, hookCalled[1]); //$NON-NLS-1$ |
| assertEquals("listener not removed", size, result.size()); //$NON-NLS-1$ |
| iter = result.iterator(); |
| while (iter.hasNext()) { |
| ListenerHook.ListenerInfo info = (ListenerHook.ListenerInfo) iter.next(); |
| BundleContext c = info.getBundleContext(); |
| String f = info.getFilter(); |
| if ((c == testContext) && (filterString2.equals(f))) { |
| fail("second listener not removed"); //$NON-NLS-1$ |
| } |
| } |
| |
| testContext.removeServiceListener(testSL); |
| assertEquals("added called", 3, hookCalled[0]); //$NON-NLS-1$ |
| assertEquals("removed called", 2, hookCalled[1]); //$NON-NLS-1$ |
| assertEquals("listener removed", size, result.size()); //$NON-NLS-1$ |
| |
| } catch (InvalidSyntaxException e) { |
| fail(e.getMessage()); |
| } finally { |
| if (regHook != null) { |
| regHook.unregister(); |
| } |
| } |
| } |
| |
| public void testListenerHook02() { |
| final String testMethodName = "testListenerHook02"; //$NON-NLS-1$ |
| // test the ListenerHook works with the FilteredServiceListener optimization in equinox |
| final BundleContext testContext = OSGiTestsActivator.getContext(); |
| final Collection result = new ArrayList(); |
| final int[] hookCalled = new int[] {0, 0}; |
| |
| ListenerHook hook1 = new ListenerHook() { |
| public void added(Collection listeners) { |
| synchronized (hookCalled) { |
| hookCalled[0]++; |
| } |
| result.addAll(listeners); |
| } |
| |
| public void removed(Collection listeners) { |
| synchronized (hookCalled) { |
| hookCalled[1]++; |
| } |
| result.removeAll(listeners); |
| } |
| }; |
| |
| Hashtable props = new Hashtable(); |
| props.put("name", testMethodName); //$NON-NLS-1$ |
| // register listener hook 1 |
| props.put(Constants.SERVICE_DESCRIPTION, "listener hook 1"); //$NON-NLS-1$ |
| ServiceRegistration regHook = testContext.registerService(ListenerHook.class.getName(), hook1, props); |
| |
| try { |
| assertFalse("no service listeners found", result.isEmpty()); //$NON-NLS-1$ |
| assertEquals("added not called", 1, hookCalled[0]); //$NON-NLS-1$ |
| assertEquals("removed called", 0, hookCalled[1]); //$NON-NLS-1$ |
| |
| int size = result.size(); |
| ServiceListener testSL = new ServiceListener() { |
| public void serviceChanged(ServiceEvent event) { |
| // do nothing |
| } |
| }; |
| String filterString1 = "(" + Constants.OBJECTCLASS + "=bar)"; //$NON-NLS-1$ //$NON-NLS-2$ |
| testContext.addServiceListener(testSL, filterString1); |
| assertEquals("added not called", 2, hookCalled[0]); //$NON-NLS-1$ |
| assertEquals("removed called", 0, hookCalled[1]); //$NON-NLS-1$ |
| assertEquals("listener not added", size + 1, result.size()); //$NON-NLS-1$ |
| Iterator iter = result.iterator(); |
| boolean found = false; |
| while (iter.hasNext()) { |
| ListenerHook.ListenerInfo info = (ListenerHook.ListenerInfo) iter.next(); |
| BundleContext c = info.getBundleContext(); |
| String f = info.getFilter(); |
| if ((c == testContext) && (filterString1.equals(f))) { |
| if (found) { |
| fail("found more than once"); //$NON-NLS-1$ |
| } |
| found = true; |
| } |
| } |
| if (!found) { |
| fail("listener not found"); //$NON-NLS-1$ |
| } |
| |
| String filterString2 = null; |
| testContext.addServiceListener(testSL); |
| assertEquals("added not called", 3, hookCalled[0]); //$NON-NLS-1$ |
| assertEquals("removed not called", 1, hookCalled[1]); //$NON-NLS-1$ |
| assertEquals("listener not removed and added", size + 1, result.size()); //$NON-NLS-1$ |
| iter = result.iterator(); |
| found = false; |
| while (iter.hasNext()) { |
| ListenerHook.ListenerInfo info = (ListenerHook.ListenerInfo) iter.next(); |
| BundleContext c = info.getBundleContext(); |
| String f = info.getFilter(); |
| if ((c == testContext) && (f == filterString2)) { |
| if (found) { |
| fail("found more than once"); //$NON-NLS-1$ |
| } |
| found = true; |
| } |
| if ((c == testContext) && (filterString1.equals(f))) { |
| fail("first listener not removed"); //$NON-NLS-1$ |
| } |
| } |
| if (!found) { |
| fail("listener not found"); //$NON-NLS-1$ |
| } |
| |
| testContext.removeServiceListener(testSL); |
| assertEquals("added called", 3, hookCalled[0]); //$NON-NLS-1$ |
| assertEquals("removed not called", 2, hookCalled[1]); //$NON-NLS-1$ |
| assertEquals("listener not removed", size, result.size()); //$NON-NLS-1$ |
| iter = result.iterator(); |
| while (iter.hasNext()) { |
| ListenerHook.ListenerInfo info = (ListenerHook.ListenerInfo) iter.next(); |
| BundleContext c = info.getBundleContext(); |
| String f = info.getFilter(); |
| if ((c == testContext) && (f == filterString2)) { |
| fail("second listener not removed"); //$NON-NLS-1$ |
| } |
| } |
| |
| testContext.removeServiceListener(testSL); |
| assertEquals("added called", 3, hookCalled[0]); //$NON-NLS-1$ |
| assertEquals("removed called", 2, hookCalled[1]); //$NON-NLS-1$ |
| assertEquals("listener removed", size, result.size()); //$NON-NLS-1$ |
| |
| } catch (InvalidSyntaxException e) { |
| fail(e.getMessage()); |
| } finally { |
| if (regHook != null) { |
| regHook.unregister(); |
| } |
| } |
| } |
| } |