@@ -0,0 +1,176 @@ | |||||
package application; | |||||
import java.io.IOException; | |||||
import javax.servlet.ServletException; | |||||
import javax.servlet.http.HttpServletRequest; | |||||
import javax.servlet.http.HttpServletResponse; | |||||
import log.QueryLogger; | |||||
import org.json.*; | |||||
import org.eclipse.jetty.server.Request; | |||||
import org.eclipse.jetty.server.handler.AbstractHandler; | |||||
import rdf.Sparql; | |||||
import qa.GAnswer; | |||||
import qa.Globals; | |||||
import qa.Matches; | |||||
public class GanswerHandler extends AbstractHandler{ | |||||
public static String errorHandle(String status,String message,String question,QueryLogger qlog){ | |||||
JSONObject exobj = new JSONObject(); | |||||
try { | |||||
exobj.put("status", status); | |||||
exobj.put("message", message); | |||||
exobj.put("questions", question); | |||||
if(qlog!=null&&qlog.rankedSparqls!=null&&qlog.rankedSparqls.size()>0){ | |||||
exobj.put("sparql", qlog.rankedSparqls.get(0).toStringForGStore2()); | |||||
} | |||||
} catch (Exception e1) { | |||||
} | |||||
return exobj.toString(); | |||||
} | |||||
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) | |||||
throws IOException, ServletException { | |||||
String question = ""; | |||||
QueryLogger qlog = null; | |||||
try{ | |||||
response.setContentType("text/html;charset=utf-8"); | |||||
response.setStatus(HttpServletResponse.SC_OK); | |||||
//step1: parsing input json | |||||
String data = request.getParameter("data"); | |||||
data = data.replace("%22","\""); | |||||
JSONObject jsonobj = new JSONObject(); | |||||
int needAnswer = 0; | |||||
int needSparql = 1; | |||||
question = "Show me all Czech movies"; | |||||
jsonobj = new JSONObject(data); | |||||
needAnswer = jsonobj.getInt("maxAnswerNum"); | |||||
needSparql = jsonobj.getInt("needSparql"); | |||||
question = jsonobj.getString("questions"); | |||||
Globals.MaxAnswerNum = needAnswer; | |||||
//step2 run GAnswer Logic | |||||
String input = question; | |||||
GAnswer ga = new GAnswer(); | |||||
qlog = ga.getSparqlList(input); | |||||
if(qlog == null || qlog.rankedSparqls == null){ | |||||
try { | |||||
baseRequest.setHandled(true); | |||||
response.getWriter().println(errorHandle("500","UnvalidQuestionException: the question you input is invalid, please check",question,qlog)); | |||||
} catch (Exception e1) { | |||||
} | |||||
return; | |||||
} | |||||
int idx; | |||||
//step2 construct response | |||||
JSONObject resobj = new JSONObject(); | |||||
resobj.put("status", "200"); | |||||
resobj.put("id","test"); | |||||
resobj.put("query",jsonobj.getString("questions")); | |||||
JSONObject tmpobj = new JSONObject(); | |||||
if(needAnswer > 0){ | |||||
if(qlog!=null && qlog.rankedSparqls.size()!=0){ | |||||
Sparql curSpq = null; | |||||
Matches m = null; | |||||
for(idx = 1;idx<=Math.min(qlog.rankedSparqls.size(), 5);idx+=1){ | |||||
curSpq = qlog.rankedSparqls.get(idx-1); | |||||
if(curSpq.tripleList.size()>0&&curSpq.questionFocus!=null){ | |||||
m = ga.getAnswerFromGStore2(curSpq); | |||||
} | |||||
if(m!=null&&m.answers!=null){ | |||||
qlog.sparql = curSpq; | |||||
qlog.match = m; | |||||
break; | |||||
} | |||||
} | |||||
curSpq = ga.getUntypedSparql(curSpq); | |||||
if(curSpq!=null){ | |||||
m = ga.getAnswerFromGStore2(curSpq); | |||||
} | |||||
if(m!=null&&m.answers!=null){ | |||||
qlog.sparql = curSpq; | |||||
qlog.match = m; | |||||
} | |||||
if(qlog.match==null) | |||||
qlog.match=new Matches(); | |||||
if(qlog.sparql==null) | |||||
qlog.sparql = qlog.rankedSparqls.get(0); | |||||
qlog.reviseAnswers(); | |||||
//adding variables to result json | |||||
JSONArray vararr = new JSONArray(); | |||||
for(String var : qlog.sparql.variables){ | |||||
vararr.put(var); | |||||
} | |||||
resobj.put("vars", vararr); | |||||
//adding answers to result json | |||||
JSONArray ansobj = new JSONArray(); | |||||
JSONObject bindingobj; | |||||
System.out.println(qlog.match.answersNum); | |||||
for(int i=0;i<qlog.match.answersNum;i++){ | |||||
int j = 0; | |||||
bindingobj = new JSONObject(); | |||||
for(String var:qlog.sparql.variables){ | |||||
JSONObject bidobj = new JSONObject(); | |||||
if(qlog.match.answers[i][j].startsWith("\"")) | |||||
bidobj.put("type", "literal"); | |||||
else | |||||
bidobj.put("type", "uri"); | |||||
String[] ansRiv = qlog.match.answers[i][j].split(":"); | |||||
bidobj.put("value", ansRiv[ansRiv.length-1]); | |||||
System.out.println(qlog.match.answers[i][j]); | |||||
j += 1; | |||||
bindingobj.put(var, bidobj); | |||||
} | |||||
ansobj.put(bindingobj); | |||||
} | |||||
tmpobj.put("bindings", ansobj); | |||||
} | |||||
resobj.put("results", tmpobj); | |||||
} | |||||
if(needSparql>0){ | |||||
JSONArray spqarr = new JSONArray(); | |||||
for(idx=0;idx<needSparql&&idx<qlog.rankedSparqls.size();idx+=1){ | |||||
spqarr.put(qlog.rankedSparqls.get(idx).toStringForGStore2()); | |||||
} | |||||
resobj.put("sparql", spqarr); | |||||
} | |||||
baseRequest.setHandled(true); | |||||
response.getWriter().println(resobj.toString()); | |||||
} | |||||
catch(Exception e){ | |||||
if(e instanceof IOException){ | |||||
try { | |||||
baseRequest.setHandled(true); | |||||
response.getWriter().println(errorHandle("500","IOException",question,qlog)); | |||||
} catch (Exception e1) { | |||||
} | |||||
} | |||||
else if(e instanceof JSONException){ | |||||
try { | |||||
baseRequest.setHandled(true); | |||||
response.getWriter().println(errorHandle("500","JSONException",question,qlog)); | |||||
} catch (Exception e1) { | |||||
} | |||||
} | |||||
else if(e instanceof ServletException){ | |||||
try { | |||||
baseRequest.setHandled(true); | |||||
response.getWriter().println(errorHandle("500","ServletException",question,qlog)); | |||||
} catch (Exception e1) { | |||||
} | |||||
} | |||||
else { | |||||
try { | |||||
baseRequest.setHandled(true); | |||||
response.getWriter().println(errorHandle("500","Unkown Exception",question,qlog)); | |||||
} catch (Exception e1) { | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,37 @@ | |||||
package application; | |||||
import org.eclipse.jetty.server.Server; | |||||
import org.eclipse.jetty.server.handler.ContextHandler; | |||||
import org.eclipse.jetty.server.handler.ContextHandlerCollection; | |||||
import org.eclipse.jetty.server.handler.ErrorHandler; | |||||
import org.eclipse.jetty.server.Handler; | |||||
import qa.Globals; | |||||
public class GanswerHttp { | |||||
public static void main(String[] args) throws Exception { | |||||
//step 1: initialize the server with a given port | |||||
Server server = new Server(9999); | |||||
//step 2: attach gAnswer function handler to the server | |||||
ContextHandler contextGS = new ContextHandler("/gSolve"); | |||||
contextGS.setHandler(new GanswerHandler()); | |||||
ContextHandler contextGI = new ContextHandler("/gInfo"); | |||||
contextGI.setHandler(new GinfoHandler()); | |||||
ContextHandlerCollection contexts = new ContextHandlerCollection(); | |||||
contexts.setHandlers(new Handler[] {contextGS, contextGI}); | |||||
server.setHandler(contexts); | |||||
//step 3: attach gAnswer error handler to the server | |||||
//TODO: using default error handler currently. Should replace it with a custom one | |||||
ErrorHandler errorHandler = new ErrorHandler(); | |||||
errorHandler.setShowStacks(false); | |||||
server.addBean(errorHandler); | |||||
//step 4: start the server and initialize gAnswer | |||||
server.start(); | |||||
server.dumpStdErr(); | |||||
Globals.init(); | |||||
server.join(); | |||||
System.out.println("Server ready!"); | |||||
} | |||||
} |
@@ -0,0 +1,106 @@ | |||||
package application; | |||||
import java.io.*; | |||||
import java.net.*; | |||||
import java.lang.*; | |||||
import java.net.URL; | |||||
import java.net.URLConnection; | |||||
import java.net.URLEncoder; | |||||
import java.net.URLDecoder; | |||||
import java.io.UnsupportedEncodingException; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
public class GanswerHttpConnector { | |||||
public static final String defaultServerIP = "59.108.48.19"; | |||||
public static final int defaultServerPort = 9999; | |||||
private String serverIP; | |||||
private int serverPort; | |||||
public GanswerHttpConnector() { | |||||
this.serverIP = GanswerHttpConnector.defaultServerIP; | |||||
this.serverPort = GanswerHttpConnector.defaultServerPort; | |||||
} | |||||
public GanswerHttpConnector(int _port) { | |||||
this.serverIP = GanswerHttpConnector.defaultServerIP; | |||||
this.serverPort = _port; | |||||
} | |||||
public GanswerHttpConnector(String _ip, int _port) { | |||||
this.serverIP = _ip; | |||||
this.serverPort = _port; | |||||
} | |||||
public String sendGet(String param,String context) { | |||||
String url = "http://" + this.serverIP + ":" + this.serverPort+context; | |||||
StringBuffer result = new StringBuffer(); | |||||
BufferedReader in = null; | |||||
System.out.println("parameter: "+param); | |||||
try { | |||||
param = URLEncoder.encode(param, "UTF-8"); | |||||
} | |||||
catch (UnsupportedEncodingException ex) { | |||||
throw new RuntimeException("Broken VM does not support UTF-8"); | |||||
} | |||||
try { | |||||
//careful: if you encode the "?data=" part, jetty may not accept such a encoding | |||||
String urlNameString = url + "/?data=" + param; | |||||
System.out.println("request: "+urlNameString); | |||||
URL realUrl = new URL(urlNameString); | |||||
URLConnection connection = realUrl.openConnection(); | |||||
connection.setRequestProperty("accept", "*/*"); | |||||
connection.setRequestProperty("connection", "Keep-Alive"); | |||||
//set agent to avoid: speed limited by server if server think the client not a browser | |||||
connection.setRequestProperty("user-agent", | |||||
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); | |||||
connection.connect(); | |||||
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8")); | |||||
String line; | |||||
while ((line = in.readLine()) != null) { | |||||
result.append(line+"\n"); | |||||
} | |||||
} catch (Exception e) { | |||||
System.out.println("error in get request: " + e); | |||||
e.printStackTrace(); | |||||
} | |||||
finally { | |||||
try { | |||||
if (in != null) { | |||||
in.close(); | |||||
} | |||||
} catch (Exception e2) { | |||||
e2.printStackTrace(); | |||||
} | |||||
} | |||||
return result.toString(); | |||||
} | |||||
public String gSolve(String data){ | |||||
String param = data; | |||||
String rst = sendGet(param,"/gSolve"); | |||||
System.out.println(rst); | |||||
return rst; | |||||
} | |||||
public String gInfo(){ | |||||
String param = ""; | |||||
String rst = sendGet(param,"/gInfo"); | |||||
System.out.println(rst); | |||||
return rst; | |||||
} | |||||
public static void main(String[] args){ | |||||
GanswerHttpConnector ghc = new GanswerHttpConnector(); | |||||
String data = "{\"dictionary\":{\"id\":\"test\"},\"log\":\"1\",\"maxAnswerNum\":\"3\",\"needSparql\":\"2\",\"questions\":\"\"}"; | |||||
ghc.gInfo(); | |||||
ghc.gSolve(data); | |||||
} | |||||
} |
@@ -0,0 +1,80 @@ | |||||
package application; | |||||
import java.io.IOException; | |||||
import javax.servlet.ServletException; | |||||
import javax.servlet.http.HttpServletRequest; | |||||
import javax.servlet.http.HttpServletResponse; | |||||
import log.QueryLogger; | |||||
import org.json.*; | |||||
import org.eclipse.jetty.server.Request; | |||||
import org.eclipse.jetty.server.handler.AbstractHandler; | |||||
import qa.Globals; | |||||
public class GinfoHandler extends AbstractHandler{ | |||||
public static String errorHandle(String status,String message,String question,QueryLogger qlog){ | |||||
JSONObject exobj = new JSONObject(); | |||||
try { | |||||
exobj.put("status", status); | |||||
exobj.put("message", message); | |||||
exobj.put("questions", question); | |||||
if(qlog!=null&&qlog.rankedSparqls!=null&&qlog.rankedSparqls.size()>0){ | |||||
exobj.put("sparql", qlog.rankedSparqls.get(0).toStringForGStore2()); | |||||
} | |||||
} catch (Exception e1) { | |||||
} | |||||
return exobj.toString(); | |||||
} | |||||
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) | |||||
throws IOException, ServletException { | |||||
try{ | |||||
response.setContentType("text/html;charset=utf-8"); | |||||
response.setStatus(HttpServletResponse.SC_OK); | |||||
JSONObject infoobj = new JSONObject(); | |||||
infoobj.put("version", Globals.Version); | |||||
infoobj.put("dictionary", Globals.DictionaryPath); | |||||
infoobj.put("dataset", Globals.Dataset); | |||||
infoobj.put("GDB system", Globals.GDBsystem); | |||||
//TODO add more info | |||||
baseRequest.setHandled(true); | |||||
response.getWriter().println(infoobj.toString()); | |||||
} | |||||
catch(Exception e){ | |||||
if(e instanceof IOException){ | |||||
try { | |||||
baseRequest.setHandled(true); | |||||
response.getWriter().println(errorHandle("500","IOException","",null)); | |||||
} catch (Exception e1) { | |||||
} | |||||
} | |||||
else if(e instanceof JSONException){ | |||||
try { | |||||
baseRequest.setHandled(true); | |||||
response.getWriter().println(errorHandle("500","JSONException","",null)); | |||||
} catch (Exception e1) { | |||||
} | |||||
} | |||||
else if(e instanceof ServletException){ | |||||
try { | |||||
baseRequest.setHandled(true); | |||||
response.getWriter().println(errorHandle("500","ServletException","",null)); | |||||
} catch (Exception e1) { | |||||
} | |||||
} | |||||
else { | |||||
try { | |||||
baseRequest.setHandled(true); | |||||
response.getWriter().println(errorHandle("500","Unkown Exception","",null)); | |||||
} catch (Exception e1) { | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,25 @@ | |||||
package application; | |||||
import java.io.IOException; | |||||
import javax.servlet.ServletException; | |||||
import javax.servlet.http.HttpServletRequest; | |||||
import javax.servlet.http.HttpServletResponse; | |||||
import org.eclipse.jetty.server.Request; | |||||
import org.eclipse.jetty.server.handler.AbstractHandler; | |||||
public class HelloHandler extends AbstractHandler { | |||||
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) | |||||
throws IOException, ServletException { | |||||
response.setContentType("text/html;charset=utf-8"); | |||||
response.setStatus(HttpServletResponse.SC_OK); | |||||
baseRequest.setHandled(true); | |||||
String data = request.getParameter("data"); | |||||
response.getWriter().println("<h1>Hello World</h1>"); | |||||
response.getWriter().println("Request url: " + target); | |||||
response.getWriter().println(data); | |||||
} | |||||
} |
@@ -0,0 +1,16 @@ | |||||
package application; | |||||
import org.eclipse.jetty.server.Server; | |||||
import org.eclipse.jetty.server.handler.ContextHandler; | |||||
public class HelloWorld { | |||||
public static void main(String[] args) throws Exception { | |||||
Server server = new Server(8888); | |||||
ContextHandler context = new ContextHandler(); | |||||
context.setContextPath("/hello"); | |||||
context.setHandler(new HelloHandler()); | |||||
server.setHandler(context); | |||||
server.start(); | |||||
server.join(); | |||||
} | |||||
} |
@@ -261,6 +261,7 @@ public class GAnswer { | |||||
String[] varLineContents = rawLines[0].split("\t"); | String[] varLineContents = rawLines[0].split("\t"); | ||||
int varNum = varLineContents.length; | int varNum = varLineContents.length; | ||||
ret.answers = new String[ansNum][varNum]; | ret.answers = new String[ansNum][varNum]; | ||||
ret.answersNum = ansNum; | |||||
System.out.println("ansNum=" + ansNum); | System.out.println("ansNum=" + ansNum); | ||||
System.out.println("varNum=" + varNum); | System.out.println("varNum=" + varNum); | ||||
@@ -27,6 +27,10 @@ public class Globals { | |||||
// entity linking system | // entity linking system | ||||
public static DBpediaLookup dblk; | public static DBpediaLookup dblk; | ||||
public static int MaxAnswerNum = 100; | public static int MaxAnswerNum = 100; | ||||
public static String Dataset = "dbpedia 2016"; | |||||
public static String DictionaryPath = "default"; | |||||
public static String Version = "0.1.2"; | |||||
public static String GDBsystem = "gStore v0.7.2"; | |||||
/* | /* | ||||
* evaluationMethod: | * evaluationMethod: | ||||