/******************************************************************************* * Copyright (c) 2010 Markus Alexander Kuppe. * 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: * Markus Alexander Kuppe (ecf-dev_eclipse.org <at> lemmster <dot> de) - initial API and implementation ******************************************************************************/ package org.eclipse.ecf.tests.provider.dnssd; import java.util.Dictionary; import java.util.Hashtable; import org.eclipse.ecf.discovery.IDiscoveryAdvertiser; import org.eclipse.ecf.discovery.IDiscoveryLocator; import org.eclipse.ecf.provider.dnssd.IDnsSdDiscoveryConstants; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceListener; import org.osgi.framework.ServiceReference; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; public class Activator implements BundleActivator { private static Activator instance; private IDiscoveryLocator discoveryLocator; private IDiscoveryAdvertiser discoveryAdvertiser; private ServiceListener locListener; private ServiceListener advListener; private final Object locLock = new Object(); private final Object advLock = new Object(); public Activator() { instance = this; } /* (non-Javadoc) * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) */ public void start(final BundleContext context) throws Exception { final ServiceReference configAdminServiceRef = context .getServiceReference(ConfigurationAdmin.class.getName()); if (configAdminServiceRef == null) { System.err.println("You don't have config admin deployed. Some tests will fail that require configuration!"); return; } final ConfigurationAdmin configAdmin = (ConfigurationAdmin) context.getService(configAdminServiceRef); Configuration config = configAdmin.createFactoryConfiguration( DnsSdTestHelper.ECF_DISCOVERY_DNSSD + ".locator", null); Dictionary properties = new Hashtable(); properties.put(IDnsSdDiscoveryConstants.CA_SEARCH_PATH, new String[]{DnsSdTestHelper.DOMAIN}); properties.put(IDnsSdDiscoveryConstants.CA_RESOLVER, DnsSdTestHelper.DNS_RESOLVER); properties.put(IDnsSdDiscoveryConstants.CA_TSIG_KEY, DnsSdTestHelper.TSIG_KEY); properties.put(IDnsSdDiscoveryConstants.CA_TSIG_KEY_NAME, DnsSdTestHelper.TSIG_KEY_NAME); config.update(properties); String filter = "(" + Constants.SERVICE_PID + "=" + config.getPid() + ")"; // add the service listener locListener = new ServiceListener() { public void serviceChanged(ServiceEvent event) { switch (event.getType()) { case ServiceEvent.REGISTERED: ServiceReference serviceReference = event.getServiceReference(); discoveryLocator = (IDiscoveryLocator) context.getService(serviceReference); synchronized (locLock) { locLock.notifyAll(); } } } }; context.addServiceListener(locListener, filter); // try to get the service initially ServiceReference[] references = context.getServiceReferences(IDiscoveryLocator.class.getName(), filter); if(references != null) { for (int i = 0; i < references.length;) { ServiceReference serviceReference = references[i]; discoveryLocator = (IDiscoveryLocator) context.getService(serviceReference); synchronized (locLock) { locLock.notifyAll(); } } } // advertiser config = configAdmin.createFactoryConfiguration( DnsSdTestHelper.ECF_DISCOVERY_DNSSD + ".advertiser", null); properties = new Hashtable(); properties.put(IDnsSdDiscoveryConstants.CA_SEARCH_PATH, new String[]{DnsSdTestHelper.DOMAIN}); properties.put(IDnsSdDiscoveryConstants.CA_RESOLVER, DnsSdTestHelper.DNS_RESOLVER); properties.put(IDnsSdDiscoveryConstants.CA_TSIG_KEY, DnsSdTestHelper.TSIG_KEY); properties.put(IDnsSdDiscoveryConstants.CA_TSIG_KEY_NAME, DnsSdTestHelper.TSIG_KEY_NAME); config.update(properties); filter = "(" + Constants.SERVICE_PID + "=" + config.getPid() + ")"; // add the service listener advListener = new ServiceListener() { public void serviceChanged(ServiceEvent event) { switch (event.getType()) { case ServiceEvent.REGISTERED: ServiceReference serviceReference = event.getServiceReference(); discoveryAdvertiser = (IDiscoveryAdvertiser) context.getService(serviceReference); synchronized (advLock) { advLock.notifyAll(); } } } }; context.addServiceListener(advListener, filter); // try to get the service initially references = context.getServiceReferences(IDiscoveryAdvertiser.class.getName(), filter); if(references != null) { for (int i = 0; i < references.length;) { ServiceReference serviceReference = references[i]; discoveryAdvertiser = (IDiscoveryAdvertiser) context.getService(serviceReference); synchronized (advLock) { advLock.notifyAll(); } } } } /* (non-Javadoc) * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) */ public void stop(BundleContext context) throws Exception { if(locListener != null) { context.removeServiceListener(locListener); locListener = null; } if(advListener != null) { context.removeServiceListener(advListener); advListener = null; } } public static Activator getDefault() { return instance; } public IDiscoveryLocator getDiscoveryLocator() { if (discoveryLocator == null) { try { synchronized (locLock) { locLock.wait(2000); // wait 2 few for config admin } } catch (InterruptedException e) { // may never happen e.printStackTrace(); return null; } } return discoveryLocator; } public IDiscoveryAdvertiser getDiscoveryAdvertiser() { if (discoveryAdvertiser == null) { try { synchronized (advLock) { advLock.wait(2000); // wait a few sec for config admin } } catch (InterruptedException e) { // may never happen e.printStackTrace(); return null; } } return discoveryAdvertiser; } }