package org.mobicents.slee.runtime.activity; import java.util.Set; import javax.slee.resource.ActivityAlreadyExistsException; import javax.slee.resource.ActivityFlags; import org.apache.log4j.Logger; import org.mobicents.slee.container.SleeContainer; /** * Activity context factory -- return an activity context given an activity or * create one and put it in the table. This also implements the activity context * naming facility for the SLEE. * * @author F.Moggia * @author M. Ranganathan * @author Tim Fox * @author eduardomartins second version * @version 2.0 * * */ public class ActivityContextFactoryImpl implements ActivityContextFactory { private static Logger logger = Logger.getLogger(ActivityContextFactoryImpl.class); /** * the container for this factory */ private final SleeContainer sleeContainer; private ActivityContextFactoryCacheData cacheData; public ActivityContextFactoryImpl(SleeContainer sleeContainer) { this.sleeContainer = sleeContainer; cacheData = new ActivityContextFactoryCacheData(sleeContainer.getCluster()); cacheData.create(); } public ActivityContext createActivityContext(final ActivityContextHandle ach) throws ActivityAlreadyExistsException { return createActivityContext(ach,ActivityFlags.NO_FLAGS); } public ActivityContext createActivityContext(final ActivityContextHandle ach, int activityFlags) throws ActivityAlreadyExistsException { // create ac ActivityContextCacheData activityContextCacheData = new ActivityContextCacheData(ach, sleeContainer.getCluster()); if (activityContextCacheData.exists()) { throw new ActivityAlreadyExistsException(ach.toString()); } ActivityContext ac = new ActivityContext(ach,activityContextCacheData,tracksIdleTime(ach),Integer.valueOf(activityFlags)); if (logger.isDebugEnabled()) { logger.debug("Created ac "+ac+" for handle "+ach); } return ac; } private boolean tracksIdleTime(ActivityContextHandle ach) { return ach.getActivityType() == ActivityType.RA; } public ActivityContext getActivityContext(ActivityContextHandle ach) { ActivityContextCacheData activityContextCacheData = new ActivityContextCacheData(ach, sleeContainer.getCluster()); if (activityContextCacheData.exists()) { return new ActivityContext(ach,activityContextCacheData,tracksIdleTime(ach)); } else { return null; } } public Set<ActivityContextHandle> getAllActivityContextsHandles() { return cacheData.getActivityContextHandles(); } public void removeActivityContext(final ActivityContext ac) { if (logger.isDebugEnabled()) { logger.debug("Removing ac "+ac); } final ActivityContextHandle ach = ac.getActivityContextHandle(); // do end procedures ac.activityEnded(); // remove runtime resources sleeContainer.getEventRouter().activityEnded(ach); if (logger.isDebugEnabled()) { logger.debug("Activity context with handle "+ac.getActivityContextHandle()+" removed"); } } public int getActivityContextCount() { return getAllActivityContextsHandles().size(); } @Override public String toString() { return "ActivityContext Factory: " + "\n+-- Number of ACs: " + getActivityContextCount(); } }