18f7f30cca29a14a68f51e289ef7fb11413ebdda
[iotcloud.git] / src / java / iotcloud / CloudComm.java
1 package iotcloud;
2 import java.io.*;
3 import java.net.*;
4 import java.util.Arrays;
5
6 class CloudComm {
7         String baseurl;
8         CloudComm(String _baseurl) {
9                 this.baseurl=_baseurl;
10         }
11         
12         private URL buildRequest(boolean isput, long sequencenumber, long maxentries) throws IOException {
13                 String reqstring=isput?"req=putslot":"req=getslot";
14                 String urlstr=baseurl+"?"+reqstring+"&seq="+sequencenumber;
15                 if (maxentries != 0)
16                         urlstr += "&max="+maxentries;
17                 return new URL(urlstr);
18         }
19
20         public Slot[] putSlot(Slot slot, int max) throws IOException{
21                 long sequencenumber=slot.getSequenceNumber();
22                 URL url=buildRequest(true, sequencenumber, max);
23                 URLConnection con=url.openConnection();
24                 HttpURLConnection http = (HttpURLConnection) con;
25                 http.setRequestMethod("POST");
26                 http.setFixedLengthStreamingMode(slot.getBytes().length);
27                 http.setDoOutput(true);
28                 http.connect();
29                 OutputStream os=http.getOutputStream();
30                 os.write(slot.getBytes());
31                 System.out.println(http.getResponseMessage());
32
33                 InputStream is=http.getInputStream();
34                 DataInputStream dis=new DataInputStream(is);
35                 byte[] resptype=new byte[7];
36                 dis.readFully(resptype);
37                 if (Arrays.equals(resptype, "getslot".getBytes()))
38                         return processSlots(dis, sequencenumber);
39                 else if (Arrays.equals(resptype, "putslot".getBytes()))
40                         return null;
41                 else
42                         throw new Error("Bad response to putslot");
43         }
44         
45         public Slot[] getSlots(long sequencenumber) throws IOException {
46                 URL url=buildRequest(false, sequencenumber, 0);
47                 URLConnection con=url.openConnection();
48                 HttpURLConnection http = (HttpURLConnection) con;
49                 http.setRequestMethod("POST");
50                 http.connect();
51                 System.out.println(http.getResponseMessage());
52                 InputStream is=http.getInputStream();
53
54                 DataInputStream dis=new DataInputStream(is);
55                 byte[] resptype=new byte[7];
56                 dis.readFully(resptype);
57                 if (!Arrays.equals(resptype, "getslot".getBytes()))
58                         throw new Error("Bad Response: "+new String(resptype));
59                 else
60                         return processSlots(dis, sequencenumber);
61         }
62                 
63         Slot[] processSlots(DataInputStream dis, long sequencenumber) throws IOException {
64                 int numberofslots=dis.readInt();
65                 int[] sizesofslots=new int[numberofslots];
66                 Slot[] slots=new Slot[numberofslots];
67                 System.out.println(numberofslots);
68                 for(int i=0;i<numberofslots;i++)
69                         sizesofslots[i]=dis.readInt();
70
71                 for(int i=0;i<numberofslots;i++) {
72                         byte[] data=new byte[sizesofslots[i]];
73                         dis.readFully(data);
74                         slots[i]=new Slot(sequencenumber+i, data);
75                 }
76                 dis.close();
77                 return slots;
78         }
79 }