package org.mobicents.slee.resource;
import java.util.HashSet;
import java.util.Set;
import javax.slee.EventTypeID;
import javax.slee.SbbID;
import javax.slee.ServiceID;
import javax.slee.UnrecognizedServiceException;
import javax.slee.facilities.FacilityException;
import javax.slee.facilities.ServiceLookupFacility;
import javax.slee.resource.ReceivableService;
import javax.slee.resource.ReceivableService.ReceivableEvent;
import org.mobicents.slee.container.SleeContainer;
import org.mobicents.slee.container.component.ComponentRepositoryImpl;
import org.mobicents.slee.container.component.SbbComponent;
import org.mobicents.slee.container.component.ServiceComponent;
import org.mobicents.slee.container.component.deployment.jaxb.descriptors.sbb.MEventEntry;
/**
* Implementation of the SLEE 1.1 specs {@link ServiceLookupFacility} class.
*
* @author martins
*
*/
public class ServiceLookupFacilityImpl implements ServiceLookupFacility {
/**
* the container
*/
private final SleeContainer container;
/**
* the ra entity
*/
private final ResourceAdaptorEntity raEntity;
public ServiceLookupFacilityImpl(ResourceAdaptorEntity raEntity,SleeContainer container) {
this.container = container;
this.raEntity = raEntity;
}
public ReceivableService getReceivableService(ServiceID serviceID)
throws NullPointerException, UnrecognizedServiceException,
FacilityException {
if (serviceID == null) {
throw new NullPointerException("null ServiceID");
}
ServiceComponent serviceComponent = container
.getComponentRepositoryImpl().getComponentByID(serviceID);
if (serviceComponent == null) {
throw new UnrecognizedServiceException(serviceID.toString());
}
return createReceivableService(serviceComponent);
}
/**
* Creates a {@link ReceivableServiceImpl} instance from the specified
* service component
*
* @param serviceComponent
* @return
*/
private ReceivableService createReceivableService(
ServiceComponent serviceComponent) {
ComponentRepositoryImpl componentRepository = container
.getComponentRepositoryImpl();
HashSet<ReceivableEvent> resultSet = new HashSet<ReceivableEvent>();
for (SbbID sbbID : serviceComponent.getSbbIDs(componentRepository)) {
SbbComponent sbbComponent = componentRepository
.getComponentByID(sbbID);
for (MEventEntry eventEntry : sbbComponent.getDescriptor()
.getEventEntries().values()) {
EventTypeID eventTypeID = eventEntry.getEventReference()
.getComponentID();
final Set<EventTypeID> allowedEventTypes = raEntity.getAllowedEventTypes();
if (allowedEventTypes == null
|| allowedEventTypes.contains(eventTypeID)) {
/*
* The Service Lookup Facility will only return Service
* event type information forthe event types referenced by
* the resource adaptor types implemented by the Resource
* Adaptor.
*/
ReceivableEventImpl receivableEventImpl = new ReceivableEventImpl(
eventTypeID, eventEntry.getResourceOption(),
eventEntry.isInitialEvent());
// add it if it's not in the set or if it is but initial
// event is set (this way if there is a conflict the one
// with initial as true wins)
if (!resultSet.contains(receivableEventImpl)
|| receivableEventImpl.isInitialEvent()) {
resultSet.add(receivableEventImpl);
}
}
}
}
return new ReceivableServiceImpl(serviceComponent.getServiceID(),
resultSet.toArray(new ReceivableEventImpl[resultSet.size()]));
}
}