package com.blubi.branchmaster;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.simple.JSONArray;
import org.json.simple.JSONValue;
import external.fi.iki.elonen.NanoHTTPD;
public class CustomHTTPD extends NanoHTTPD {
private static String ASSETS_FOLDER = "/web_assets";
public static int port;
public CustomHTTPD(int port)throws IOException {
super(port);
CustomHTTPD.port=port;
}
public static final String MIME_DEFAULT_BINARY = "application/octet-stream";
private static final Map<String, String> MIME_TYPES = new HashMap<String, String>() {{
put("css", "text/css");
put("htm", "text/html");
put("html", "text/html");
put("xml", "text/xml");
put("txt", "text/plain");
put("gif", "image/gif");
put("jpg", "image/jpeg");
put("jpeg", "image/jpeg");
put("png", "image/png");
put("ico", "image/x-icon");
put("js", "application/javascript");
put("zip", "application/octet-stream");
put("json", "application/json");
}};
// Get MIME type from file name extension, if possible
private String getMimeTypeForFile(String uri) {
int dot = uri.lastIndexOf('.');
String mime = null;
if (dot >= 0) {
mime = MIME_TYPES.get(uri.substring(dot + 1).toLowerCase());
}
return mime == null ? MIME_DEFAULT_BINARY : mime;
}
List<String> staticFiles = Arrays.asList(new String[] { "/d3.min.js",
"/BranchMaster.html",
"/chosen.jquery.min.js",
"/jquery-1.11.1.min.js",
"/branchmaster_server.js",
"/chosen.min.css",
"/chosen-sprite.png",
"/chosen-sprite@2x.png",
"/branchmaster.css",
"/Git-Icon-1788C.png"});
@Override
public Response serve( String uri, Method method,
Map<String, String> header, Map<String, String> parms,
Map<String, String> files ) {
System.out.println("Serving: "+uri);
if(staticFiles.contains(uri)) {
return serveFile(uri);
}
if(uri.equals("/dir")) {
String navigate = parms.get("navigate");
String result = new Commands().dir(homedir,navigate);
Response response = new Response(Response.Status.OK, getMimeTypeForFile(".json"), result);
response.addHeader("Access-Control-Allow-Origin", "*");
return response;
}
// if(uri.equals("/showbranch")) {
// String showBranchesResult = new Commands().showBranches(homedir);
// Response response = new Response(Response.Status.OK, getMimeTypeForFile(".json"), showBranchesResult);
// response.addHeader("Access-Control-Allow-Origin", "*");
// return response;
// }
if(uri.equals("/gittree")) {
String branches_parm = parms.get("branches");
if ( branches_parm == null )
return new Response(Response.Status.OK, getMimeTypeForFile(".json"), "{ \"error\": \"Wrong input\"}");
// For Json see: https://code.google.com/p/json-simple/
JSONArray brancharray=(JSONArray) JSONValue.parse(branches_parm);
String[] branches = (String[]) brancharray.toArray(new String[brancharray.size()]);
// DEBUG: String[] branches = {"origin/NlpPayables_2.7.1","origin/v.2.8.galop","origin/master", "origin/fr_master", "origin/fr_release_1.5.2"};
String gitTreeResult = new Commands().gitTree(homedir, branches);
Response response = new Response(Response.Status.OK, getMimeTypeForFile(".json"), gitTreeResult);
response.addHeader("Access-Control-Allow-Origin", "*");
return response;
}
System.out.println("Not found");
return new Response(Response.Status.NOT_FOUND, MIME_PLAINTEXT, "404 - "+uri);
}
private Response serveFile(String uri) {
InputStream stream = getClass().getResourceAsStream(ASSETS_FOLDER+uri);
if (stream == null) {
return new Response(Response.Status.NOT_FOUND, MIME_PLAINTEXT, "Fatal - Not Found: "+uri);
}
return new Response(Response.Status.OK, getMimeTypeForFile(uri), stream);
}
private static CustomHTTPD server;
public static File homedir;
public static void startUp(int port, File _homedir) {
try {
homedir = _homedir;
server = new CustomHTTPD(port);
server.start();
}
catch( IOException ioe )
{
System.err.println( "Couldn't start server on port "+port+"\n" + ioe );
System.exit( -1 );
}
System.out.println( "Listening on port "+port+".\n" );
}
public static void stopNow() {
server.stop();
}
public static void waitForStop() {
System.out.println( "Hit Enter to stop.\n" );
try { System.in.read(); } catch( Throwable t ) {
System.out.println("read error");
server.stop();
}
}
}