/* * Copyright: Almende B.V. (2014), Rotterdam, The Netherlands * License: The Apache Software License, Version 2.0 */ package com.almende.eve.algorithms.simulation; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import com.almende.eve.capabilities.handler.Handler; import com.almende.eve.protocol.jsonrpc.annotation.Access; import com.almende.eve.protocol.jsonrpc.annotation.AccessType; import com.almende.eve.protocol.jsonrpc.annotation.Name; import com.almende.eve.protocol.jsonrpc.formats.Caller; import com.almende.eve.protocol.jsonrpc.formats.JSONMessage; import com.almende.eve.scheduling.SimpleScheduler; import com.almende.eve.scheduling.clock.Clock; import com.almende.util.jackson.JOM; import com.fasterxml.jackson.databind.node.ObjectNode; /** * The Class SimulationScheduler. */ public class SimulationScheduler extends SimpleScheduler { private static final Logger LOG = Logger.getLogger(SimulationScheduler.class .getName()); private static Clock sharedClock = null; /** * Instantiates a new simulation scheduler. * * @param params * the params * @param handle * the handle */ public SimulationScheduler(ObjectNode params, Handler<Caller> handle) { super(params, handle); if (sharedClock == null) { sharedClock = new SimulationClock(0); } clock = sharedClock; } /** * Start. */ public void start() { clock.start(); } /** * Receive tracer report. * * @param tracer * the tracer */ @Access(AccessType.PUBLIC) public void receiveTracerReport(final @Name("tracer") Tracer tracer) { clock.done(tracer.getId()); } private Tracer createTracer() { final Tracer tracer = new Tracer(); tracer.setOwner(myUrl); return tracer; } @Override protected void handleTrigger(final Object msg, final String triggerId) { JSONMessage message = JSONMessage.jsonConvert(msg); if (message != null) { final Tracer tracer = createTracer(); tracer.setId(triggerId); final ObjectNode extra = JOM.createObjectNode(); extra.set("@simtracer", JOM.getInstance().valueToTree(tracer)); if (message.getExtra() == null) { message.setExtra(extra); } else { message.getExtra().setAll(extra); } try { handle.get().call(myUrl, msg); } catch (IOException e) { LOG.log(Level.WARNING, "Scheduler got IOException, couldn't send request", e); } } else { LOG.warning("Scheduler tries to send Non-JSON-RPC message, doesn't work with SimulationScheduler."); try { handle.get().call(myUrl, msg); } catch (IOException e) { LOG.log(Level.WARNING, "Scheduler got IOException, couldn't send request", e); } } } @Override public void delete() { clear(); SimulationSchedulerConfig config = SimulationSchedulerConfig .decorate(getParams()); SimulationSchedulerBuilder.delete(config.getId()); } }