package vroom.optimization.online.jmsa.events;
import vroom.common.utilities.events.EventHandlingException;
import vroom.common.utilities.events.IEventHandler;
import vroom.optimization.online.jmsa.IInstance;
import vroom.optimization.online.jmsa.IScenario;
import vroom.optimization.online.jmsa.MSABase.MSAProxy;
import vroom.optimization.online.jmsa.events.MSACallbackEvent.EventTypes;
import vroom.optimization.online.jmsa.utils.MSALogging;
/**
* <code>EndOfServiceHandler<code> is an implementation of {@link
* IEventHandler}responsible of the handling of {@link ResourceEvent} events.
*
* @author Victor Pillac, <a href="http://uniandes.edu.co">Universidad de Los Andes</a> - <a
* href="http://copa.uniandes.edu.co">Copa</a>, <a href="http://www.emn.fr">Ecole des Mines de Nantes</a>-<a
* href="http://www.irccyn.ec-nantes.fr/irccyn/d/en/equipes/Slp">SLP</a>
* @version 1.0 #updated 16-Feb-2010 10:06:59 a.m.
*/
public class ResourceHandler<S extends IScenario, I extends IInstance> extends
MSAEventHandler<ResourceEvent, S, I> {
public ResourceHandler(MSAProxy<S, I> parentMSA) {
super(parentMSA);
}
@Override
public boolean canHandleEvent(ResourceEvent event) {
return true;
}
@Override
public boolean handleEvent(ResourceEvent event) throws EventHandlingException {
boolean result = false;
switch (event.getType()) {
case START:
MSALogging.getEventsLogger().info(
"ResourceHandler.handleEvent: Start servicing handler (%s)", event);
getParentMSAProxy().getInstance().acquireLock();
getParentMSAProxy().getInstance().setResourceStarted(event.getResourceId(),
event.getAdditionalInformation());
getParentMSAProxy().getInstance().releaseLock();
getParentMSAProxy().getComponentManager().startServicingUpdate(event.getResourceId());
result = true;
break;
case STOP:
MSALogging.getEventsLogger().info(
"ResourceHandler.handleEvent: Stop servicing handler (%s)", event);
getParentMSAProxy().getInstance().acquireLock();
getParentMSAProxy().getInstance().setResourceStopped(event.getResourceId(),
event.getAdditionalInformation());
getParentMSAProxy().getInstance().releaseLock();
getParentMSAProxy().getComponentManager().stopServicingUpdate(event.getResourceId());
result = true;
break;
case REQUEST_ASSIGNED:
MSALogging.getEventsLogger().info(
"ResourceHandler.handleEvent: Enforcing decision (req:%s res:%s)",
event.getRequest(), event.getResourceId());
getParentMSAProxy().getInstance().acquireLock();
result = getParentMSAProxy().getInstance().assignRequestToResource(event.getRequest(),
event.getResourceId());
getParentMSAProxy().getInstance().releaseLock();
if (!result) {
MSALogging.getEventsLogger().warn(
"ResourceHandler.handleEvent: Error when calling IInstance.commitResourceToRequest, "
+ "ignoring the event (method returned false) (req:%s res:%s)",
event.getRequest(), event.getResourceId());
} else {
getParentMSAProxy().getComponentManager().enforceDecision(event.getResourceId(),
event.getRequest());
}
break;
case START_OF_SERVICE:
MSALogging.getEventsLogger().info(
"ResourceHandler.handleEvent: Start of service handler (%s)", event);
getParentMSAProxy().getComponentManager().startOfServiceUpdate(event.getResourceId(),
event.getRequest());
result = true;
break;
case END_OF_SERVICE:
MSALogging.getEventsLogger().info(
"ResourceHandler.handleEvent: End of service handler (%s)", event);
getParentMSAProxy().getComponentManager().endOfServiceUpdate(event.getResourceId(),
event.getRequest());
getParentMSAProxy().getInstance().acquireLock();
result = getParentMSAProxy().getInstance().markRequestAsServed(event.getRequest(),
event.getResourceId());
getParentMSAProxy().getInstance().releaseLock();
if (!result) {
MSALogging
.getEventsLogger()
.error("ResourceHandler.handleEvent: Unable to mark the request as served (req:%s)",
event.getRequest());
}
// event.getSource().raisePoolUpdateEvent(true);
event.getSource().raiseDecisionEvent();
break;
default:
MSALogging.getEventsLogger().info(
"ResourceHandler.handleEvent: Nothing to do for event %s", event);
result = true;
break;
}
getParentMSAProxy().callbacks(EventTypes.EVENTS_RESOURCE, new Object[] { event, result });
return result;
}
}