Mercurial > hg > NamedIdentityManager
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); + } + } + +}