package org.deri.grefine.reconcile.commands;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.deri.grefine.reconcile.GRefineServiceManager;
import org.deri.grefine.reconcile.model.ReconciliationService;
import org.deri.grefine.reconcile.rdf.RdfReconciliationService;
import org.deri.grefine.reconcile.rdf.endpoints.QueryEndpoint;
import org.deri.grefine.reconcile.rdf.endpoints.QueryEndpointImpl;
import org.deri.grefine.reconcile.rdf.executors.DumpQueryExecutor;
import org.deri.grefine.reconcile.rdf.executors.QueryExecutor;
import org.deri.grefine.reconcile.rdf.factories.JenaTextSparqlQueryFactory;
import org.deri.grefine.reconcile.rdf.factories.SparqlQueryFactory;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONWriter;
import com.google.common.collect.ImmutableList;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
public class UploadFileAndAddServiceCommand extends AbstractAddServiceCommand{
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
try{
//write results
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "application/json");
PrintWriter out = response.getWriter();
StringWriter sw = new StringWriter();
JSONWriter w = new JSONWriter(sw);
w.object();
w.key("code"); w.value("ok");
w.key("service");
ReconciliationService service = getReconciliationService(request);
service.writeAsJson(w);
w.endObject();
sw.flush();
//out.print("<html><body><textarea>" + sw.toString() + "</textarea></body></html>");
out.print(sw.toString());
out.flush();
} catch (Exception e) {
respondError(response,e);
}
}
@Override
protected ReconciliationService getReconciliationService(HttpServletRequest request) throws JSONException, IOException {
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
InputStream in = null;
String name=null, id = null, props = null, format=null, filename = null;
Model model = null;
try{
@SuppressWarnings("unchecked")
List<FileItem> items = upload.parseRequest(request);
for(FileItem item:items){
if(item.getFieldName().equals("service_name")){
name = item.getString();
id = getIdForString(name);
}else if(item.getFieldName().equals("properties")){
props = item.getString();
}else if(item.getFieldName().equals("file_format")){
format = item.getString();
}else if(item.getFieldName().equals("file_upload")){
filename = item.getName();
in = item.getInputStream();
}
}
model = ModelFactory.createDefaultModel();
if(format.equals("autodetect")){
format = guessFormat(filename);
}
model.read(in, null, format);
ImmutableList<String> propUris = asImmutableList(props);
if(GRefineServiceManager.singleton.hasService(id)){
//id already exist
throw new RuntimeException("A service with name '" + id + "' already exist!");
}
if(name.isEmpty() || propUris.size()==0){
throw new RuntimeException("name and at least one label property ar needed");
}
SparqlQueryFactory queryFactory = new JenaTextSparqlQueryFactory();
QueryExecutor queryExecutor;
if(propUris.size()==1){
queryExecutor = new DumpQueryExecutor(model,propUris.get(0));
}else{
queryExecutor = new DumpQueryExecutor(model);
}
QueryEndpoint queryEndpoint = new QueryEndpointImpl(queryFactory, queryExecutor);
ReconciliationService service = new RdfReconciliationService(id, name, propUris, queryEndpoint, AddServiceCommand.DEFAULT_MATCH_THRESHOLD);
GRefineServiceManager.singleton.addAndSaveService(service);
return service;
}catch(FileUploadException fe){
throw new IOException(fe);
}
}
private void respondError(HttpServletResponse response, Exception e) throws IOException, ServletException{
try{
JSONObject o = new JSONObject();
o.put("code", "error");
o.put("message", e.getMessage());
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
pw.flush();
sw.flush();
o.put("stack", sw.toString());
response.setCharacterEncoding("UTF-8");
respond(response, "<html><body><textarea>\n" + o.toString() + "\n</textarea></body></html>");
} catch (JSONException e1) {
e1.printStackTrace(response.getWriter());
}
}
private String guessFormat(String filename){
if(filename.lastIndexOf('.')!=-1){
String extension = filename.substring(filename.lastIndexOf('.')).toLowerCase();
if(extension.equals(".ttl")){
return "TTL";
}else if(extension.equals(".rdf")){
return "RDF/XML";
}else if(extension.equals(".owl")){
return "RDF/XML";
}else if(extension.equals(".nt")){
return "N-TRIPLE";
}else if(extension.equals(".n3")){
return "N3";
}
}
return "RDF/XML";
}
}