diff options
Diffstat (limited to 'sca-java-2.x/trunk/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiServiceExporter.java')
-rw-r--r-- | sca-java-2.x/trunk/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiServiceExporter.java | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/sca-java-2.x/trunk/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiServiceExporter.java b/sca-java-2.x/trunk/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiServiceExporter.java index b644ca14c9..4466c04563 100644 --- a/sca-java-2.x/trunk/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiServiceExporter.java +++ b/sca-java-2.x/trunk/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiServiceExporter.java @@ -31,6 +31,9 @@ import java.util.ArrayList; import java.util.Collections; 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.assembly.Component; import org.apache.tuscany.sca.assembly.ComponentService; @@ -48,6 +51,10 @@ import org.osgi.util.tracker.ServiceTrackerCustomizer; * Watching and exporting OSGi services */ public class OSGiServiceExporter extends AbstractOSGiServiceHandler implements ServiceTrackerCustomizer { + private final static Logger logger = Logger.getLogger(OSGiServiceExporter.class.getName()); + + private Map<EndpointDescription, ExportReferenceImpl> exportReferences = + new ConcurrentHashMap<EndpointDescription, ExportReferenceImpl>(); /** * @param context @@ -62,6 +69,11 @@ public class OSGiServiceExporter extends AbstractOSGiServiceHandler implements S init(); } + public void stop() { + exportReferences.clear(); + super.stop(); + } + public Object addingService(ServiceReference reference) { return exportService(reference, null); } @@ -97,17 +109,23 @@ public class OSGiServiceExporter extends AbstractOSGiServiceHandler implements S List<ExportRegistration> exportedServices = new ArrayList<ExportRegistration>(); for (Endpoint endpoint : service.getEndpoints()) { EndpointDescription endpointDescription = createEndpointDescription(context, endpoint); - ExportRegistration exportRegistration = - new ExportRegistrationImpl(node, reference, endpointDescription); - exportedServices.add(exportRegistration); + synchronized (this) { + ExportReferenceImpl exportReference = exportReferences.get(endpointDescription); + if (exportReference == null) { + exportReference = new ExportReferenceImpl(node, reference, endpointDescription); + } + ExportRegistration exportRegistration = exportReference.register(); + exportedServices.add(exportRegistration); + } } return exportedServices; } else { return null; } } catch (Exception e) { - e.printStackTrace(); - return null; + logger.log(Level.SEVERE, e.getMessage(), e); + ExportRegistration exportRegistration = new ExportRegistrationImpl(null, e); + return Collections.singletonList(exportRegistration); } } @@ -118,7 +136,7 @@ public class OSGiServiceExporter extends AbstractOSGiServiceHandler implements S public void removedService(ServiceReference reference, Object service) { List<ExportRegistration> exportedServices = (List<ExportRegistration>)service; - for(ExportRegistration exportRegistration: exportedServices) { + for (ExportRegistration exportRegistration : exportedServices) { exportRegistration.close(); } } |