org.refactoringminer.RefactoringMinerHttpsServer Maven / Gradle / Ivy
package org.refactoringminer;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.URI;
import java.security.KeyStore;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.TrustManagerFactory;
import org.refactoringminer.api.GitHistoryRefactoringMiner;
import org.refactoringminer.api.Refactoring;
import org.refactoringminer.api.RefactoringHandler;
import org.refactoringminer.rm1.GitHistoryRefactoringMinerImpl;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpsConfigurator;
import com.sun.net.httpserver.HttpsParameters;
import com.sun.net.httpserver.HttpsServer;
public class RefactoringMinerHttpsServer {
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
InputStream input = new FileInputStream("server.properties");
prop.load(input);
String hostName = prop.getProperty("hostname");
int port = Integer.parseInt(prop.getProperty("port"));
String keystore = prop.getProperty("keystore");
String keyStorePass = prop.getProperty("keystore-password");
InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress.getByName(hostName), port);
HttpsServer server = HttpsServer.create(inetSocketAddress, 0);
SSLContext sslContext = SSLContext.getInstance("TLS");
// initialize the keystore
char[] password = keyStorePass.toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream(keystore);
ks.load(fis, password);
// setup the key manager factory
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);
// setup the trust manager factory
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
// setup the HTTPS context and parameters
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
server.setHttpsConfigurator(new HttpsConfigurator(sslContext) {
public void configure(HttpsParameters params) {
try {
// initialize the SSL context
SSLContext context = getSSLContext();
SSLEngine engine = context.createSSLEngine();
params.setNeedClientAuth(false);
params.setCipherSuites(engine.getEnabledCipherSuites());
params.setProtocols(engine.getEnabledProtocols());
// Set the SSL parameters
SSLParameters sslParameters = context.getSupportedSSLParameters();
params.setSSLParameters(sslParameters);
} catch (Exception ex) {
System.out.println("Failed to create HTTPS port");
}
}
});
server.createContext("/RefactoringMiner", new MyHandler());
server.setExecutor(new ThreadPoolExecutor(4, 8, 60, TimeUnit.SECONDS, new ArrayBlockingQueue(100)));
server.start();
System.out.println(InetAddress.getLocalHost());
}
static class MyHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
printRequestInfo(exchange);
URI requestURI = exchange.getRequestURI();
String query = requestURI.getQuery();
Map queryToMap = queryToMap(query);
String gitURL = queryToMap.get("gitURL");
String commitId = queryToMap.get("commitId");
int timeout = Integer.parseInt(queryToMap.get("timeout"));
List detectedRefactorings = new ArrayList();
GitHistoryRefactoringMiner miner = new GitHistoryRefactoringMinerImpl();
miner.detectAtCommit(gitURL, commitId, new RefactoringHandler() {
@Override
public void handle(String commitId, List refactorings) {
detectedRefactorings.addAll(refactorings);
}
}, timeout);
String response = JSON(gitURL, commitId, detectedRefactorings);
System.out.println(response);
exchange.getResponseHeaders().add("Access-Control-Allow-Origin", "*");
exchange.sendResponseHeaders(200, response.length());
OutputStream os = exchange.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
private static Map queryToMap(String query) {
Map result = new HashMap<>();
for (String param : query.split("&")) {
String[] entry = param.split("=");
if (entry.length > 1) {
result.put(entry[0], entry[1]);
}
else {
result.put(entry[0], "");
}
}
return result;
}
private static String JSON(String gitURL, String currentCommitId, List refactoringsAtRevision) {
StringBuilder sb = new StringBuilder();
sb.append("{").append("\n");
sb.append("\"").append("commits").append("\"").append(": ");
sb.append("[");
sb.append("{");
sb.append("\t").append("\"").append("repository").append("\"").append(": ").append("\"").append(gitURL).append("\"").append(",").append("\n");
sb.append("\t").append("\"").append("sha1").append("\"").append(": ").append("\"").append(currentCommitId).append("\"").append(",").append("\n");
String url = GitHistoryRefactoringMinerImpl.extractCommitURL(gitURL, currentCommitId);
sb.append("\t").append("\"").append("url").append("\"").append(": ").append("\"").append(url).append("\"").append(",").append("\n");
sb.append("\t").append("\"").append("refactorings").append("\"").append(": ");
sb.append("[");
int counter = 0;
for(Refactoring refactoring : refactoringsAtRevision) {
sb.append(refactoring.toJSON());
if(counter < refactoringsAtRevision.size()-1) {
sb.append(",");
}
sb.append("\n");
counter++;
}
sb.append("]");
sb.append("}");
sb.append("]").append("\n");
sb.append("}");
return sb.toString();
}
private static void printRequestInfo(HttpExchange exchange) {
System.out.println("-- headers --");
Headers requestHeaders = exchange.getRequestHeaders();
requestHeaders.entrySet().forEach(System.out::println);
System.out.println("-- HTTP method --");
String requestMethod = exchange.getRequestMethod();
System.out.println(requestMethod);
System.out.println("-- query --");
URI requestURI = exchange.getRequestURI();
String query = requestURI.getQuery();
System.out.println(query);
}
}