« - »

Feeding your own data picker (part 2)

6 March 2008

Now that we have all of the standard, reusable code for a selection list feeder servlet stuffed into an abstract base class, it will not take much additional code to extend that class to complete a specific implementation. Since we’ve been working with the Request for Approval lately, and we already have the database tables defined, I figured that RFAs were as good of a choice as any other for an example. To extend the base class for a standard JDBC/SQL implementation, all that is required is to implement the getQueryStatement() method to build the SQL to obtain the data, and provide values in the constructor for the following data fields:

Here is the complete Java class for the RequestForApprovalSelectorServlet:

package org.restafarian.approval.servlets;

import java.util.HashMap;
import java.util.Map;

import org.restafarian.core.servlets.SelectListServletBase;

/**
 * <p>RequestForApproval data picker servlet.</p>
 */
public class RequestForApprovalSelectorServlet extends SelectListServletBase {
  private static final long serialVersionUID = 1;

  /**
   * <p>Constructs a new <code>RequestForApprovalSelectorServlet</code>.</p>
   */
  public RequestForApprovalSelectorServlet(){
    super();
    setContextKey("request.for.approval.selector.results.cache");
    setDataSourceName("java:comp/env/jdbc/approval");
    setDataFields(defineDataFields());
  }

  /**
   * <p>Builds the list of fields to include.</p>
   *
   * @return the static list of fields to include
   */
  private Map defineDataFields() {
    Map fields = new HashMap();

    fields.put("id", "id");
    fields.put("type", "type");
    fields.put("state", "state");
    fields.put("payloadId", "payloadId");
    fields.put("payloadURI", "payloadURI");
    fields.put("description", "description");
    fields.put("authorId", "authorId");
    fields.put("authorURI", "authorURI");
    fields.put("authorName", "authorName");
    fields.put("dateTime", "dateTime");

    return fields;
  }

  /**
   * <p>This method creates the SQL statement.</p>
   *
   * @param startsWith the "starts with" query parameter
   * @param contains the "contains" query parameter
   * @param orderBy the sort order
   * @return the SQL statement
   */
  protected String getQueryStatement(String startsWith, String
         contains, String orderBy) {
    StringBuffer buffer = new StringBuffer();

    buffer.append(" select\n");
    buffer.append("    id,\n");
    buffer.append("    type,\n");
    buffer.append("    state,\n");
    buffer.append("    payloadId,\n");
    buffer.append("    payloadURI,\n");
    buffer.append("    description,\n");
    buffer.append("    authorId,\n");
    buffer.append("    authorURI,\n");
    buffer.append("    authorName,\n");
    buffer.append("    dateTime\n");
    buffer.append(" from\n");
    buffer.append("    requestforapproval\n");
    buffer.append(" where\n");
    if ("id".equalsIgnoreCase(orderBy)) {
      // sort and select by id
      if (contains != null && contains.length() > 0) {
        buffer.append("    lower(id) like '%" + contains.toLowerCase() +
             "%'\n");
      } else {
        buffer.append("    lower(id) like '" + startsWith.toLowerCase() +
             "%' \n");
      }
      buffer.append(" order by\n");
      buffer.append("    id\n");
    } else if ("type".equalsIgnoreCase(orderBy)) {
      // sort and select by type
      if (contains != null && contains.length() > 0) {
        buffer.append("    lower(type) like '%" + contains.toLowerCase() +
             "%'\n");
      } else {
        buffer.append("    lower(type) like '" + startsWith.toLowerCase() +
             "%'\n");
      }
      buffer.append(" order by\n");
      buffer.append("    type, id\n");
    } else if ("state".equalsIgnoreCase(orderBy)) {
      // sort and select by state
      if (contains != null && contains.length() > 0) {
        buffer.append("    lower(state) like '%" + contains.toLowerCase() +
             "%'\n");
      } else {
        buffer.append("    lower(state) like '" + startsWith.toLowerCase() +
             "%'\n");
      }
      buffer.append(" order by\n");
      buffer.append("    state, id\n");
    } else if ("payloadId".equalsIgnoreCase(orderBy)) {
      // sort and select by payloadId
      if (contains != null && contains.length() > 0) {
        buffer.append("    lower(payloadId) like '%" +
             contains.toLowerCase() + "%'\n");
      } else {
        buffer.append("    lower(payloadId) like '" +
             startsWith.toLowerCase() + "%'\n");
      }
      buffer.append(" order by\n");
      buffer.append("    payloadId, id\n");
    } else if ("payloadURI".equalsIgnoreCase(orderBy)) {
      // sort and select by payloadURI
      if (contains != null && contains.length() > 0) {
        buffer.append("    lower(payloadURI) like '%" +
             contains.toLowerCase() + "%'\n");
      } else {
        buffer.append("    lower(payloadURI) like '" +
             startsWith.toLowerCase() + "%'\n");
      }
      buffer.append(" order by\n");
      buffer.append("    payloadURI, id\n");
    } else if ("description".equalsIgnoreCase(orderBy)) {
      // sort and select by description
      if (contains != null && contains.length() > 0) {
        buffer.append("    lower(description) like '%" +
             contains.toLowerCase() + "%'\n");
      } else {
        buffer.append("    lower(description) like '" +
             startsWith.toLowerCase() + "%'\n");
      }
      buffer.append(" order by\n");
      buffer.append("    description, id\n");
    } else if ("authorId".equalsIgnoreCase(orderBy)) {
      // sort and select by authorId
      if (contains != null && contains.length() > 0) {
        buffer.append("    lower(authorId) like '%" +
             contains.toLowerCase() + "%'\n");
      } else {
        buffer.append("    lower(authorId) like '" +
             startsWith.toLowerCase() + "%'\n");
      }
      buffer.append(" order by\n");
      buffer.append("    authorId, id\n");
    } else if ("authorURI".equalsIgnoreCase(orderBy)) {
      // sort and select by authorURI
      if (contains != null && contains.length() > 0) {
        buffer.append("    lower(authorURI) like '%" +
             contains.toLowerCase() + "%'\n");
      } else {
        buffer.append("    lower(authorURI) like '" +
             startsWith.toLowerCase() + "%'\n");
      }
      buffer.append(" order by\n");
      buffer.append("    authorURI, id\n");
    } else if ("authorName".equalsIgnoreCase(orderBy)) {
      // sort and select by authorName
      if (contains != null && contains.length() > 0) {
        buffer.append("    lower(authorName) like '%" +
             contains.toLowerCase() + "%'\n");
      } else {
        buffer.append("    lower(authorName) like '" +
             startsWith.toLowerCase() + "%'\n");
      }
      buffer.append(" order by\n");
      buffer.append("    authorName, id\n");
    } else if ("dateTime".equalsIgnoreCase(orderBy)) {
      // sort and select by dateTime
      if (contains != null && contains.length() > 0) {
        buffer.append("    lower(dateTime) like '%" +
             contains.toLowerCase() + "%'\n");
      } else {
        buffer.append("    lower(dateTime) like '" +
             startsWith.toLowerCase() + "%'\n");
      }
      buffer.append(" order by\n");
      buffer.append("    dateTime, id\n");
    }

    return buffer.toString();
  }
}

I’ve already added both this and the abstract base class to the example .ear file that I have been distributing, but there are a couple of additional things that I would like to do before I release another version. Hopefuly, I can get all of that done before the start of next week.


http://blog.restafarian.org/2008/03/feeding-your-own-data-picker-part-2/

Comments are closed.

Sorry, the comment form is closed at this time.