diff options
author | Markus Alexander Kuppe | 2013-12-14 19:14:03 +0000 |
---|---|---|
committer | Markus Alexander Kuppe | 2013-12-14 19:22:16 +0000 |
commit | b5df2eec58a7a2c156d3f3517645759819c87ff8 (patch) | |
tree | efa6a85e152d71c08ff2b561922ae80a735ec995 /osgi | |
parent | 91d50b481c4f91bc7f593359eb30e13347f54531 (diff) | |
download | org.eclipse.ecf-b5df2eec58a7a2c156d3f3517645759819c87ff8.tar.gz org.eclipse.ecf-b5df2eec58a7a2c156d3f3517645759819c87ff8.tar.xz org.eclipse.ecf-b5df2eec58a7a2c156d3f3517645759819c87ff8.zip |
Bug 424059: RSA not dynamic aware with regards to discovery providers
https://bugs.eclipse.org/bugs/show_bug.cgi?id=424059
Refactor .remoteserviceadmin bundle to interact with ECF discovery via
whiteboard pattern only. Besides code simplifications a major advantage
is removal of startup ordering in that Discovery providers can now be
started but still advertise the endpoint after RSA has published the
service.
Part #1 removes the coupling with IDiscoveryAdvertiser
Signed-off-by: Markus Alexander Kuppe <bugs.eclipse.org@lemmster.de>
Diffstat (limited to 'osgi')
10 files changed, 44 insertions, 623 deletions
diff --git a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/.project b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/.project index 2ce11a0ae..f64778ed4 100644 --- a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/.project +++ b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/.project @@ -25,6 +25,11 @@ <arguments> </arguments> </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ds.core.builder</name> + <arguments> + </arguments> + </buildCommand> </buildSpec> <natures> <nature>org.eclipse.pde.PluginNature</nature> diff --git a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/META-INF/MANIFEST.MF b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/META-INF/MANIFEST.MF index fedb577a4..cfb7f1971 100644 --- a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/META-INF/MANIFEST.MF +++ b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %bundle.name Bundle-SymbolicName: org.eclipse.ecf.osgi.services.remoteserviceadmin -Bundle-Version: 3.0.0.qualifier +Bundle-Version: 4.0.0.qualifier Bundle-Activator: org.eclipse.ecf.internal.osgi.services.remoteserviceadmin.Activator Bundle-Vendor: %bundle.provider Bundle-RequiredExecutionEnvironment: J2SE-1.5 @@ -34,4 +34,5 @@ Import-Package: javax.xml.parsers, org.xml.sax DynamicImport-Package: * Bundle-ActivationPolicy: lazy +Service-Component: OSGI-INF/serviceInfoFactory.xml diff --git a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/OSGI-INF/serviceInfoFactory.xml b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/OSGI-INF/serviceInfoFactory.xml new file mode 100644 index 000000000..fbf0369ac --- /dev/null +++ b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/OSGI-INF/serviceInfoFactory.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.ecf.osgi.services.remoteserviceadmin.serviceInfoFactory"> + <implementation class="org.eclipse.ecf.osgi.services.remoteserviceadmin.ServiceInfoFactory"/> + <service> + <provide interface="org.eclipse.ecf.osgi.services.remoteserviceadmin.IServiceInfoFactory"/> + </service> +</scr:component> diff --git a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/build.properties b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/build.properties index a947bebcc..f1b1a8252 100644 --- a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/build.properties +++ b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/build.properties @@ -1,10 +1,11 @@ -source.. = src/ output.. = bin/ bin.includes = META-INF/,\ .,\ bundle.properties,\ about.html,\ .options,\ - OSGI-INF/ + OSGI-INF/,\ + OSGI-INF/serviceInfoFactory.xml src.includes = about.html,\ bundle.properties +source.. = src/ diff --git a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/internal/osgi/services/remoteserviceadmin/Activator.java b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/internal/osgi/services/remoteserviceadmin/Activator.java index 71aca41fc..42e739451 100644 --- a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/internal/osgi/services/remoteserviceadmin/Activator.java +++ b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/internal/osgi/services/remoteserviceadmin/Activator.java @@ -28,9 +28,7 @@ import org.eclipse.ecf.core.ContainerTypeDescription; import org.eclipse.ecf.core.IContainerManager; import org.eclipse.ecf.core.util.LogHelper; import org.eclipse.ecf.core.util.SystemLogService; -import org.eclipse.ecf.osgi.services.remoteserviceadmin.EndpointDescriptionAdvertiser; import org.eclipse.ecf.osgi.services.remoteserviceadmin.EndpointDescriptionLocator; -import org.eclipse.ecf.osgi.services.remoteserviceadmin.IEndpointDescriptionAdvertiser; import org.eclipse.ecf.osgi.services.remoteserviceadmin.RemoteServiceAdmin; import org.eclipse.ecf.remoteservice.IRemoteServiceContainerAdapter; import org.osgi.framework.Bundle; @@ -66,7 +64,6 @@ public class Activator implements BundleActivator { private ServiceRegistration remoteServiceAdminRegistration; private EndpointDescriptionLocator endpointDescriptionLocator; - private EndpointDescriptionAdvertiser endpointDescriptionAdvertiser; private ServiceRegistration endpointDescriptionAdvertiserRegistration; // Logging @@ -209,11 +206,6 @@ public class Activator implements BundleActivator { final Properties properties = new Properties(); properties.put(Constants.SERVICE_RANKING, new Integer(Integer.MIN_VALUE)); - endpointDescriptionAdvertiser = new EndpointDescriptionAdvertiser( - endpointDescriptionLocator); - endpointDescriptionAdvertiserRegistration = context.registerService( - IEndpointDescriptionAdvertiser.class.getName(), - endpointDescriptionAdvertiser, (Dictionary) properties); // start endpointDescriptionLocator endpointDescriptionLocator.start(); @@ -251,10 +243,6 @@ public class Activator implements BundleActivator { endpointDescriptionAdvertiserRegistration.unregister(); endpointDescriptionAdvertiserRegistration = null; } - if (endpointDescriptionAdvertiser != null) { - endpointDescriptionAdvertiser.close(); - endpointDescriptionAdvertiser = null; - } synchronized (saxParserFactoryTrackerLock) { if (saxParserFactoryTracker != null) { saxParserFactoryTracker.close(); diff --git a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractTopologyManager.java b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractTopologyManager.java index 4190756db..a73855477 100644 --- a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractTopologyManager.java +++ b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractTopologyManager.java @@ -9,8 +9,7 @@ ******************************************************************************/ package org.eclipse.ecf.osgi.services.remoteserviceadmin; -import java.security.AccessController; -import java.security.PrivilegedAction; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -18,6 +17,7 @@ import java.util.StringTokenizer; import java.util.TreeMap; import org.eclipse.core.runtime.IStatus; +import org.eclipse.ecf.discovery.IServiceInfo; import org.eclipse.ecf.internal.osgi.services.remoteserviceadmin.Activator; import org.eclipse.ecf.internal.osgi.services.remoteserviceadmin.DebugOptions; import org.eclipse.ecf.internal.osgi.services.remoteserviceadmin.LogUtility; @@ -27,6 +27,7 @@ import org.osgi.framework.Filter; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; import org.osgi.service.remoteserviceadmin.EndpointListener; import org.osgi.service.remoteserviceadmin.ImportRegistration; import org.osgi.util.tracker.ServiceTracker; @@ -47,12 +48,13 @@ public abstract class AbstractTopologyManager { private BundleContext context; - private ServiceTracker endpointDescriptionAdvertiserTracker; - private Object endpointDescriptionAdvertiserTrackerLock = new Object(); - private ServiceTracker remoteServiceAdminTracker; private Object remoteServiceAdminTrackerLock = new Object(); + private final IServiceInfoFactory serviceInfoFactory = new ServiceInfoFactory(); + + private final Map<org.osgi.service.remoteserviceadmin.EndpointDescription, ServiceRegistration<IServiceInfo>> registrations = new HashMap<org.osgi.service.remoteserviceadmin.EndpointDescription, ServiceRegistration<IServiceInfo>>(); + public AbstractTopologyManager(BundleContext context) { this.context = context; } @@ -68,42 +70,7 @@ public abstract class AbstractTopologyManager { return a.getFrameworkUUID(); } - /** - * @since 3.0 - */ - protected IEndpointDescriptionAdvertiser getEndpointDescriptionAdvertiser( - org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription) { - IEndpointDescriptionAdvertiser advertiser = AccessController - .doPrivileged(new PrivilegedAction<IEndpointDescriptionAdvertiser>() { - public IEndpointDescriptionAdvertiser run() { - synchronized (endpointDescriptionAdvertiserTrackerLock) { - if (endpointDescriptionAdvertiserTracker == null) { - endpointDescriptionAdvertiserTracker = new ServiceTracker( - getContext(), - IEndpointDescriptionAdvertiser.class - .getName(), null); - endpointDescriptionAdvertiserTracker.open(); - } - } - return (IEndpointDescriptionAdvertiser) endpointDescriptionAdvertiserTracker - .getService(); - } - }); - if (advertiser == null) - logWarning("handleOSGiEndpointAdded", //$NON-NLS-1$ - "No endpoint description advertiser available for endpointDescription=" //$NON-NLS-1$ - + endpointDescription); - - return advertiser; - } - public void close() { - synchronized (endpointDescriptionAdvertiserTrackerLock) { - if (endpointDescriptionAdvertiserTracker != null) { - endpointDescriptionAdvertiserTracker.close(); - endpointDescriptionAdvertiserTracker = null; - } - } synchronized (remoteServiceAdminTrackerLock) { if (remoteServiceAdminTracker != null) { remoteServiceAdminTracker.close(); @@ -152,16 +119,12 @@ public abstract class AbstractTopologyManager { */ protected void advertiseEndpointDescription( org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription) { - // forward to all other endpoint listener - IEndpointDescriptionAdvertiser advertiser = getEndpointDescriptionAdvertiser(endpointDescription); - if (advertiser != null) { - // Now advertise endpoint description using endpoint description - // advertiser - trace("advertiseEndpointDescription", //$NON-NLS-1$ - "advertising endpointDescription=" + endpointDescription //$NON-NLS-1$ - + " with advertiser=" + advertiser); //$NON-NLS-1$ - handleAdvertisingResult(advertiser.advertise(endpointDescription), - endpointDescription, true); + final IServiceInfo serviceInfo = serviceInfoFactory.createServiceInfo( + null, endpointDescription); + if (serviceInfo != null) { + final ServiceRegistration<IServiceInfo> registerService = this.context + .registerService(IServiceInfo.class, serviceInfo, null); + this.registrations.put(endpointDescription, registerService); } } @@ -170,52 +133,10 @@ public abstract class AbstractTopologyManager { */ protected void unadvertiseEndpointDescription( org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription) { - IEndpointDescriptionAdvertiser advertiser = getEndpointDescriptionAdvertiser(endpointDescription); - if (advertiser != null) { - // Now unadvertise endpoint description using endpoint description - // advertiser - trace("unadvertiseEndpointDescription", //$NON-NLS-1$ - "unadvertising endpointDescription=" + endpointDescription //$NON-NLS-1$ - + " with advertiser=" + advertiser); //$NON-NLS-1$ - handleAdvertisingResult( - advertiser.unadvertise(endpointDescription), - endpointDescription, false); - } - } - - /** - * @since 3.0 - */ - protected void advertiseEndpointDescription( - EndpointDescription endpointDescription) { - // forward to all other endpoint listener - IEndpointDescriptionAdvertiser advertiser = getEndpointDescriptionAdvertiser(endpointDescription); - if (advertiser != null) { - // Now advertise endpoint description using endpoint description - // advertiser - trace("advertiseEndpointDescription", //$NON-NLS-1$ - "advertising endpointDescription=" + endpointDescription //$NON-NLS-1$ - + " with advertiser=" + advertiser); //$NON-NLS-1$ - handleAdvertisingResult(advertiser.advertise(endpointDescription), - endpointDescription, true); - } - } - - /** - * @since 3.0 - */ - protected void unadvertiseEndpointDescription( - EndpointDescription endpointDescription) { - IEndpointDescriptionAdvertiser advertiser = getEndpointDescriptionAdvertiser(endpointDescription); - if (advertiser != null) { - // Now unadvertise endpoint description using endpoint description - // advertiser - trace("unadvertiseEndpointDescription", //$NON-NLS-1$ - "unadvertising endpointDescription=" + endpointDescription //$NON-NLS-1$ - + " with advertiser=" + advertiser); //$NON-NLS-1$ - handleAdvertisingResult( - advertiser.unadvertise(endpointDescription), - endpointDescription, false); + final ServiceRegistration<IServiceInfo> serviceRegistration = this.registrations + .get(endpointDescription); + if (serviceRegistration != null) { + serviceRegistration.unregister(); } } @@ -310,8 +231,9 @@ public abstract class AbstractTopologyManager { listeners = context.getServiceReferences( EndpointListener.class.getName(), "(" + EndpointListener.ENDPOINT_LISTENER_SCOPE + "=*)"); //$NON-NLS-1$//$NON-NLS-2$ - } catch (InvalidSyntaxException e) { + } catch (InvalidSyntaxException doesNotHappen) { // Should never happen + doesNotHappen.printStackTrace(); } if (listeners != null) { for (int i = 0; i < listeners.length; i++) { @@ -436,5 +358,4 @@ public abstract class AbstractTopologyManager { } } } - } diff --git a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/EndpointDescriptionAdvertiser.java b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/EndpointDescriptionAdvertiser.java deleted file mode 100644 index 6b4f78d35..000000000 --- a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/EndpointDescriptionAdvertiser.java +++ /dev/null @@ -1,296 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010-2011 Composent, Inc. 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: - * Composent, Inc. - initial API and implementation - ******************************************************************************/ -package org.eclipse.ecf.osgi.services.remoteserviceadmin; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.PatternSyntaxException; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.MultiStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.ecf.core.jobs.JobsExecutor; -import org.eclipse.ecf.discovery.IDiscoveryAdvertiser; -import org.eclipse.ecf.discovery.IServiceInfo; -import org.eclipse.ecf.internal.osgi.services.remoteserviceadmin.Activator; -import org.eclipse.ecf.internal.osgi.services.remoteserviceadmin.DebugOptions; -import org.eclipse.ecf.internal.osgi.services.remoteserviceadmin.LogUtility; -import org.eclipse.equinox.concurrent.future.IExecutor; -import org.eclipse.equinox.concurrent.future.IProgressRunnable; -import org.eclipse.equinox.concurrent.future.ImmediateExecutor; -import org.eclipse.equinox.concurrent.future.ThreadsExecutor; - -/** - * Default implementation of {@link IEndpointDescriptionAdvertiser}. - * - */ -public class EndpointDescriptionAdvertiser implements - IEndpointDescriptionAdvertiser { - - private static final String advertiserFilter = System - .getProperty("org.eclipse.ecf.osgi.services.remoteserviceadmin.endpointDescriptionDiscoveryAdvertiserFilter"); //$NON-NLS-1$ - - private static final String executorType = System - .getProperty( - "org.eclipse.ecf.osgi.services.remoteserviceadmin.endpointDescriptionDiscoveryAdvertiserExecutorType", "immediate"); //$NON-NLS-1$ //$NON-NLS-2$ - - private EndpointDescriptionLocator endpointDescriptionLocator; - private List<String> filteredAdvertisers = new ArrayList<String>(); - - public EndpointDescriptionAdvertiser( - EndpointDescriptionLocator endpointDescriptionLocator) { - this.endpointDescriptionLocator = endpointDescriptionLocator; - if (advertiserFilter != null) { - try { - String[] fas = advertiserFilter.split(","); //$NON-NLS-1$ - if (fas != null) - for (int i = 0; i < fas.length; i++) - filteredAdvertisers.add(fas[i]); - } catch (PatternSyntaxException e) { - // should never happen - } - } - for (String filteredAdvertiser : filteredAdvertisers) - trace("EndpointDescriptionAdvertiser<init>", //$NON-NLS-1$ - "filtering advertiser=" + filteredAdvertiser); //$NON-NLS-1$ - } - - private IExecutor createExecutor() { - if (executorType.equals("jobs")) { //$NON-NLS-1$ - return new JobsExecutor(this.getClass().getName()); - } else if (executorType.equals("threads")) { //$NON-NLS-1$ - return new ThreadsExecutor(); - } else - return new ImmediateExecutor(); - } - - private IExecutor executor; - - private IExecutor getExecutor() { - synchronized (this) { - if (executor == null) - executor = createExecutor(); - return executor; - } - } - - /** - * @since 3.0 - */ - public IStatus advertise(EndpointDescription endpointDescription) { - return doDiscovery(endpointDescription, true); - } - - /** - * @since 3.0 - */ - protected void trace(String methodName, String message) { - LogUtility.trace(methodName, - DebugOptions.ENDPOINT_DESCRIPTION_ADVERTISER, this.getClass(), - message); - } - - /** - * @since 3.0 - */ - protected IStatus doDiscovery( - final IDiscoveryAdvertiser discoveryAdvertiser, - final IServiceInfo serviceInfo, final boolean advertise) { - IProgressRunnable<IStatus> runnable = new IProgressRunnable<IStatus>() { - public IStatus run(IProgressMonitor monitor) throws Exception { - try { - if (advertise) { - trace("doDiscovery", "discoveryAdvertiser=" + discoveryAdvertiser + " serviceInfo=" + serviceInfo); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - synchronized (discoveryAdvertiser) { - discoveryAdvertiser.registerService(serviceInfo); - } - } else { - trace("doUndiscovery", "discoveryAdvertiser=" + discoveryAdvertiser + " serviceInfo=" + serviceInfo); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - synchronized (discoveryAdvertiser) { - discoveryAdvertiser.unregisterService(serviceInfo); - } - } - } catch (Exception e) { - LogUtility - .logError( - "doDiscovery", DebugOptions.ENDPOINT_DESCRIPTION_ADVERTISER, this.getClass(), createErrorStatus("Unexplained exception in discoveryAdvertiserID=" + discoveryAdvertiser + " for serviceInfo=" + serviceInfo + " advertise=" + true)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - return null; - } - }; - // Start/do it - getExecutor().execute(runnable, null); - return Status.OK_STATUS; - } - - protected IServiceInfoFactory getServiceInfoFactory() { - return endpointDescriptionLocator.getServiceInfoFactory(); - } - - protected IDiscoveryAdvertiser[] getDiscoveryAdvertisers() { - IDiscoveryAdvertiser[] unfilteredAdvertisers = endpointDescriptionLocator - .getDiscoveryAdvertisers(); - List<IDiscoveryAdvertiser> results = new ArrayList<IDiscoveryAdvertiser>(); - if (unfilteredAdvertisers != null) - for (int i = 0; i < unfilteredAdvertisers.length; i++) { - String className = unfilteredAdvertisers[i].getClass() - .getName(); - if (!filteredAdvertisers.contains(className)) - results.add(unfilteredAdvertisers[i]); - else - LogUtility - .logWarning( - "getDiscoveryAdvertisers", DebugOptions.ENDPOINT_DESCRIPTION_ADVERTISER, this.getClass(), "Filtering out discoveryAdvertiser=" + className); //$NON-NLS-1$ //$NON-NLS-2$ - } - return results.toArray(new IDiscoveryAdvertiser[results.size()]); - } - - protected IStatus createErrorStatus(String message) { - return createErrorStatus(message, null); - } - - protected IStatus createErrorStatus(String message, Throwable e) { - return new Status(IStatus.ERROR, Activator.PLUGIN_ID, message, e); - } - - /** - * @since 3.0 - */ - protected IStatus doDiscovery(EndpointDescription endpointDescription, - boolean advertise) { - Assert.isNotNull(endpointDescription); - String messagePrefix = advertise ? "Advertise" : "Unadvertise"; //$NON-NLS-1$ //$NON-NLS-2$ - List<IStatus> statuses = new ArrayList<IStatus>(); - // First get serviceInfoFactory - IServiceInfoFactory serviceInfoFactory = getServiceInfoFactory(); - if (serviceInfoFactory == null) - return createErrorStatus(messagePrefix - + " endpointDescription=" //$NON-NLS-1$ - + endpointDescription - + ". No IServiceInfoFactory is available. Cannot unpublish endpointDescription=" //$NON-NLS-1$ - + endpointDescription); - IDiscoveryAdvertiser[] discoveryAdvertisers = getDiscoveryAdvertisers(); - if (discoveryAdvertisers == null || discoveryAdvertisers.length == 0) - return createErrorStatus(messagePrefix - + " endpointDescription=" //$NON-NLS-1$ - + endpointDescription - + ". No endpointDescriptionLocator advertisers available. Cannot " //$NON-NLS-1$ - + (advertise ? "publish" : "unpublish") //$NON-NLS-1$ //$NON-NLS-2$ - + " endpointDescription=" //$NON-NLS-1$ - + endpointDescription); - for (int i = 0; i < discoveryAdvertisers.length; i++) { - IServiceInfo serviceInfo = (advertise ? serviceInfoFactory - .createServiceInfo(discoveryAdvertisers[i], - endpointDescription) : serviceInfoFactory - .removeServiceInfo(discoveryAdvertisers[i], - endpointDescription)); - if (serviceInfo == null) { - statuses.add(createErrorStatus(messagePrefix - + " endpointDescription=" //$NON-NLS-1$ - + endpointDescription - + ". Service Info is null. Cannot publish endpointDescription=" //$NON-NLS-1$ - + endpointDescription)); - continue; - } - // Now actually unregister with advertiser - statuses.add(doDiscovery(discoveryAdvertisers[i], serviceInfo, - advertise)); - } - return createResultStatus(statuses, messagePrefix - + " endpointDesription=" + endpointDescription //$NON-NLS-1$ - + ". Problem in unadvertise"); //$NON-NLS-1$ - } - - /** - * @since 3.0 - */ - public IStatus unadvertise(EndpointDescription endpointDescription) { - return doDiscovery(endpointDescription, false); - } - - private IStatus createResultStatus(List<IStatus> statuses, - String errorMessage) { - List<IStatus> errorStatuses = new ArrayList<IStatus>(); - for (IStatus status : statuses) - if (!status.isOK()) - errorStatuses.add(status); - if (errorStatuses.size() > 0) - return new MultiStatus(Activator.PLUGIN_ID, IStatus.ERROR, - (IStatus[]) statuses.toArray(new IStatus[statuses.size()]), - errorMessage, null); - else - return Status.OK_STATUS; - } - - public void close() { - this.filteredAdvertisers.clear(); - this.endpointDescriptionLocator = null; - executor = null; - } - - public IStatus advertise( - org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription) { - return doDiscovery(endpointDescription, true); - } - - protected IStatus doDiscovery( - org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription, - boolean advertise) { - Assert.isNotNull(endpointDescription); - String messagePrefix = advertise ? "Advertise" : "Unadvertise"; //$NON-NLS-1$ //$NON-NLS-2$ - List<IStatus> statuses = new ArrayList<IStatus>(); - // First get serviceInfoFactory - IServiceInfoFactory serviceInfoFactory = getServiceInfoFactory(); - if (serviceInfoFactory == null) - return createErrorStatus(messagePrefix - + " endpointDescription=" //$NON-NLS-1$ - + endpointDescription - + ". No IServiceInfoFactory is available. Cannot unpublish endpointDescription=" //$NON-NLS-1$ - + endpointDescription); - IDiscoveryAdvertiser[] discoveryAdvertisers = getDiscoveryAdvertisers(); - if (discoveryAdvertisers == null || discoveryAdvertisers.length == 0) - return createErrorStatus(messagePrefix - + " endpointDescription=" //$NON-NLS-1$ - + endpointDescription - + ". No endpointDescriptionLocator advertisers available. Cannot " //$NON-NLS-1$ - + (advertise ? "publish" : "unpublish") //$NON-NLS-1$ //$NON-NLS-2$ - + " endpointDescription=" //$NON-NLS-1$ - + endpointDescription); - for (int i = 0; i < discoveryAdvertisers.length; i++) { - IServiceInfo serviceInfo = (advertise ? serviceInfoFactory - .createServiceInfo(discoveryAdvertisers[i], - endpointDescription) : serviceInfoFactory - .removeServiceInfo(discoveryAdvertisers[i], - endpointDescription)); - if (serviceInfo == null) { - statuses.add(createErrorStatus(messagePrefix - + " endpointDescription=" //$NON-NLS-1$ - + endpointDescription - + ". Service Info is null. Cannot publish endpointDescription=" //$NON-NLS-1$ - + endpointDescription)); - continue; - } - // Now actually unregister with advertiser - statuses.add(doDiscovery(discoveryAdvertisers[i], serviceInfo, - advertise)); - } - return createResultStatus(statuses, messagePrefix - + " endpointDesription=" + endpointDescription //$NON-NLS-1$ - + ". Problem in unadvertise"); //$NON-NLS-1$ - } - - public IStatus unadvertise( - org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription) { - return doDiscovery(endpointDescription, false); - } - -} diff --git a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/IEndpointDescriptionAdvertiser.java b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/IEndpointDescriptionAdvertiser.java deleted file mode 100644 index f1f293fdd..000000000 --- a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/IEndpointDescriptionAdvertiser.java +++ /dev/null @@ -1,118 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010-2011 Composent, Inc. 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: - * Composent, Inc. - initial API and implementation - ******************************************************************************/ -package org.eclipse.ecf.osgi.services.remoteserviceadmin; - -import org.eclipse.core.runtime.IStatus; -import org.eclipse.ecf.discovery.IDiscoveryAdvertiser; - -/** - * Endpoint description advertiser service. TopologyManager consumers may use - * this service to advertise/publish endpoint descriptions for discovery. - * Typically, implementations of this service will use the ECF Discovery API to - * advertise/publish EndpointDescriptions over the network. For example, this is - * what {@link EndpointDescriptionAdvertiser} does...i.e. it - * advertises/unadvertises endpoint descriptions by calling and/all available - * instances of - * {@link org.eclipse.ecf.discovery.IDiscoveryAdvertiser#registerService(org.eclipse.ecf.discovery.IServiceInfo)} - * . - * <p> - * <p> - * Note, however, that other implementations of endpoint description advertisers - * are possible that do not use ECF Discovery...or use ECF Discovery in other - * ways. For example, some TopologyManagers may wish to advertise exported - * remote services by creating a static xml file describing the endpoint by - * using the Endpoint Description Extender Format (EDEF) described in section - * 122.8 of the <a - * href="http://www.osgi.org/download/r4v42/r4.enterprise.pdf">OSGi Enterprise - * Specification</a> by calling {@link #advertise(EndpointDescription)} on their - * own implementation of this service that uses an - * {@link EndpointDescriptionWriter} to create an EDEF bundle. - * <p> - * <p> - * If no other instances of this service have been registered, a default - * instance of {@link EndpointDescriptionAdvertiser} will be used. The default - * instance uses ECF {@link IDiscoveryAdvertiser}s to publish the endpoint - * description. Note that the default instance is registered with the lowest - * possible priority, so that if other {@link IEndpointDescriptionAdvertiser} - * instances are registered, they will be preferred/used over the default. - */ -public interface IEndpointDescriptionAdvertiser { - - /** - * Advertise/publish the given endpoint description. - * - * @param endpointDescription - * the endpoint description to advertise. Must not be - * <code>null</code>. - * @return IStatus to indicate the status of the advertisement. If the - * returned status returns <code>false</code> from - * {@link IStatus#isOK()}, then the advertisement failed. The - * IStatus can be further inspected for exception information and/or - * child statuses. - * - * @see IStatus - * @since 3.0 - */ - public IStatus advertise(EndpointDescription endpointDescription); - - /** - * Unadvertise/unpublishe the given endpoint description. - * - * @param endpointDescription - * the endpoint description to unadvertise. Must not be - * <code>null</code>. - * @return IStatus to indicate the status of the unadvertisement. If the - * returned status returns <code>false</code> from - * {@link IStatus#isOK()}, then the unadvertisement failed. The - * IStatus can be further inspected for exception information and/or - * child statuses. - * - * @see IStatus - * @since 3.0 - */ - public IStatus unadvertise(EndpointDescription endpointDescription); - - /** - * Advertise/publish the given endpoint description. - * - * @param endpointDescription - * the endpoint description to advertise. Must not be - * <code>null</code>. - * @return IStatus to indicate the status of the advertisement. If the - * returned status returns <code>false</code> from - * {@link IStatus#isOK()}, then the advertisement failed. The - * IStatus can be further inspected for exception information and/or - * child statuses. - * - * @since 3.0 - * @see IStatus - */ - public IStatus advertise( - org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription); - - /** - * Unadvertise/unpublishe the given endpoint description. - * - * @param endpointDescription - * the endpoint description to unadvertise. Must not be - * <code>null</code>. - * @return IStatus to indicate the status of the unadvertisement. If the - * returned status returns <code>false</code> from - * {@link IStatus#isOK()}, then the unadvertisement failed. The - * IStatus can be further inspected for exception information and/or - * child statuses. - * - * @since 3.0 - * @see IStatus - */ - public IStatus unadvertise( - org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription); - -} diff --git a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/IServiceInfoFactory.java b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/IServiceInfoFactory.java index 55cc586b8..104b8e795 100644 --- a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/IServiceInfoFactory.java +++ b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/IServiceInfoFactory.java @@ -67,26 +67,4 @@ public interface IServiceInfoFactory { public IServiceInfo createServiceInfo( IDiscoveryAdvertiser advertiser, org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription); - -/** - * Remove any previously created service info that is associated with the - * given endpointDescription (and advertiser). - * - * @param advertiser - * the advertiser associated with the service info previously - * created. Must not be <code>null</code>. - * @param endpointDescription - * the endpoint description that the service info was previously - * created for. Must not be <code>null</code>. - * @return IServiceInfo to use to unpublish the endpointDescription for - * discovery (via - * {@link IDiscoveryAdvertiser#unregisterService(IServiceInfo)). If - * <code>null</code> no service info exists that had previously been - * created for the given endpointDescription and advertiser. - * @since 3.0 - */ - public IServiceInfo removeServiceInfo( - IDiscoveryAdvertiser advertiser, - org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription); - } diff --git a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/ServiceInfoFactory.java b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/ServiceInfoFactory.java index d5a2eb52d..f8159d356 100644 --- a/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/ServiceInfoFactory.java +++ b/osgi/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/ServiceInfoFactory.java @@ -12,7 +12,6 @@ package org.eclipse.ecf.osgi.services.remoteserviceadmin; import java.net.InetAddress; import java.net.URI; import java.net.URISyntaxException; -import java.util.HashMap; import java.util.Map; import org.eclipse.ecf.core.identity.IDFactory; @@ -33,41 +32,6 @@ import org.eclipse.ecf.internal.osgi.services.remoteserviceadmin.PropertiesUtil; public class ServiceInfoFactory extends AbstractMetadataFactory implements IServiceInfoFactory { - protected Map<ServiceInfoKey, IServiceInfo> serviceInfos = new HashMap(); - - protected class ServiceInfoKey { - private org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription; - private Namespace discoveryNamespace; - private int hashCode = 7; - - /** - * @since 3.0 - */ - public ServiceInfoKey( - org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription, - Namespace discoveryNamespace) { - this.endpointDescription = endpointDescription; - this.discoveryNamespace = discoveryNamespace; - this.hashCode = 31 * this.hashCode + endpointDescription.hashCode(); - this.hashCode = 31 * this.hashCode + discoveryNamespace.hashCode(); - } - - public boolean equals(Object other) { - if (other == null) - return false; - if (!(other instanceof ServiceInfoKey)) - return false; - ServiceInfoKey otherKey = (ServiceInfoKey) other; - return (this.endpointDescription - .equals(otherKey.endpointDescription) && this.discoveryNamespace - .equals(otherKey.discoveryNamespace)); - } - - public int hashCode() { - return hashCode; - } - } - /** * @since 3.0 */ @@ -75,15 +39,6 @@ public class ServiceInfoFactory extends AbstractMetadataFactory implements IDiscoveryAdvertiser advertiser, org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription) { try { - Namespace advertiserNamespace = advertiser.getServicesNamespace(); - ServiceInfoKey key = new ServiceInfoKey(endpointDescription, - advertiserNamespace); - IServiceInfo existingServiceInfo = null; - synchronized (serviceInfos) { - existingServiceInfo = serviceInfos.get(key); - // If it's already there, then we return null - if (existingServiceInfo != null) - return null; IServiceTypeID serviceTypeID = createServiceTypeID( endpointDescription, advertiser); String serviceName = createServiceName(endpointDescription, @@ -95,10 +50,7 @@ public class ServiceInfoFactory extends AbstractMetadataFactory implements serviceName, uri); IServiceInfo newServiceInfo = createServiceInfo(uri, serviceName, serviceTypeID, serviceProperties); - // put into map using key - serviceInfos.put(key, newServiceInfo); return newServiceInfo; - } } catch (Exception e) { logError( "createServiceInfo", //$NON-NLS-1$ @@ -213,6 +165,13 @@ public class ServiceInfoFactory extends AbstractMetadataFactory implements protected IServiceTypeID createServiceTypeID( org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription, IDiscoveryAdvertiser advertiser) { + + Namespace servicesNamespace = IDFactory.getDefault() + .getNamespaceByName("ecf.namespace.discovery"); //$NON-NLS-1$ + if (advertiser != null) { + servicesNamespace = advertiser.getServicesNamespace(); + } + Map props = endpointDescription.getProperties(); String[] scopes = PropertiesUtil.getStringArrayWithDefault(props, RemoteConstants.DISCOVERY_SCOPE, IServiceTypeID.DEFAULT_SCOPE); @@ -223,33 +182,8 @@ public class ServiceInfoFactory extends AbstractMetadataFactory implements RemoteConstants.DISCOVERY_NAMING_AUTHORITY, IServiceTypeID.DEFAULT_NA); return ServiceIDFactory.getDefault().createServiceTypeID( - advertiser.getServicesNamespace(), + servicesNamespace, new String[] { RemoteConstants.DISCOVERY_SERVICE_TYPE }, scopes, protocols, namingAuthority); } - - public void close() { - removeAllServiceInfos(); - super.close(); - } - - private void removeAllServiceInfos() { - synchronized (serviceInfos) { - serviceInfos.clear(); - } - } - - /** - * @since 3.0 - */ - public IServiceInfo removeServiceInfo( - IDiscoveryAdvertiser advertiser, - org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription) { - Namespace advertiserNamespace = advertiser.getServicesNamespace(); - ServiceInfoKey key = new ServiceInfoKey(endpointDescription, - advertiserNamespace); - synchronized (serviceInfos) { - return serviceInfos.remove(key); - } - } } |