view 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 source

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);
		}
	}

}