/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.biohackathon.SPARQLBuilder.www;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.biohackathon.SPARQLBuilder.OWL.*;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
//import javax.json.Json;
/**
*
* @author atsuko
*/
@WebServlet(name = "SPServlet", urlPatterns = {"/sparql"})
public class SPServlet extends HttpServlet {
/**
* Processes requests for both HTTP GET
and POST
* methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
/* TODO output your page here. You may use following sample code. */
out.println("");
out.println("");
out.println("
");
out.println("Servlet SPServlet");
out.println("");
out.println("");
out.println("Servlet SPServlet at " + request.getContextPath() + "
");
out.println("");
out.println("");
}
}
//
/**
* Handles the HTTP GET
method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
/* protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//processRequest(request, response);
response.setContentType("application/json;charset=UTF-8");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET");
response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
response.setHeader("Access-Control-Max-Age", "-1");
PrintWriter out = response.getWriter();
String jpath = request.getParameter("path");
System.out.println("Path");
System.out.println(jpath);
Path path = null;
try {
path = convertJ2Path(jpath);
} catch (JSONException ex) {
Logger.getLogger(SPServlet.class.getName()).log(Level.SEVERE, null, ex);
}
String query = null;
try {
query = convertPath2SPARQL(path);
} catch (Exception ex) {
Logger.getLogger(SPServlet.class.getName()).log(Level.SEVERE, null, ex);
}
out.print(query);
}
/**
* Handles the HTTP POST
method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}//
private Path convertJ2Path(String jpath) throws JSONException{
JSONObject object = new JSONObject(jpath);
// int width = Integer.parseInt(object.getJSONObject("width").toString());
JSONArray classLinks = object.getJSONArray("classLinks");
JSONObject jsonObject;
List list = new ArrayList();
for (int i=0;i classname =new ArrayList() ;
if( path == null ){
throw new Exception("Path is null.");
}
String startClass = path.getStartClass();
List classLinks = path.getClassLinks();
StringBuffer queryStr = new StringBuffer();
StringBuffer selStr = new StringBuffer();
StringBuffer whereStr = new StringBuffer();
// if(num==0){
int num = classLinks.size();
// }
queryStr.append("PREFIX rdfs: \n");
queryStr.append("PREFIX rdf: \n");
selStr.append("SELECT ");
whereStr.append("WHERE { \n");
String properties = null;
String objectClasses = null;
String subjectClasses = null;
Direction direction = null;
int i = 0;
int k = 0;
for (ClassLink link :classLinks )
{
properties = link.getPropertyURI();
objectClasses = link.getLinkedClassURI();
direction = link.getDirection();
if (i==0)
subjectClasses = startClass;
classname.add(subjectClasses);
selStr.append("?c").append(i).append(" ");
selStr.append("?l").append(i).append(" ");
if(i == classLinks.size())
selStr.append("\n");
whereStr.append("?c").append(i).
append(" rdf:type ").
append("<").
append(subjectClasses).
append(">").
append(".\n");
whereStr.append("OPTIONAL{\n?c"+i+" rdfs:label ?l"+i+".}\n");
if(direction == Direction.forward)
{
whereStr.append("?c").append(i).append(" ");
whereStr.append("<").append(properties).append("> ");
whereStr.append("?c").append(i+1).append(".\n");
}
else
{
whereStr.append("?c").append(i+1).append(" ");
whereStr.append("<").append(properties).append("> ");
whereStr.append("?c").append(i).append(".\n");
}
subjectClasses = objectClasses;
i++;
k++;
if(k>=num){
break;
}
}
selStr.append("?c").append(i).append(" \n");
selStr.append("?l").append(i).append(" \n");
whereStr.append("?c").append(i).append(" rdf:type ").
append("<").
append(subjectClasses).
append(">").
append(".\n");
whereStr.append("OPTIONAL{\n?c"+i+" rdfs:label ?l"+i+".}\n");
classname.add(subjectClasses);
queryStr.append(selStr).append(whereStr);
queryStr.append("}");
//OPTIONAL
queryStr.append("LIMIT 100\n");
System.out.println(queryStr);
//rewrite Sparql
ArrayList classname2 = new ArrayList();
for(int index=0;index convertJ2Path2(String jpath) throws JSONException{
List list = null;
String temp =(String) jpath.subSequence(2, jpath.length()-2);
// if (temp.contains(",""))
list =Arrays.asList(temp.split("\",\""));
return list;
/* JSONArray classLinks=new JSONArray(jpath);
String string;
for (int i=0;i path) throws Exception{
if( path == null ){
throw new Exception("Path is null.");
}
//List classLinks = path.getClassLinks();
StringBuffer queryStr = new StringBuffer();
StringBuffer selStr = new StringBuffer();
StringBuffer whereStr = new StringBuffer();
// if(num==0){
// int num = classLinks.size();
// }
queryStr.append("PREFIX rdfs: \n");
queryStr.append("PREFIX rdf: \n");
selStr.append("SELECT ");
whereStr.append("WHERE { \n");
String properties = null;
String objectClasses = null;
String subjectClasses = null;
Direction direction = null;
int i = 0;
int k = 0;
String startClass = path.get(path.size()-1);
List classLinks = null;
// ArrayList array= (String[])path.toArray();
// classLinks.add(path.get(i));
int num =(path.size()-1)/2;
for(int j=path.size()-2;j>0;j=j-2)
{
// properties = link.getPropertyURI();
// objectClasses = link.getLinkedClassURI();
// direction = link.getDirection();
properties = path.get(j);
objectClasses = path.get(j-1);
direction = Direction.forward;
if (i==0)
subjectClasses = startClass;
selStr.append("?c").append(i).append(" ");
selStr.append("?l").append(i).append(" ");
// if(i == path.size())
// selStr.append("\n");
whereStr.append("?c").append(i).
append(" rdf:type ").
append("<").
append(subjectClasses).
append(">").
append(".\n");
whereStr.append("OPTIONAL{\n?c"+i+" rdfs:label ?l"+i+".}\n");
if(direction == Direction.forward)
{
whereStr.append("?c").append(i).append(" ");
whereStr.append("<").append(properties).append("> ");
whereStr.append("?c").append(i+1).append(".\n");
}
else
{
whereStr.append("?c").append(i+1).append(" ");
whereStr.append("<").append(properties).append("> ");
whereStr.append("?c").append(i).append(".\n");
}
subjectClasses = objectClasses;
i++;
k++;
if(k>=num){
break;
}
}
selStr.append("?c").append(i).append(" \n");
selStr.append("?l").append(i).append(" \n");
whereStr.append("?c").append(i).append(" rdf:type ").
append("<").
append(subjectClasses).
append(">").
append(".\n");
whereStr.append("OPTIONAL{\n?c"+i+" rdfs:label ?l"+i+".}\n");
queryStr.append(selStr).append(whereStr);
queryStr.append("}");
//OPTIONAL
queryStr.append("LIMIT 100\n");;
System.out.println(queryStr);
return queryStr.toString();
}
}