package org.deri.grefine.rdf.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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.deri.grefine.rdf.app.ApplicationContext;
import org.deri.grefine.rdf.vocab.VocabularyImporter;
import org.json.JSONException;
import org.json.JSONObject;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.inferencer.fc.ForwardChainingRDFSInferencer;
import org.openrdf.sail.memory.MemoryStore;
public class AddPrefixFromFileCommand extends RdfCommand{
public AddPrefixFromFileCommand(ApplicationContext ctxt) {
super(ctxt);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
try {
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
String uri = null, prefix = null, format = null, projectId = null, filename="";
InputStream in = null;
@SuppressWarnings("unchecked")
List<FileItem> items = upload.parseRequest(request);
for(FileItem item:items){
if(item.getFieldName().equals("vocab-prefix")){
prefix = item.getString();
}else if(item.getFieldName().equals("vocab-uri")){
uri = item.getString();
}else if(item.getFieldName().equals("file_format")){
format = item.getString();
}else if(item.getFieldName().equals("project")){
projectId = item.getString();
}else{
filename = item.getName();
in = item.getInputStream();
}
}
Repository repository = new SailRepository(
new ForwardChainingRDFSInferencer(new MemoryStore()));
repository.initialize();
RepositoryConnection con = repository.getConnection();
RDFFormat rdfFromat;
if(format.equals("auto-detect")){
rdfFromat = guessFormat(filename);
}else if(format.equals("TTL")){
rdfFromat = RDFFormat.TURTLE;
}else if(format.equals("N3")){
rdfFromat = RDFFormat.N3;
}else if(format.equals("NTRIPLE")) {
rdfFromat = RDFFormat.NTRIPLES;
}else{
rdfFromat = RDFFormat.RDFXML;
}
con.add(in, "", rdfFromat);
con.close();
getRdfSchema(request).addPrefix(prefix, uri);
getRdfContext().getVocabularySearcher().importAndIndexVocabulary(prefix, uri, repository, projectId, new VocabularyImporter());
//success
PrintWriter out = response.getWriter();
out.print("<html><body><textarea>\n{\"code\":\"ok\"}\n</textarea></body></html>");
out.flush();
} catch (Exception e) {
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) {
e.printStackTrace(response.getWriter());
}
}
}
private RDFFormat guessFormat(String filename){
if(filename.lastIndexOf('.')!=-1){
String extension = filename.substring(filename.lastIndexOf('.')).toLowerCase();
if(extension.equals(".ttl")){
return RDFFormat.TURTLE;
}else if(extension.equals(".rdf")){
return RDFFormat.RDFXML;
}else if(extension.equals(".owl")){
return RDFFormat.RDFXML;
}else if(extension.equals(".nt")){
return RDFFormat.NTRIPLES;
}else if(extension.equals(".n3")){
return RDFFormat.N3;
}
}
return RDFFormat.RDFXML;
}
}