iframe_demo_form.jsp

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>IFrame Demo</title>
</head>
<body bgcolor="#ffffff" >
<p> </p>

<table align="center" bgcolor="#004000" border="0" cellpadding="3" cellspacing="1" width="780">
  <tbody>
  <tr>
    <td> </td>
  </tr>
  <tr>
    <td bgcolor="#ffffff">
      <p align="center"> </p>

      <h1 align="center">IFrame Demo</h1>

      <h2 align="left">Enter panelist profile:</h2>

      <form action="iframe_demo.jsp" method="post" name="entryForm">
        <p>Birthdate:  <input maxlength="10" name="birthdate" size="10" type="text" style="color:#888;"
                                   value="yyyy-mm-dd" onfocus="inputFocus(this)" onblur="inputBlur(this)"/></p>

        <p>Gender:  <select name="gender">
          <option>Male</option>
          <option>Female</option>
        </select></p>

        <p>Postal Code:  <input maxlength="10" name="postalCode" size="10" type="text" /></p>

        <p>Country:  <input maxlength="2" name="country" size="2" type="text" /></p>

        <p>Unit Name:  <input name="unitName" size="20" type="text" /></p>

        <p>Conversion %:  <input maxlength="3" name="unitConv" size="3" type="number" /></p>

        <p><input name="submit" type="submit" value="Submit" /><input name="reset" type="reset" value="Reset" /></p>
      </form>

      <p> </p>

      <p> </p>
    </td>
  </tr>
  <tr>
    <td bgcolor="#004000"> </td>
  </tr>
  </tbody>
</table>

<p> </p>

<p> </p>

</body>

<script>
  function inputFocus(i){
    if(i.value==i.defaultValue){ i.value=""; i.style.color="#000"; }
  }
  function inputBlur(i){
    if(i.value==""){ i.value=i.defaultValue; i.style.color="#888"; }
  }
</script>
</html>

iframe_demo.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="org.bson.types.ObjectId" %>
<%@ page import="com.researchforgood.api.RFGAPI" %>
<%@ page import="org.json.simple.parser.JSONParser" %>
<%@ page import="org.json.simple.JSONObject" %>
<%@ page import="org.json.simple.parser.ParseException" %>
<html>
<head>
    <title>IFrame Demo</title>
</head>
<body>
    <h1>IFrame Demo</h1>
    <%
        StringBuilder sb = new StringBuilder("{ command: \"iframe/query/1\", rid: \"").append(new ObjectId()).append("\", ");

        String birthdate = request.getParameter("birthdate");
        if (birthdate == null || birthdate.isEmpty() || birthdate.equalsIgnoreCase("yyyy-mm-dd")) {
            %><p>Missing birthday</p><%
            return;
        }
        sb.append("birthday:\"").append(birthdate).append("\", ");

        String gender = request.getParameter("gender");
        sb.append("gender:\"").append(gender).append("\", ");

        String postalCode = request.getParameter("postalCode");
        if (postalCode == null || postalCode.isEmpty()) {
            %><p>Missing postal code</p><%
            return;
        }
        sb.append("postalCode:\"").append(postalCode).append("\", ");

        String country = request.getParameter("country");
        if (country == null || country.length() != 2) {
            %><p>Missing or invalid country</p><%
            return;
        }
        sb.append("country:\"").append(country).append("\"");

        String unitName = request.getParameter("unitName");
        if (unitName != null && !unitName.isEmpty()) {
            sb.append(", unitName:\"").append(request.getParameter("unitName")).append("\"");
        }

        String unitConv = request.getParameter("unitConv");
        if (unitConv != null && !unitConv.isEmpty()) {
           sb.append(", unitConv:\"").append(unitConv).append("\" }");
        }

        sb.append(" }");

        System.out.println(sb.toString());
        String resp = RFGAPI.sendCommand(sb.toString());
        System.out.println(resp);

        JSONParser jsonParser = new JSONParser();
        JSONObject jsonObject = null;
        try {
            jsonObject = (JSONObject) jsonParser.parse(resp);
        } catch (ParseException e) {
            //
        }
        if (jsonObject == null) {
            %><p>Failed to parse API response</p><%
            return;
        }
        Long result = (Long) jsonObject.get("result");
        if (result != 0) {
            %><p><% out.print(jsonObject.get("message")); %></p><%
            return;
        }
        JSONObject respObj = (JSONObject) jsonObject.get("response");
        String offer = (String) respObj.get("offer");
        if (offer == null || offer.isEmpty() || offer.equalsIgnoreCase("no")) {
            %><p>No offer</p><%
        } else {
            String offerURL = (String) respObj.get("offerURL");
            %><p><b>Offer URL:  </b><a href="<%=offerURL%>" target="_blank"><%=offerURL%></a></p><%
        }
    %>

</body>
</html>

RFGAPI.java

package com.researchforgood.api;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.io.*;
import java.net.*;
import java.nio.charset.Charset;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public class RFGAPI
{
     private static final String apiURL = "http://www.saysoforgood.com/API";
     private static final String apid = "533dc12aa46ba5da8d801f84"; // put your key here
     private static final String secretHex = "5a7540114c1009b363dc19bf75b0e7bc"; // put your secret here

     public static void main(String[] args) throws Exception {
          String command = "{ \"command\" : \"test/copy/1\" , \"data1\" : \"THIS IS A TEST\"}";
          String response = sendCommand(command);
          System.out.println(response);
     }

     public static String sendCommand(String command) throws NoSuchAlgorithmException, InvalidKeyException, IOException {
          long time = System.currentTimeMillis()/1000;
          Mac mac = Mac.getInstance("HmacSHA1");
          mac.init(new SecretKeySpec(DatatypeConverter.parseHexBinary(secretHex),"HmacSHA1"));
          byte[] hash = mac.doFinal((time + command).getBytes(Charset.forName("UTF-8")));
          String url = apiURL + "?apid="+apid+"&time="+time+"&hash="+DatatypeConverter.printHexBinary(hash);

          HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
          con.setDoOutput(true);
          con.setRequestMethod("POST");
          con.setRequestProperty("Content-Type", "application/json");
          con.setRequestProperty("Content-Length", String.valueOf(command.length()));
          OutputStream os = con.getOutputStream();
          try {
               os.write(command.getBytes("UTF-8"));
               os.flush();
          } finally {
               os.close();
          }

          BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
          String line;
          StringBuilder buffer = new StringBuilder();
          try {
               while ((line = in.readLine()) != null) {
                    buffer.append(line);
               }
          } finally {
               in.close();
          }

          return buffer.toString();
     }
}