From 2888555b9ba1c6c5c6279f10a8ebab4ead6b8c1d Mon Sep 17 00:00:00 2001 From: Helen Williamson Date: Tue, 14 Mar 2017 16:09:01 +0000 Subject: [PATCH] Brian/Helen: Adding filtered landscape (allows filtering builds by user) (#40) * Brian/Helen: Adding filtered landscape (allows filtering builds by user) * Brian/Helen: Consolidate filtered and non filtered LandscapeObservationResponder. Lowercased url. * Brian/Helen: Return NotFound if user can't be found (with message) --- .../core/domain/LandscapeObservation.java | 19 ++++++++++- .../server/response/CiEyeResourceEngine.java | 33 +++++++++++++++++++ .../LandscapeObservationResponder.java | 15 ++++++--- .../response/responder/NotFoundResponder.java | 15 +++++++-- 4 files changed, 75 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/netmelody/cieye/core/domain/LandscapeObservation.java b/src/main/java/org/netmelody/cieye/core/domain/LandscapeObservation.java index c2b4eb2..a00eeb9 100644 --- a/src/main/java/org/netmelody/cieye/core/domain/LandscapeObservation.java +++ b/src/main/java/org/netmelody/cieye/core/domain/LandscapeObservation.java @@ -1,6 +1,6 @@ package org.netmelody.cieye.core.domain; -import static com.google.common.collect.Lists.newArrayList; +import com.google.common.base.Predicate; import java.util.ArrayList; import java.util.Collection; @@ -8,6 +8,9 @@ import java.util.List; import java.util.Set; +import static com.google.common.collect.Collections2.filter; +import static com.google.common.collect.Lists.newArrayList; + public final class LandscapeObservation { private final List targets = new ArrayList(); @@ -46,4 +49,18 @@ public Set dohGroup() { public LandscapeObservation withDoh(Set dohGroup) { return new LandscapeObservation(this.targets, dohGroup); } + + public LandscapeObservation forSponsor(final Sponsor sponsor) { + return new LandscapeObservation(filter(targets, onSponsor(sponsor)), dohGroup); + } + + private Predicate onSponsor(final Sponsor sponsor) { + return new Predicate() { + @Override + public boolean apply(TargetDetail input) { + return input.sponsors().contains(sponsor); + } + }; + } + } diff --git a/src/main/java/org/netmelody/cieye/server/response/CiEyeResourceEngine.java b/src/main/java/org/netmelody/cieye/server/response/CiEyeResourceEngine.java index f23cdca..1132504 100644 --- a/src/main/java/org/netmelody/cieye/server/response/CiEyeResourceEngine.java +++ b/src/main/java/org/netmelody/cieye/server/response/CiEyeResourceEngine.java @@ -1,6 +1,9 @@ package org.netmelody.cieye.server.response; +import com.google.common.base.Function; +import org.netmelody.cieye.core.domain.LandscapeObservation; +import org.netmelody.cieye.core.domain.Sponsor; import org.netmelody.cieye.server.CiEyeNewVersionChecker; import org.netmelody.cieye.server.CiEyeServerInformationFetcher; import org.netmelody.cieye.server.CiSpyIntermediary; @@ -94,6 +97,17 @@ private CiEyeResponder route(Address target) { } if (path.length == 3) { + if ("filteredlandscapes".equals(path[0])) { + Sponsor sponsor = tracker.sponsorWith(path[2]); + if (sponsor == null) { + return new NotFoundResponder("Cannot find user " + path[2]); + } + if (!target.getPath().getPath().endsWith("/")) { + return new RedirectResponder(target.getPath().getPath() + "/"); + } + return new FileResponder("/resources/cieye.html"); + } + if ("landscapes".equals(path[0]) && "landscapeobservation.json".equals(path[2])) { return new LandscapeObservationResponder(landscapeFetcher.landscapeNamed(path[1]), spyIntermediary, prison); } @@ -107,6 +121,25 @@ private CiEyeResponder route(Address target) { } } + if (path.length == 4) { + if ("filteredlandscapes".equals(path[0]) && "landscapeobservation.json".equals(path[3])) { + Sponsor sponsor = tracker.sponsorWith(path[2]); + if (sponsor == null) { + return new NotFoundResponder("Cannot find user " + path[2]); + } + return new LandscapeObservationResponder(landscapeFetcher.landscapeNamed(path[1]), spyIntermediary, prison, filteringOnSponsor(sponsor)); + } + } + return new NotFoundResponder(); } + + private Function filteringOnSponsor(final Sponsor sponsor) { + return new Function() { + @Override + public LandscapeObservation apply(LandscapeObservation input) { + return input.forSponsor(sponsor); + } + }; + } } \ No newline at end of file diff --git a/src/main/java/org/netmelody/cieye/server/response/responder/LandscapeObservationResponder.java b/src/main/java/org/netmelody/cieye/server/response/responder/LandscapeObservationResponder.java index 2d70ed6..1b03b18 100644 --- a/src/main/java/org/netmelody/cieye/server/response/responder/LandscapeObservationResponder.java +++ b/src/main/java/org/netmelody/cieye/server/response/responder/LandscapeObservationResponder.java @@ -4,6 +4,8 @@ import java.io.IOException; +import com.google.common.base.Function; +import com.google.common.base.Functions; import org.netmelody.cieye.core.domain.Feature; import org.netmelody.cieye.core.domain.Landscape; import org.netmelody.cieye.core.domain.LandscapeObservation; @@ -20,14 +22,19 @@ public final class LandscapeObservationResponder implements CiEyeResponder { private final CiSpyIntermediary spyIntermediary; private final Landscape landscape; private final Prison prison; + private final Function converter; public LandscapeObservationResponder(Landscape landscape, CiSpyIntermediary spyIntermediary, Prison prison) { + this(landscape, spyIntermediary, prison, Functions.identity()); + } + + public LandscapeObservationResponder(Landscape landscape, CiSpyIntermediary spyIntermediary, Prison prison, Function converter) { this.landscape = landscape; this.spyIntermediary = spyIntermediary; this.prison = prison; + this.converter = converter; } - @Override public CiEyeResponse respond(Request request) throws IOException { LandscapeObservation result = new LandscapeObservation(); long timeToLiveMillis = Long.MAX_VALUE; @@ -36,11 +43,11 @@ public CiEyeResponse respond(Request request) throws IOException { result = result.add(briefing.status); timeToLiveMillis = min(timeToLiveMillis, briefing.millisecondsUntilNextUpdate); } - + if (prison.crimeReported(landscape)) { result = result.withDoh(prison.prisonersFor(landscape)); } - - return CiEyeResponse.withJson(new JsonTranslator().toJson(result)).expiringInMillis(timeToLiveMillis); + + return CiEyeResponse.withJson(new JsonTranslator().toJson(converter.apply(result))).expiringInMillis(timeToLiveMillis); } } diff --git a/src/main/java/org/netmelody/cieye/server/response/responder/NotFoundResponder.java b/src/main/java/org/netmelody/cieye/server/response/responder/NotFoundResponder.java index 2262f70..ee8e424 100644 --- a/src/main/java/org/netmelody/cieye/server/response/responder/NotFoundResponder.java +++ b/src/main/java/org/netmelody/cieye/server/response/responder/NotFoundResponder.java @@ -12,11 +12,22 @@ public final class NotFoundResponder implements CiEyeResponder { private static final String CONTENT = "" + "" + - "Page Not Found. Try starting from the top" + + "%s" + ""; + private static final String BODY = "Page Not Found. Try starting from the top"; + private final String content; + + public NotFoundResponder() { + this(BODY); + } + + public NotFoundResponder(String body) { + this.content = String.format(CONTENT, body); + } + @Override public CiEyeResponse respond(Request request) throws IOException { - return CiEyeResponse.withHtml(CONTENT).withStatus(Status.NOT_FOUND); + return CiEyeResponse.withHtml(content).withStatus(Status.NOT_FOUND); } } \ No newline at end of file