View Javadoc
1   package com.github.davidmoten.aws.lw.client;
2   
3   import java.io.BufferedOutputStream;
4   import java.io.FileNotFoundException;
5   import java.io.FileOutputStream;
6   import java.io.IOException;
7   import java.io.OutputStream;
8   import java.nio.charset.StandardCharsets;
9   import java.util.List;
10  import java.util.Map;
11  import java.util.concurrent.TimeUnit;
12  import java.util.stream.Collectors;
13  
14  import org.davidmoten.kool.Stream;
15  
16  import com.github.davidmoten.aws.lw.client.internal.util.Util;
17  import com.github.davidmoten.aws.lw.client.xml.XmlElement;
18  import com.github.davidmoten.aws.lw.client.xml.builder.Xml;
19  
20  public final class ClientMain {
21  
22      private static final boolean TEST_CHUNKED = false;
23  
24      public static void main(String[] args)
25              throws InterruptedException, FileNotFoundException, IOException {
26          String regionName = "ap-southeast-2";
27          String accessKey = System.getProperty("accessKey");
28          String secretKey = System.getProperty("secretKey");
29  
30          Credentials credentials = Credentials.of(accessKey, secretKey);
31          Client sqs = Client //
32                  .sqs() //
33                  .region(regionName) //
34                  .credentials(credentials) //
35                  .build();
36          Client s3 = Client.s3().from(sqs).build();
37          System.out.println(s3.path("moten-fixes", "Neo4j_Graph_Algorithms_r3.mobi").presignedUrl(5,
38                  TimeUnit.MINUTES));
39          {
40              // create bucket
41              String bucketName = "temp-bucket-" + System.currentTimeMillis();
42              String createXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
43                      + "<CreateBucketConfiguration xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\">\n"
44                      + "   <LocationConstraint>" + regionName + "</LocationConstraint>\n"
45                      + "</CreateBucketConfiguration>";
46              s3.path(bucketName) //
47                      .method(HttpMethod.PUT) //
48                      .requestBody(createXml) //
49                      .execute();
50  
51              String objectName = "ExampleObject.txt";
52              Map<String, List<String>> h = s3 //
53                      .path(bucketName, objectName) //
54                      .method(HttpMethod.PUT) //
55                      .requestBody("hi there") //
56                      .metadata("category", "something") //
57                      .response() //
58                      .headers();
59              System.out.println("put object completed, headers:");
60              h.entrySet().stream().forEach(x -> System.out.println("  " + x));
61  
62              try {
63                  String uploadId = s3 //
64                          .path(bucketName, objectName) //
65                          .query("uploads") //
66                          .method(HttpMethod.POST) //
67                          .responseAsXml() //
68                          .content("UploadId");
69                  System.out.println("uploadId=" + uploadId);
70  
71                  // upload part 1
72                  String text1 = Stream.repeatElement("hello").take(1200000).join(" ").get();
73                  String tag1 = s3.path(bucketName, objectName) //
74                          .method(HttpMethod.PUT) //
75                          .query("partNumber", "1") //
76                          .query("uploadId", uploadId) //
77                          .requestBody(text1) //
78                          .response() //
79                          .headers() //
80                          .get("ETag") //
81                          .get(0);
82  
83                  // upload part 2
84                  String text2 = Stream.repeatElement("there").take(1200000).join(" ").get();
85                  String tag2 = s3.path(bucketName, objectName) //
86                          .method(HttpMethod.PUT) //
87                          .query("partNumber", "2") //
88                          .query("uploadId", uploadId) //
89                          .requestBody(text2) //
90                          .response() //
91                          .headers() //
92                          .get("ETag") //
93                          .get(0);
94                  System.out.println("tags=" + tag1 + " " + tag2);
95                  String xml = Xml //
96                          .create("CompleteMultipartUpload") //
97                          .attribute("xmlns", "http://s3.amazonaws.com/doc/2006-03-01/") //
98                          .element("Part") //
99                          .element("ETag").content(tag1.substring(1, tag1.length() - 1)) //
100                         .up() //
101                         .element("PartNumber").content("1") //
102                         .up().up() //
103                         .element("Part") //
104                         .element("ETag").content(tag2.substring(1, tag2.length() - 1)) //
105                         .up() //
106                         .element("PartNumber").content("2") //
107                         .toString();
108                 System.out.println(xml);
109 
110                 s3.path(bucketName, objectName) //
111                         .method(HttpMethod.POST) //
112                         .query("uploadId", uploadId) //
113                         .header("Content-Type", "application/xml") //
114                         .unsignedPayload() //
115                         .requestBody(xml) //
116                         .execute();
117 
118             } catch (Throwable e) {
119                 e.printStackTrace();
120             }
121 
122 //            {
123 //                Response r = s3.path(bucketName, objectName) //
124 //                        .method(HttpMethod.HEAD) //
125 //                        .response();
126 //                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("E, d MMM Y hh:mm:ss z",Locale.ENGLISH).withZone(ZoneId.of("GMT"));
127 //                System.out.println("parsed=" + dtf.parse(r.headers().get("Last-Modified").get(0)));
128 //                System.exit(0);
129 //                
130 //            }
131 
132             try {
133                 s3.path(bucketName + "/" + "not-there") //
134                         .responseAsUtf8();
135             } catch (Throwable e) {
136                 e.printStackTrace(System.out);
137             }
138 
139             try {
140                 Client.s3() //
141                         .region(regionName) //
142                         .credentials(credentials) //
143                         .exception(r -> !r.isOk(), r -> new NoSuchKeyException(r.contentUtf8()))
144                         .build() //
145                         .path(bucketName + "/" + "not-there") //
146                         .responseAsUtf8();
147             } catch (NoSuchKeyException e) {
148                 e.printStackTrace(System.out);
149             }
150 
151             {
152                 Response r = s3.path(bucketName, "notThere").response();
153                 System.out.println("ok=" + r.isOk() + ", statusCode=" + r.statusCode()
154                         + ", message=" + r.contentUtf8());
155             }
156             {
157                 // read bucket object
158                 String text = s3.path(bucketName, objectName).responseAsUtf8();
159                 System.out.println(text);
160                 System.out.println("presignedUrl="
161                         + s3.path("amsa-xml-in" + "/" + objectName).presignedUrl(1, TimeUnit.DAYS));
162             }
163             {
164                 // read bucket object as stream
165                 byte[] bytes = Util
166                         .readBytesAndClose(s3.path(bucketName, objectName).responseInputStream());
167                 System.out.println(new String(bytes, StandardCharsets.UTF_8));
168                 System.out.println("presignedUrl="
169                         + s3.path("amsa-xml-in" + "/" + objectName).presignedUrl(1, TimeUnit.DAYS));
170             }
171             {
172                 // read bucket object with metadata
173                 Response r = s3 //
174                         .path(bucketName, objectName) //
175                         .response();
176                 System.out.println(r.content().length + " chars read");
177                 r //
178                         .metadata() //
179                         .entrySet() //
180                         .stream() //
181                         .map(x -> x.getKey() + "=" + x.getValue()) //
182                         .forEach(System.out::println);
183 
184                 System.out.println("category[0]=" + r.metadata("category").orElse(""));
185             }
186 
187             List<String> keys = s3 //
188                     .url("https://" + bucketName + ".s3." + regionName + ".amazonaws.com") //
189                     .query("list-type", "2") //
190                     .responseAsXml() //
191                     .childrenWithName("Contents") //
192                     .stream() //
193                     .map(x -> x.content("Key")) //
194                     .collect(Collectors.toList());
195 
196             System.out.println(keys);
197 
198             // delete object
199             s3.path(bucketName, objectName) //
200                     .method(HttpMethod.DELETE) //
201                     .execute();
202 
203             // delete bucket
204             s3.path(bucketName) //
205                     .method(HttpMethod.DELETE) //
206                     .execute();
207             System.out.println("bucket deleted");
208 
209             System.out.println("all actions complete on s3");
210         }
211 
212         {
213             String queueName = "MyQueue-" + System.currentTimeMillis();
214 
215             sqs.query("Action", "CreateQueue") //
216                     .query("QueueName", queueName) //
217                     .execute();
218 
219             String queueUrl = sqs //
220                     .query("Action", "GetQueueUrl") //
221                     .query("QueueName", queueName) //
222                     .responseAsXml() //
223                     .content("GetQueueUrlResult", "QueueUrl");
224 
225             for (int i = 1; i <= 3; i++) {
226                 sqs.url(queueUrl) //
227                         .query("Action", "SendMessage") //
228                         .query("MessageBody", "hi there --> " + i) //
229                         .execute();
230             }
231 
232             // read all messages, print to console and delete them
233             List<XmlElement> list;
234             Request request = sqs //
235                     .url(queueUrl) //
236                     .query("Action", "ReceiveMessage");
237             do {
238                 list = request //
239                         .responseAsXml() //
240                         .child("ReceiveMessageResult") //
241                         .children();
242 
243                 list.forEach(x -> {
244                     String msg = x.child("Body").content();
245                     System.out.println(msg);
246                     // mark message as read
247                     sqs.url(queueUrl) //
248                             .query("Action", "DeleteMessage") //
249                             .query("ReceiptHandle", x.child("ReceiptHandle").content()) //
250                             .execute();
251                 });
252             } while (!list.isEmpty());
253 
254             sqs.url(queueUrl) //
255                     .query("Action", "DeleteQueue") //
256                     .execute();
257 
258             System.out.println("all actions complete on " + queueUrl);
259         }
260         {
261             // test chunked response
262             if (TEST_CHUNKED) {
263                 try (ResponseInputStream in = s3
264                         .path("moten-fixes", "Neo4j_Graph_Algorithms_r3.mobi")
265                         .responseInputStream()) {
266                     try (OutputStream out = new BufferedOutputStream(
267                             new FileOutputStream("target/thing.mobi"))) {
268                         byte[] buffer = new byte[8192];
269                         int n;
270                         while ((n = in.read(buffer)) != -1) {
271                             out.write(buffer, 0, n);
272                         }
273                     }
274                 }
275             }
276         }
277     }
278 }