package eu.geoknow.generator.rest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.ws.rs.CookieParam;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
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.google.gson.JsonObject;
import com.ontos.ldiw.vocabulary.LDIWO;
import eu.geoknow.generator.common.Queries;
import eu.geoknow.generator.component.beans.Service;
import eu.geoknow.generator.configuration.FrameworkConfiguration;
import eu.geoknow.generator.configuration.FrameworkManager;
import eu.geoknow.generator.configuration.FrameworkSetup;
import eu.geoknow.generator.exceptions.InformationMissingException;
import eu.geoknow.generator.exceptions.ResourceNotFoundException;
import eu.geoknow.generator.users.FrameworkUserManager;
import eu.geoknow.generator.users.UserProfile;
/**
* Retrieves the configuration
*
* @author alejandragarciarojas
*
*/
@Path("/config")
public class Configuration {
private static final Logger log = Logger.getLogger(Configuration.class);
/**
* Get application basic parameters
*
* @return JSON object with the configuration information available in the
* configuration-famework.nt file
*/
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getConfiguration(@Context ServletContext context) {
FrameworkConfiguration frameworkConf;
JsonObject config = null;
try {
frameworkConf = FrameworkConfiguration.getInstance();
} catch (IOException | InformationMissingException e) {
log.error(e);
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
config = new JsonObject();
config.addProperty("frameworkUri", frameworkConf.getFrameworkUri());
config.addProperty("ns", frameworkConf.getResourceNamespace());
config.addProperty("frameworkOntologyNs", LDIWO.NS);
config.addProperty("defaultSettingsGraphUri", frameworkConf.getSettingsGraph());
config.addProperty("groupsGraphUri", frameworkConf.getGroupsGraph());
config.addProperty("accountsGraph", frameworkConf.getAccountsGraph());
config.addProperty("sparqlEndpoint", frameworkConf.getPublicSparqlEndpoint());
config.addProperty("authSparqlEndpoint", frameworkConf.getAuthSparqlEndpoint());
config.addProperty("homepage", frameworkConf.getHomepage());
config.addProperty("flagPath", frameworkConf.getFrameworkDataDir());
return Response.ok(config.toString(), MediaType.APPLICATION_JSON).build();
}
/**
* Get the status of the setup
*
* @return true/false
*/
@GET
@Path("/setup")
@Produces(MediaType.TEXT_PLAIN)
public Response isSetuUp() {
FrameworkConfiguration fc;
try {
fc = FrameworkConfiguration.getInstance();
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
return Response.ok(fc.isSetUp(), MediaType.TEXT_PLAIN).build();
}
/**
* Reset the configuration of the workbench
*
* @param context
* @return 200
*/
@POST
@Produces(MediaType.TEXT_PLAIN)
public Response reset(@Context ServletContext context) {
try {
FrameworkSetup setupManager = new FrameworkSetup();
setupManager.setUp(true);
} catch (Exception e) {
log.error(e);
e.printStackTrace();
if (e.getClass().getName().equals("virtuoso.jdbc4.VirtuosoException"))
return Response.status(Response.Status.SERVICE_UNAVAILABLE).entity(e.getMessage())
.type(MediaType.TEXT_PLAIN).build();
else
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage())
.type(MediaType.TEXT_PLAIN).build();
}
log.info("System was reseted successfully.");
return Response.ok().entity("System reseted successfully").build();
}
/**
* Initializes the workbench
*
* @param context
* @return
*/
@PUT
@Produces(MediaType.TEXT_PLAIN)
public Response initialize(@Context ServletContext context) {
// try to get the framework config, if not existing, create it
// setup the system by pushing the config data also to the triple store
try {
FrameworkSetup setupManager = new FrameworkSetup();
setupManager.setUp(false);
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage())
.type(MediaType.TEXT_PLAIN).build();
}
log.info("System was set up successfully.");
return Response.ok().entity("System initialized successfully").type(MediaType.TEXT_PLAIN)
.build();
}
/**
* Return the description of built-in services
*
* @param context
* @return JSONArray wit the built-in services
*/
@GET
@Path("/services")
@Produces(MediaType.APPLICATION_JSON)
public Response getServices(@CookieParam(value = "user") Cookie userc, @CookieParam(
value = "token") String token) {
UserProfile user;
try {
FrameworkUserManager frameworkUserManager =
FrameworkConfiguration.getInstance().getFrameworkUserManager();
// authenticates the user, throw exception if fail
user = frameworkUserManager.validate(userc, token);
if (user == null) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials").build();
}
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
try {
FrameworkManager manager = new FrameworkManager();
Collection<Service> services = manager.getFrameworkServices();
Gson gson = new Gson();
String json = "{ \"services\" : " + gson.toJson(services) + "}";
return Response.status(Response.Status.OK).entity(json).type(MediaType.APPLICATION_JSON)
.build();
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
/**
* Get a list of integrated components
*
* @param userc
* @param token
* @return
*/
@GET
@Path("/components")
@Produces(MediaType.APPLICATION_JSON)
public Response getIntegratedComponents(@CookieParam(value = "user") Cookie userc, @CookieParam(
value = "token") String token) {
UserProfile user;
FrameworkUserManager frameworkUserManager;
try {
frameworkUserManager = FrameworkConfiguration.getInstance().getFrameworkUserManager();
// authenticates the user, throw exception if fail
user = frameworkUserManager.validate(userc, token);
if (user == null) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials").build();
}
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
try {
FrameworkManager manager = new FrameworkManager();
Collection<Map<String, Object>> integrated = manager.getIntegratedComponents();
List<String> required = manager.getRequiredComponents();
// Now have to filter the results, depending on the user'r role
/*
* if (!frameworkUserManager.isAdmin(user.getAccountURI())) { for (String s :
* user.getRole().getServices()) {
*
* } }
*/
Gson gson = new Gson();
String json =
"{ \"integrated\" : " + gson.toJson(integrated) + ", \"required\" : "
+ gson.toJson(required) + "}";
return Response.status(Response.Status.OK).entity(json).type(MediaType.APPLICATION_JSON)
.build();
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
/**
* Integrate a component to the workbench
*
* @param userc
* @param token
* @param uri
* @return
*/
@POST
@Path("/components/{uri : .+}")
@Produces(MediaType.APPLICATION_JSON)
public Response integrateComponent(@CookieParam(value = "user") Cookie userc, @CookieParam(
value = "token") String token, @PathParam("uri") String uri) {
UserProfile user;
try {
FrameworkUserManager frameworkUserManager =
FrameworkConfiguration.getInstance().getFrameworkUserManager();
// authenticates the user, throw exception if fail
user = frameworkUserManager.validate(userc, token);
if (user == null) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials").build();
}
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
try {
FrameworkManager manager = new FrameworkManager();
manager.setComponentsIntegration(uri);
return Response.status(Response.Status.OK).build();
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
/**
* Remove a component from the workbench
*
* @param userc
* @param token
* @param uri
* @return
*/
@DELETE
@Path("/components/{uri : .+}")
@Produces(MediaType.APPLICATION_JSON)
public Response removeComponent(@CookieParam(value = "user") Cookie userc, @CookieParam(
value = "token") String token, @PathParam("uri") String uri) {
UserProfile user;
try {
FrameworkUserManager frameworkUserManager =
FrameworkConfiguration.getInstance().getFrameworkUserManager();
// authenticates the user, throw exception if fail
user = frameworkUserManager.validate(userc, token);
if (user == null) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials").build();
}
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
try {
FrameworkManager manager = new FrameworkManager();
manager.removeComponentsIntegration(uri);
return Response.status(Response.Status.OK).build();
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
/**
* Retun the data of the given built-in service
*
* @param context
* @return JSON of the Service object
*/
@GET
@Path("/services/{uri : .+}")
@Produces(MediaType.APPLICATION_JSON)
public Response getService(@CookieParam(value = "user") Cookie userc, @CookieParam(
value = "token") String token, @PathParam("uri") String uri) {
UserProfile user;
try {
FrameworkUserManager frameworkUserManager =
FrameworkConfiguration.getInstance().getFrameworkUserManager();
// authenticates the user, throw exception if fail
user = frameworkUserManager.validate(userc, token);
if (user == null) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials").build();
}
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
try {
FrameworkManager manager = new FrameworkManager();
Service service = manager.getFrameworkService(uri);
Gson gson = new Gson();
String json = "{ \"service\" : " + gson.toJson(service) + "}";
return Response.status(Response.Status.OK).entity(json).type(MediaType.APPLICATION_JSON)
.build();
} catch (ResourceNotFoundException e) {
log.error(e);
return Response.status(Response.Status.NO_CONTENT).entity(e.getMessage()).build();
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
/**
* Ask if a resource exists, it is mainly used for creating new resources, we want to ckeck that
* the uri provided by the user is not already existing
*
* @return true/false
*/
@GET
@Path("/exists/{uri : .+}")
@Produces(MediaType.TEXT_PLAIN)
public Response exists(@CookieParam(value = "user") Cookie userc,
@CookieParam(value = "token") String token, @PathParam("uri") String uri) {
UserProfile user;
try {
FrameworkUserManager frameworkUserManager =
FrameworkConfiguration.getInstance().getFrameworkUserManager();
// authenticates the user, throw exception if fail
user = frameworkUserManager.validate(userc, token);
if (user == null) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials").build();
}
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
try {
boolean res =
Queries.resourceExists(uri, FrameworkConfiguration.getInstance()
.getSystemRdfStoreManager());
String json = "{ \"response\" : " + res + "}";
return Response.status(Response.Status.OK).entity(json).type(MediaType.APPLICATION_JSON)
.build();
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
/**
* Get a list of integrated components
*
* @param userc
* @param token
* @return
*/
@GET
@Path("/routes")
@Produces(MediaType.APPLICATION_JSON)
public Response getRouteRestrictions(@CookieParam(value = "user") Cookie userc, @CookieParam(
value = "token") String token) {
UserProfile user;
FrameworkUserManager frameworkUserManager;
try {
frameworkUserManager = FrameworkConfiguration.getInstance().getFrameworkUserManager();
// authenticates the user, throw exception if fail
user = frameworkUserManager.validate(userc, token);
if (user == null) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials").build();
}
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
try {
FrameworkManager manager = new FrameworkManager();
Map<String, ArrayList<String>> routes = manager.getRouteRestrictions();
Gson gson = new Gson();
String json = "{ \"restrictions\" : " + gson.toJson(routes) + "}";
return Response.status(Response.Status.OK).entity(json).type(MediaType.APPLICATION_JSON)
.build();
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
}