package eu.geoknow.generator.rest;
import java.io.File;
import javax.servlet.ServletContext;
import javax.ws.rs.CookieParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Cookie;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.log4j.Logger;
import com.google.gson.Gson;
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.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import eu.geoknow.generator.configuration.FrameworkConfiguration;
import eu.geoknow.generator.exceptions.ServiceInternalServerError;
import eu.geoknow.generator.importer.HttpRdfInsert;
import eu.geoknow.generator.importer.RdfImportConfig;
import eu.geoknow.generator.rdf.RdfStoreManager;
import eu.geoknow.generator.users.FrameworkUserManager;
import eu.geoknow.generator.users.UserProfile;
@Path("/import-rdf")
public class ImportRdf {
private static final Logger log = Logger.getLogger(ImportRdf.class);
private static String filePath;
public ImportRdf(@Context ServletContext context) {
filePath =
context.getRealPath(File.separator) + context.getInitParameter("file-upload")
+ File.separator;
filePath = "file:///" + filePath.replace("\\", "/");
filePath = filePath.replace(" ", "%20");
log.info("Uploading directory: " + filePath);
}
@POST
@Path("file")
@Produces(MediaType.APPLICATION_JSON)
public Response fromFile(@CookieParam(value = "user") Cookie userc,
@CookieParam(value = "token") String token, RdfImportConfig importConfig) {
FrameworkConfiguration config;
FrameworkUserManager frameworkUserManager;
RdfStoreManager rdfStoreManager;
try {
config = FrameworkConfiguration.getInstance();
frameworkUserManager = config.getFrameworkUserManager();
// authenticates the user, throw exception if fail
UserProfile user = frameworkUserManager.validate(userc, token);
if (user == null) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials").build();
}
rdfStoreManager = frameworkUserManager.getRdfStoreManager(userc.getName());
} catch (Exception e) {
log.error(e);
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
log.debug(importConfig.getTargetGraph());
// validate required values
if (importConfig.getFiles().isEmpty())
return Response.status(Response.Status.BAD_REQUEST)
.entity("List of files to be imported is required").build();
int triples = 0;
for (String file : importConfig.getFiles()) {
log.info("importing " + filePath + file);
HttpRdfInsert insert = new HttpRdfInsert(rdfStoreManager);
try {
Model model = ModelFactory.createDefaultModel();
model.read(filePath + file);
triples +=
insert.httpInsert(importConfig.getTargetGraph(), model, config.getResourceNamespace());
} catch (Exception e) {
log.error(e);
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage())
.build();
}
}
importConfig.setTriples(triples);
Gson gson = new Gson();
String json = "{ \"import\" : " + gson.toJson(importConfig) + "}";
return Response.status(Response.Status.OK).type(MediaType.APPLICATION_JSON).entity(json)
.build();
}
@POST
@Path("url")
@Produces(MediaType.APPLICATION_JSON)
public Response fromUrl(@CookieParam(value = "user") Cookie userc,
@CookieParam(value = "token") String token, RdfImportConfig importConfig) {
FrameworkConfiguration config;
FrameworkUserManager frameworkUserManager;
RdfStoreManager rdfStoreManager;
try {
config = FrameworkConfiguration.getInstance();
frameworkUserManager = config.getFrameworkUserManager();
// authenticates the user, throw exception if fail
UserProfile user = frameworkUserManager.validate(userc, token);
if (user == null) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials").build();
}
rdfStoreManager = frameworkUserManager.getRdfStoreManager(userc.getName());
} catch (Exception e) {
log.error(e);
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
if (importConfig.getSourceUrl().isEmpty())
return Response.status(Response.Status.BAD_REQUEST).entity("Source URL is not provided")
.build();
int triples = 0;
Model model = ModelFactory.createDefaultModel();
model.read(importConfig.getSourceUrl());
HttpRdfInsert insert = new HttpRdfInsert(rdfStoreManager);
try {
triples +=
insert.httpInsert(importConfig.getTargetGraph(), model, config.getResourceNamespace());
} catch (Exception e) {
log.error(e);
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
importConfig.setTriples(triples);
Gson gson = new Gson();
String json = "{ \"import\" : " + gson.toJson(importConfig) + "}";
return Response.status(Response.Status.OK).type(MediaType.APPLICATION_JSON).entity(json)
.build();
}
@POST
@Path("endpoint-query")
@Produces(MediaType.APPLICATION_JSON)
public Response fromEndpoint(@CookieParam(value = "user") Cookie userc, @CookieParam(
value = "token") String token, RdfImportConfig importConfig) {
FrameworkConfiguration config;
FrameworkUserManager frameworkUserManager;
RdfStoreManager rdfStoreManager;
try {
config = FrameworkConfiguration.getInstance();
frameworkUserManager = config.getFrameworkUserManager();
// authenticates the user, throw exception if fail
UserProfile user = frameworkUserManager.validate(userc, token);
if (user == null) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials").build();
}
rdfStoreManager = frameworkUserManager.getRdfStoreManager(userc.getName());
} catch (Exception e) {
log.error(e);
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
if (importConfig.getSourceEndpoint().isEmpty())
return Response.status(Response.Status.BAD_REQUEST).entity("Source endpoint is not provided")
.build();
if (importConfig.getSparqlQuery().isEmpty())
return Response.status(Response.Status.BAD_REQUEST).entity("Sparql query is not provided")
.build();
int triples = 0;
Query query = QueryFactory.create(importConfig.getSparqlQuery());
QueryExecution qexec =
QueryExecutionFactory.sparqlService(importConfig.getSourceEndpoint(), query);
Model model = qexec.execConstruct();
HttpRdfInsert insert = new HttpRdfInsert(rdfStoreManager);
try {
triples =
insert.httpInsert(importConfig.getTargetGraph(), model, config.getResourceNamespace());
} catch (Exception e) {
log.error(e);
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
qexec.close();
importConfig.setTriples(triples);
Gson gson = new Gson();
String json = "{ \"import\" : " + gson.toJson(importConfig) + "}";
return Response.status(Response.Status.OK).type(MediaType.APPLICATION_JSON).entity(json)
.build();
}
@POST
@Path("local-query")
@Produces(MediaType.APPLICATION_JSON)
public Response fromLocalQuery(@CookieParam(value = "user") Cookie userc, @CookieParam(
value = "token") String token, RdfImportConfig importConfig) {
FrameworkConfiguration config;
FrameworkUserManager frameworkUserManager;
RdfStoreManager rdfStoreManager;
try {
config = FrameworkConfiguration.getInstance();
frameworkUserManager = config.getFrameworkUserManager();
// authenticates the user, throw exception if fail
UserProfile user = frameworkUserManager.validate(userc, token);
if (user == null) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials").build();
}
rdfStoreManager = frameworkUserManager.getRdfStoreManager(userc.getName());
} catch (Exception e) {
log.error(e);
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
if (importConfig.getSourceGraph().isEmpty())
return Response.status(Response.Status.BAD_REQUEST).entity("Source graph is not provided")
.build();
if (importConfig.getSparqlQuery().isEmpty())
return Response.status(Response.Status.BAD_REQUEST).entity("Sparql query is not provided")
.build();
int triples = 0;
HttpRdfInsert insert = new HttpRdfInsert(rdfStoreManager);
try {
log.debug(importConfig.getSparqlQuery());
if (importConfig.getSparqlQuery().equals("ADD"))
triples = insert.localAdd(importConfig.getSourceGraph(), importConfig.getTargetGraph());
else if (importConfig.getSparqlQuery().equals("COPY"))
triples = insert.localCopy(importConfig.getSourceGraph(), importConfig.getTargetGraph());
else {
triples =
insert.localInsertQuery(importConfig.getSparqlQuery(), importConfig.getSourceGraph(),
importConfig.getTargetGraph());
}
} catch (ServiceInternalServerError e) {
return Response.status(Response.Status.EXPECTATION_FAILED).entity(e.getMessage()).build();
} catch (Exception e) {
log.error(e);
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
importConfig.setTriples(triples);
Gson gson = new Gson();
String json = "{ \"import\" : " + gson.toJson(importConfig) + "}";
return Response.status(Response.Status.OK).type(MediaType.APPLICATION_JSON).entity(json)
.build();
}
}