package controllers; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import controllers.mapping.HeritrixSummaryMapper; import play.libs.Akka; import play.libs.F.Function; import play.libs.F.Promise; import play.libs.Json; import play.mvc.Result; import uk.bl.monitrix.Global; import uk.bl.monitrix.heritrix.api.HeritrixAPI; import uk.bl.monitrix.heritrix.api.HeritrixSummary; public class Heritrix extends AbstractController { private static final String CRAWLER_URL = "heritrix_url"; private static final String HTTP_USER = "heritrix_username"; private static final String HTTP_PASSWORD = "heritrix_password"; private static List<HeritrixAPI> crawlers = Global.getCrawlerAPIs(); public static Result index() { return ok(views.html.heritrix.index.render(crawlers)); } public static Result addCrawler() { String sUrl = getFormParam(CRAWLER_URL); if (sUrl.isEmpty()) { flash("error", "Crawler Endpoint URL may not be empty"); return redirect(routes.Heritrix.index()); } URL url = null; try { url = new URL(sUrl); } catch (MalformedURLException e) { flash("error", "Invalid Endpoint URL: " + sUrl); return redirect(routes.Heritrix.index()); } String authUser = getFormParam(HTTP_USER); String authPassword = getFormParam(HTTP_PASSWORD); crawlers.add(new HeritrixAPI(url, authUser, authPassword)); return redirect(routes.Heritrix.index()); } public static Result getCrawlersJSON() { // Where's my scala .map? ;-) List<String> urls = new ArrayList<String>(); for (HeritrixAPI api : crawlers) urls.add(api.getEndpointURL()); return ok(Json.toJson(urls)); } public static Result getCrawlerSummaryJSON(String url) { final HeritrixAPI api = get(url); if (api == null) return notFound(); Promise<HeritrixSummary> promise = Akka.future(new Callable<HeritrixSummary>() { @Override public HeritrixSummary call() throws Exception { return api.getSummary(); } }); return async(promise.map(new Function<HeritrixSummary, Result>() { @Override public Result apply(HeritrixSummary summary) throws Throwable { return ok(Json.toJson(new HeritrixSummaryMapper(summary))); } })); } private static HeritrixAPI get(String url) { // This is in need of optimization for (HeritrixAPI api : crawlers) if (api.getEndpointURL().equals(url)) return api; return null; } }