Skip to content

Commit 78ae810

Browse files
committed
added adapter for JDeferred library
1 parent 9150240 commit 78ae810

File tree

7 files changed

+226
-0
lines changed

7 files changed

+226
-0
lines changed

extras/jdeferred/pom.xml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2+
<modelVersion>4.0.0</modelVersion>
3+
<parent>
4+
<artifactId>async-http-client-extras-parent</artifactId>
5+
<groupId>com.ning</groupId>
6+
<version>1.8.0-SNAPSHOT</version>
7+
<relativePath>..</relativePath>
8+
</parent>
9+
<artifactId>async-http-client-extras-jdeferred</artifactId>
10+
<dependencies>
11+
<dependency>
12+
<groupId>org.jdeferred</groupId>
13+
<artifactId>jdeferred-core</artifactId>
14+
<version>1.0.0</version>
15+
</dependency>
16+
</dependencies>
17+
</project>
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.ning.http.client.extra;
2+
3+
import java.io.IOException;
4+
5+
import org.jdeferred.Promise;
6+
import org.jdeferred.impl.DeferredObject;
7+
8+
import com.ning.http.client.AsyncHttpClient.BoundRequestBuilder;
9+
import com.ning.http.client.AsyncCompletionHandler;
10+
import com.ning.http.client.HttpResponseBodyPart;
11+
import com.ning.http.client.Response;
12+
13+
public class AsyncHttpDeferredObject extends DeferredObject<Response, Throwable, HttpProgress> {
14+
public AsyncHttpDeferredObject(BoundRequestBuilder builder) throws IOException {
15+
builder.execute(new AsyncCompletionHandler<Void>() {
16+
@Override
17+
public Void onCompleted(Response response) throws Exception {
18+
AsyncHttpDeferredObject.this.resolve(response);
19+
return null;
20+
}
21+
22+
@Override
23+
public void onThrowable(Throwable t) {
24+
AsyncHttpDeferredObject.this.reject(t);
25+
}
26+
27+
@Override
28+
public com.ning.http.client.AsyncHandler.STATE onContentWriteProgress(
29+
long amount, long current, long total) {
30+
AsyncHttpDeferredObject.this.notify(new ContentWriteProgress(amount, current, total));
31+
return super.onContentWriteProgress(amount, current, total);
32+
}
33+
34+
@Override
35+
public com.ning.http.client.AsyncHandler.STATE onBodyPartReceived(
36+
HttpResponseBodyPart content) throws Exception {
37+
AsyncHttpDeferredObject.this.notify(new HttpResponseBodyPartProgress(content));
38+
return super.onBodyPartReceived(content);
39+
}
40+
});
41+
}
42+
43+
public static Promise<Response, Throwable, HttpProgress> promise(final BoundRequestBuilder builder) throws IOException {
44+
return new AsyncHttpDeferredObject(builder).promise();
45+
}
46+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.ning.http.client.extra;
2+
3+
public class ContentWriteProgress implements HttpProgress {
4+
private final long amount;
5+
private final long current;
6+
private final long total;
7+
8+
public ContentWriteProgress(long amount, long current, long total) {
9+
this.amount = amount;
10+
this.current = current;
11+
this.total = total;
12+
}
13+
14+
public long getAmount() {
15+
return amount;
16+
}
17+
18+
public long getCurrent() {
19+
return current;
20+
}
21+
22+
public long getTotal() {
23+
return total;
24+
}
25+
26+
@Override
27+
public String toString() {
28+
return "ContentWriteProgress [amount=" + amount + ", current="
29+
+ current + ", total=" + total + "]";
30+
}
31+
32+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.ning.http.client.extra;
2+
3+
public interface HttpProgress {
4+
5+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.ning.http.client.extra;
2+
3+
import com.ning.http.client.HttpResponseBodyPart;
4+
5+
public class HttpResponseBodyPartProgress implements HttpProgress {
6+
private final HttpResponseBodyPart part;
7+
8+
public HttpResponseBodyPartProgress(HttpResponseBodyPart part) {
9+
this.part = part;
10+
}
11+
12+
public HttpResponseBodyPart getPart() {
13+
return part;
14+
}
15+
16+
@Override
17+
public String toString() {
18+
return "HttpResponseBodyPartProgress [part=" + part + "]";
19+
}
20+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package com.ning.http.client.extra;
2+
3+
import java.io.IOException;
4+
import java.util.concurrent.CountDownLatch;
5+
import java.util.concurrent.atomic.AtomicInteger;
6+
7+
import junit.framework.Assert;
8+
import junit.framework.TestCase;
9+
10+
import org.jdeferred.DoneCallback;
11+
import org.jdeferred.ProgressCallback;
12+
import org.jdeferred.Promise;
13+
import org.jdeferred.impl.DefaultDeferredManager;
14+
import org.jdeferred.multiple.MultipleResults;
15+
16+
import com.ning.http.client.AsyncHttpClient;
17+
import com.ning.http.client.Response;
18+
19+
public class AsyncHttpTest extends TestCase {
20+
protected DefaultDeferredManager deferredManager;
21+
22+
protected void setUp() throws Exception {
23+
super.setUp();
24+
deferredManager = new DefaultDeferredManager();
25+
}
26+
27+
protected void tearDown() throws Exception {
28+
super.tearDown();
29+
}
30+
31+
public void testPromiseAdapter() throws IOException {
32+
final CountDownLatch latch = new CountDownLatch(1);
33+
final AtomicInteger successCount = new AtomicInteger();
34+
final AtomicInteger progressCount = new AtomicInteger();
35+
36+
AsyncHttpClient client = new AsyncHttpClient();
37+
38+
Promise<Response, Throwable, HttpProgress> p1 = AsyncHttpDeferredObject
39+
.promise(client.prepareGet("http://www.ning.com"));
40+
p1.done(new DoneCallback<Response>() {
41+
@Override
42+
public void onDone(Response response) {
43+
try {
44+
Assert.assertEquals(200, response.getStatusCode());
45+
successCount.incrementAndGet();
46+
} finally {
47+
latch.countDown();
48+
}
49+
}
50+
}).progress(new ProgressCallback<HttpProgress>() {
51+
52+
@Override
53+
public void onProgress(HttpProgress progress) {
54+
progressCount.incrementAndGet();
55+
}
56+
});
57+
58+
try {
59+
latch.await();
60+
Assert.assertTrue(progressCount.get() > 0);
61+
} catch (InterruptedException e) {
62+
Thread.currentThread().interrupt();
63+
}
64+
}
65+
66+
public void testMultiplePromiseAdapter() throws IOException {
67+
final CountDownLatch latch = new CountDownLatch(1);
68+
final AtomicInteger successCount = new AtomicInteger();
69+
70+
AsyncHttpClient client = new AsyncHttpClient();
71+
72+
Promise<Response, Throwable, HttpProgress> p1 = AsyncHttpDeferredObject
73+
.promise(client.prepareGet("http://www.ning.com"));
74+
Promise<Response, Throwable, HttpProgress> p2 = AsyncHttpDeferredObject
75+
.promise(client.prepareGet("http://www.google.com"));
76+
AsyncHttpDeferredObject deferredRequest = new AsyncHttpDeferredObject(
77+
client.prepareGet("http://jdeferred.org"));
78+
79+
deferredManager.when(p1, p2, deferredRequest).then(
80+
new DoneCallback<MultipleResults>() {
81+
@Override
82+
public void onDone(MultipleResults result) {
83+
try {
84+
Assert.assertEquals(3, result.size());
85+
Assert.assertEquals(200, ((Response) result.get(0)
86+
.getResult()).getStatusCode());
87+
Assert.assertEquals(200, ((Response) result.get(1)
88+
.getResult()).getStatusCode());
89+
Assert.assertEquals(200, ((Response) result.get(2)
90+
.getResult()).getStatusCode());
91+
successCount.incrementAndGet();
92+
} finally {
93+
latch.countDown();
94+
}
95+
}
96+
});
97+
98+
try {
99+
latch.await();
100+
} catch (InterruptedException e) {
101+
Thread.currentThread().interrupt();
102+
}
103+
}
104+
105+
}

extras/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747

4848
<modules>
4949
<module>guava</module>
50+
<module>jdeferred</module>
5051
</modules>
5152

5253
<dependencies>

0 commit comments

Comments
 (0)