package eu.geoknow.generator.rest;
import java.util.Collection;
import javax.ws.rs.Consumes;
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.Cookie;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.log4j.Logger;
import com.google.gson.Gson;
import eu.geoknow.generator.configuration.FrameworkConfiguration;
import eu.geoknow.generator.exceptions.ResourceExistsException;
import eu.geoknow.generator.exceptions.ResourceNotFoundException;
import eu.geoknow.generator.users.FrameworkUserManager;
import eu.geoknow.generator.users.RoleManager;
import eu.geoknow.generator.users.RoleType;
import eu.geoknow.generator.users.UserProfile;
import eu.geoknow.generator.users.UserRole;
/**
* A Rest interface to manage Roles
*
* @author alejandragarciarojas
*
*/
@Path("/roles")
public class Roles {
private static final Logger log = Logger.getLogger(Roles.class);
/**
* Return an array of roles with the allowed services. This is a public method because the
* notLoggedIn Role needs to be retrieved without the authentication
*
* @return JSON Collection<UserRole>
*/
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getRoles() {
try {
RoleManager manager =
new RoleManager(FrameworkConfiguration.getInstance().getSystemRdfStoreManager());
Collection<UserRole> roles = manager.getRoles();
Gson gson = new Gson();
String json = "{\"roles\" : " + gson.toJson(roles) + "}";
log.info(json);
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 the role of the given URI
*
* @param uri
* @param userc
* @param token
* @return
*/
@GET
@Path("/{uri : .+}")
@Produces(MediaType.APPLICATION_JSON)
public Response getRole(@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 {
RoleManager manager =
new RoleManager(FrameworkConfiguration.getInstance().getSystemRdfStoreManager());
UserRole res = manager.getRole(uri);
Gson gson = new Gson();
String json = "{\"role\" : " + gson.toJson(res) + "}";
log.info(json);
return Response.status(Response.Status.OK).entity(json).type(MediaType.APPLICATION_JSON)
.build();
} catch (ResourceNotFoundException e) {
log.error(e);
return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build();
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
/**
* Add a new role
*
* @param UserRole role
* @param user cookie
* @param token
* @return UserRole
*/
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createRole(UserRole role, @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();
}
// check that the user is admin so he can update the component
if (!frameworkUserManager.isAdmin(user.getAccountURI())) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Admin role required").build();
}
} catch (Exception e) {
log.error(e);
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
try {
RoleManager manager =
new RoleManager(FrameworkConfiguration.getInstance().getSystemRdfStoreManager());
UserRole res = manager.create(role);
Gson gson = new Gson();
String json = "{\"role\" : " + gson.toJson(res) + "}";
log.info(json);
return Response.status(Response.Status.CREATED).entity(json).type(MediaType.APPLICATION_JSON)
.build();
} catch (ResourceExistsException e) {
log.error(e);
return Response.status(Response.Status.CONFLICT).entity(e.getMessage()).build();
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
/**
* Update a role
*
* @param role
* @param userc
* @param token
* @return
*/
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response updateRole(UserRole role, @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();
}
// check that the user is admin so he can update the component
if (!frameworkUserManager.isAdmin(user.getAccountURI())) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Admin role required").build();
}
} catch (Exception e) {
log.error(e);
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
try {
RoleManager manager =
new RoleManager(FrameworkConfiguration.getInstance().getSystemRdfStoreManager());
role = manager.updateRole(role);
Gson gson = new Gson();
String json = "{\"role\" : " + gson.toJson(role) + "}";
log.info(json);
return Response.status(Response.Status.OK).entity(json).type(MediaType.APPLICATION_JSON)
.build();
} catch (ResourceNotFoundException e) {
log.error(e);
return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build();
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
/**
* Delete a role with the given URI
*
* @param uri
* @param userc
* @param token
* @return
*/
@DELETE
@Path("/{uri : .+}")
public Response deleteRole(@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();
}
// only admin can delete
if (!frameworkUserManager.isAdmin(user.getAccountURI())) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Admin role required").build();
}
} catch (Exception e) {
log.error(e);
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
try {
RoleManager manager =
new RoleManager(FrameworkConfiguration.getInstance().getSystemRdfStoreManager());
manager.deleteRole(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();
}
}
/**
* Sets the Default to the provided uri.
*
* @param uri of the role
* @param userc
* @param token
* @return
*/
@PUT
@Path("/default/{uri : .+}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response setDefaultType(@PathParam("uri") String uri,
@CookieParam(value = "user") Cookie userc, @CookieParam(value = "token") String token) {
return setType(RoleType.DEFAULT, uri, userc, token);
}
/**
* Sets the not-logged-in to the provided uri.
*
* @param uri of the role
* @param userc
* @param token
* @return
*/
@PUT
@Path("/not-logged-in/{uri : .+}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response setNotLoggedInType(@PathParam("uri") String uri,
@CookieParam(value = "user") Cookie userc, @CookieParam(value = "token") String token) {
return setType(RoleType.NOT_LOGGED_IN_USER, uri, userc, token);
}
/**
* A general method to set the Defaulf or the NotLoggedIn type
*
* @param type
* @param uri
* @param userc
* @param token
* @return
*/
private Response setType(String type, String uri, Cookie userc, String token) {
log.debug(type + "/" + uri);
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();
}
// check that the user is admin so he can update the component
if (!frameworkUserManager.isAdmin(user.getAccountURI())) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Admin role required").build();
}
} catch (Exception e) {
log.error(e);
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
try {
RoleManager manager =
new RoleManager(FrameworkConfiguration.getInstance().getSystemRdfStoreManager());
if (type.equals(RoleType.DEFAULT))
manager.setDefaultRole(uri);
else if (type.equals(RoleType.NOT_LOGGED_IN_USER))
manager.setNotLoggedInRole(uri);
return Response.status(Response.Status.OK).build();
} catch (ResourceNotFoundException e) {
log.error(e);
return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build();
} catch (Exception e) {
log.error(e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
}