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
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
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
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
124
125
126
127
128
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
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
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
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
199 s3.path(bucketName, objectName)
200 .method(HttpMethod.DELETE)
201 .execute();
202
203
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
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
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
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 }