/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.smartitengineering.user.ws.resources;
import com.smartitengineering.user.service.Services;
import com.smartitengineering.user.domain.Organization;
import com.smartitengineering.user.domain.Privilege;
import com.smartitengineering.user.domain.SecuredObject;
import com.smartitengineering.util.rest.atom.server.AbstractResource;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
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.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriBuilderException;
import org.apache.abdera.model.Feed;
import org.apache.abdera.model.Link;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
/**
*
* @author russel
*/
@Path("/orgs/sn/{organizationUniqueShortName}/privs/name/{privilegeName}")
public class OrganizationPrivilegeResource extends AbstractResource {
static final Method CONTENT_METHOD;
static {
try {
CONTENT_METHOD = (OrganizationPrivilegeResource.class.getMethod("getContent"));
}
catch (Exception ex) {
throw new InstantiationError();
}
}
private String organizationUniqueShortName;
private String privilegeName;
private Organization organization;
private Privilege privilege;
public OrganizationPrivilegeResource(@PathParam("organizationUniqueShortName") String organizationUniqueShortName, @PathParam(
"privilegeName") String privilegeName) {
this.organizationUniqueShortName = organizationUniqueShortName;
this.privilegeName = privilegeName;
organization = getOrganization();
privilege = getPrivilege();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/content")
public Response getContent() {
ResponseBuilder responseBuilder = Response.ok();
if (organization == null || privilege == null) {
return responseBuilder.status(Status.NOT_FOUND).build();
}
responseBuilder = Response.ok(getPrivilege());
return responseBuilder.build();
}
@GET
@Produces(MediaType.APPLICATION_ATOM_XML)
public Response get() {
ResponseBuilder responseBuilder = Response.ok();
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Entering get method of privilege resource");
if(organization==null){
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Organization is null from privilege resource");
}
if(privilege==null){
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Privilege is null from privilege resource");
}
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Privilege or organization is not null from privilege resource");
if (organization == null || privilege == null) {
return responseBuilder.status(Status.NOT_FOUND).build();
}
try {
responseBuilder = Response.status(Status.OK);
Feed privilegeFeed = getPrivilegeFeed();
responseBuilder = Response.ok(privilegeFeed);
}
catch (Exception ex) {
responseBuilder = Response.status(Status.INTERNAL_SERVER_ERROR);
}
return responseBuilder.build();
}
@DELETE
public Response delete() {
ResponseBuilder responseBuilder = Response.ok();
if (organization == null || privilege == null) {
return responseBuilder.status(Status.NOT_FOUND).build();
}
try {
responseBuilder = Response.status(Status.OK);
Services.getInstance().getPrivilegeService().delete(getPrivilege());
}
catch (Exception ex) {
responseBuilder = Response.status(Status.INTERNAL_SERVER_ERROR);
}
return responseBuilder.build();
}
@PUT
@Produces(MediaType.APPLICATION_ATOM_XML)
@Consumes(MediaType.APPLICATION_JSON)
public Response update(Privilege newPrivilege) {
ResponseBuilder responseBuilder = Response.ok();
if (organization == null || privilege == null) {
return responseBuilder.status(Status.NOT_FOUND).build();
}
try {
responseBuilder = Response.status(Status.OK);
newPrivilege.setParentOrganization(organization);
Services.getInstance().getPrivilegeService().update(newPrivilege);
}
catch (Exception ex) {
responseBuilder = Response.status(Status.INTERNAL_SERVER_ERROR);
}
return responseBuilder.build();
}
private Feed getPrivilegeFeed() throws UriBuilderException, IllegalArgumentException {
Feed privilegeFeed = getAbderaFactory().newFeed();
privilegeFeed.setId(privilegeName);
privilegeFeed.setTitle(privilegeName);
privilegeFeed.addLink(getSelfLink());
Link editLink = getAbderaFactory().newLink();
editLink.setHref(getUriInfo().getRequestUri().toString());
editLink.setRel(Link.REL_EDIT);
editLink.setMimeType(MediaType.APPLICATION_JSON);
Link altLink = getAbderaFactory().newLink();
altLink.setHref(getRelativeURIBuilder().path(OrganizationPrivilegeResource.class).path(CONTENT_METHOD).build(
organizationUniqueShortName, privilegeName).toString());
altLink.setRel(Link.REL_ALTERNATE);
altLink.setMimeType(MediaType.APPLICATION_JSON);
privilegeFeed.addLink(altLink);
privilegeFeed.addLink(editLink);
return privilegeFeed;
}
@POST
@Path("/delete")
public Response deletePost() {
ResponseBuilder responseBuilder = Response.ok();
if (organization == null || privilege == null) {
return responseBuilder.status(Status.NOT_FOUND).build();
}
try {
Services.getInstance().getPrivilegeService().delete(getPrivilege());
}
catch (Exception ex) {
responseBuilder = Response.ok(Status.INTERNAL_SERVER_ERROR);
}
return responseBuilder.build();
}
@POST
@Path("/update")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response updatePost(@HeaderParam("Content-type") String contentType, String message) {
ResponseBuilder responseBuilder = Response.status(Status.SERVICE_UNAVAILABLE);
if (organization == null || privilege == null) {
return responseBuilder.status(Status.NOT_FOUND).build();
}
if (StringUtils.isBlank(message)) {
responseBuilder = Response.status(Status.BAD_REQUEST);
responseBuilder.build();
}
final boolean isHtmlPost;
if (StringUtils.isBlank(contentType)) {
contentType = MediaType.APPLICATION_OCTET_STREAM;
isHtmlPost = false;
}
else if (contentType.equals(MediaType.APPLICATION_FORM_URLENCODED)) {
contentType = MediaType.APPLICATION_OCTET_STREAM;
isHtmlPost = true;
try {
//Will search for the first '=' if not found will take the whole string
final int startIndex = 0;//message.indexOf("=") + 1;
//Consider the first '=' as the start of a value point and take rest as value
final String realMsg = message.substring(startIndex);
//Decode the message to ignore the form encodings and make them human readable
message = URLDecoder.decode(realMsg, "UTF-8");
}
catch (UnsupportedEncodingException ex) {
}
}
else {
isHtmlPost = false;
}
if (isHtmlPost) {
Privilege newPrivilege = getPrivilegeFromContent(message);
try {
Services.getInstance().getPrivilegeService().update(newPrivilege);
responseBuilder = Response.ok(getPrivilegeFeed());
}
catch (Exception ex) {
responseBuilder = Response.status(Status.INTERNAL_SERVER_ERROR);
}
}
return responseBuilder.build();
}
private Privilege getPrivilegeFromContent(String message) {
Map<String, String> keyValueMap = new HashMap<String, String>();
String[] keyValuePairs = message.split("&");
for (int i = 0; i < keyValuePairs.length; i++) {
String[] keyValuePair = keyValuePairs[i].split("=");
keyValueMap.put(keyValuePair[0], keyValuePair[1]);
}
Privilege newPrivilege = new Privilege();
if (keyValueMap.get("id") != null) {
newPrivilege.setId(NumberUtils.toLong((keyValueMap.get("id"))));
}
if (keyValueMap.get("name") != null) {
newPrivilege.setName(keyValueMap.get("name"));
}
if (keyValueMap.get("displayName") != null) {
newPrivilege.setDisplayName(keyValueMap.get("displayName"));
}
if (keyValueMap.get("shortDescription") != null) {
newPrivilege.setShortDescription(keyValueMap.get("shortDescription"));
}
if (keyValueMap.get("permissionMask") != null) {
newPrivilege.setPermissionMask(Integer.valueOf(keyValueMap.get("permissionMask")));
}
if (keyValueMap.get("orgName") != null) {
Organization parentOrganization = Services.getInstance().getOrganizationService().getOrganizationByUniqueShortName(keyValueMap.
get("orgName"));
newPrivilege.setParentOrganization(parentOrganization);
}
if (keyValueMap.get("securedObjectID") != null) {
SecuredObject securedObject = Services.getInstance().getSecuredObjectService().getByOrganizationAndObjectID(
organizationUniqueShortName, keyValueMap.get("securedObjectID"));
newPrivilege.setSecuredObject(securedObject);
}
return newPrivilege;
}
private Privilege getPrivilege() {
return Services.getInstance().getPrivilegeService().getPrivilegeByOrganizationAndPrivilegeName(
organizationUniqueShortName, privilegeName);
}
private Organization getOrganization() {
return Services.getInstance().getOrganizationService().getOrganizationByUniqueShortName(organizationUniqueShortName);
}
@Override
protected String getAuthor() {
return "Smart User";
}
}