blob: 8a86ead0650d8956441cd3d54f3442549d9e388c [file] [log] [blame]
/*
* Copyright 2015 Webindex authors (see AUTHORS)
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package webindex.ui;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.Optional;
import com.google.gson.Gson;
import freemarker.template.Configuration;
import org.apache.accumulo.core.client.Connector;
import org.apache.fluo.api.config.FluoConfiguration;
import org.apache.fluo.core.util.AccumuloUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import spark.ModelAndView;
import spark.Request;
import spark.Spark;
import spark.template.freemarker.FreeMarkerEngine;
import webindex.core.IndexClient;
import webindex.core.WebIndexConfig;
import webindex.core.models.Links;
import webindex.core.models.Page;
import webindex.core.models.Pages;
import webindex.core.models.TopResults;
import static spark.Spark.get;
import static spark.Spark.halt;
import static spark.Spark.staticFiles;
public class WebServer {
private static final Logger log = LoggerFactory.getLogger(WebServer.class);
private IndexClient client;
public WebServer() {}
private TopResults getTop(Request req) {
String next = Optional.ofNullable(req.queryParams("next")).orElse("");
Integer pageNum = Integer.parseInt(Optional.ofNullable(req.queryParams("pageNum")).orElse("0"));
return client.getTopResults(next, pageNum);
}
private Page getPage(Request req) {
String url = req.queryParams("url");
if (url == null) {
halt(400, "Bad request: url parameter was not set");
}
return client.getPage(url);
}
private Pages getPages(Request req) {
String domain = req.queryParams("domain");
if (domain == null) {
halt(400, "Bad request: domain parameter was not set");
}
String next = Optional.ofNullable(req.queryParams("next")).orElse("");
Integer pageNum = Integer.parseInt(Optional.ofNullable(req.queryParams("pageNum")).orElse("0"));
return client.getPages(domain, next, pageNum);
}
private Links getLinks(Request req) {
String rawUrl = req.queryParams("url");
if (rawUrl == null) {
halt(400, "Bad request: url parameter was not set");
}
String linkType = req.queryParams("linkType");
if (linkType == null) {
halt(400, "Bad request: linkType parameter was not set");
}
String next = Optional.ofNullable(req.queryParams("next")).orElse("");
Integer pageNum = Integer.parseInt(Optional.ofNullable(req.queryParams("pageNum")).orElse("0"));
return client.getLinks(rawUrl, linkType, next, pageNum);
}
public void start(IndexClient client, int port, Path templatePath) {
this.client = client;
Spark.port(port);
staticFiles.location("/assets");
FreeMarkerEngine freeMarkerEngine = new FreeMarkerEngine();
if (templatePath != null && Files.exists(templatePath)) {
log.info("Serving freemarker templates from {}", templatePath.toAbsolutePath());
Configuration freeMarkerConfig = new Configuration();
try {
freeMarkerConfig.setDirectoryForTemplateLoading(templatePath.toFile());
} catch (IOException e) {
throw new IllegalStateException(e);
}
freeMarkerEngine.setConfiguration(freeMarkerConfig);
}
get("/", (req, res) -> new ModelAndView(null, "home.ftl"), freeMarkerEngine);
get("/top", (req, res) -> new ModelAndView(Collections.singletonMap("top", getTop(req)),
"top.ftl"), freeMarkerEngine);
Gson gson = new Gson();
get("/api/top", (req, res) -> getTop(req), gson::toJson);
get("/page", (req, res) -> new ModelAndView(Collections.singletonMap("page", getPage(req)),
"page.ftl"), freeMarkerEngine);
get("/api/page", (req, res) -> getPage(req), gson::toJson);
get("/pages", (req, res) -> new ModelAndView(Collections.singletonMap("pages", getPages(req)),
"pages.ftl"), freeMarkerEngine);
get("/api/pages", (req, res) -> getPages(req), gson::toJson);
get("/links", (req, res) -> new ModelAndView(Collections.singletonMap("links", getLinks(req)),
"links.ftl"), freeMarkerEngine);
get("/api/links", (req, res) -> getLinks(req), gson::toJson);
}
public void stop() {
Spark.stop();
}
public static void main(String[] args) throws Exception {
WebIndexConfig webIndexConfig = WebIndexConfig.load();
File fluoConfigFile = new File(webIndexConfig.getFluoPropsPath());
FluoConfiguration fluoConfig = new FluoConfiguration(fluoConfigFile);
Connector conn = AccumuloUtil.getConnector(fluoConfig);
IndexClient client = new IndexClient(webIndexConfig.accumuloIndexTable, conn);
WebServer webServer = new WebServer();
webServer.start(client, 4567, null);
}
}