package eu.geoknow.generator.rest; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Collection; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.ServletContext; import javax.ws.rs.CookieParam; import javax.ws.rs.FormParam; 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.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import eu.geoknow.generator.common.Queries; import eu.geoknow.generator.configuration.FrameworkConfiguration; import eu.geoknow.generator.graphs.GraphsManager; import eu.geoknow.generator.graphs.beans.Contribution; import eu.geoknow.generator.graphs.beans.NamedGraph; import eu.geoknow.generator.rdf.GraphGroupManager; import eu.geoknow.generator.rdf.RdfStoreManager; import eu.geoknow.generator.rdf.RdfStoreManagerImpl; import eu.geoknow.generator.rdf.SecureRdfStoreManagerImpl; import eu.geoknow.generator.users.FrameworkUserManager; import eu.geoknow.generator.users.UserManager; import eu.geoknow.generator.users.UserProfile; @Path("/graphs") public class Graphs { private static final Logger log = Logger.getLogger(Graphs.class); @POST @Path("/createGraph") @Produces(MediaType.APPLICATION_JSON) public Response createGraph(@Context ServletContext context, @CookieParam("token") String token, @FormParam("graph") String graph, @FormParam("permissions") String permissions, @FormParam("username") String username, @FormParam("metadata") String metadata) { FrameworkConfiguration frameworkConfiguration; try { frameworkConfiguration = FrameworkConfiguration.getInstance(); } catch (Exception e) { log.error("Failed to get framework configuration", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Failed to get framework config").build(); } UserManager rdfStoreUserManager = frameworkConfiguration.getRdfStoreUserManager(); FrameworkUserManager frameworkUserManager = frameworkConfiguration.getFrameworkUserManager(); try { checkToken(username, token, frameworkUserManager); } catch (Exception e) { log.error("Token checking failed: user = " + username + ", token = " + token, e); return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials").build(); } log.info(metadata); log.info(permissions); RdfStoreManager rdfStoreManager; boolean unauthorizedUser = username == null || username.isEmpty(); try { if (unauthorizedUser) { log.info("unauthorised user creates a graph <" + graph + ">"); rdfStoreManager = new RdfStoreManagerImpl(frameworkConfiguration.getPublicSparqlEndpoint()); rdfStoreUserManager.setDefaultGraphPermissions(graph, UserManager.GraphPermissions.WRITE); } else { log.info(username + " user creates a graph <" + graph + ">"); rdfStoreManager = frameworkUserManager.getRdfStoreManager(username); rdfStoreUserManager.setRdfGraphPermissions(username, graph, UserManager.GraphPermissions.WRITE); setGraphPermissions(graph, permissions, rdfStoreUserManager); } // in current version we write graph metadata in fronted (js), so // here we need just to create graph in RDF store // todo maybe later move all metadata operation to backend String result = rdfStoreManager.createGraph(graph); return Response.status(Response.Status.OK).entity(result).build(); } catch (Exception e) { log.error("Failed to create graph " + graph + " for user " + username, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } } @POST @Path("/dropGraph") @Produces(MediaType.APPLICATION_JSON) public Response dropGraph(@Context ServletContext context, @CookieParam(value = "user") Cookie userc, @CookieParam(value = "token") String token, @FormParam("graph") String graph) { FrameworkConfiguration frameworkConfig = null; try { frameworkConfig = FrameworkConfiguration.getInstance(); } catch (Exception e) { log.error("Failed to get framework configuration", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Failed to get framework config").build(); } FrameworkUserManager frameworkUserManager = frameworkConfig.getFrameworkUserManager(); UserProfile user; try { // authenticates the user, throw exception if fail user = frameworkConfig.getFrameworkUserManager().validate(userc, token); if (user == null) { return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials").build(); } } catch (Exception e) { log.error(e); e.printStackTrace(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } String username = user.getUsername(); boolean unauthorizedUser = username == null || username.isEmpty(); try { // get rdf store manager RdfStoreManager rdfStoreManager; if (unauthorizedUser) rdfStoreManager = new RdfStoreManagerImpl(frameworkConfig.getPublicSparqlEndpoint()); else rdfStoreManager = frameworkUserManager.getRdfStoreManager(username); // drop graph String result = rdfStoreManager.dropGraph(graph); // remove graph from graph groups descriptions RdfStoreManager frameworkRdfStoreManager = frameworkConfig.getSystemRdfStoreManager(); String query = "PREFIX sd: <http://www.w3.org/ns/sparql-service-description#> " + " DELETE WHERE {GRAPH <" + frameworkConfig.getGroupsGraph() + "> {?s sd:namedGraph <" + graph + ">}}"; frameworkRdfStoreManager.execute(query, null); return Response.status(Response.Status.OK).entity(result).build(); } catch (Exception e) { log.error("Failed to drop graph " + graph + " for user " + username, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } } /** * This function is for updating metadata after a operation in the graph * * @param userc * @param token * @return */ @PUT @Produces(MediaType.APPLICATION_JSON) public Response addContribution(@CookieParam(value = "user") Cookie userc, @CookieParam( value = "token") String token, Contribution contribution) { FrameworkUserManager frameworkUserManager; UserProfile user; 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); e.printStackTrace(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } try { if (contribution.getDate() == null) { // 2015-06-12T14:35:00 Calendar cal = GregorianCalendar.getInstance(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); format.setCalendar(cal); contribution.setDate(format.format(cal.getTime())); } GraphsManager manager = new GraphsManager(); NamedGraph graph = manager.addContribution(contribution); Gson gson = new Gson(); String json = "{ \"namedgraph\" : " + gson.toJson(graph) + "}"; 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(); } } @POST @Path("/updateGraph") @Produces(MediaType.APPLICATION_JSON) public Response updateGraph(@Context ServletContext context, @CookieParam("token") String token, @FormParam("graph") String graph, @FormParam("permissions") String permissions, @FormParam("username") String username) { FrameworkConfiguration frameworkConfig = null; try { frameworkConfig = FrameworkConfiguration.getInstance(); } catch (Exception e) { log.error("Failed to get framework configuration", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Failed to get framework config").build(); } FrameworkUserManager frameworkUserManager = frameworkConfig.getFrameworkUserManager(); try { checkToken(username, token, frameworkUserManager); } catch (Exception e) { log.error("Token checking failed: user = " + username + ", token = " + token, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } try { UserManager rdfStoreUserManager = frameworkConfig.getRdfStoreUserManager(); // delete old user permissions Collection<String> users = frameworkUserManager.getUsers(graph); for (String u : users) { rdfStoreUserManager.deleteRdfGraphPermissions(u, graph); } // set new user permissions setGraphPermissions(graph, permissions, rdfStoreUserManager); String result = "{\"results\" : \"success\"}"; return Response.status(Response.Status.OK).entity(result).build(); } catch (Exception e) { log.error("Failed to update graph " + graph + " permissions", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } } @GET @Path("/countTriples/{uri : .+}") @Produces(MediaType.APPLICATION_JSON) public Response countTriples(@PathParam("uri") String uri, @CookieParam(value = "user") Cookie userc, @CookieParam(value = "token") String token) { FrameworkUserManager frameworkUserManager; UserProfile user; 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); e.printStackTrace(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } try { SecureRdfStoreManagerImpl rdfStoreManager = FrameworkConfiguration.getInstance().getSystemRdfStoreManager(); // delete old user permissions int triples = Queries.countGraphTriples(uri, rdfStoreManager); String result = "{\"triples\" : " + triples + "}"; return Response.status(Response.Status.OK).entity(result).build(); } catch (Exception e) { log.error("Failed to count triples graph " + uri + " permissions", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } } @POST @Path("/getAllGraphs") @Produces(MediaType.APPLICATION_JSON) public Response getAllGraphs(@Context ServletContext context, @CookieParam("token") String token, @FormParam("username") String username) { FrameworkConfiguration frameworkConfig = null; try { frameworkConfig = FrameworkConfiguration.getInstance(); } catch (Exception e) { log.error("Failed to get framework configuration", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Failed to get framework config").build(); } FrameworkUserManager frameworkUserManager = frameworkConfig.getFrameworkUserManager(); try { checkToken(username, token, frameworkUserManager); } catch (Exception e) { log.error("Token checking failed: user = " + username + ", token = " + token, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } try { Collection<String> graphs = frameworkUserManager.getAllGraphs(); String result = new ObjectMapper().writeValueAsString(graphs); return Response.status(Response.Status.OK).entity(result).build(); } catch (Exception e) { log.error("Failed to read all graphs", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } } @POST @Path("/getAllGraphsSparql") @Produces(MediaType.APPLICATION_JSON) public Response getAllGraphsSparql(@Context ServletContext context, @CookieParam("token") String token, @FormParam("username") String username) { FrameworkConfiguration frameworkConfig = null; try { frameworkConfig = FrameworkConfiguration.getInstance(); } catch (Exception e) { log.error("Failed to get framework configuration", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Failed to get framework config").build(); } FrameworkUserManager frameworkUserManager = frameworkConfig.getFrameworkUserManager(); try { checkToken(username, token, frameworkUserManager); } catch (Exception e) { log.error("Token checking failed: user = " + username + ", token = " + token, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } try { String result = frameworkUserManager.getAllGraphsSparql(); return Response.status(Response.Status.OK).entity(result).build(); } catch (Exception e) { log.error("Failed to read all graphs", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } } @POST @Path("/updateForeign") @Produces(MediaType.APPLICATION_JSON) public Response updateForeign(@Context ServletContext context, @CookieParam("token") String token, @FormParam("graph") String graph, @FormParam("format") String responseFormat, @FormParam("username") String username) { FrameworkConfiguration frameworkConfig = null; try { frameworkConfig = FrameworkConfiguration.getInstance(); } catch (Exception e) { log.error("Failed to get framework configuration", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Failed to get framework config").build(); } FrameworkUserManager frameworkUserManager = frameworkConfig.getFrameworkUserManager(); try { checkToken(username, token, frameworkUserManager); } catch (Exception e) { log.error("Token checking failed: user = " + username + ", token = " + token, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } try { if (!frameworkUserManager.isAdmin(username)) return Response.status(Response.Status.FORBIDDEN).entity("Access denied").build(); ObjectMapper objectMapper = new ObjectMapper(); JsonNode graphNode = objectMapper.readTree(graph); String graphURI = graphNode.path("name").textValue(); String settingsGraph = frameworkUserManager.getDescribedIn(graphURI); // update metadata RdfStoreManager frameworkRdfStoreManager = frameworkConfig.getSystemRdfStoreManager(); String graphLabel = graphNode.path("graph").path("label").textValue(); String graphDescription = graphNode.path("graph").path("description").textValue(); String graphModified = graphNode.path("graph").path("modified").textValue(); // OntoQuad doesn't support DELETE {...} INSERT {...} WHERE {...}, // so use 2 queries String deleteQuery = "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" + "PREFIX dcterms: <http://purl.org/dc/terms/>\n" + "PREFIX sd: <http://www.w3.org/ns/sparql-service-description#>\n" + " DELETE {GRAPH <" + settingsGraph + "> { ?s rdfs:label ?label . ?s dcterms:description ?descr . ?s dcterms:modified ?modif. } } " + " WHERE {GRAPH <" + settingsGraph + "> { <" + graphURI + "> sd:graph ?s . ?s rdfs:label ?label . ?s dcterms:description ?descr . ?s dcterms:modified ?modif. }}"; String insertQuery = "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" + "PREFIX dcterms: <http://purl.org/dc/terms/>\n" + "PREFIX sd: <http://www.w3.org/ns/sparql-service-description#>\n" + " INSERT {GRAPH <" + settingsGraph + "> { ?s rdfs:label \"" + graphLabel + "\" . ?s dcterms:description \"" + graphDescription + "\" . ?s dcterms:modified \"" + graphModified + "\" . } } " + " WHERE {GRAPH <" + settingsGraph + "> { <" + graphURI + "> sd:graph ?s . ?s rdfs:label ?label . ?s dcterms:description ?descr . ?s dcterms:modified ?modif. } }"; // todo replace 2 queries with this query when OntoQuad will support // DELETE {...} INSERT {...} WHERE {...} queries // String query = // "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" // + "PREFIX dcterms: <http://purl.org/dc/terms/>\n" // + // "PREFIX sd: <http://www.w3.org/ns/sparql-service-description#>\n" // + "WITH <" + settingsGraph + "> " // + // " DELETE { ?s rdfs:label ?label . ?s dcterms:description ?descr . ?s dcterms:modified ?modif. } " // + " INSERT { ?s rdfs:label \"" + graphLabel + // "\" . ?s dcterms:description \"" + graphDescription + // "\" . ?s dcterms:modified \"" + graphModified + "\" . } " // + " WHERE { <" + graphURI + // "> sd:graph ?s . ?s rdfs:label ?label . ?s dcterms:description ?descr . ?s dcterms:modified ?modif. }"; frameworkRdfStoreManager.execute(deleteQuery, responseFormat); frameworkRdfStoreManager.execute(insertQuery, responseFormat); // set public access String publicAccess = graphNode.path("publicAccess").textValue(); if (publicAccess.equals("acl:Read")) frameworkUserManager .setDefaultGraphPermissions(graphURI, UserManager.GraphPermissions.READ); else if (publicAccess.equals("acl:Write")) frameworkUserManager.setDefaultGraphPermissions(graphURI, UserManager.GraphPermissions.WRITE); else frameworkUserManager.setDefaultGraphPermissions(graphURI, UserManager.GraphPermissions.NO); // set users access Collection<String> users = frameworkUserManager.getUsers(graphURI); for (String u : users) frameworkUserManager.deleteRdfGraphPermissions(u, graphURI); Iterator<JsonNode> readersIter = graphNode.path("usersRead").elements(); while (readersIter.hasNext()) frameworkUserManager.setRdfGraphPermissions(readersIter.next().textValue(), graphURI, UserManager.GraphPermissions.READ); Iterator<JsonNode> writersIter = graphNode.path("usersWrite").elements(); while (writersIter.hasNext()) frameworkUserManager.setRdfGraphPermissions(writersIter.next().textValue(), graphURI, UserManager.GraphPermissions.WRITE); String result = "{\"results\" : \"success\"}"; return Response.status(Response.Status.OK).entity(result).build(); } catch (Exception e) { log.error("Failed to update foreign " + graph, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } } @POST @Path("/dropForeign") @Produces(MediaType.APPLICATION_JSON) public Response dropForeign(@Context ServletContext context, @CookieParam("token") String token, @FormParam("graph") String graph, @FormParam("format") String responseFormat, @FormParam("username") String username) { FrameworkConfiguration frameworkConfig = null; try { frameworkConfig = FrameworkConfiguration.getInstance(); } catch (Exception e) { log.error("Failed to get framework configuration", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Failed to get framework config").build(); } FrameworkUserManager frameworkUserManager = frameworkConfig.getFrameworkUserManager(); try { checkToken(username, token, frameworkUserManager); } catch (Exception e) { log.error("Token checking failed: user = " + username + ", token = " + token, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } try { if (!frameworkUserManager.isAdmin(username)) return Response.status(Response.Status.FORBIDDEN).entity("Access denied").build(); // drop graph RdfStoreManager rdfStoreManager = frameworkUserManager.getRdfStoreManager(username); rdfStoreManager.dropGraph(graph); // drop graph metadata String settingsGraph = frameworkUserManager.getDescribedIn(graph); RdfStoreManager frameworkRdfStoreManager = frameworkConfig.getSystemRdfStoreManager(); String query = "PREFIX sd: <http://www.w3.org/ns/sparql-service-description#>\n" + "PREFIX gkg: <http://ldiw.ontos.com/ontology/>\n" + " DELETE {GRAPH <" + settingsGraph + "> {?s ?p ?o} } " + " WHERE { " + " {GRAPH <" + settingsGraph + "> { ?s ?p ?o . FILTER (?s = <" + graph + ">) } } " + " UNION " + " {GRAPH <" + settingsGraph + "> { <" + graph + "> sd:graph ?s . ?s ?p ?o . } } " + " UNION " + " {GRAPH <" + settingsGraph + "> { <" + graph + "> gkg:access ?s . ?s ?p ?o . } } " + " UNION " + " {GRAPH <" + settingsGraph + "> {?s ?p ?o . FILTER (?s = <http://ldiw.ontos.com/resource/default-dataset> && ?p = sd:namedGraph && ?o = <" + graph + ">) } } " + "}"; frameworkRdfStoreManager.execute(query, responseFormat); // remove graph from graph groups descriptions query = "PREFIX sd: <http://www.w3.org/ns/sparql-service-description#> " + " DELETE WHERE {GRAPH <" + frameworkConfig.getGroupsGraph() + "> {?s sd:namedGraph <" + graph + ">} }"; frameworkRdfStoreManager.execute(query, null); String result = "{\"results\" : \"success\"}"; return Response.status(Response.Status.OK).entity(result).build(); } catch (Exception e) { log.error("Failed to drop foreign " + graph, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } } @POST @Path("/createGroup") @Produces(MediaType.APPLICATION_JSON) public Response createGroup(@Context ServletContext context, @CookieParam("token") String token, @FormParam("group") String group, @FormParam("graphs") List<String> graphs, @FormParam("username") String username) { FrameworkConfiguration frameworkConfig = null; try { frameworkConfig = FrameworkConfiguration.getInstance(); } catch (Exception e) { log.error("Failed to get framework configuration", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Failed to get framework config").build(); } FrameworkUserManager frameworkUserManager = frameworkConfig.getFrameworkUserManager(); try { checkToken(username, token, frameworkUserManager); } catch (Exception e) { log.error("Token checking failed: user = " + username + ", token = " + token, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } try { GraphGroupManager graphGroupManager = frameworkConfig.getGraphGroupManager(); UserManager rdfStoreUserManager = frameworkConfig.getRdfStoreUserManager(); graphGroupManager.createGraphGroup(group); if (graphs != null) { for (String g : graphs) graphGroupManager.addGraph(group, g); } rdfStoreUserManager.setDefaultGraphPermissions(group, UserManager.GraphPermissions.LIST_GRAPH_GROUP); String result = "{\"results\" : \"success\"}"; return Response.status(Response.Status.OK).entity(result).build(); } catch (Exception e) { log.error("Failed to create graph group " + group, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } } @POST @Path("/updateGroup") @Produces(MediaType.APPLICATION_JSON) public Response updateGroup(@Context ServletContext context, @CookieParam("token") String token, @FormParam("group") String group, @FormParam("graphs") List<String> graphs, @FormParam("username") String username) { FrameworkConfiguration frameworkConfig = null; try { frameworkConfig = FrameworkConfiguration.getInstance(); } catch (Exception e) { log.error("Failed to get framework configuration", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Failed to get framework config").build(); } FrameworkUserManager frameworkUserManager = frameworkConfig.getFrameworkUserManager(); try { checkToken(username, token, frameworkUserManager); } catch (Exception e) { log.error("Token checking failed: user = " + username + ", token = " + token, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } try { GraphGroupManager graphGroupManager = frameworkConfig.getGraphGroupManager(); graphGroupManager.dropGroup(group); graphGroupManager.createGraphGroup(group); if (graphs != null) { for (String g : graphs) graphGroupManager.addGraph(group, g); } String result = "{\"results\" : \"success\"}"; return Response.status(Response.Status.OK).entity(result).build(); } catch (Exception e) { log.error("Failed to update graph group " + group, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } } @POST @Path("/dropGroup") @Produces(MediaType.APPLICATION_JSON) public Response dropGroup(@Context ServletContext context, @CookieParam("token") String token, @FormParam("group") String group, @FormParam("username") String username) { FrameworkConfiguration frameworkConfig = null; try { frameworkConfig = FrameworkConfiguration.getInstance(); } catch (Exception e) { log.error("Failed to get framework configuration", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Failed to get framework config").build(); } FrameworkUserManager frameworkUserManager = frameworkConfig.getFrameworkUserManager(); try { checkToken(username, token, frameworkUserManager); } catch (Exception e) { log.error("Token checking failed: user = " + username + ", token = " + token, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } try { GraphGroupManager graphGroupManager = frameworkConfig.getGraphGroupManager(); graphGroupManager.dropGroup(group); String result = "{\"results\" : \"success\"}"; return Response.status(Response.Status.OK).entity(result).build(); } catch (Exception e) { log.error("Failed to drop graph group " + group, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } } private void setGraphPermissions(String graph, String permissionsString, UserManager rdfStoreUserManager) throws Exception { if (permissionsString == null || permissionsString.isEmpty()) return; // set public graph permissions GraphPermissions graphPermissions = parsePermissions(permissionsString); rdfStoreUserManager.setDefaultGraphPermissions(graph, graphPermissions.getDefaultPermissions()); // set users permissions for (Map.Entry<String, UserManager.GraphPermissions> userPerm : graphPermissions .getUserPermissions().entrySet()) { rdfStoreUserManager.setRdfGraphPermissions(userPerm.getKey(), graph, userPerm.getValue()); } } private GraphPermissions parsePermissions(String permissionsStr) throws IOException { log.info("User graph permissions: " + permissionsStr); GraphPermissions graphPermissions = new GraphPermissions(); if (permissionsStr != null && !permissionsStr.isEmpty()) { ObjectMapper mapper = new ObjectMapper(); Iterator<JsonNode> permissionsIter = mapper.readTree(permissionsStr).elements(); while (permissionsIter.hasNext()) { JsonNode permissionNode = permissionsIter.next(); String username = permissionNode.path("username").textValue(); String permStr = permissionNode.path("permissions").textValue(); UserManager.GraphPermissions perm = null; if ("n".equals(permStr)) perm = UserManager.GraphPermissions.NO; else if ("r".equals(permStr)) perm = UserManager.GraphPermissions.READ; else if ("w".equals(permStr)) perm = UserManager.GraphPermissions.WRITE; if (perm != null) { if (username == null || username.isEmpty()) graphPermissions.setDefaultPermissions(perm); else graphPermissions.setUserPermissions(username, perm); } } } return graphPermissions; } private void checkToken(String username, String token, FrameworkUserManager frameworkUserManager) throws Exception { boolean unauthorizedUser = username == null || username.isEmpty(); if (!unauthorizedUser) { if (token == null) throw new Exception("null token"); boolean checkToken = frameworkUserManager.checkToken(username, token); if (!checkToken) throw new Exception("Invalid token " + token + " for user " + username); } } private class GraphPermissions { private UserManager.GraphPermissions defaultPermissions = UserManager.GraphPermissions.NO; private HashMap<String, UserManager.GraphPermissions> userPermissions = new HashMap<String, UserManager.GraphPermissions>(); // username->permissions public UserManager.GraphPermissions getDefaultPermissions() { return defaultPermissions; } public void setDefaultPermissions(UserManager.GraphPermissions defaultPermissions) { this.defaultPermissions = defaultPermissions; } public HashMap<String, UserManager.GraphPermissions> getUserPermissions() { return userPermissions; } public void setUserPermissions(String username, UserManager.GraphPermissions permissions) { userPermissions.put(username, permissions); } } }