package tr.com.srdc.mdr.web.rest.api.serialize;
import java.io.File;
import java.io.IOException;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Variant;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tr.com.srdc.mdr.core.impl.Repository;
import tr.com.srdc.mdr.core.impl.RepositoryManager;
import tr.com.srdc.mdr.web.html.util.WebUtil;
import tr.com.srdc.mdr.web.rest.api.util.GraphStream;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.query.ParameterizedSparqlString;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ResourceFactory;
@Path("/serialize")
public class SerializationService {
private static final Logger logger = LoggerFactory
.getLogger(SerializationService.class);
private GraphStream graphStream = new GraphStream();
@GET
@Path("/dex")
@Produces({ WebUtil.MEDIA_TYPE_APPLICATION_NTRIPLE,
WebUtil.MEDIA_TYPE_APPLICATION_RDFJSON,
WebUtil.MEDIA_TYPE_APPLICATION_RDFXML, MediaType.TEXT_PLAIN,
WebUtil.MEDIA_TYPE_TEXT_N3, WebUtil.MEDIA_TYPE_TEXT_TURTLE })
public Response dexSerialization(@QueryParam("id") String uuid,
@Context Request request) {
Variant variant = request.selectVariant(WebUtil.VARIANTS);
MediaType mediaType = variant.getMediaType();
Repository repository = RepositoryManager.getInstance().getRepository();
OntModel ontModel = repository.getMDRDatabase().getOntModel();
String queryString;
File file = new File(
"../web/src/main/resources/rest/dex-serialization-query.rq");
try {
queryString = FileUtils.readFileToString(file);
} catch (IOException e) {
logger.error("File with dex serialization query could not be found ");
return Response.serverError().build();
}
ParameterizedSparqlString query = new ParameterizedSparqlString(
queryString);
query.setLiteral("uuid", ResourceFactory.createTypedLiteral(uuid));
QueryExecution qe = QueryExecutionFactory.create(query.asQuery(),
ontModel);
Model resultModel = qe.execConstruct();
graphStream.setModel(resultModel);
graphStream.setLanguage(WebUtil.getSerializationLanguage(mediaType
.toString()));
return Response.ok(graphStream).build();
}
/**
*
* @param type
* outputFormat "N3", "N-TRIPLE", "RDF/XML-ABBREV" or
* "TURTLE"default: "RDF/XML".
* @param uuid
* @return
*/
@GET
@Path("/graph")
@Produces({ WebUtil.MEDIA_TYPE_APPLICATION_NTRIPLE,
WebUtil.MEDIA_TYPE_APPLICATION_RDFJSON,
WebUtil.MEDIA_TYPE_APPLICATION_RDFXML, MediaType.TEXT_PLAIN,
WebUtil.MEDIA_TYPE_TEXT_N3, WebUtil.MEDIA_TYPE_TEXT_TURTLE })
public Response serialize(@QueryParam("id") String uuid, @QueryParam("uri") String uri,
@Context Request request) {
Variant variant = request.selectVariant(WebUtil.VARIANTS);
MediaType mediaType = variant.getMediaType();
Repository repository = RepositoryManager.getInstance().getRepository();
OntModel ontModel = repository.getMDRDatabase().getOntModel();
String query = "";
if(uuid != null) {
// get the uri of the resource
query = "prefix mdr: <http://www.salusproject.eu/iso11179-3/mdr#> "
+ "prefix xsd: <http://www.w3.org/2001/XMLSchema#> "
+ "SELECT ?resource WHERE { " + "?resource ?op ?ar . "
+ "?ar mdr:administeredItemIdentifier ?ii . "
+ "?ii mdr:dataIdentifier \"" + uuid + "\"^^xsd:string. " + "}";
logger.debug("Query execution: {}", query);
Query q = QueryFactory.create(query);
QueryExecution qe = QueryExecutionFactory.create(q, ontModel);
ResultSet rs = qe.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
uri = qs.getResource("resource").getURI();
}
}
if(uri == null) {
throw new WebApplicationException(Response.Status.BAD_REQUEST);
}
// use the uri to construct the model and return its serialization.
query = "CONSTRUCT WHERE { <" + uri + "> ?p ?o .}";
Query q2 = QueryFactory.create(query);
QueryExecution qe2 = QueryExecutionFactory.create(q2, ontModel);
Model outModel = qe2.execConstruct();
graphStream.setModel(outModel);
graphStream.setLanguage(WebUtil.getSerializationLanguage(mediaType
.toString()));
return Response.ok(graphStream).build();
}
}