protected void doPost(HttpServletRequest req, HttpServletResponse res)
      throws ServletException, IOException {
    HttpSession session = req.getSession();
    session.setAttribute("url", req.getRequestURI());
    session.setAttribute(
        "relatedUrl",
        "<ul><li><a href='BM/BMCreateButton'>BMCreateButton</a></li><li><a href='BM/BMUpdateButton'>BMUpdateButton</a></li><li><a href='BM/BMButtonSearch'>BMButtonSearch</a></li><li><a href='BM/BMGetButtonDetails'>BMGetButtonDetails</a></li><li><a href='BM/BMManageButtonStatus'>BMManageButtonStatus</a></li><li><a href='BM/BMSetInventory'>BMSetInventory</a></li><li><a href='BM/BMGetInventory'>BMGetInventory</a></li></ul>");
    res.setContentType("text/html");
    try {
      // Configuration map containing signature credentials and other required configuration.
      // For a full list of configuration parameters refer in wiki page.
      // (https://github.com/paypal/sdk-core-java/blob/master/README.md)
      Map<String, String> configurationMap = Configuration.getAcctAndConfig();

      // Creating service wrapper object to make an API call by loading configuration map.
      PayPalAPIInterfaceServiceService service =
          new PayPalAPIInterfaceServiceService(configurationMap);

      if (req.getRequestURI().contains("BMCreateButton")) {

        BMCreateButtonReq request = new BMCreateButtonReq();
        BMCreateButtonRequestType reqType = new BMCreateButtonRequestType();

        /*
        *  (Required) The kind of button you want to create.
        *  It is one of the following values:

           BUYNOW - Buy Now button
           CART - Add to Cart button
           GIFTCERTIFICATE - Gift Certificate button
           SUBSCRIBE - Subscribe button
           DONATE - Donate button
           UNSUBSCRIBE - Unsubscribe button
           VIEWCART - View Cart button
           PAYMENTPLAN - Installment Plan button; since version 63.0
           AUTOBILLING - Automatic Billing button; since version 63.0
           PAYMENT - Pay Now button; since version 65.1

        Note: Do not specify BUYNOW if BUTTONCODE=TOKEN; specify PAYMENT instead.
        Do not specify PAYMENT if BUTTONCODE=HOSTED.
        */
        reqType.setButtonType(ButtonTypeType.fromValue(req.getParameter("buttonType")));

        /*
        *  (Optional) The kind of button code to create.
        *  It is one of the following values:

           1.HOSTED - A secure button stored on PayPal; default for all buttons
             except View Cart, Unsubscribe, and Pay Now
           2.ENCRYPTED - An encrypted button, not stored on PayPal; default for
              View Cart button
           3.CLEARTEXT - An unencrypted button, not stored on PayPal; default for
             Unsubscribe button
           4.TOKEN - A secure button, not stored on PayPal, used only to initiate the Hosted
             Solution checkout flow; default for Pay Now button. Since version 65.1
        */
        reqType.setButtonCode(ButtonCodeType.fromValue(req.getParameter("buttonCode")));

        // (Optional) HTML standard button variables
        List<String> lst = new ArrayList<String>();
        lst.add("item_name=" + req.getParameter("itemName"));
        lst.add("return=" + req.getParameter("returnURL"));
        lst.add("business=" + req.getParameter("businessMail"));
        lst.add("amount=" + req.getParameter("amt"));
        lst.add("notify_url=" + req.getParameter("notifyURL"));
        reqType.setButtonVar(lst);

        /*
        * Construct the request values according to the Button Type and
          Button Code.
        */
        if (req.getParameter("buttonType").equalsIgnoreCase("PAYMENTPLAN")) {

          OptionSelectionDetailsType detailsType = new OptionSelectionDetailsType("CreateButton");

          List<InstallmentDetailsType> insList = new ArrayList<InstallmentDetailsType>();
          InstallmentDetailsType insType = new InstallmentDetailsType();
          /*
           * (Optional) The total number of billing cycles, regardless of the duration
           * of a cycle; 1 is the default
           */
          insType.setTotalBillingCycles(Integer.parseInt(req.getParameter("billingCycles")));

          // (Optional) The base amount to bill for the cycle.
          insType.setAmount(req.getParameter("installmentAmt"));

          /*
           * (Optional) The installment cycle frequency in units, e.g. if the billing frequency is 2
           * and the billing period is Month, the billing cycle is every 2 months.
           * The default billing frequency is 1.
           */
          insType.setBillingFrequency(Integer.parseInt(req.getParameter("billingFreq")));

          /*
          *  (Optional) The installment cycle unit,
          *  which is one of the following values:

             NoBillingPeriodType - None (default)
             Day
             Week
             SemiMonth
             Month
             Year
          */
          insType.setBillingPeriod(BillingPeriodType.fromValue(req.getParameter("billingPeriod")));
          insList.add(insType);

          /*
          *  (Optional) The installment option type for an OPTIONnNAME,
          *  which is one of the following values:

             FULL - Payment in full
             VARIABLE - Variable installments
             EMI - Equal installments
          */
          detailsType.setOptionType(OptionTypeListType.fromValue(req.getParameter("optionType")));

          // (Optional) Information about an installment option
          detailsType.setPaymentPeriod(insList);

          // Option Details created with Menu name
          OptionDetailsType optType = new OptionDetailsType("CreateButton");
          List<OptionSelectionDetailsType> optSelectList =
              new ArrayList<OptionSelectionDetailsType>();
          optSelectList.add(detailsType);
          List<OptionDetailsType> optList = new ArrayList<OptionDetailsType>();

          // (Optional) Menu items
          optType.setOptionSelectionDetails(optSelectList);

          optList.add(optType);
          reqType.setOptionDetails(optList);
        } else if (req.getParameter("buttonType").equalsIgnoreCase("AUTOBILLING")) {

          // (Optional) HTML standard button variables
          lst.add("min_amount=" + req.getParameter("minAmt"));
        } else if (req.getParameter("buttonType").equalsIgnoreCase("GIFTCERTIFICATE")) {

          // (Optional) HTML standard button variables
          lst.add("shopping_url=" + req.getParameter("shoppingUrl"));
        } else if (req.getParameter("buttonType").equalsIgnoreCase("PAYMENT")) {

          // (Optional) HTML standard button variables
          lst.add("subtotal=" + req.getParameter("subTotal"));

        } else if (req.getParameter("buttonType").equalsIgnoreCase("SUBSCRIBE")) {

          // (Optional) HTML standard button variables
          lst.add("a3=" + req.getParameter("subAmt"));
          lst.add("p3=" + req.getParameter("subPeriod"));
          lst.add("t3=" + req.getParameter("subInterval"));
        }
        request.setBMCreateButtonRequest(reqType);
        BMCreateButtonResponseType resp = service.bMCreateButton(request);

        if (resp != null) {
          session.setAttribute("lastReq", service.getLastRequest());
          session.setAttribute("lastResp", service.getLastResponse());
          if (resp.getAck().toString().equalsIgnoreCase("SUCCESS")) {
            Map<Object, Object> map = new LinkedHashMap<Object, Object>();
            map.put("Ack", resp.getAck());

            // ID of a PayPal-hosted button or a Hosted Solution token
            map.put("Hosted Button ID", resp.getHostedButtonID());

            session.setAttribute("map", map);
            res.sendRedirect(this.getServletContext().getContextPath() + "/Response.jsp");
          } else {
            session.setAttribute("Error", resp.getErrors());
            res.sendRedirect(this.getServletContext().getContextPath() + "/Error.jsp");
          }
        }

      } else if (req.getRequestURI().contains("BMUpdateButton")) {

        BMUpdateButtonReq request = new BMUpdateButtonReq();
        BMUpdateButtonRequestType reqType = new BMUpdateButtonRequestType();
        /*
         *  (Required) The kind of button you want to update. It is one of the following values:

            BUYNOW - Buy Now button
            CART - Add to Cart button
            GIFTCERTIFICATE - Gift Certificate button
            SUBSCRIBE - Subscribe button
            DONATE - Donate button
            UNSUBSCRIBE - Unsubscribe button
            VIEWCART - View Cart button
            PAYMENTPLAN - Installment Plan button; since version 63.0
            AUTOBILLING - Automatic Billing button; since version 63.0

        Note:
         You cannot change the kind of button after the button has been created.

         */
        reqType.setButtonType(ButtonTypeType.fromValue(req.getParameter("buttonType")));
        /*
        *  (Optional) The kind of button code to create.
        *  It is one of the following values:

           HOSTED - A secure button stored on PayPal; default for all buttons except View Cart and Unsubscribe
           ENCRYPTED - An encrypted button, not stored on PayPal; default for View Cart button
           CLEARTEXT - An unencrypted button, not stored on PayPal; default for Unsubscribe button
        			Note:
        				You cannot change the kind of button code after after the button has been created.
        */
        reqType.setButtonCode(ButtonCodeType.fromValue(req.getParameter("buttonCode")));

        // (Optional) HTML standard button variables
        List<String> lst = new ArrayList<String>();
        lst.add("item_name=" + req.getParameter("itemName"));
        lst.add("amount=" + req.getParameter("amt"));
        lst.add("return=" + req.getParameter("returnURL"));
        lst.add("business=" + req.getParameter("businessMail"));
        lst.add("notify_url=" + req.getParameter("notifyURL"));

        reqType.setButtonVar(lst);
        // Construct the request values according to the Button Type and
        // Button Code
        if (req.getParameter("buttonType").equalsIgnoreCase("PAYMENTPLAN")) {

          OptionSelectionDetailsType detailsType = new OptionSelectionDetailsType("CreateButton");

          List<InstallmentDetailsType> insList = new ArrayList<InstallmentDetailsType>();
          InstallmentDetailsType insType = new InstallmentDetailsType();

          /*
           * (Optional) The total number of billing cycles, regardless of the duration
           * of a cycle; 1 is the default
           */
          insType.setTotalBillingCycles(3);

          // (Optional) The base amount to bill for the cycle.
          insType.setAmount("2.00");

          /*
           * (Optional) The installment cycle frequency in units, e.g.
           * if the billing frequency is 2 and the billing period is Month,
           * the billing cycle is every 2 months. The default billing frequency is 1.
           */
          insType.setBillingFrequency(2);

          /*
          *  (Optional) The installment cycle unit, which is one of the following values:

             NoBillingPeriodType - None (default)
             Day
             Week
             SemiMonth
             Month
             Year
          */
          insType.setBillingPeriod(BillingPeriodType.MONTH);
          insList.add(insType);
          /*
          *  (Optional) The installment option type for an OPTIONnNAME,
          *  which is one of the following values:

             FULL - Payment in full
             VARIABLE - Variable installments
             EMI - Equal installments

          Note:
          Only available for Installment Plan buttons.
          */
          detailsType.setOptionType(OptionTypeListType.EMI);

          // (Optional) Information about an installment option
          detailsType.setPaymentPeriod(insList);

          // Option Details created with Menu name
          OptionDetailsType optType = new OptionDetailsType("CreateButton");
          List<OptionSelectionDetailsType> optSelectList =
              new ArrayList<OptionSelectionDetailsType>();
          optSelectList.add(detailsType);
          List<OptionDetailsType> optList = new ArrayList<OptionDetailsType>();

          // (Optional) Menu items
          optType.setOptionSelectionDetails(optSelectList);

          optList.add(optType);
          reqType.setOptionDetails(optList);
        } else if (req.getParameter("buttonType").equalsIgnoreCase("AUTOBILLING")) {
          // (Optional) HTML standard button variables
          lst.add("min_amount=4.00");
        } else if (req.getParameter("buttonType").equalsIgnoreCase("GIFTCERTIFICATE")) {
          // (Optional) HTML standard button variables
          lst.add("shopping_url=http://www.ebay.com");
        } else if (req.getParameter("buttonType").equalsIgnoreCase("PAYMENT")) {
          // (Optional) HTML standard button variables
          lst.add("subtotal=2.00");
        } else if (req.getParameter("buttonType").equalsIgnoreCase("SUBSCRIBE")) {
          // (Optional) HTML standard button variables
          lst.add("a3=2.00");
          lst.add("p3=3");
          lst.add("t3=W");
        }

        // (Required) The ID of the hosted button you want to modify.
        reqType.setHostedButtonID(req.getParameter("hostedID"));
        request.setBMUpdateButtonRequest(reqType);

        // ## Making API call
        // Invoke the appropriate method corresponding to API in service
        // wrapper object
        BMUpdateButtonResponseType resp = service.bMUpdateButton(request);

        if (resp != null) {
          session.setAttribute("lastReq", service.getLastRequest());
          session.setAttribute("lastResp", service.getLastResponse());
          if (resp.getAck().toString().equalsIgnoreCase("SUCCESS")) {
            Map<Object, Object> map = new LinkedHashMap<Object, Object>();
            map.put("Ack", resp.getAck());

            // ID of a PayPal hosted button
            map.put("Hosted Button ID", resp.getHostedButtonID());
            session.setAttribute("map", map);
            res.sendRedirect(this.getServletContext().getContextPath() + "/Response.jsp");
          } else {
            session.setAttribute("Error", resp.getErrors());
            res.sendRedirect(this.getServletContext().getContextPath() + "/Error.jsp");
          }
        }
      } else if (req.getRequestURI().contains("BMButtonSearch")) {
        BMButtonSearchReq request = new BMButtonSearchReq();
        BMButtonSearchRequestType reqType = new BMButtonSearchRequestType();

        /*
         * (Required) Starting date for the search. The value must be in UTC/GMT format;
         * for example, 2009-08-24T05:38:48Z. No wildcards are allowed.
         */
        reqType.setStartDate(req.getParameter("startDate") + "T00:00:00.000Z");
        /*
         * (Optional) Ending date for the search. The value must be in UTC/GMT format;
         * for example, 2010-05-01T05:38:48Z. No wildcards are allowed.
         */
        reqType.setEndDate(req.getParameter("endDate") + "T23:59:59.000Z");

        request.setBMButtonSearchRequest(reqType);

        // ## Making API call
        // Invoke the appropriate method corresponding to API in service
        // wrapper object
        BMButtonSearchResponseType resp = service.bMButtonSearch(request);
        if (resp != null) {
          session.setAttribute("lastReq", service.getLastRequest());
          session.setAttribute("lastResp", service.getLastResponse());
          if (resp.getAck().toString().equalsIgnoreCase("SUCCESS")) {
            Map<Object, Object> map = new LinkedHashMap<Object, Object>();
            map.put("Ack", resp.getAck());
            Iterator<ButtonSearchResultType> iterator = resp.getButtonSearchResult().iterator();
            while (iterator.hasNext()) {
              ButtonSearchResultType result = (ButtonSearchResultType) iterator.next();

              // The hosted button ID
              map.put("ButtonType", result.getButtonType());

              // The hosted button ID
              map.put("Hosted Button ID", result.getHostedButtonID());

              // The item name
              map.put("Item Name", result.getItemName());
            }

            session.setAttribute("map", map);
            res.sendRedirect(this.getServletContext().getContextPath() + "/Response.jsp");
          } else {
            session.setAttribute("Error", resp.getErrors());
            res.sendRedirect(this.getServletContext().getContextPath() + "/Error.jsp");
          }
        }

      } else if (req.getRequestURI().contains("BMGetButtonDetails")) {

        BMGetButtonDetailsReq request = new BMGetButtonDetailsReq();
        BMGetButtonDetailsRequestType reqType = new BMGetButtonDetailsRequestType();

        // (Required) The ID of the hosted button whose details you want to obtain.
        reqType.setHostedButtonID(req.getParameter("hostedID"));

        request.setBMGetButtonDetailsRequest(reqType);

        // ## Making API call
        // Invoke the appropriate method corresponding to API in service
        // wrapper object
        BMGetButtonDetailsResponseType resp = service.bMGetButtonDetails(request);
        if (resp != null) {
          session.setAttribute("lastReq", service.getLastRequest());
          session.setAttribute("lastResp", service.getLastResponse());
          if (resp.getAck().toString().equalsIgnoreCase("SUCCESS")) {
            Map<Object, Object> map = new LinkedHashMap<Object, Object>();
            map.put("Ack", resp.getAck());
            /*
            * The kind of button. It is one of the following values:

               BUYNOW - Buy Now button
               CART - Add to Cart button
               GIFTCERTIFICATE - Gift Certificate button
               SUBSCRIBE - Subscribe button
               DONATE - Donate button
               UNSUBSCRIBE - Unsubscribe button
               VIEWCART - View Cart button
               PAYMENTPLAN - Installment Plan button; since version 63.0
               AUTOBILLING - Automatic Billing button; since version 63.0
            */
            map.put("ButtonType", resp.getButtonType());

            /*
            * The kind of button code. It is one of the following values:

               HOSTED - A secure button stored on PayPal
               ENCRYPTED - An encrypted button, not stored on PayPal
               CLEARTEXT - An unencrypted button, not stored on PayPal
            */
            map.put("ButtonCode", resp.getButtonCode());

            // HTML code for web pages
            map.put("Website", resp.getWebsite());
            session.setAttribute("map", map);
            res.sendRedirect(this.getServletContext().getContextPath() + "/Response.jsp");
          } else {
            session.setAttribute("Error", resp.getErrors());
            res.sendRedirect(this.getServletContext().getContextPath() + "/Error.jsp");
          }
        }

      } else if (req.getRequestURI().contains("BMManageButtonStatus")) {
        BMManageButtonStatusReq request = new BMManageButtonStatusReq();
        BMManageButtonStatusRequestType reqType = new BMManageButtonStatusRequestType();

        // (Required) The ID of the hosted button whose status you want to change.
        reqType.setHostedButtonID(req.getParameter("hostedID"));

        /*
        *  (Required) The new status of the button. It is one of the following values:
        			 DELETE - the button is deleted from PayPal
        */
        reqType.setButtonStatus(ButtonStatusType.fromValue(req.getParameter("buttonStatus")));
        request.setBMManageButtonStatusRequest(reqType);

        // ## Making API call
        // Invoke the appropriate method corresponding to API in service
        // wrapper object
        BMManageButtonStatusResponseType resp = service.bMManageButtonStatus(request);

        if (resp != null) {
          session.setAttribute("lastReq", service.getLastRequest());
          session.setAttribute("lastResp", service.getLastResponse());
          if (resp.getAck().toString().equalsIgnoreCase("SUCCESS")) {
            Map<Object, Object> map = new LinkedHashMap<Object, Object>();
            map.put("Ack", resp.getAck());
            session.setAttribute("map", map);
            res.sendRedirect(this.getServletContext().getContextPath() + "/Response.jsp");
          } else {
            session.setAttribute("Error", resp.getErrors());
            res.sendRedirect(this.getServletContext().getContextPath() + "/Error.jsp");
          }
        }

      } else if (req.getRequestURI().contains("BMGetInventory")) {
        BMGetInventoryReq request = new BMGetInventoryReq();
        BMGetInventoryRequestType reqType = new BMGetInventoryRequestType();
        // (Required) The ID of the hosted button whose inventory information you want to obtain.
        reqType.setHostedButtonID(req.getParameter("hostedID"));
        request.setBMGetInventoryRequest(reqType);

        // ## Making API call
        // Invoke the appropriate method corresponding to API in service
        // wrapper object
        BMGetInventoryResponseType resp = service.bMGetInventory(request);

        if (resp != null) {
          if (resp.getAck().toString().equalsIgnoreCase("SUCCESS")) {
            session.setAttribute("lastReq", service.getLastRequest());
            session.setAttribute("lastResp", service.getLastResponse());
            if (resp.getAck().toString().equalsIgnoreCase("SUCCESS")) {
              Map<Object, Object> map = new LinkedHashMap<Object, Object>();
              map.put("Ack", resp.getAck());
              /*
              * Whether to track inventory levels associated with the button.
              * It is one of the following values:

                 0 - do not track inventory
                 1 - track inventory
              */
              map.put("TrackInv", resp.getTrackInv());

              /*
               * Whether to track the gross profit associated with inventory changes.
               * It is one of the following values:

                  0 - do not track the gross profit
                  1 - track the gross profit

              Note:
              The gross profit is calculated as the price of the item less its cost,
              multiplied by the change in the inventory level since the last call to
              BMSetInventory.
               */
              map.put("TrackPnl", resp.getTrackPnl());
              // The ID of the hosted button whose inventory you want to set.
              map.put("Hosted Button ID", resp.getHostedButtonID());

              // The cost of the item associated with this button
              map.put("Item Cost", resp.getItemTrackingDetails().getItemCost());

              // The current inventory level of the item associated with this button
              map.put("Item Quantity", resp.getItemTrackingDetails().getItemQty());
              session.setAttribute("map", map);
              res.sendRedirect(this.getServletContext().getContextPath() + "/Response.jsp");
            }

          } else {
            session.setAttribute("Error", resp.getErrors());
            res.sendRedirect(this.getServletContext().getContextPath() + "/Error.jsp");
          }
        }
      } else if (req.getRequestURI().contains("BMSetInventory")) {
        BMSetInventoryReq request = new BMSetInventoryReq();
        BMSetInventoryRequestType reqType = new BMSetInventoryRequestType();

        // API Version
        reqType.setVersion("82");

        // (Required) The ID of the hosted button whose inventory you want to set.
        reqType.setHostedButtonID(req.getParameter("hostedID"));

        /*
        *  (Required) Whether to track inventory levels associated with the button.
        *  It is one of the following values:

           0 - do not track inventory
           1 - track inventory
        */
        reqType.setTrackInv(req.getParameter("trackInv"));

        /*
        *  (Required) Whether to track the gross profit associated with inventory changes.
        *  It is one of the following values:

           0 - do not track the gross profit
           1 - track the gross profit
        Note: The gross profit is calculated as the price of the item less its cost,
        multiplied by the change in the inventory level since the last call to
        BMSetInventory
        */
        reqType.setTrackPnl(req.getParameter("trackPnl"));
        ItemTrackingDetailsType itemTrackDetails = new ItemTrackingDetailsType();

        /*
         * The quantity you want to specify for the item associated with this button.
         * Specify either the absolute quantity in this field or the change in quantity in
         * the quantity delta field
         */
        itemTrackDetails.setItemQty(req.getParameter("itemQty"));

        // (Optional) The cost of the item associated with this button
        itemTrackDetails.setItemCost(req.getParameter("itemCost"));
        reqType.setItemTrackingDetails(itemTrackDetails);
        request.setBMSetInventoryRequest(reqType);

        // ## Making API call
        // Invoke the appropriate method corresponding to API in service
        // wrapper object
        BMSetInventoryResponseType resp = service.bMSetInventory(request);
        res.setContentType("text/html");
        if (resp != null) {
          session.setAttribute("lastReq", service.getLastRequest());
          session.setAttribute("lastResp", service.getLastResponse());
          if (resp.getAck().toString().equalsIgnoreCase("SUCCESS")) {
            Map<Object, Object> map = new LinkedHashMap<Object, Object>();
            map.put("Ack", resp.getAck());
            session.setAttribute("map", map);
            res.sendRedirect(this.getServletContext().getContextPath() + "/Response.jsp");
          } else {

            session.setAttribute("Error", resp.getErrors());
            res.sendRedirect(this.getServletContext().getContextPath() + "/Error.jsp");
          }
        }
      }

    } catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (ParserConfigurationException e) {
      e.printStackTrace();
    } catch (SSLConfigurationException e) {
      e.printStackTrace();
    } catch (InvalidCredentialException e) {
      e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    } catch (HttpErrorException e) {
      e.printStackTrace();
    } catch (InvalidResponseDataException e) {
      e.printStackTrace();
    } catch (ClientActionRequiredException e) {
      e.printStackTrace();
    } catch (MissingCredentialException e) {
      e.printStackTrace();
    } catch (OAuthException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  /** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // TODO Auto-generated method stub
    HttpSession session = request.getSession();
    session.setAttribute("url", request.getRequestURI());
    session.setAttribute(
        "relatedUrl",
        "<ul><li><a href='Pay'>Pay</a></li><li><a href='Refund'>Refund</a></li><li><a href='Preapproval'>Preapproval</a></li></ul>");
    RequestEnvelope requestEnvelope = new RequestEnvelope("en_US");

    List<CurrencyType> currency = new ArrayList<CurrencyType>();
    CurrencyType type1 = new CurrencyType();
    /** (Required) The amount to be converted. */
    if (request.getParameter("amount") != "")
      type1.setAmount(Double.parseDouble(request.getParameter("amount")));

    /** (Required) The currency code. */
    if (request.getParameter("code") != "") type1.setCode(request.getParameter("code"));
    currency.add(type1);
    CurrencyList baseAmountList = new CurrencyList(currency);
    List<String> currencyCode = new ArrayList<String>();

    /** (Required) A list of currencies to convert to. */
    if (request.getParameter("convertTo") != "")
      currencyCode.add(request.getParameter("convertTo"));

    CurrencyCodeList convertToCurrencyList = new CurrencyCodeList(currencyCode);

    ConvertCurrencyRequest req =
        new ConvertCurrencyRequest(requestEnvelope, baseAmountList, convertToCurrencyList);
    /**
     * (Optional)The conversion type allows you to determine the converted amounts for a PayPal user
     * in different currency conversion scenarios, e.g., sending a payment in a different currency
     * than what this user holds, accepting payment in a different currency than what the user
     * holds, or converting a balance to a different currency than the user holds.. The default
     * value is SENDER_SIDE
     */
    if (request.getParameter("conversionType") != "")
      req.setConversionType(request.getParameter("conversionType"));
    /**
     * (Optional)The two-character ISO code for the country where the function is supposed to
     * happen. The default value is US.
     */
    if (request.getParameter("countryCode") != "")
      req.setCountryCode(request.getParameter("countryCode"));

    // Configuration map containing signature credentials and other required configuration.
    // For a full list of configuration parameters refer in wiki page
    // (https://github.com/paypal/sdk-core-java/wiki/SDK-Configuration-Parameters)
    Map<String, String> configurationMap = Configuration.getAcctAndConfig();

    // Creating service wrapper object to make an API call by loading configuration map.
    AdaptivePaymentsService service = new AdaptivePaymentsService(configurationMap);

    response.setContentType("text/html");
    try {

      // if (request.getParameter("ConvertBtn").equals("convert")) {
      ConvertCurrencyResponse resp = service.convertCurrency(req);
      if (resp != null) {
        session.setAttribute("RESPONSE_OBJECT", resp);
        session.setAttribute("lastReq", service.getLastRequest());
        session.setAttribute("lastResp", service.getLastResponse());
        if (resp.getResponseEnvelope().getAck().toString().equalsIgnoreCase("SUCCESS")) {
          Map<Object, Object> map = new LinkedHashMap<Object, Object>();
          map.put("Ack", resp.getResponseEnvelope().getAck());

          /**
           * Correlation identifier. It is a 13-character, alphanumeric string (for example,
           * db87c705a910e) that is used only by PayPal Merchant Technical Support. Note: You must
           * log and store this data for every response you receive. PayPal Technical Support uses
           * the information to assist with reported issues.
           */
          map.put("Correlation ID", resp.getResponseEnvelope().getCorrelationId());

          /**
           * Date on which the response was sent, for example: 2012-04-02T22:33:35.774-07:00 Note:
           * You must log and store this data for every response you receive. PayPal Technical
           * Support uses the information to assist with reported issues.
           */
          map.put("Time Stamp", resp.getResponseEnvelope().getTimestamp());
          Iterator<CurrencyConversionList> iterator =
              resp.getEstimatedAmountTable().getCurrencyConversionList().iterator();
          int index = 1;
          while (iterator.hasNext()) {
            CurrencyConversionList currencyList = iterator.next();
            map.put("Amount to be converted" + index, currencyList.getBaseAmount().getAmount());
            Iterator<CurrencyType> currencyIterator =
                currencyList.getCurrencyList().getCurrency().iterator();
            int innerIndex = 1;
            while (currencyIterator.hasNext()) {
              CurrencyType currencyType = currencyIterator.next();
              map.put("Currency" + innerIndex, currencyType.getCode());
              map.put("Converted Amount" + innerIndex, currencyType.getAmount());
              innerIndex++;
            }
            index++;
          }
          session.setAttribute("map", map);
          response.sendRedirect("Response.jsp");
        } else {
          session.setAttribute("Error", resp.getError());
          response.sendRedirect("Error.jsp");
        }
      }

      // }
    } catch (SSLConfigurationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InvalidCredentialException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (HttpErrorException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InvalidResponseDataException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (ClientActionRequiredException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (MissingCredentialException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (OAuthException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  /** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // TODO Auto-generated method stub
    HttpSession session = request.getSession();
    session.setAttribute("url", request.getRequestURI());
    session.setAttribute(
        "relatedUrl",
        "<ul><li><a href='RequestPermissions'>RequestPermissions</a></li><li><a href='GetAccessToken'>GetAccessToken</a></li><li><a href='GetPermissions'>GetPermissions</a></li><li><a href='CancelPermissions'>CancelPermissions</a></li><li><a href='GetBasicPersonalData'>GetBasicPersonalData</a></li><li><a href='GetAdvancedPersonalData'>GetAdvancedPersonalData</a></li></ul>");

    GetAdvancedPersonalDataRequest req = new GetAdvancedPersonalDataRequest();
    /*
     * (Required) RFC 3066 language in which error messages are returned; by
     * default it is en_US, which is the only language currently supported.
     */
    RequestEnvelope requestEnvelope = new RequestEnvelope("en_US");
    req.setRequestEnvelope(requestEnvelope);

    /*
     * The attributes whose value you are requesting. You specify one or
     * more of the following URIs:
     *
     * http://axschema.org/birthDate - Date of birth
     * http://axschema.org/contact/postalCode/home - Postcode
     * http://schema.openid.net/contact/street1 - Street1
     * http://schema.openid.net/contact/street2 - Street2
     * http://axschema.org/contact/city/home - City
     * http://axschema.org/contact/state/home - State
     * http://axschema.org/contact/phone/default - Phone
     */
    List<PersonalAttribute> lst = new ArrayList<PersonalAttribute>();
    String check[] = request.getParameterValues("attr");
    for (int i = 0; i < check.length; i++) {
      lst.add(PersonalAttribute.fromValue(check[i]));
    }
    PersonalAttributeList attribute = new PersonalAttributeList();
    attribute.setAttribute(lst);
    req.setAttributeList(attribute);

    SignatureCredential cred = null;
    if (request.getParameter("accessToken") != null
        && request.getParameter("accessToken").length() > 0
        && request.getParameter("tokenSecret") != null
        && request.getParameter("tokenSecret").length() > 0) {
      // The access token that identifies a set of permissions.
      // The secret associated with the access token.
      ThirdPartyAuthorization thirdPartyAuth =
          new TokenAuthorization(
              request.getParameter("accessToken"), request.getParameter("tokenSecret"));

      cred =
          new SignatureCredential(
              "jb-us-seller_api1.paypal.com",
              "WX4WTU3S8MY44S7F",
              "AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy");

      cred.setApplicationId("APP-80W284485P519543T");
      cred.setThirdPartyAuthorization(thirdPartyAuth);
    }
    // ## Creating service wrapper object
    // Creating service wrapper object to make API call
    // Configuration map containing mode and other required configuration.
    // For a full list of configuration parameters refer in wiki page.
    // (https://github.com/paypal/sdk-core-java/wiki/SDK-Configuration-Parameters)
    PermissionsService service = new PermissionsService(Configuration.getAcctAndConfig());
    try {

      // ## Making API call
      // Invoke the appropriate method corresponding to API in service
      // wrapper object
      GetAdvancedPersonalDataResponse resp = null;
      if (cred != null) {
        resp = service.getAdvancedPersonalData(req, cred);
      } else {
        resp = service.getAdvancedPersonalData(req);
      }
      response.setContentType("text/html");
      if (resp != null) {
        session.setAttribute("RESPONSE_OBJECT", resp);
        session.setAttribute("lastReq", service.getLastRequest());
        session.setAttribute("lastResp", service.getLastResponse());
        if (resp.getResponseEnvelope().getAck().toString().equalsIgnoreCase("SUCCESS")) {
          Map<Object, Object> map = new LinkedHashMap<Object, Object>();
          /*
           * Acknowledgement code. It is one of the following values:
           *
           * Success - The operation completed successfully. Failure -
           * The operation failed. Warning - Warning.
           * SuccessWithWarning - The operation completed
           * successfully; however, there is a warning message.
           * FailureWithWarning - The operation failed with a warning
           * message.
           */
          map.put("Ack", resp.getResponseEnvelope().getAck());
          Iterator<PersonalData> iterator = resp.getResponse().getPersonalData().iterator();
          int index = 1;
          while (iterator.hasNext()) {
            PersonalData personalData = iterator.next();
            /*
             * The attributes whose values you are requesting. You
             * specify one or more of the following URIs:
             *
             * http://axschema.org/namePerson/first - First name
             * http://axschema.org/namePerson/last - last name
             * http://axschema.org/contact/email - Email
             * http://schema.openid.net/contact/fullname - Full name
             * http://openid.net/schema/company/name - Business name
             * http://axschema.org/contact/country/home - Country
             * https://www.paypal.com/webapps/auth/schema/payerID -
             * Payer ID
             */
            map.put("PersonalDataKey" + index, personalData.getPersonalDataKey().getValue());

            // The value associated with the key
            map.put("PersonalDataValue" + index, personalData.getPersonalDataValue());
            index++;
          }

          session.setAttribute("map", map);
          response.sendRedirect("Response.jsp");
        } else {
          session.setAttribute("Error", resp.getError());
          response.sendRedirect("Error.jsp");
        }
      }

    } catch (OAuthException e) {
      // TODO: handle exception
      e.printStackTrace();
    } catch (SSLConfigurationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InvalidCredentialException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (HttpErrorException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InvalidResponseDataException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (ClientActionRequiredException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (MissingCredentialException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  /** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    InvoiceType invoiceType = new InvoiceType();
    invoiceType.setMerchantEmail(request.getParameter("merchantEmail"));
    invoiceType.setPayerEmail(request.getParameter("payerEmail"));
    List<InvoiceItemType> items = new ArrayList<InvoiceItemType>();
    items.add(
        new InvoiceItemType(
            request.getParameter("item_name1"),
            Double.valueOf(request.getParameter("item_quantity1")),
            Double.valueOf(request.getParameter("item_unitPrice1"))));
    items.add(
        new InvoiceItemType(
            request.getParameter("item_name2"),
            Double.valueOf(request.getParameter("item_quantity2")),
            Double.valueOf(request.getParameter("item_unitPrice2"))));
    invoiceType.setItems(items);
    invoiceType.setCurrencyCode(request.getParameter("currencyCode"));
    invoiceType.setPaymentTerms(PaymentTermsType.valueOf(request.getParameter("paymentTerms")));

    RequestEnvelope env = new RequestEnvelope("en_US");
    try {

      if (request.getParameter("CreateBtn") != null) {
        if (request.getParameter("CreateBtn").equals("CreateInvoice")) {
          CreateInvoiceRequest createRequest = new CreateInvoiceRequest(env, invoiceType);
          InvoiceService invoiceSrvc =
              new InvoiceService(
                  this.getServletContext().getRealPath("/") + "/WEB-INF/sdk_config.properties");

          CreateInvoiceResponse createResp = invoiceSrvc.createInvoice(createRequest);
          response.getWriter().println("Ack:" + createResp.getResponseEnvelope().getAck());
          response.getWriter().println("InvoiceID:" + createResp.getInvoiceID());
          response.getWriter().println("InvoiceNumber:" + createResp.getInvoiceNumber());

        } else if (request.getParameter("CreateBtn").equals("CreateAndSendInvoice")) {
          CreateAndSendInvoiceRequest createRequest =
              new CreateAndSendInvoiceRequest(env, invoiceType);
          InvoiceService invoiceSrvc =
              new InvoiceService(
                  this.getServletContext().getRealPath("/") + "/WEB-INF/sdk_config.properties");

          CreateAndSendInvoiceResponse createResp = invoiceSrvc.createAndSendInvoice(createRequest);
          response.getWriter().println("Ack:" + createResp.getResponseEnvelope().getAck());
          response.getWriter().println("InvoiceID:" + createResp.getInvoiceID());
          response.getWriter().println("InvoiceNumber:" + createResp.getInvoiceNumber());
        } else {
          response.getWriter().println("Unknown request - click one of the buttons");
        }
      }

    } catch (SSLConfigurationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InvalidCredentialException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (HttpErrorException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InvalidResponseDataException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (ClientActionRequiredException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (MissingCredentialException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }