/* * gw2live - GuildWars 2 Dynamic Map * * Website: http://gw2map.com * * Copyright 2013 zyclonite networx * http://zyclonite.net * Developer: Lukas Prettenthaler */ package net.zyclonite.gw2live.handler; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Date; import net.zyclonite.gw2live.listener.StatisticUpdateListener; import net.zyclonite.gw2live.service.MongoDB; import net.zyclonite.gw2live.util.AppConfig; import net.zyclonite.gw2live.util.EplUpdateListener; import net.zyclonite.gw2live.util.LocalCache; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.vertx.java.core.Handler; import org.vertx.java.core.http.HttpServerRequest; import org.vertx.java.core.json.JsonArray; import org.vertx.java.core.json.JsonObject; /** * * @author zyclonite */ public class StatRestHandler implements Handler<HttpServerRequest> { private static final Log LOG = LogFactory.getLog(StatRestHandler.class); private final ObjectMapper mapper; private final MongoDB db; private final String crossdomainpolicy; public StatRestHandler() { mapper = new ObjectMapper(); db = MongoDB.getInstance(); final AppConfig config = AppConfig.getInstance(); crossdomainpolicy = config.getString("webservice.cross-domain-policy", "*"); } @Override public void handle(final HttpServerRequest req) { req.response().setStatusCode(200); req.response().putHeader("Content-Type", "application/json; charset=utf-8"); req.response().putHeader("Access-Control-Allow-Origin", crossdomainpolicy); final String endpoint = req.params().get("endpoint"); LOG.debug("got request path: " + req.path()); String output; switch (endpoint) { case "list": req.response().putHeader("Cache-Control", "max-age=21600");//cache for 6h final JsonArray response = new JsonArray(); for (final EplUpdateListener statement : LocalCache.STATEMENTS) { if (statement instanceof StatisticUpdateListener) { final JsonObject service = new JsonObject(); service.putString("name", statement.getName().toLowerCase()); final JsonArray out = new JsonArray(); for (final String value : ((StatisticUpdateListener)statement).getOutput()) { out.addString(value); } service.putArray("output", out); response.addObject(service); } } output = response.encode(); break; case "get": req.response().putHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0"); req.response().putHeader("Pragma", "no-cache"); if (req.params().contains("id")) { try { if (req.params().contains("date")) { Date date = new Date(); try { date = new Date(Long.parseLong(req.params().get("date"))); } catch (NumberFormatException e) { } if (req.params().contains("limit")) { int limit = 1000; try { limit = Integer.parseInt(req.params().get("limit")); } catch (NumberFormatException e) { } output = mapper.writeValueAsString(db.findStats(req.params().get("id").toLowerCase(), date, limit)); } else { output = mapper.writeValueAsString(db.findStats(req.params().get("id").toLowerCase(), date)); } } else { output = mapper.writeValueAsString(db.findStats(req.params().get("id").toLowerCase())); } } catch (JsonProcessingException ex) { output = "{\"error\":\"server error\"}"; LOG.warn("could not translate object to json " + ex.getMessage()); } } else { output = "{\"error\":\"missing id parameter\"}"; } break; default: output = "{\"error\":\"wrong endpoint\"}"; } req.response().end(output); } }