com.ibm.wsspi.kernel.service.utils
Class ConcurrentServiceReferenceSet<T>

java.lang.Object
  extended by com.ibm.wsspi.kernel.service.utils.ConcurrentServiceReferenceSet<T>

public class ConcurrentServiceReferenceSet<T>
extends java.lang.Object

This provides a simple set implementation for lazy-resolution of services. Use this class when you have frequent iteration with infrequent add/removal. Services are stored in reverse order of ServiceReference.compareTo(java.lang.Object): highest service.ranking then lowest (first) service.id.

Usage (following OSGi DS naming conventions/patterns):

 private final ConcurrentServiceReferenceSet<T> serviceSet = new ConcurrentServiceReferenceSet<T>("referenceName");
 
 protected void activate(ComponentContext ctx) {
  serviceSet.activate(ctx);
 }
 
 protected void deactivate(ComponentContext ctx) {
  serviceSet.deactivate(ctx);
 }
 
 protected void setReferenceName(ServiceReference<T> ref) {
  serviceSet.addReference(ref);
 }
 
 protected void unsetReferenceName(ServiceReference<T> ref) {
  serviceSet.removeReference(ref);
 }
 
 public Iterator<T> getReferenceName() {
  return serviceSet.getServices();
 }
 


Constructor Summary
ConcurrentServiceReferenceSet(java.lang.String name)
          Create a new ConcurrentServiceReferenceSet for the named service.
 
Method Summary
 void activate(org.osgi.service.component.ComponentContext context)
           
 boolean addReference(org.osgi.framework.ServiceReference<T> reference)
          Adds the service reference to the set, or notifies the set that the service ranking for the reference might have been updated.
 void deactivate(org.osgi.service.component.ComponentContext context)
           
 org.osgi.framework.ServiceReference<T> getHighestRankedReference()
          The ConcurrentReferenceSet is ordered by the usual service ranking rules: highest service.ranking then lowest (first) service.id.
 T getHighestRankedService()
          The ConcurrentReferenceSet is ordered by the usual service ranking rules: highest service.ranking then lowest (first) service.id.
 T getService(org.osgi.framework.ServiceReference<T> serviceReference)
          Find the provided reference in the set, and return the corresponding service.
 java.util.Iterator<T> getServices()
          Allocate and return an iterator: The iterator will return the service associated with each ServiceReference as it progresses.
 java.util.Iterator<ServiceAndServiceReferencePair<T>> getServicesWithReferences()
          Allocate and return an iterator: The iterator will return the service associated with each ServiceReference as it progresses.
 boolean isActive()
           
 boolean isEmpty()
          Check if there are any registered/added service references: this will return true if the set is empty (none available).
 java.lang.Iterable<org.osgi.framework.ServiceReference<T>> references()
           
 boolean removeReference(org.osgi.framework.ServiceReference<T> reference)
          Removes the service reference from the set
 java.lang.Iterable<T> services()
           
 java.lang.String toString()
           
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

ConcurrentServiceReferenceSet

public ConcurrentServiceReferenceSet(java.lang.String name)
Create a new ConcurrentServiceReferenceSet for the named service. e.g. from bnd.bnd: referenceName=.... or from component.xml:

Parameters:
name - Name of DS reference
Method Detail

activate

public void activate(org.osgi.service.component.ComponentContext context)

deactivate

public void deactivate(org.osgi.service.component.ComponentContext context)

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object

addReference

public boolean addReference(org.osgi.framework.ServiceReference<T> reference)
Adds the service reference to the set, or notifies the set that the service ranking for the reference might have been updated.

Parameters:
reference - ServiceReference for the target service
Returns:
true if this set already contained the service reference

removeReference

public boolean removeReference(org.osgi.framework.ServiceReference<T> reference)
Removes the service reference from the set

Parameters:
reference - ServiceReference associated with service to be unset
Returns:
true if this set contained the service reference

isEmpty

public boolean isEmpty()
Check if there are any registered/added service references: this will return true if the set is empty (none available). If the set is not empty, the services will only be resolvable if there is a viable component context.

Returns:
true if the list of registered service references is empty.

isActive

public boolean isActive()

getService

public T getService(org.osgi.framework.ServiceReference<T> serviceReference)
Find the provided reference in the set, and return the corresponding service. Subject to the same restrictions/behavior as getServices.

Parameters:
serviceReference - Service reference to find in the set
Returns:
service associated with service reference, or null if the service could not be located.

getHighestRankedService

public T getHighestRankedService()
The ConcurrentReferenceSet is ordered by the usual service ranking rules: highest service.ranking then lowest (first) service.id.

Returns:
The "first" service according to the ranking

getHighestRankedReference

public org.osgi.framework.ServiceReference<T> getHighestRankedReference()
The ConcurrentReferenceSet is ordered by the usual service ranking rules: highest service.ranking then lowest (first) service.id.

Returns:
The "first" service reference according to the ranking

getServices

public java.util.Iterator<T> getServices()
Allocate and return an iterator: The iterator will return the service associated with each ServiceReference as it progresses. Creation of the iterator does not eagerly resolve services: resolution is done only once per service reference, and only when "next" would retrieve that service.

Returns:

getServicesWithReferences

public java.util.Iterator<ServiceAndServiceReferencePair<T>> getServicesWithReferences()
Allocate and return an iterator: The iterator will return the service associated with each ServiceReference as it progresses. Creation of the iterator does not eagerly resolve services: resolution is done only once per service reference, and only when "next" would retrieve that service.

Returns:

services

public java.lang.Iterable<T> services()

references

public java.lang.Iterable<org.osgi.framework.ServiceReference<T>> references()