/**
  * @param channel fully qualified channel name
  * @return true if present, false if not
  */
 public boolean isChannelPresent(String channel) {
   Set<String> channelList = cbManager.getActiveChannelsList();
   if (channelList != null) {
     return channelList.contains(channel);
   }
   return false;
 }
  /** @return Returns list of active channels */
  @GET
  @Path("/channels/list")
  @Produces("text/html")
  public Response getActiveChannelsList() {

    Set<String> channelList = cbManager.getActiveChannelsList();
    StringBuilder htmlMessageString = new StringBuilder();

    // Build HTML doc to return
    htmlMessageString.append("<!DOCTYPE html>");
    htmlMessageString.append("<html>");
    htmlMessageString.append(
        "<head><title>REDIS PUBSUB Channel Data Output Service</title></head>");
    htmlMessageString.append("<body>");
    htmlMessageString.append("<p><big>Available active channels: </big></p>");
    htmlMessageString.append("<ul>");
    if (channelList != null) {
      Iterator<String> itr = channelList.iterator();
      while (itr.hasNext()) {
        htmlMessageString.append(
            "<li>" + itr.next().substring(CHANNEL_PREFIX_STRING.length()) + "</li>");
      }
    }
    htmlMessageString.append("</body></html>");
    if (channelList != null) channelList.clear();
    channelList = null;

    return Response.ok(htmlMessageString.toString()).build();
  }
  /**
   * @param callbackName JSONP callback name
   * @param count number of buffered messages to fetch
   * @return returns the 'count' number of buffered messages from requested channel as jsonp data
   */
  @GET
  @Path("/channel/{crisisCode}")
  @Produces({"application/json"})
  public Response getBufferedAIDRData(
      @PathParam("crisisCode") String channelCode,
      @QueryParam("callback") String callbackName,
      @DefaultValue(DEFAULT_COUNT_STR) @QueryParam("count") String count) {

    logger.info("[getBufferedAIDRData] request received");
    if (null != cbManager.jedisConn && cbManager.jedisConn.isPoolSetup()) {
      boolean error = false;
      // Parse the HTTP GET request and generating results for output
      // Set the response MIME type of the response message
      if (null == channelCode) {
        error = true;
      }
      if (!error && channelCode.contains("*")) {
        // Got a wildcard fetch request - fetch from all channels
        return getLatestBufferedAIDRData(callbackName, count);
      }
      if (channelCode != null && channelCode.contains("?")) {
        error = true;
      }
      if (error) {
        Set<String> channelList = cbManager.getActiveChannelsList();
        StringBuilder htmlMessageString = new StringBuilder();

        // Build HTML doc to return
        htmlMessageString.append("<!DOCTYPE html>");
        htmlMessageString.append("<html>");
        htmlMessageString.append(
            "<head><title>REDIS PUBSUB Channel Data Output Service</title></head>");
        htmlMessageString.append("<body>");
        htmlMessageString.append("<h1>Invalid/No CrisisCode Provided! </h1>");
        htmlMessageString.append("<h2>Can not initiate REDIS channel subscription!</h2>");
        htmlMessageString.append("<p><big>Available active channels: </big></p>");
        htmlMessageString.append("<ul>");
        if (channelList != null) {
          Iterator<String> itr = channelList.iterator();
          while (itr.hasNext()) {
            htmlMessageString.append(
                "<li>" + itr.next().substring(CHANNEL_PREFIX_STRING.length()) + "</li>");
          }
        }
        htmlMessageString.append("</body></html>");
        if (channelList != null) channelList.clear();
        channelList = null;

        return Response.ok(htmlMessageString.toString()).build();
      } else {
        // Form fully qualified channelName and get other parameter values, if any
        String channelName = null;
        if (channelCode.startsWith(CHANNEL_PREFIX_STRING) || channelCode.contains(".")) {
          channelName = channelCode; // fully qualified channel name provided
        } else {
          channelName =
              CHANNEL_PREFIX_STRING.concat(
                  channelCode); // fully qualified channel name - same as REDIS channel
        }
        if (isChannelPresent(channelName)) {
          int msgCount = Integer.parseInt(count);
          int messageCount = DEFAULT_COUNT;
          if (msgCount > 0) {
            messageCount = Math.min(msgCount, MAX_MESSAGES_COUNT);
          }
          // Get the last messageCount messages for channel=channelCode
          List<String> bufferedMessages = new ArrayList<String>();
          List<String> temp = cbManager.getLastMessages(channelName, messageCount);
          bufferedMessages.addAll(temp != null ? temp : new ArrayList<String>());

          final JsonDataFormatter taggerOutput =
              new JsonDataFormatter(callbackName); // Tagger specific JSONP output formatter
          final StringBuilder jsonDataList =
              taggerOutput.createList(bufferedMessages, messageCount, rejectNullFlag);
          final int sendCount = taggerOutput.getMessageCount();

          // Cleanup, send the retrieved list to client and close connection
          if (temp != null) {
            temp.clear();
            temp = null;
          }
          bufferedMessages.clear();
          bufferedMessages = null;

          logger.info("[doGet] Sending jsonp data, count = " + sendCount);
          return Response.ok(jsonDataList.toString()).build();
        } else {
          if (callbackName != null) {
            StringBuilder respStr = new StringBuilder();
            respStr.append(callbackName).append("([{}])");
            return Response.ok(respStr.toString()).build();
          } else return Response.ok(new String("[{}]")).build();
        }
      }
    }
    return Response.ok(new String("[{}]")).build();
  }