/**
  * Explicit Constructor. Create an instance of <code>AS2EnvelopQuerySender</code>.
  *
  * @param logger The logger for log the sending process.
  * @param ad The <code>AS2AdminData</code> for locating the HTTP end-point the request send to.
  * @throws NullPointerException When <code>p</code> is null. When the manage partnership end-point
  *     from <code>ad</code> is null or empty.
  */
 public AS2EnvelopQuerySender(FileLogger logger, AS2AdminData ad) {
   super(logger, ad);
   String endpoint = ad.getEnvelopQueryEndpoint();
   if (endpoint == null || endpoint.equals(""))
     throw new NullPointerException("Missing 'Envelop Partnership endpoint' in AS2 Admin Data.");
   this.setServiceEndPoint(endpoint);
   this.setBasicAuthentication(ad.getUsername(), new String(ad.getPassword()));
   this.setMessageCriteriaToDownload(ad.getMessageIdCriteria(), ad.getMessageBoxCriteria());
 }
  /** The main method is for CLI mode. */
  public static void main(String[] args) {
    try {
      java.io.PrintStream out = System.out;

      if (args.length < 2) {
        out.println("Usage: as2-envelop [config-xml] [log-path]");
        out.println();
        out.println(
            "Example: as2-envelop ./config/as2-envelop/as2-request.xml ./logs/as2-envelop.log");
        System.exit(1);
      }

      out.println("------------------------------------------------------");
      out.println("       AS2 Envelop Queryer       ");
      out.println("------------------------------------------------------");

      // Initialize the logger.
      out.println("Initialize logger .. ");
      // The logger path is specified at the last argument.
      FileLogger logger = new FileLogger(new File(args[args.length - 1]));

      // Initialize the query parameter.
      out.println("Importing AS2 administrative sending parameters ... ");
      AS2AdminData acd =
          DataFactory.getInstance()
              .createAS2AdminDataFromXML(new PropertyTree(new File(args[0]).toURI().toURL()));

      boolean historyQueryNeeded = false;
      AS2MessageHistoryRequestData queryData = new AS2MessageHistoryRequestData();
      if (acd.getMessageIdCriteria() == null || acd.getMessageIdCriteria().trim().equals("")) {

        historyQueryNeeded = true;

        // print command prompt
        out.println("No messageID was specified!");
        out.println("Start querying message repositry ...");

        String endpoint = acd.getEnvelopQueryEndpoint();
        String host = endpoint.substring(0, endpoint.indexOf("/corvus"));
        host += "/corvus/httpd/as2/msg_history";
        queryData.setEndPoint(host);
      } /*
        	If the user has entered message id but no messagebox,
        	using the messageid as serach criteria and as
        	user to chose his target message
        */ else if (acd.getMessageBoxCriteria() == null
          || acd.getMessageBoxCriteria().trim().equals("")) {

        historyQueryNeeded = true;

        // print command prompt
        out.println("Message Box value haven't specified.");
        out.println(
            "Start query message whcih matched with messageID: " + acd.getMessageIdCriteria());

        String endpoint = acd.getEnvelopQueryEndpoint();
        String host = endpoint.substring(0, endpoint.indexOf("/corvus"));
        host += "/corvus/httpd/as2/msg_history";

        queryData.setEndPoint(host);
        queryData.setMessageId(acd.getMessageIdCriteria());
      }
      // Debug Message
      System.out.println("history Endpoint: " + queryData.getEndPoint());
      System.out.println("Repositry Endpoint: " + acd.getEnvelopQueryEndpoint());

      if (historyQueryNeeded) {
        List msgList = listAvailableMessage(queryData, logger);

        if (msgList == null || msgList.size() == 0) {
          out.println();
          out.println();
          out.println("No stream data found in repositry...");
          out.println("Please view log for details .. ");
          return;
        }

        int selection = promptForSelection(msgList);

        if (selection == -1) {
          return;
        }

        String messageID = (String) ((List) msgList.get(selection)).get(0);
        String messageBox = (String) ((List) msgList.get(selection)).get(1);
        acd.setMessageIdCriteria(messageID);
        acd.setMessageBoxCriteria(messageBox.toUpperCase());
        out.println();
        out.println();
        out.println("Start download targeted message envelop ...");
      }

      // Initialize the sender.
      out.println("Initialize AS2 HTTP data service client... ");
      AS2EnvelopQuerySender sender = new AS2EnvelopQuerySender(logger, acd);

      out.println("Sending    AS2 HTTP Envelop Query request ... ");
      sender.run();

      out.println();
      out.println("                    Sending Done:                   ");
      out.println("----------------------------------------------------");
      out.println("The Message Envelope : ");
      InputStream eins = sender.getEnvelopStream();
      if (eins.available() == 0) {
        out.println("No stream data found.");
        out.println(
            "The message envelop does not exist for message id "
                + sender.getMessageIdToDownload()
                + " and message box "
                + sender.getMessageBoxToDownload());
      } else IOHandler.pipe(sender.getEnvelopStream(), out);

      out.println("Please view log for details .. ");
    } catch (Exception e) {
      e.printStackTrace(System.err);
    }
  }