package denominator.denominatord; import com.squareup.okhttp.mockwebserver.Dispatcher; import com.squareup.okhttp.mockwebserver.MockResponse; import com.squareup.okhttp.mockwebserver.RecordedRequest; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import denominator.ZoneApi; import denominator.model.Zone; import static java.lang.String.format; import static java.lang.System.currentTimeMillis; public class ZoneDispatcher extends Dispatcher { private final Logger log = Logger.getLogger(Dispatcher.class.getName()); private final ZoneApi api; private final JsonCodec codec; ZoneDispatcher(ZoneApi api, JsonCodec codec) { this.api = api; this.codec = codec; } @Override public MockResponse dispatch(RecordedRequest request) { if (request.getMethod().equals("GET")) { Query query = Query.from(request.getPath()); if (query.name != null) { return codec.toJsonArray(api.iterateByName(query.name)); } return codec.toJsonArray(api.iterator()); } else if (request.getMethod().equals("PUT")) { Zone zone = codec.readJson(request, Zone.class); long s = currentTimeMillis(); log.info(format("replacing zone %s", zone)); String id = api.put(zone); log.info(format("replaced zone %s in %sms", zone, currentTimeMillis() - s)); return new MockResponse().setResponseCode(201).addHeader("Location", "/zones/" + id); } else if (request.getMethod().equals("DELETE")) { String zoneId = request.getPath().replace("/zones/", ""); long s = currentTimeMillis(); log.info(format("deleting zone %s ", zoneId)); api.delete(zoneId); log.info(format("deleted zone %s in %sms", zoneId, currentTimeMillis() - s)); return new MockResponse().setResponseCode(204); } else { return new MockResponse().setResponseCode(405); } } }