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; import org.netmelody.cieye.server.LandscapeFetcher; import org.netmelody.cieye.server.PictureFetcher; import org.netmelody.cieye.server.response.resource.CiEyeResource; import org.netmelody.cieye.server.response.responder.CiEyeVersionResponder; import org.netmelody.cieye.server.response.responder.DohHandler; import org.netmelody.cieye.server.response.responder.FileResponder; import org.netmelody.cieye.server.response.responder.LandscapeListResponder; import org.netmelody.cieye.server.response.responder.LandscapeObservationResponder; import org.netmelody.cieye.server.response.responder.NotFoundResponder; import org.netmelody.cieye.server.response.responder.PictureResponder; import org.netmelody.cieye.server.response.responder.RedirectResponder; import org.netmelody.cieye.server.response.responder.SettingsLocationResponder; import org.netmelody.cieye.server.response.responder.SponsorResponder; import org.netmelody.cieye.server.response.responder.TargetNotationHandler; import org.simpleframework.http.Address; import org.simpleframework.http.resource.Resource; import org.simpleframework.http.resource.ResourceEngine; public final class CiEyeResourceEngine implements ResourceEngine { private final CiSpyIntermediary spyIntermediary; private final LandscapeFetcher landscapeFetcher; private final PictureFetcher pictureFetcher; private final CiEyeServerInformationFetcher configurationFetcher; private final CiEyeNewVersionChecker updateChecker; private final RequestOriginTracker tracker; private final Prison prison = new Prison(); public CiEyeResourceEngine(LandscapeFetcher landscapeFetcher, PictureFetcher pictureFetcher, CiEyeServerInformationFetcher configurationFetcher, RequestOriginTracker tracker, CiSpyIntermediary spyIntermediary, CiEyeNewVersionChecker updateChecker) { this.landscapeFetcher = landscapeFetcher; this.pictureFetcher = pictureFetcher; this.configurationFetcher = configurationFetcher; this.tracker = tracker; this.spyIntermediary = spyIntermediary; this.updateChecker = updateChecker; } @Override public Resource resolve(Address target) { return new CiEyeResource(route(target)); } private CiEyeResponder route(Address target) { final String[] path = target.getPath().getSegments(); if (path.length == 0) { return new FileResponder("/resources/welcome.html"); } if (path.length == 1) { if ("mugshotconfig.html".equals(path[0])) { return new FileResponder("/resources/mugshotconfig.html"); } if ("landscapelist.json".equals(path[0])) { return new LandscapeListResponder(landscapeFetcher); } if ("settingslocation.json".equals(path[0])) { return new SettingsLocationResponder(configurationFetcher); } if ("version.json".equals(path[0])) { return new CiEyeVersionResponder(configurationFetcher, updateChecker); } if ("sponsor.json".equals(path[0])) { return new SponsorResponder(tracker); } final String name = "/resources/" + path[0]; if (null != getClass().getResource(name)) { return new FileResponder(name); } } if (path.length == 2) { if ("pictures".equals(path[0])) { return new PictureResponder(pictureFetcher, path[1]); } if ("landscapes".equals(path[0])) { if (!target.getPath().getPath().endsWith("/")) { return new RedirectResponder(target.getPath().getPath() + "/"); } return new FileResponder("/resources/cieye.html"); } } 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); } if ("landscapes".equals(path[0]) && "addNote".equals(path[2])) { return new TargetNotationHandler(landscapeFetcher.landscapeNamed(path[1]), spyIntermediary, tracker); } if ("landscapes".equals(path[0]) && "doh".equals(path[2])) { return new DohHandler(landscapeFetcher.landscapeNamed(path[1]), prison, tracker); } } 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)); } if ("filteredlandscapes".equals(path[0]) && "addNote".equals(path[3])) { return new TargetNotationHandler(landscapeFetcher.landscapeNamed(path[1]), spyIntermediary, tracker); } if ("filteredlandscapes".equals(path[0]) && "doh".equals(path[3])) { return new DohHandler(landscapeFetcher.landscapeNamed(path[1]), prison, tracker); } } return new NotFoundResponder(); } private Function<LandscapeObservation, LandscapeObservation> filteringOnSponsor(final Sponsor sponsor) { return new Function<LandscapeObservation, LandscapeObservation>() { @Override public LandscapeObservation apply(LandscapeObservation input) { return input.forSponsor(sponsor); } }; } }