Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 19 additions & 35 deletions src/main/java/com/rallydev/lookback/LookbackApi.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package com.rallydev.lookback;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.apache.commons.codec.binary.Base64;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.Credentials;
Expand All @@ -16,13 +17,10 @@
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreProtocolPNames;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonReader;

/**
* LookbackApi objects provide an API for communicating with Rally's Lookback API service.
Expand Down Expand Up @@ -58,7 +56,6 @@ public class LookbackApi {
public LookbackApi() {
this(new DefaultHttpClient());
Runnable shutdown = new Runnable() {
@Override
public void run() {
client.getConnectionManager().shutdown();
}
Expand Down Expand Up @@ -235,15 +232,21 @@ LookbackResult executeQuery(LookbackQuery query) throws IOException {

private HttpResponse executeRequest(String requestJson) throws IOException {
HttpUriRequest request = createRequest(requestJson);

applyCredentials();
return client.execute(request);
}

private LookbackResult buildLookbackResult(HttpResponse response) throws IOException {
HttpEntity responseBody = validateResponse(response);
String json = getResponseJson(responseBody);
return serializeLookbackResultFromJson(json);
JsonReader reader = new JsonReader(new InputStreamReader(responseBody.getContent(), "UTF-8"));
LookbackResult resultFromJson = null;
try {
resultFromJson = serializeLookbackResultFromJson(reader);
} finally {
reader.close();
}

return resultFromJson;
}

private HttpUriRequest createRequest(String requestJson) throws IOException {
Expand All @@ -263,18 +266,9 @@ private HttpEntity validateResponse(HttpResponse response) {
return responseBody;
}

private String getResponseJson(HttpEntity responseBody) throws IOException {
InputStream responseStream = responseBody.getContent();
try {
return readFromStream(responseStream);
} finally {
responseStream.close();
}
}

private LookbackResult serializeLookbackResultFromJson(String json) {
private LookbackResult serializeLookbackResultFromJson(JsonReader reader) {
Gson serializer = new GsonBuilder().serializeNulls().create();
return serializer.fromJson(json, LookbackResult.class);
return serializer.fromJson(reader, LookbackResult.class);
}

private boolean authorizationFailed(HttpResponse response) {
Expand All @@ -291,16 +285,6 @@ private String buildUrl() {
serverUrl.toExternalForm(), buildApiVersion(), workspace);
}

private String readFromStream(InputStream stream) {
Scanner scanner = new Scanner(stream);
scanner.useDelimiter("\\A");
if (scanner.hasNext()) {
return scanner.next();
} else {
return "";
}
}

private String buildApiVersion() {
return "v" + versionMajor + "." + versionMinor;
}
Expand Down
18 changes: 9 additions & 9 deletions src/test/java/com/rallydev/lookback/LookbackIntegrationTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
package com.rallydev.lookback;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Assert;
Expand All @@ -10,14 +18,6 @@
import org.simpleframework.http.core.ContainerServer;
import org.simpleframework.transport.connect.SocketConnection;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class LookbackIntegrationTest {

protected String username = "test1";
Expand Down Expand Up @@ -129,7 +129,7 @@ protected Container returnLbapiResults() {
try {
InputStream is = getClass().getResource("/1.json").openStream();
Assert.assertNotNull(is);
json = IOUtils.toString(is);
json = IOUtils.toString(is, "UTF-8");
} catch (Exception e) {
Assert.fail(e.getMessage());
}
Expand Down
11 changes: 8 additions & 3 deletions src/test/java/com/rallydev/lookback/ProxiedLookbackApiTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.rallydev.lookback;

import java.io.InputStream;
import java.util.Stack;

import org.apache.commons.io.IOUtils;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
Expand All @@ -10,9 +13,6 @@
import org.junit.Test;
import org.simpleframework.http.core.Container;

import java.io.InputStream;
import java.util.Stack;

public class ProxiedLookbackApiTest extends LookbackIntegrationTest {

private String proxyuser = "test";
Expand Down Expand Up @@ -53,6 +53,8 @@ public void worksThroughProxy() {
.execute();

Assert.assertEquals("there should be 2 results", 2, result.Results.size());
Assert.assertEquals("Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa", result.Results.get(0).get("Name"));

}


Expand All @@ -74,6 +76,7 @@ protected Container requestProxyAuth() {
ret = capturesRequest(ret);
ret = respondWith(ret, 407);
ret = addsHeader(ret, "Proxy-Authenticate", "Basic realm=\"theproxy\"");
ret = addsHeader(ret, "Content-Type", "application/json; charset=UTF-8");
return ret;
}

Expand All @@ -91,6 +94,7 @@ protected Container returnLbapiResults() {
ret = capturesRequest(ret);
ret = assertsHeader(ret, "Proxy-Authorization", "Basic dGVzdDpwYXNz");
ret = assertsHeader(ret, "Authorization", "Basic dGVzdDE6cGFzczE=");
ret = addsHeader(ret, "Content-Type", "application/json; charset=UTF-8");
return ret;
}

Expand All @@ -99,6 +103,7 @@ protected Container requestLbapiAuth() {
ret = capturesRequest(ret);
ret = assertsHeader(ret, "Proxy-Authorization", "Basic dGVzdDpwYXNz");
ret = addsHeader(ret, "WWW-Authenticate", "Basic realm=\"myRealm\"");
ret = addsHeader(ret, "Content-Type", "application/json; charset=UTF-8");
ret = respondWith(ret, 401);
return ret;
}
Expand Down
4 changes: 2 additions & 2 deletions src/test/resources/1.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
"PageSize": 100,
"ETLDate": "2014-08-20T18:29:22.379Z",
"Results": [
{"ObjectID":5.387234184E9,"Project":2.79050021E8,"_ValidFrom":"2012-02-08T14:42:14.147Z","_ValidTo":"2012-02-09T19:16:26.890Z","_id":"53e110d3e4b03369a36c47e1"},
{"ObjectID":4.9413018E9,"Project":2.79050021E8,"_ValidFrom":"2012-02-08T14:13:16.509Z","_ValidTo":"2012-02-08T14:13:20.022Z","_id":"53e110d3e4b03369a36c47c1"}
{"ObjectID":5.387234184E9,"Name":"Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa","Project":2.79050021E8,"_ValidFrom":"2012-02-08T14:42:14.147Z","_ValidTo":"2012-02-09T19:16:26.890Z","_id":"53e110d3e4b03369a36c47e1"},
{"ObjectID":4.9413018E9,"Name":"Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa","Project":2.79050021E8,"_ValidFrom":"2012-02-08T14:13:16.509Z","_ValidTo":"2012-02-08T14:13:20.022Z","_id":"53e110d3e4b03369a36c47c1"}
]
}