summaryrefslogtreecommitdiffstats
path: root/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery
diff options
context:
space:
mode:
Diffstat (limited to 'java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery')
-rw-r--r--java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/AbstractDiscoveryService.java280
-rw-r--r--java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/Discovery.java66
-rw-r--r--java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DiscoveryActivator.java57
-rw-r--r--java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DomainDiscoveryService.java124
-rw-r--r--java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/LocalDiscoveryService.java205
5 files changed, 0 insertions, 732 deletions
diff --git a/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/AbstractDiscoveryService.java b/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/AbstractDiscoveryService.java
deleted file mode 100644
index 5b0b311d7a..0000000000
--- a/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/AbstractDiscoveryService.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tuscany.sca.osgi.service.discovery.impl;
-
-import static org.apache.tuscany.sca.osgi.remoteserviceadmin.EndpointListener.ENDPOINT_LISTENER_SCOPE;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Dictionary;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.tuscany.sca.core.ExtensionPointRegistry;
-import org.apache.tuscany.sca.core.LifeCycleListener;
-import org.apache.tuscany.sca.node.NodeFactory;
-import org.apache.tuscany.sca.node.impl.NodeFactoryImpl;
-import org.apache.tuscany.sca.osgi.remoteserviceadmin.EndpointDescription;
-import org.apache.tuscany.sca.osgi.remoteserviceadmin.EndpointListener;
-import org.apache.tuscany.sca.osgi.remoteserviceadmin.RemoteConstants;
-import org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.OSGiHelper;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Filter;
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTracker;
-
-/**
- *
- */
-public abstract class AbstractDiscoveryService implements Discovery, LifeCycleListener {
- protected final static int ADDED = 0x1;
- protected final static int REMOVED = 0x2;
- protected final static int MODIFIED = 0x4;
-
- protected final static Logger logger = Logger.getLogger(AbstractDiscoveryService.class.getName());
-
- protected BundleContext context;
- protected ExtensionPointRegistry registry;
-
- private Map<String, List<EndpointListener>> filtersToListeners = new HashMap<String, List<EndpointListener>>();
- // this is effectively a set which allows for multiple service descriptions with the
- // same interface name but different properties and takes care of itself with respect to concurrency
- protected Map<EndpointDescription, Bundle> servicesInfo = new ConcurrentHashMap<EndpointDescription, Bundle>();
- private Map<EndpointListener, Collection<String>> listenersToFilters =
- new HashMap<EndpointListener, Collection<String>>();
- private ServiceTracker trackerTracker;
-
- public AbstractDiscoveryService(BundleContext context) {
- super();
- this.context = context;
- }
-
- public void start() {
- // track the registration of EndpointListener
- trackerTracker = new ServiceTracker(this.context, EndpointListener.class.getName(), null) {
- public Object addingService(ServiceReference reference) {
- Object result = super.addingService(reference);
- cacheTracker(reference, result);
- return result;
- }
-
- public void modifiedService(ServiceReference reference, Object service) {
- super.modifiedService(reference, service);
- updateTracker(reference, service);
- }
-
- public void removedService(ServiceReference reference, Object service) {
- super.removedService(reference, service);
- clearTracker(service);
- }
- };
-
- trackerTracker.open();
- }
-
- public void stop() {
- trackerTracker.close();
- }
-
- protected ExtensionPointRegistry getExtensionPointRegistry() {
- NodeFactoryImpl factory = (NodeFactoryImpl)NodeFactory.newInstance();
- factory.init();
- ServiceTracker tracker = new ServiceTracker(context, ExtensionPointRegistry.class.getName(), null);
- tracker.open();
- // tracker.waitForService(1000);
- registry = (ExtensionPointRegistry)tracker.getService();
- tracker.close();
- return registry;
- }
-
- protected Dictionary<String, Object> getProperties() {
- Dictionary headers = context.getBundle().getHeaders();
- Hashtable<String, Object> props = new Hashtable<String, Object>();
- props.put(PRODUCT_NAME, "Apache Tuscany SCA");
- props.put(PRODUCT_VERSION, headers.get(Constants.BUNDLE_VERSION));
- props.put(VENDOR_NAME, headers.get(Constants.BUNDLE_VENDOR));
- // props.put(SUPPORTED_PROTOCOLS, new String[] {"local", "org.osgi.sca"});
- return props;
- }
-
- private synchronized void cacheTracker(ServiceReference reference, Object service) {
- if (service instanceof EndpointListener) {
- EndpointListener listener = (EndpointListener)service;
- Collection<String> filters =
- addTracker(reference, listener, ENDPOINT_LISTENER_SCOPE, filtersToListeners, listenersToFilters);
-
- triggerCallbacks(null, filters, listener, true);
- }
- }
-
- private synchronized void clearTracker(Object service) {
- if (service instanceof EndpointListener) {
- removeTracker((EndpointListener)service, filtersToListeners, listenersToFilters);
- }
- }
-
- private synchronized void updateTracker(ServiceReference reference, Object service) {
- if (service instanceof EndpointListener) {
- EndpointListener listener = (EndpointListener)service;
- if (logger.isLoggable(Level.FINE)) {
- logger.fine("updating listener: " + listener);
- }
- Collection<String> oldFilters = removeTracker(listener, filtersToListeners, listenersToFilters);
-
- Collection<String> newFilters =
- addTracker(reference, listener, ENDPOINT_LISTENER_SCOPE, filtersToListeners, listenersToFilters);
-
- triggerCallbacks(oldFilters, newFilters, listener, true);
- }
- }
-
- private void triggerCallbacks(Collection<String> oldInterest,
- Collection<String> newInterest,
- EndpointListener listener,
- boolean isFilter) {
- // compute delta between old & new interfaces/filters and
- // trigger callbacks for any entries in servicesInfo that
- // match any *additional* interface/filters
- Collection<String> deltaInterest = new ArrayList<String>();
- if (newInterest != null && !newInterest.isEmpty()) {
- if (oldInterest == null || oldInterest.isEmpty()) {
- deltaInterest.addAll(newInterest);
- } else {
- Iterator<String> i = newInterest.iterator();
- while (i.hasNext()) {
- String next = (String)i.next();
- if (!oldInterest.contains(next)) {
- deltaInterest.add(next);
- }
- }
- }
- }
-
- if (logger.isLoggable(Level.FINE)) {
- if (servicesInfo.size() > 0) {
- logger.fine("search for matches to trigger callbacks with delta: " + deltaInterest);
- } else {
- logger.fine("nothing to search for matches to trigger callbacks with delta: " + deltaInterest);
- }
- }
- Iterator<String> i = deltaInterest.iterator();
- while (i.hasNext()) {
- String next = i.next();
- for (EndpointDescription sd : servicesInfo.keySet()) {
- triggerCallbacks(listener, next, sd, ADDED);
- }
- }
- }
-
- private void triggerCallbacks(EndpointListener listener, String matchedFilter, EndpointDescription sd, int type) {
- switch (type) {
- case ADDED:
- listener.endpointAdded(sd, matchedFilter);
- break;
- case REMOVED:
- listener.endpointRemoved(sd, matchedFilter);
- break;
- case MODIFIED:
- listener.endpointRemoved(sd, matchedFilter);
- listener.endpointAdded(sd, matchedFilter);
- break;
- }
- }
-
- private boolean filterMatches(String filterValue, EndpointDescription sd) {
- Filter filter = OSGiHelper.createFilter(context, filterValue);
- Hashtable<String, Object> props = new Hashtable<String, Object>(sd.getProperties());
- // Add two faked properties to make the filter match
- props.put(Constants.OBJECTCLASS, sd.getInterfaces());
- props.put(RemoteConstants.SERVICE_IMPORTED, "true");
- return filter != null ? filter.match(props) : false;
- }
-
- static Collection<String> removeTracker(EndpointListener listener,
- Map<String, List<EndpointListener>> forwardMap,
- Map<EndpointListener, Collection<String>> reverseMap) {
- Collection<String> collection = reverseMap.get(listener);
- if (collection != null && !collection.isEmpty()) {
- reverseMap.remove(listener);
- Iterator<String> i = collection.iterator();
- while (i.hasNext()) {
- String element = i.next();
- if (forwardMap.containsKey(element)) {
- forwardMap.get(element).remove(listener);
- } else {
- // if the element wasn't on the forwardmap, its a new element and
- // shouldn't be returned as part of the collection of old ones
- i.remove();
- }
- }
- }
- return collection;
- }
-
- @SuppressWarnings("unchecked")
- static Collection<String> addTracker(ServiceReference reference,
- EndpointListener listener,
- String property,
- Map<String, List<EndpointListener>> forwardMap,
- Map<EndpointListener, Collection<String>> reverseMap) {
- Collection<String> collection = OSGiHelper.getStringCollection(reference, property);
- if (logger.isLoggable(Level.FINE)) {
- logger.fine("adding listener: " + listener
- + " collection: "
- + collection
- + " registered against prop: "
- + property);
- }
- if (collection != null && !collection.isEmpty()) {
- reverseMap.put(listener, new ArrayList<String>(collection));
- Iterator<String> i = collection.iterator();
- while (i.hasNext()) {
- String element = i.next();
- if (forwardMap.containsKey(element)) {
- forwardMap.get(element).add(listener);
- } else {
- List<EndpointListener> trackerList = new ArrayList<EndpointListener>();
- trackerList.add(listener);
- forwardMap.put(element, trackerList);
- }
- }
- }
- return collection;
- }
-
- protected void endpointChanged(EndpointDescription sd, int type) {
- for (Map.Entry<EndpointListener, Collection<String>> entry : listenersToFilters.entrySet()) {
- for (String filter : entry.getValue()) {
- if (filterMatches(filter, sd)) {
- triggerCallbacks(entry.getKey(), filter, sd, type);
- }
- }
- }
- }
-
-}
diff --git a/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/Discovery.java b/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/Discovery.java
deleted file mode 100644
index 3ad1e53fee..0000000000
--- a/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/Discovery.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.osgi.service.discovery.impl;
-
-/**
- * Every Discovery Provider registers a service implementing this interface.
- * This service is registered with extra properties identified at the beginning
- * of this interface to denote the name of the product providing Discovery
- * functionality, its version, vendor, used protocols etc..
- * <p>
- * Discovery allows to publish services exposed for remote access as well as to
- * search for remote services.
- * <p>
- * Discovery service implementations usually rely on some discovery protocols or
- * other information distribution means.
- *
- * @ThreadSafe
- */
-public interface Discovery {
-
- /**
- * ServiceRegistration property for the name of the Discovery product.
- * <p>
- * Value of this property is of type <code>String</code>.
- */
- String PRODUCT_NAME = "osgi.remote.discovery.product";
-
- /**
- * ServiceRegistration property for the version of the Discovery product.
- * <p>
- * Value of this property is of type <code>String</code>.
- */
- String PRODUCT_VERSION = "osgi.remote.discovery.product.version";
-
- /**
- * ServiceRegistration property for the Discovery product vendor name.
- * <p>
- * Value of this property is of type <code>String</code>.
- */
- String VENDOR_NAME = "osgi.remote.discovery.vendor";
-
- /**
- * ServiceRegistration property that lists the discovery protocols used by
- * this Discovery service.
- * <p>
- * Value of this property is of type
- * <code>Collection (&lt;? extends String&gt;)</code>.
- */
- String SUPPORTED_PROTOCOLS = "osgi.remote.discovery.supported_protocols";
-}
diff --git a/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DiscoveryActivator.java b/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DiscoveryActivator.java
deleted file mode 100644
index 32bd10b77b..0000000000
--- a/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DiscoveryActivator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.osgi.service.discovery.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-
-public class DiscoveryActivator implements BundleActivator {
- private List<AbstractDiscoveryService> discoveryServices = new ArrayList<AbstractDiscoveryService>();
- private List<ServiceRegistration> discoveryServiceRegistrations = new ArrayList<ServiceRegistration>();
-
- public void start(BundleContext context) {
- discoveryServices.add(new LocalDiscoveryService(context));
-
- discoveryServices.add(new DomainDiscoveryService(context));
-
- for (AbstractDiscoveryService service : discoveryServices) {
- service.start();
- ServiceRegistration registration =
- context.registerService(Discovery.class.getName(), service, service.getProperties());
- discoveryServiceRegistrations.add(registration);
- }
- }
-
- public void stop(BundleContext context) {
- for (ServiceRegistration registration : discoveryServiceRegistrations) {
- try {
- registration.unregister();
- } catch (IllegalStateException e) {
- // The service has been unregistered, ignore it
- }
- }
- for (AbstractDiscoveryService service : discoveryServices) {
- service.stop();
- }
- }
-}
diff --git a/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DomainDiscoveryService.java b/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DomainDiscoveryService.java
deleted file mode 100644
index bf70c98634..0000000000
--- a/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DomainDiscoveryService.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tuscany.sca.osgi.service.discovery.impl;
-
-import static org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.EndpointHelper.createEndpointDescription;
-
-import java.util.Dictionary;
-
-import org.apache.tuscany.sca.assembly.Endpoint;
-import org.apache.tuscany.sca.assembly.Implementation;
-import org.apache.tuscany.sca.core.UtilityExtensionPoint;
-import org.apache.tuscany.sca.implementation.osgi.OSGiImplementation;
-import org.apache.tuscany.sca.osgi.remoteserviceadmin.EndpointDescription;
-import org.apache.tuscany.sca.runtime.DomainRegistryFactory;
-import org.apache.tuscany.sca.runtime.EndpointListener;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-
-/**
- * Discovery service based on the distributed SCA domain
- */
-public class DomainDiscoveryService extends AbstractDiscoveryService implements EndpointListener {
- private DomainRegistryFactory domainRegistryFactory;
-
- public DomainDiscoveryService(BundleContext context) {
- super(context);
- }
-
- public void start() {
- super.start();
- getExtensionPointRegistry();
- this.domainRegistryFactory =
- registry.getExtensionPoint(UtilityExtensionPoint.class).getUtility(DomainRegistryFactory.class);
- domainRegistryFactory.addListener(this);
- }
-
- public void endpointAdded(Endpoint endpoint) {
- Implementation impl = endpoint.getComponent().getImplementation();
- if (!(impl instanceof OSGiImplementation)) {
- return;
- }
-
- BundleContext bundleContext = null;
- // Remote endpoint doesn't have a bundle
- if (!endpoint.isRemote()) {
- OSGiImplementation osgiImpl = (OSGiImplementation)impl;
- Bundle bundle = osgiImpl.getBundle();
- bundleContext = bundle != null ? bundle.getBundleContext() : null;
- }
-
- /*
- if (!endpoint.isRemote()) {
- Interface intf = endpoint.getService().getInterfaceContract().getInterface();
- JavaInterface javaInterface = (JavaInterface)intf;
- // String filter = getOSGiFilter(provider.getOSGiProperties(service));
- // FIXME: What is the filter?
- String filter = "(!(sca.reference=*))";
- // "(sca.service=" + component.getURI() + "#service-name\\(" + service.getName() + "\\))";
- ServiceReference ref = null;
- try {
- ref = bundleContext.getServiceReferences(javaInterface.getName(), filter)[0];
- } catch (InvalidSyntaxException e) {
- // Ignore
- }
- if (ref != null) {
-
- }
- } else
- */
- {
- // Notify the endpoint listeners
- EndpointDescription description = createEndpointDescription(bundleContext, endpoint);
- endpointChanged(description, ADDED);
- }
- }
-
- public void endpointRemoved(Endpoint endpoint) {
- /*
- if (!endpoint.isRemote()) {
- // export services
- } else
- */
- {
- EndpointDescription description = createEndpointDescription(context, endpoint);
- endpointChanged(description, REMOVED);
- }
- }
-
- public void endpointUpdated(Endpoint oldEndpoint, Endpoint newEndpoint) {
- // FIXME: This is a quick and dirty way for the update
- endpointRemoved(oldEndpoint);
- endpointAdded(newEndpoint);
- }
-
- public void stop() {
- domainRegistryFactory.removeListener(this);
- super.stop();
- }
-
- @Override
- protected Dictionary<String, Object> getProperties() {
- Dictionary<String, Object> props = super.getProperties();
- props.put(SUPPORTED_PROTOCOLS, new String[] {"org.osgi.sca"});
- return props;
- }
-
-}
diff --git a/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/LocalDiscoveryService.java b/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/LocalDiscoveryService.java
deleted file mode 100644
index 11dcd56272..0000000000
--- a/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/LocalDiscoveryService.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.osgi.service.discovery.impl;
-
-import static org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.OSGiHelper.getConfiguration;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Dictionary;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.UUID;
-import java.util.Map.Entry;
-import java.util.logging.Level;
-
-import org.apache.tuscany.sca.core.UtilityExtensionPoint;
-import org.apache.tuscany.sca.deployment.Deployer;
-import org.apache.tuscany.sca.implementation.osgi.SCAConfig;
-import org.apache.tuscany.sca.implementation.osgi.ServiceDescription;
-import org.apache.tuscany.sca.implementation.osgi.ServiceDescriptions;
-import org.apache.tuscany.sca.osgi.remoteserviceadmin.EndpointDescription;
-import org.apache.tuscany.sca.osgi.remoteserviceadmin.RemoteConstants;
-import org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.OSGiHelper;
-import org.oasisopen.sca.ServiceRuntimeException;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleEvent;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.util.tracker.BundleTracker;
-import org.osgi.util.tracker.BundleTrackerCustomizer;
-import org.osgi.util.tracker.ServiceTracker;
-
-public class LocalDiscoveryService extends AbstractDiscoveryService implements BundleTrackerCustomizer {
- private Deployer deployer;
- private BundleTracker bundleTracker;
- private Collection<ExtenderConfiguration> extenders = new ArrayList<ExtenderConfiguration>();
-
- public LocalDiscoveryService(BundleContext context) {
- super(context);
- }
-
- public void start() {
- super.start();
- getExtensionPointRegistry();
-
- UtilityExtensionPoint utilities = this.registry.getExtensionPoint(UtilityExtensionPoint.class);
- this.deployer = utilities.getUtility(Deployer.class);
- bundleTracker = new BundleTracker(context, Bundle.ACTIVE | Bundle.STARTING, this);
- bundleTracker.open();
- }
-
- public static ServiceTracker getTracker(BundleContext context) {
- Filter filter = null;
- try {
- filter =
- context.createFilter("(& (" + Discovery.SUPPORTED_PROTOCOLS
- + "=local) ("
- + Constants.OBJECTCLASS
- + "="
- + Discovery.class.getName()
- + "))");
- } catch (InvalidSyntaxException e) {
- throw new IllegalArgumentException(e);
- }
- return new ServiceTracker(context, filter, null);
- }
-
- private EndpointDescription createEndpointDescription(ServiceDescription sd) {
- Map<String, Object> props = new HashMap<String, Object>(sd.getProperties());
- props.put(Constants.OBJECTCLASS, sd.getInterfaces().toArray(new String[sd.getInterfaces().size()]));
- if (!props.containsKey(RemoteConstants.SERVICE_REMOTE_ID)) {
- props.put(RemoteConstants.SERVICE_REMOTE_ID, String.valueOf(System.currentTimeMillis()));
- }
- if (!props.containsKey(RemoteConstants.SERVICE_REMOTE_FRAMEWORK_UUID)) {
- props.put(RemoteConstants.SERVICE_REMOTE_FRAMEWORK_UUID, OSGiHelper.getFrameworkUUID(context));
- }
- if (!props.containsKey(RemoteConstants.SERVICE_REMOTE_URI)) {
- props.put(RemoteConstants.SERVICE_REMOTE_URI, UUID.randomUUID().toString());
- }
-
- EndpointDescription sed = new EndpointDescription(props);
- return sed;
- }
-
- private void removeServicesDeclaredInBundle(Bundle bundle) {
- for (Iterator<Map.Entry<EndpointDescription, Bundle>> i = servicesInfo.entrySet().iterator(); i.hasNext();) {
- Entry<EndpointDescription, Bundle> entry = i.next();
- if (entry.getValue().equals(bundle)) {
- serviceDescriptionRemoved(entry.getKey());
- i.remove();
- }
- }
- }
-
- private void serviceDescriptionAdded(EndpointDescription endpointDescription) {
- endpointChanged(endpointDescription, ADDED);
- }
-
- private void serviceDescriptionRemoved(EndpointDescription endpointDescription) {
- endpointChanged(endpointDescription, REMOVED);
- }
-
- public void stop() {
- if (bundleTracker != null) {
- bundleTracker.close();
- }
- super.stop();
- }
-
- public Object addingBundle(Bundle bundle, BundleEvent event) {
- Collection<URL> scaConfigs = getConfiguration(bundle, "SCA-Configuration", "OSGI-INF/sca-config/*.xml");
- Collection<URL> descriptions = getConfiguration(bundle, "Remote-Service", null);
- if (scaConfigs.isEmpty() && descriptions.isEmpty()) {
- return null;
- }
- ExtenderConfiguration extender = new ExtenderConfiguration();
- for (URL url : scaConfigs) {
- try {
- SCAConfig scaConfig = deployer.loadXMLDocument(url, deployer.createMonitor());
- extender.scaConfigs.add(scaConfig);
- } catch (Exception e) {
- logger.log(Level.SEVERE, e.getMessage(), e);
- throw new ServiceRuntimeException(e);
- }
- }
- for (URL url : descriptions) {
- try {
- ServiceDescriptions sds = deployer.loadXMLDocument(url, deployer.createMonitor());
- extender.remoteServiceDescriptions.add(sds);
- } catch (Exception e) {
- logger.log(Level.SEVERE, e.getMessage(), e);
- // throw new ServiceRuntimeException(e);
- }
- }
-
- // Notify
- for (ServiceDescriptions sds : extender.getRemoteServiceDescriptions()) {
- for (ServiceDescription sd : sds) {
- EndpointDescription sed = createEndpointDescription(sd);
- servicesInfo.put(sed, bundle);
- serviceDescriptionAdded(sed);
- }
- }
-
- this.extenders.add(extender);
- return extender;
- }
-
- public void modifiedBundle(Bundle bundle, BundleEvent event, Object object) {
- // STARTING --> ACTIVE
- }
-
- public void removedBundle(Bundle bundle, BundleEvent event, Object object) {
- if (object instanceof ExtenderConfiguration) {
- extenders.remove((ExtenderConfiguration)object);
- removeServicesDeclaredInBundle(bundle);
- }
- }
-
- public Collection<ExtenderConfiguration> getConfigurations() {
- return extenders;
- }
-
- public static class ExtenderConfiguration {
- private Collection<SCAConfig> scaConfigs = new ArrayList<SCAConfig>();
- private Collection<ServiceDescriptions> remoteServiceDescriptions = new ArrayList<ServiceDescriptions>();
-
- public Collection<ServiceDescriptions> getRemoteServiceDescriptions() {
- return remoteServiceDescriptions;
- }
-
- public Collection<SCAConfig> getSCAConfigs() {
- return scaConfigs;
- }
-
- }
-
- @Override
- protected Dictionary<String, Object> getProperties() {
- Dictionary<String, Object> props = super.getProperties();
- props.put(SUPPORTED_PROTOCOLS, new String[] {"local"});
- return props;
- }
-
-}