/** * */ package vroom.optimization.online.jmsa.benchmarking; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.Arrays; import vroom.common.utilities.callbacks.CallbackEventBase; import vroom.optimization.online.jmsa.events.MSACallbackBase; import vroom.optimization.online.jmsa.events.MSACallbackEvent; import vroom.optimization.online.jmsa.events.ResourceEvent; import vroom.optimization.online.jmsa.utils.MSALogging; import vroom.optimization.online.jmsa.vrp.MSAVRPInstance; public class ResourceCallback extends MSACallbackBase { private final BufferedWriter writer; public ResourceCallback(String file) throws IOException { writer = new BufferedWriter(new FileWriter(file)); } @Override public void execute(MSACallbackEvent event) { if (event.getParams() == null || event.getParams().length < 2) { MSALogging.getBaseLogger().warn("ResourceCallback.execute: invalid argument - %s", Arrays.asList(event.getParams())); } else if (event.getParams()[0] == null) { MSALogging.getBaseLogger().warn("ResourceCallback.execute: invalid argument - {%s,%s}", event.getParams()); } else { ResourceEvent ev = (ResourceEvent) event.getParams()[0]; switch (ev.getType()) { case START: log(ev, "Started"); break; case STOP: log(ev, "Stopped"); break; case REQUEST_ASSIGNED: log(ev, "Assigned to request\t%s", ev.getRequest()); break; case START_OF_SERVICE: if (event.getParams().length == 3) { // Failure log(ev, "Route failure at \t%s\t Actual demands:%s Exceeding capacity: %s", ev.getRequest(), Arrays.toString((double[]) ev.getAdditionalInformation()), event.getParams()[2]); } else { log(ev, "Start servicing of \t%s\t Actual demands:%s", ev.getRequest(), Arrays.toString((double[]) ev.getAdditionalInformation())); } break; case END_OF_SERVICE: log(ev, "Served request \t%s", ev.getRequest()); break; default: log(ev, "Unknown resource event: %s", ev); break; } try { writer.newLine(); writer.flush(); } catch (IOException e) { MSALogging.getBaseLogger().warn( "Exception caught in method RequestServedCallback.execute", e); } } } protected void log(ResourceEvent e, String format, Object... arguments) { int id = e.getResourceId(); try { writer.append(String.format("[%s] V%s(%s/%s)\t %s", CallbackEventBase.getTimeStampString(e.getTimeStamp()), id, ((MSAVRPInstance) e .getSource().getParentMSA().getInstance()).getCurrentLoad(id, 0), ((MSAVRPInstance) e.getSource().getParentMSA().getInstance()).getFleet() .getVehicle(id).getCapacity(), String.format(format, arguments))); } catch (IOException e1) { MSALogging.getBaseLogger().warn( "Exception caught in method RequestServedCallback.execute", e1); } } @Override public int getPriority() { return 10; } @Override public boolean isExecutedSynchronously() { return false; } @Override protected void finalize() throws Throwable { writer.flush(); writer.close(); super.finalize(); } }