/** @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 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;
 }
  /**
   * @param callbackName JSONP callback name
   * @param count number of messages to fetch
   * @return the latest tweet data as a jsonp object from across all active channels
   */
  @GET
  @Path("/channels/latest")
  @Produces("application/json")
  public Response getLatestBufferedAIDRData(
      @QueryParam("callback") String callbackName,
      @DefaultValue("1") @QueryParam("count") String count) {

    logger.info("[getLatestBufferedAIDRData] request received");
    if (null != cbManager.jedisConn && cbManager.jedisConn.isPoolSetup()) { // Jedis pool is ready
      // Get the last count number of messages for channel=channelCode
      List<String> bufferedMessages = new ArrayList<String>();
      final int messageCount =
          Integer.parseInt(count); // number of latest messages across all channels to return
      List<String> temp = cbManager.getLatestFromAllChannels(messageCount);
      bufferedMessages.addAll(temp != null ? temp : new ArrayList<String>());
      if (temp != null) {
        temp.clear();
        temp = null;
      }
      final JsonDataFormatter taggerOutput =
          new JsonDataFormatter(callbackName); // Tagger specific JSONP output formatter
      final StringBuilder jsonDataList =
          taggerOutput.createList(bufferedMessages, messageCount, rejectNullFlag);
      final int sendCount = taggerOutput.getMessageCount();

      // Reset the messageList buffer and return
      bufferedMessages.clear();
      bufferedMessages = null;

      // Finally, send the retrieved list to client and close connection
      return Response.ok(jsonDataList.toString()).build();
    }
    return Response.ok(new String("[{}]")).build();
  }
 @GET
 @Path("/manage/restart/{passcode}")
 @Produces("application/json")
 public Response restartFetchService(@PathParam("passcode") String passcode) {
   logger.info("[restartFetchService] request received");
   if (passcode.equals("sysadmin2013")) {
     if (cbManager != null) {
       cbManager.close();
     }
     cbManager = new ChannelBufferManager(CHANNEL_REG_EX);
     logger.info("aidr-output fetch service restarted...");
     final String statusStr = "{\"aidr-output fetch service\":\"RESTARTED\"}";
     return Response.ok(statusStr).build();
   }
   return Response.ok(new String("{\"password\":\"invalid\"}")).build();
 }
 @Override
 public void contextDestroyed(ServletContextEvent sce) {
   cbManager.close();
   logger.info("Context destroyed");
 }
  /**
   * @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();
  }