diff src/de/mpiwg/itgroup/nimanager/persons/PersonByNameService.java @ 0:1384a0d382fa

first input
author dwinter
date Thu, 30 Jun 2011 11:44:24 +0200
parents
children e3ecb88314a5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/de/mpiwg/itgroup/nimanager/persons/PersonByNameService.java	Thu Jun 30 11:44:24 2011 +0200
@@ -0,0 +1,292 @@
+package de.mpiwg.itgroup.nimanager.persons;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.json.JSONArray;
+import org.openrdf.model.Statement;
+import org.openrdf.repository.RepositoryException;
+import org.openrdf.repository.RepositoryResult;
+import org.restlet.Context;
+import org.restlet.data.Form;
+import org.restlet.data.MediaType;
+import org.restlet.data.Status;
+import org.restlet.engine.component.ChildContext;
+import org.restlet.ext.json.JsonRepresentation;
+import org.restlet.representation.Representation;
+import org.restlet.representation.StringRepresentation;
+import org.restlet.resource.Get;
+import org.restlet.resource.Options;
+import org.restlet.resource.ServerResource;
+
+import virtuoso.jdbc4.VirtuosoResultSet;
+
+import de.mpiwg.itgroup.nimanager.exceptions.TripleStoreHandlerException;
+import de.mpiwg.itgroup.nimanager.owl.TripleStoreHandler;
+
+public class PersonByNameService extends ServerResource {
+
+	private String VIRTUOSO_PW;
+	private String VIRTUOSO_USER;
+	private String virtuoso_server_url;
+	private String RELATION_FOR_NAME_SEARCH = "http://xmlns.com/foaf/0.1/name";
+	private String PERSONS_CONTEXT;
+	private TripleStoreHandler th;
+
+	public PersonByNameService() {
+		ChildContext context = (ChildContext)Context.getCurrent();
+		virtuoso_server_url = context.getParameters().getFirstValue("de.mpwig.itgroup.personSearch.virtuoso.url");
+		VIRTUOSO_PW = context.getParameters().getFirstValue("de.mpwig.itgroup.personSearch.virtuoso.pw");
+		VIRTUOSO_USER = context.getParameters().getFirstValue("de.mpwig.itgroup.personSearch.virtuoso.user");
+		PERSONS_CONTEXT = context.getParameters().getFirstValue("de.mpwig.itgroup.personSearch.virtuoso.personsGraphURI");
+		//th = TripleStoreHandler.getInstance("jdbc:virtuoso://virtuoso.mpiwg-berlin.mpg.de:1111", "dba", "dba");
+		try {
+			th = new TripleStoreHandler(virtuoso_server_url, VIRTUOSO_USER, VIRTUOSO_PW);
+		} catch (TripleStoreHandlerException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	@Options
+	public void doOptions(Representation entity) {
+		Form responseHeaders = (Form) getResponse().getAttributes().get(
+				"org.restlet.http.headers");
+		if (responseHeaders == null) {
+			responseHeaders = new Form();
+			getResponse().getAttributes().put("org.restlet.http.headers",
+					responseHeaders);
+		}
+		responseHeaders.add("Access-Control-Allow-Origin", "*");
+		responseHeaders.add("Access-Control-Allow-Methods", "POST,OPTIONS,GET");
+		responseHeaders.add("Access-Control-Allow-Headers", "Content-Type");
+		responseHeaders.add("Access-Control-Allow-Credentials", "false");
+		responseHeaders.add("Access-Control-Max-Age", "60");
+	}
+
+	public Representation getTest() {
+		return new StringRepresentation("TEST");
+	}
+
+	@Get("json")
+	public Representation getJson() {
+		Form responseHeaders = (Form) getResponse().getAttributes().get(
+		"org.restlet.http.headers");
+		if (responseHeaders == null) {
+			responseHeaders = new Form();
+			getResponse().getAttributes().put("org.restlet.http.headers",
+					responseHeaders);
+		}
+		responseHeaders.add("Access-Control-Allow-Origin", "*");
+		
+		JSONArray resultsJsonArray = new JSONArray();
+		try {
+			String id = (String) getRequest().getAttributes().get("name");
+			id = URLDecoder.decode(id, "utf-8");
+			String queryPersonWPMD="sparql select DISTINCT * "+
+			"FROM <file://mpiwg_persons.rdf>"+
+			"FROM <file://newpersonsFromProjects>"+
+			" FROM <file://personendataWikipedia>"+
+			" where { " +
+			"{GRAPH <file://mpiwg_persons.rdf>" +
+			"{"+
+			"?person <"+RELATION_FOR_NAME_SEARCH+"> \""+id+"\"@en."+
+			" ?ident <http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/identifies_NamedEntity> ?person."+
+			" OPTIONAL {?wikipedia crm:P1_is_identified_by ?ident.}"+
+			" OPTIONAL {?wikipedia <http://dbpedia.org/ontology/birthDate> ?birthDate.}"+
+			" OPTIONAL {?wikipedia <http://dbpedia.org/ontology/deathDate> ?deathDate.}"
+			+"}" +
+			"} UNION {" +
+			"GRAPH <file://newpersonsFromProjects> {" +
+			"?person <"+RELATION_FOR_NAME_SEARCH+"> \""+id+"\""+
+			"}" +
+			"}" +
+			"}";
+			java.sql.Statement smt = th.sqlCon.createStatement();
+		
+			
+			smt.execute(queryPersonWPMD);
+			VirtuosoResultSet rs = (VirtuosoResultSet) smt.getResultSet();
+			Map<String,String> resultMap = new HashMap<String, String>();
+			while(rs.next()){
+				if (rs.getString("person")!=null){
+				resultMap.put("person",rs.getString("person"));
+				}else  {
+					resultMap.put("person","");
+				}
+				if (rs.getString("wikipedia")!=null){
+				resultMap.put("wikipedia",rs.getString("wikipedia"));
+				} else  {
+					resultMap.put("wikipedia","");
+				}
+				if (rs.getString("birthDate")!=null){
+				resultMap.put("birthDate",rs.getString("birthDate"));
+				} else {
+					resultMap.put("birthDate","");
+				}
+				if (rs.getString("deathDate")!=null){
+				resultMap.put("deathDate",rs.getString("deathDate"));
+				} else {
+					resultMap.put("deathDate","");
+				}
+				resultMap.put("name",id);
+				resultsJsonArray.put(resultMap);
+			}
+			
+			return new JsonRepresentation(resultsJsonArray);
+
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+			setStatus(Status.SERVER_ERROR_INTERNAL, "REPOSITORY ERROR");
+			return new JsonRepresentation(new JSONArray());
+					
+		} catch (SQLException e) {
+			
+			e.printStackTrace();
+			setStatus(Status.SERVER_ERROR_INTERNAL, "REPOSITORY SQL ERROR");
+			return new JsonRepresentation(new JSONArray());
+			
+		}
+	
+	
+	}
+	
+	@Get("xml")
+	public Representation getXML() {
+		List<MediaType> supported=new ArrayList<MediaType>();
+		supported.add(MediaType.APPLICATION_JSON);
+		
+		MediaType types = getRequest().getClientInfo().getPreferredMediaType(supported);
+		if (types.equals(MediaType.APPLICATION_JSON))
+			return getJson();
+			
+		try {
+			String id = (String) getRequest().getAttributes().get("name");
+			id = URLDecoder.decode(id, "utf-8");
+			RepositoryResult<Statement> statements = th.getStatements(null,
+					th.createUri(RELATION_FOR_NAME_SEARCH),
+					th.createLiteral(id, "en"), PERSONS_CONTEXT);
+			String ret = "<results>";
+			while (statements.hasNext()) {
+				Statement statement = statements.next();
+				ret += "<result subj=\"" + statement.getSubject().stringValue()
+						+ "\"/>";
+			}
+			ret += "</results>";
+
+			return new StringRepresentation(ret, MediaType.TEXT_XML);
+
+		} catch (RepositoryException e) {
+
+			e.printStackTrace();
+			setStatus(Status.SERVER_ERROR_INTERNAL, "REPOSITORY ERROR");
+			return new StringRepresentation(
+					"<xml><error>Repository Error</error></xml>",
+					MediaType.TEXT_XML);
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+			setStatus(Status.SERVER_ERROR_INTERNAL, "REPOSITORY ERROR");
+			return new StringRepresentation(
+					"<xml><error>Unsupported encoding</error></xml>",
+					MediaType.TEXT_XML);
+		}
+	}
+	
+	@Get("html")
+	public Representation getHTML() {
+
+		List<MediaType> supported=new ArrayList<MediaType>();
+		supported.add(MediaType.APPLICATION_JSON);
+		
+		MediaType types = getRequest().getClientInfo().getPreferredMediaType(supported);
+		if (types.equals(MediaType.APPLICATION_JSON))
+			return getJson();
+		
+		Form responseHeaders = (Form) getResponse().getAttributes().get(
+		"org.restlet.http.headers");
+		if (responseHeaders == null) {
+			responseHeaders = new Form();
+			getResponse().getAttributes().put("org.restlet.http.headers",
+					responseHeaders);
+		}
+		responseHeaders.add("Access-Control-Allow-Origin", "*");
+		try {
+			String id = (String) getRequest().getAttributes().get("name");
+			id = URLDecoder.decode(id, "utf-8");
+//			RepositoryResult<Statement> statements = th.getStatements(null,
+//					th.createUri(RELATION_FOR_NAME_SEARCH),
+//					th.createLiteral(id, "en"), PERSONS_CONTEXT);
+			String ret = "<html><body><div id=\"resultNames\">";
+			String queryPersonWPMD="sparql select * "+
+"FROM <file://mpiwg_persons.rdf>"+
+" FROM <file://personendataWikipedia>"+
+" where { "+
+" ?person <"+RELATION_FOR_NAME_SEARCH+"> \""+id+"\"@en."+
+" ?ident <http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/identifies_NamedEntity> ?person."+
+" ?wikipedia crm:P1_is_identified_by ?ident."+
+" ?wikipedia <http://dbpedia.org/ontology/birthDate> ?birthDate."+
+" ?wikipedia <http://dbpedia.org/ontology/deathDate> ?deathDate."
++"}";
+			java.sql.Statement smt = th.sqlCon.createStatement();
+		
+			
+			smt.execute(queryPersonWPMD);
+			VirtuosoResultSet rs = (VirtuosoResultSet) smt.getResultSet();
+			
+			while(rs.next()){
+				String person= rs.getString("person");
+				String wikipedia= rs.getString("wikipedia");
+				String bd= rs.getString("birthDate");
+				String dd= rs.getString("deathDate");
+				
+				ret+=String.format("<div><a href=\"%s\">%s (%s-%s)</a></div>",wikipedia,id,bd,dd);
+			}
+				
+			
+//			while (statements.hasNext()) {
+//				Statement statement = statements.next();
+//				
+//				
+//				
+//				
+//				
+//				//ret +=String.format("<div><a href=\"../id/%s\">%s</a></div>",URLEncoder.encode(statement.getSubject().stringValue()),statement.getSubject().stringValue() );
+//				ret +=String.format("<div><a href=\"%s\">%s</a></div>",statement.getSubject().stringValue(),statement.getSubject().stringValue() );
+//			
+//			}
+			
+			ret += "</div></body></html>";
+
+			return new StringRepresentation(ret, MediaType.TEXT_HTML);
+
+//		} catch (RepositoryException e) {
+//
+//			e.printStackTrace();
+//			setStatus(Status.SERVER_ERROR_INTERNAL, "REPOSITORY ERROR");
+//			return new StringRepresentation(
+//					"<xml><error>Repository Error</error></xml>",
+//					MediaType.TEXT_HTML);
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+			setStatus(Status.SERVER_ERROR_INTERNAL, "REPOSITORY ERROR");
+			return new StringRepresentation(
+					"<xml><error>Unsupported encoding</error></xml>",
+					MediaType.TEXT_HTML);
+		} catch (SQLException e) {
+			
+			e.printStackTrace();
+			setStatus(Status.SERVER_ERROR_INTERNAL, "REPOSITORY SQL ERROR");
+			return new StringRepresentation(
+					"<xml><error>Unsupported encoding</error></xml>",
+					MediaType.TEXT_HTML);
+		}
+	}
+
+}