+package iotcloud;
+import java.io.*;
+import java.net.*;
+import java.util.Arrays;
+
+class CloudComm {
+ String baseurl;
+ CloudComm(String _baseurl) {
+ this.baseurl=_baseurl;
+ }
+
+ private URL buildRequest(boolean isput, long sequencenumber, long maxentries) throws IOException {
+ String reqstring=isput?"req=putslot":"req=getslot";
+ String urlstr=baseurl+"?"+reqstring+"&seq="+sequencenumber;
+ if (maxentries != 0)
+ urlstr += "&max="+maxentries;
+ return new URL(urlstr);
+ }
+
+ public Slot[] putSlot(Slot slot, int max) throws IOException{
+ long sequencenumber=slot.getSequenceNumber();
+ URL url=buildRequest(true, sequencenumber, max);
+ URLConnection con=url.openConnection();
+ HttpURLConnection http = (HttpURLConnection) con;
+ http.setRequestMethod("POST");
+ http.setFixedLengthStreamingMode(slot.getBytes().length);
+ http.setDoOutput(true);
+ http.connect();
+ OutputStream os=http.getOutputStream();
+ os.write(slot.getBytes());
+ System.out.println(http.getResponseMessage());
+
+ InputStream is=http.getInputStream();
+ DataInputStream dis=new DataInputStream(is);
+ byte[] resptype=new byte[7];
+ dis.readFully(resptype);
+ if (Arrays.equals(resptype, "getslot".getBytes()))
+ return processSlots(dis, sequencenumber);
+ else if (Arrays.equals(resptype, "putslot".getBytes()))
+ return null;
+ else
+ throw new Error("Bad response to putslot");
+ }
+
+ public Slot[] getSlots(long sequencenumber) throws IOException {
+ URL url=buildRequest(false, sequencenumber, 0);
+ URLConnection con=url.openConnection();
+ HttpURLConnection http = (HttpURLConnection) con;
+ http.setRequestMethod("POST");
+ http.connect();
+ System.out.println(http.getResponseMessage());
+ InputStream is=http.getInputStream();
+
+ DataInputStream dis=new DataInputStream(is);
+ byte[] resptype=new byte[7];
+ dis.readFully(resptype);
+ if (!Arrays.equals(resptype, "getslot".getBytes()))
+ throw new Error("Bad Response: "+new String(resptype));
+ else
+ return processSlots(dis, sequencenumber);
+ }
+
+ Slot[] processSlots(DataInputStream dis, long sequencenumber) throws IOException {
+ int numberofslots=dis.readInt();
+ int[] sizesofslots=new int[numberofslots];
+ Slot[] slots=new Slot[numberofslots];
+ System.out.println(numberofslots);
+ for(int i=0;i<numberofslots;i++)
+ sizesofslots[i]=dis.readInt();
+
+ for(int i=0;i<numberofslots;i++) {
+ byte[] data=new byte[sizesofslots[i]];
+ dis.readFully(data);
+ slots[i]=new Slot(sequencenumber+i, data);
+ }
+ dis.close();
+ return slots;
+ }
+}