/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.smartitengineering.user.ws.resources; /** * * @author russel */ import com.smartitengineering.user.service.Services; import com.smartitengineering.user.domain.Address; import com.smartitengineering.user.domain.Organization; import com.smartitengineering.util.rest.atom.server.AbstractResource; import com.sun.jersey.api.view.Viewable; import java.io.UnsupportedEncodingException; import java.lang.reflect.Method; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import javax.servlet.http.HttpServletRequest; import java.util.Map; import javax.ws.rs.Consumes; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.UriBuilder; import org.apache.abdera.Abdera; import org.apache.abdera.model.Entry; 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; @Path("/orgs") public class OrganizationsResource extends AbstractResource { static final Method ORGANIZATION_AFTER_SHORTNAME_METHOD; static final Method ORGANIZATION_BEFORE_SHORTNAME_METHOD; @Context private HttpServletRequest servletRequest; static { try { ORGANIZATION_BEFORE_SHORTNAME_METHOD = OrganizationsResource.class.getMethod("getBefore", String.class); } catch (Exception ex) { throw new InstantiationError(); } try { ORGANIZATION_AFTER_SHORTNAME_METHOD = OrganizationsResource.class.getMethod("getAfter", String.class); } catch (Exception ex) { throw new InstantiationError(); } } // @QueryParam("name") // private String nameLike; @QueryParam("shortname") private String uniqueShortName; @DefaultValue("10") @QueryParam("count") private Integer count; @GET @Produces(MediaType.APPLICATION_ATOM_XML) @Path("/before/{beforeShortName}") public Response getBefore(@PathParam("beforeShortName") String beforeShortName) { return get(beforeShortName, true); } @GET @Produces(MediaType.TEXT_HTML) @Path("/before/{beforeShortName}") public Response getBeforeHtml(@PathParam("beforeShortName") String beforeShortName) { ResponseBuilder responseBuilder = Response.ok(); if (count == null) { count = 10; } Collection<Organization> organizations = Services.getInstance().getOrganizationService().getOrganizations( null, beforeShortName, true, count); servletRequest.setAttribute("templateContent", "/com/smartitengineering/user/ws/resources/OrganizationsResource/organizationList.jsp"); Viewable view = new Viewable("/template/template.jsp", organizations); responseBuilder.entity(view); return responseBuilder.build(); } @GET @Produces(MediaType.TEXT_HTML) @Path("/before/{beforeShortName}/frags") public Response getBeforeHtmlFrags(@PathParam("beforeShortName") String beforeShortName) { ResponseBuilder responseBuilder = Response.ok(); if (count == null) { count = 10; } Collection<Organization> organizations = Services.getInstance().getOrganizationService().getOrganizations( null, beforeShortName, true, count); Viewable view = new Viewable("organizationFrags.jsp", organizations); responseBuilder.entity(view); return responseBuilder.build(); } @GET @Produces(MediaType.APPLICATION_ATOM_XML) @Path("/after/{afterShortName}") public Response getAfter(@PathParam("afterShortName") String afterShortName) { return get(afterShortName, false); } @GET @Produces(MediaType.TEXT_HTML) @Path("/after/{afterShortName}") public Response getAfterHtml(@PathParam("afterShortName") String afterShortName) { ResponseBuilder responseBuilder = Response.ok(); if (count == null) { count = 10; } Collection<Organization> organizations = Services.getInstance().getOrganizationService().getOrganizations( null, afterShortName, false, count); servletRequest.setAttribute("templateContent", "/com/smartitengineering/user/ws/resources/OrganizationsResource/organizationList.jsp"); Viewable view = new Viewable("/template/template.jsp", organizations); responseBuilder.entity(view); return responseBuilder.build(); } @GET @Produces(MediaType.TEXT_HTML) @Path("/after/{afterShortName}/frags") public Response getAfterHtmlFrags(@PathParam("afterShortName") String afterShortName) { ResponseBuilder responseBuilder = Response.ok(); if (count == null) { count = 10; } Collection<Organization> organizations = Services.getInstance().getOrganizationService().getOrganizations( null, afterShortName, false, count); Viewable view = new Viewable("organizationFrags.jsp", organizations); responseBuilder.entity(view); return responseBuilder.build(); } @GET @Produces(MediaType.APPLICATION_ATOM_XML) public Response get() { return get(null, true); } @GET @Produces(MediaType.TEXT_HTML) public Response getHtml() { ResponseBuilder responseBuilder = Response.ok(); if (count == null) { count = 10; } Collection<Organization> organizations = Services.getInstance().getOrganizationService().getOrganizations( uniqueShortName, uniqueShortName, false, count); servletRequest.setAttribute("templateHeadContent", "/com/smartitengineering/user/ws/resources/OrganizationsResource/OrganizationHeader.jsp"); servletRequest.setAttribute("templateContent", "/com/smartitengineering/user/ws/resources/OrganizationsResource/organizationList.jsp"); Viewable view = new Viewable("/template/template.jsp", organizations); responseBuilder.entity(view); return responseBuilder.build(); } @GET @Produces(MediaType.TEXT_HTML) @Path("/frags") public Response getHtmlFrags() { ResponseBuilder responseBuilder = Response.ok(); if (count == null) { count = 10; } Collection<Organization> organizations = Services.getInstance().getOrganizationService().getOrganizations( uniqueShortName, uniqueShortName, false, count); Viewable view = new Viewable("organizationFrags.jsp", organizations); responseBuilder.entity(view); return responseBuilder.build(); } // @GET // @Produces(MediaType.APPLICATION_ATOM_XML) public Response get(String organizationName, boolean isBefore) { if (count == null) { count = 10; } ResponseBuilder responseBuilder = Response.ok(); // create a new atom feed Feed atomFeed = Abdera.getNewFactory().newFeed(); // create a link to parent resource, in this case now it is linked to root resource Link parentResourceLink = Abdera.getNewFactory().newLink(); parentResourceLink.setHref(UriBuilder.fromResource(RootResource.class).build().toString()); parentResourceLink.setRel("root"); atomFeed.addLink(parentResourceLink); // get the organizations accoring to the query //Collection<Organization> organizations = Services.getInstance().getOrganizationService().getAllOrganization(); // Collection<Organization> organizations = Services.getInstance().getOrganizationService().getOrganizations( // organizationName, uniqueShortName, isBefore, count); Collection<Organization> organizations = Services.getInstance().getOrganizationService().getOrganizations( "", organizationName, isBefore, count); // for testing purpose we manually add organization to the list. // List<Organization> serviceOrganization = new ArrayList<Organization>(); // serviceOrganization.add(new Organization("Sitel", "1")); // serviceOrganization.add(new Organization("mehmood equity", "2")); // Collection<Organization> organizations = serviceOrganization; if (organizations != null && !organizations.isEmpty()) { MultivaluedMap<String, String> queryParam = getUriInfo().getQueryParameters(); List<Organization> organizationList = new ArrayList<Organization>(organizations); // uri builder for next and previous organizations according to count final UriBuilder nextUri = getRelativeURIBuilder().path(OrganizationsResource.class).path( ORGANIZATION_AFTER_SHORTNAME_METHOD); final UriBuilder previousUri = getRelativeURIBuilder().path(OrganizationsResource.class).path( ORGANIZATION_BEFORE_SHORTNAME_METHOD); // link to the next organizations based on count Link nextLink = getAbderaFactory().newLink(); nextLink.setRel(Link.REL_NEXT); Organization lastOrganization = organizationList.get(organizationList.size() - 1); for (String key : queryParam.keySet()) { final Object[] values = queryParam.get(key).toArray(); nextUri.queryParam(key, values); previousUri.queryParam(key, values); } nextLink.setHref(nextUri.build(lastOrganization.getUniqueShortName()).toString()); //nextLink.setHref(UriBuilder.fromResource(OrganizationsResource.class).build(lastOrganization.getUniqueShortName()).toString()); atomFeed.addLink(nextLink); /* link to the previous organizations based on count */ Link prevLink = getAbderaFactory().newLink(); prevLink.setRel(Link.REL_PREVIOUS); Organization firstOrganization = organizationList.get(0); prevLink.setHref(previousUri.build(firstOrganization.getUniqueShortName()).toString()); //prevLink.setHref(nameLike) atomFeed.addLink(prevLink); // add entry of individual organization for (Organization organization : organizations) { Entry organizationEntry = getAbderaFactory().newEntry(); organizationEntry.setId(organization.getUniqueShortName().toString()); organizationEntry.setTitle(organization.getName()); organizationEntry.setSummary(organization.getName()); organizationEntry.setUpdated(organization.getLastModifiedDate()); /* setting link to the individual organization resource*/ Link organizationLink = getAbderaFactory().newLink(); organizationLink.setHref(getRelativeURIBuilder().path(OrganizationResource.class).build(organization. getUniqueShortName()).toString()); organizationLink.setRel(Link.REL_ALTERNATE); organizationLink.setMimeType(MediaType.APPLICATION_ATOM_XML); organizationEntry.addLink(organizationLink); atomFeed.addEntry(organizationEntry); } } responseBuilder.entity(atomFeed); return responseBuilder.build(); } @POST @Consumes(MediaType.APPLICATION_JSON) public Response post(Organization organization) { ResponseBuilder responseBuilder; try { //Services.getInstance().getOrganizationService().populateAuthor(organization); Services.getInstance().getOrganizationService().save(organization); responseBuilder = Response.status(Response.Status.CREATED); responseBuilder.location(getAbsoluteURIBuilder().path(OrganizationResource.class).build(organization. getUniqueShortName())); } catch (Exception ex) { responseBuilder = Response.status(Response.Status.INTERNAL_SERVER_ERROR); } return responseBuilder.build(); } private Organization getObjectFromContent(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]); } Organization newOrganization = new Organization(); if (keyValueMap.get("id") != null) { newOrganization.setId(keyValueMap.get("id")); } if (keyValueMap.get("name") != null) { newOrganization.setName(keyValueMap.get("name")); } if (keyValueMap.get("uniqueShortName") != null) { newOrganization.setUniqueShortName(keyValueMap.get("uniqueShortName")); } Address address = new Address(); if (keyValueMap.get("city") != null) { address.setCity(keyValueMap.get("city")); } if (keyValueMap.get("country") != null) { address.setCountry(keyValueMap.get("country")); } if (keyValueMap.get("state") != null) { address.setState(keyValueMap.get("state")); } if (keyValueMap.get("zip") != null) { address.setZip(keyValueMap.get("zip")); } newOrganization.setAddress(address); return newOrganization; } @POST public Response post(@HeaderParam("Content-type") String contentType, String message) { ResponseBuilder responseBuilder = Response.status(Status.SERVICE_UNAVAILABLE); 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) { Organization newOrganization = new Organization(); try { newOrganization = getObjectFromContent(message); Services.getInstance().getOrganizationService().save(newOrganization); responseBuilder.status(Status.SEE_OTHER); responseBuilder.location(getAbsoluteURIBuilder().path(OrganizationResource.class).build(newOrganization. getUniqueShortName())); } catch (Exception ex) { servletRequest.setAttribute("error", ex.getMessage()); servletRequest.setAttribute("errorOrganization", newOrganization); Collection<Organization> organizations = Services.getInstance().getOrganizationService().getOrganizations( uniqueShortName, uniqueShortName, false, count); servletRequest.setAttribute("templateHeadContent", "/com/smartitengineering/user/ws/resources/OrganizationsResource/OrganizationHeader.jsp"); servletRequest.setAttribute("templateContent", "/com/smartitengineering/user/ws/resources/OrganizationsResource/organizationList.jsp"); Viewable view = new Viewable("/template/template.jsp", organizations); responseBuilder.entity(view); } } return responseBuilder.build(); } @Override protected String getAuthor() { return "Smart User"; } }