/* GET request */
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    String signingSecret = SageoneConstants.SIGNING_SECRET;
    String accessToken = req.getParameter("access_token");
    String endpoint = "https://api.sageone.com/" + req.getParameter("endpoint");
    String nonce = Nonce.generateNonce();
    String authHeader = "Bearer " + accessToken;
    TreeMap<String, String> params = new TreeMap<String, String>();
    SageoneSigner s = new SageoneSigner("get", endpoint, params, nonce, signingSecret, accessToken);
    String signature = s.signature();

    try {
      HttpURLConnection httpConn = HttpUtility.sendGetRequest(endpoint);
      httpConn.setRequestProperty("Authorization", authHeader);
      httpConn.setRequestProperty("X-Signature", signature);
      httpConn.setRequestProperty("X-Nonce", nonce);
      httpConn.setRequestProperty("Accept", "*/*");
      httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
      httpConn.setRequestProperty("User-Agent", "SageOneSampleApp");
      String[] response = HttpUtility.readMultipleLinesResponse();
      JSONObject jsonResponse = new JSONObject(response[0]);
      Gson gson = new GsonBuilder().setPrettyPrinting().create();
      String prettyJson = gson.toJson(jsonResponse);

      resp.getWriter().println("<html>");
      resp.getWriter().println("<head>");
      resp.getWriter()
          .println("<link type=\"text/css\" rel=\"stylesheet\" href=\"sample_app.css\">");
      resp.getWriter()
          .println(
              "<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css\" integrity=\"sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7\" crossorigin=\"anonymous\">");
      resp.getWriter()
          .println(
              "<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css\" integrity=\"sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r\" crossorigin=\"anonymous\">");
      resp.getWriter()
          .println(
              "<script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js\" integrity=\"sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS\" crossorigin=\"anonymous\"></script>");
      resp.getWriter().println("<title>Response</title>");
      resp.getWriter().println("</head>");
      resp.getWriter().println("<body>");
      resp.getWriter().println("<header class=\"navbar navbar-fixed-top navbar-inverse\">");
      resp.getWriter().println("<div class='container'>");
      resp.getWriter()
          .println("<a id=\"logo\" href=\"/SageOneSampleApp\">Sage One API Sample App</a>");
      resp.getWriter().println("</div>");
      resp.getWriter().println("</header>");
      resp.getWriter().println("<div class='container'>");
      resp.getWriter().println("<h1>Sage One Data</h1>");
      resp.getWriter().println("<pre>" + prettyJson + "</pre>");
      resp.getWriter().println("</body>");
      resp.getWriter().println("</html>");
    } catch (IOException ex) {
      ex.printStackTrace();
    }
    HttpUtility.disconnect();
  }
  // Once collected, you get only one visit from the root tag block (hopefully HTML)
  public void visit(TagBlock tb) {
    // We are not going to parse attribute information in pages that don't have an HTML tag block
    if (tb.startTag.tagName.equalsIgnoreCase("HTML")) {
      HTMLElement he;
      TagBlock tbe;

      // Let's go looking for the head tag
      for (Enumeration be = tb.body.elements(); be.hasMoreElements(); ) {
        he = (HTMLElement) be.nextElement();

        if (he.getClass() == TagBlock.class) {
          tbe = (TagBlock) he;

          if (tbe.startTag.tagName.equalsIgnoreCase("HEAD")) {
            // Found the head tag block, now let's look for the page title and any meta tags
            for (Enumeration hbe = tbe.body.elements(); hbe.hasMoreElements(); ) {
              he = (HTMLElement) hbe.nextElement();

              if (he.getClass() == TagBlock.class) {
                tbe = (TagBlock) he;

                if (tbe.startTag.tagName.equalsIgnoreCase("TITLE")) {
                  // Should only be one item in title body, hopefully it's a text element
                  for (Enumeration e = tbe.body.elements(); e.hasMoreElements(); ) {
                    he = (HTMLElement) e.nextElement();

                    if (he.getClass() == Text.class) {
                      pageTitle = HttpUtility.HtmlDecode(((Text) he).text).Trim();
                      break;
                    }
                  }
                }
              } else if (he.getClass() == Tag.class) {
                Tag tg = (Tag) he;

                // See if this is a META tag
                if (tg.tagName.equalsIgnoreCase("META")) {
                  // Convert this tag and it's attributes into a more .NET
                  // friendly collection
                  MetaTag metaTag = new MetaTag(tg);

                  // Copy attributes in Java vector into .NET ArrayList...
                  for (Enumeration ae = tg.attributeList.attributes.elements();
                      ae.hasMoreElements(); )
                    metaTag.get_Attributes().Add((Attribute) ae.nextElement());

                  tagList.Add(metaTag);
                }
              }
            }

            // Once we've found the head element, we can leave...
            break;
          }
        }
      }
    }
  }