diff --git a/.gitignore b/.gitignore index 7648b24..bc2a7ba 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +.idea +sdk.iml + *.class .settings/ .classpath diff --git a/pom.xml b/pom.xml index 00f5a02..2f97657 100755 --- a/pom.xml +++ b/pom.xml @@ -74,9 +74,9 @@ test - com.google.guava - guava - 14.0.1 + com.google.guava + guava + 18.0 diff --git a/src/main/java/me/figo/FigoApi.java b/src/main/java/me/figo/FigoApi.java index d49a212..2b3fdef 100644 --- a/src/main/java/me/figo/FigoApi.java +++ b/src/main/java/me/figo/FigoApi.java @@ -46,6 +46,7 @@ import me.figo.internal.FigoSocketFactory; import me.figo.internal.FigoTrustManager; import me.figo.internal.GsonAdapter; +import me.figo.models.ErrorResponse; /** * @@ -187,19 +188,11 @@ protected T processResponse(HttpURLConnection connection, Type typeOfT) thro if (code >= 200 && code < 300) { return handleResponse(connection.getInputStream(), typeOfT); } else { - FigoException.ErrorResponse errorResponse = handleResponse(connection.getErrorStream(), FigoException.ErrorResponse.class); - logError(errorResponse, connection); - throw new FigoException(errorResponse); + ErrorResponse errorResponse = handleResponse(connection.getErrorStream(), ErrorResponse.class); + throw new FigoApiException(errorResponse); } } - private void logError(FigoException.ErrorResponse errorResponse, HttpURLConnection connection) { - String errorString = errorResponse.getError().toString(); - if (connection != null) - errorString += " " + connection.getRequestMethod() + " " + connection.getURL().toString(); - logger.log(Level.SEVERE, errorString); - } - /** * Handle the response of a request by decoding its JSON payload * diff --git a/src/main/java/me/figo/FigoApiException.java b/src/main/java/me/figo/FigoApiException.java new file mode 100644 index 0000000..e738337 --- /dev/null +++ b/src/main/java/me/figo/FigoApiException.java @@ -0,0 +1,21 @@ +package me.figo; + +import me.figo.models.ErrorObject; +import me.figo.models.ErrorResponse; + +public class FigoApiException extends FigoException { + + private static final long serialVersionUID = -1855328588622789903L; + + private ErrorObject error; + + public FigoApiException(ErrorResponse response) { + super(response.getError().toString(), response.getError().getDescription()); + this.error = response.getError(); + } + + public ErrorObject getError() { + return error; + } + +} diff --git a/src/main/java/me/figo/FigoConnection.java b/src/main/java/me/figo/FigoConnection.java index f185a71..52a09b4 100644 --- a/src/main/java/me/figo/FigoConnection.java +++ b/src/main/java/me/figo/FigoConnection.java @@ -22,21 +22,16 @@ package me.figo; +import com.google.common.io.BaseEncoding; +import me.figo.internal.*; +import me.figo.models.BusinessProcess; +import me.figo.models.ProcessToken; + import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.Charset; -import com.google.common.io.BaseEncoding; - -import me.figo.internal.CreateUserRequest; -import me.figo.internal.CreateUserResponse; -import me.figo.internal.CredentialLoginRequest; -import me.figo.internal.TokenRequest; -import me.figo.internal.TokenResponse; -import me.figo.models.BusinessProcess; -import me.figo.models.ProcessToken; - /** * Representing a not user-bound connection to the figo connect API. Its main purpose is to let user login via the OAuth2 API and/or create business processes. diff --git a/src/main/java/me/figo/FigoException.java b/src/main/java/me/figo/FigoException.java index c9c58a3..b270e02 100644 --- a/src/main/java/me/figo/FigoException.java +++ b/src/main/java/me/figo/FigoException.java @@ -22,8 +22,6 @@ package me.figo; -import com.google.gson.annotations.Expose; - /*** * Base Class for all figo Exceptions. It extends the normal Java exceptions with an error_code field, which carries the computer readable error reason. * @@ -37,21 +35,10 @@ public class FigoException extends Exception { private final String error_description; public FigoException(String error_message, String error_description) { - super(error_message); - - this.error_message = error_message; - this.error_description = error_description; - } - - public FigoException(String error_message, String error_description, Throwable exc) { - super(error_message, exc); - - this.error_message = error_message; - this.error_description = error_description; - } + super(error_message); - public FigoException(ErrorResponse response) { - this(response.getError().getMessage(), response.getError().getDescription()); + this.error_message = error_message; + this.error_description = error_description; } public String getErrorMessage() { @@ -62,75 +49,4 @@ public String getErrorDescription() { return error_description; } - public static class ErrorResponse { - - @Expose - private ErrorObject error; - - public ErrorResponse() { - } - - public ErrorObject getError() { - return error; - } - } - - public static class ErrorObject { - - @Expose - private String code; - - @Expose - private String name; - - @Expose - private String message; - - @Expose - private String description; - - @Expose - private String group; - - public ErrorObject() { - } - - public String getMessage() { - return message; - } - - public String getDescription() { - return description; - } - - public String getCode() { - return code; - } - - public String getName() { - return name; - } - - public String getGroup() { - return group; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("ErrorObject ["); - if (code != null) - builder.append("code=").append(code).append(", "); - if (name != null) - builder.append("name=").append(name).append(", "); - if (message != null) - builder.append("message=").append(message).append(", "); - if (description != null) - builder.append("description=").append(description).append(", "); - if (group != null) - builder.append("group=").append(group); - builder.append("]"); - return builder.toString(); - } - } } diff --git a/src/main/java/me/figo/models/ErrorObject.java b/src/main/java/me/figo/models/ErrorObject.java new file mode 100644 index 0000000..a6ddb1c --- /dev/null +++ b/src/main/java/me/figo/models/ErrorObject.java @@ -0,0 +1,75 @@ +package me.figo.models; + +import com.google.gson.annotations.Expose; + +import java.util.List; +import java.util.Map; + +public class ErrorObject { + + @Expose + private String code; + + @Expose + private String name; + + @Expose + private String message; + + @Expose + private String description; + + @Expose + private String group; + + @Expose + private Map> data; + + public ErrorObject() { + } + + public String getMessage() { + return message; + } + + public String getDescription() { + return description; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + public String getGroup() { + return group; + } + + public Map> getData() { + return data; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ErrorObject ["); + if (code != null) + builder.append("code=").append(code).append(", "); + if (name != null) + builder.append("name=").append(name).append(", "); + if (message != null) + builder.append("message=").append(message).append(", "); + if (description != null) + builder.append("description=").append(description).append(", "); + if (data != null) + builder.append("data=").append(data.toString()).append(", "); + if (group != null) + builder.append("group=").append(group); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/java/me/figo/models/ErrorResponse.java b/src/main/java/me/figo/models/ErrorResponse.java new file mode 100644 index 0000000..a942a7f --- /dev/null +++ b/src/main/java/me/figo/models/ErrorResponse.java @@ -0,0 +1,17 @@ +package me.figo.models; + +import com.google.gson.annotations.Expose; + +public class ErrorResponse { + + @Expose + private ErrorObject error; + + public ErrorResponse() { + } + + public ErrorObject getError() { + return error; + } + +} diff --git a/src/test/java/me/figo/FigoApiExceptionTest.java b/src/test/java/me/figo/FigoApiExceptionTest.java new file mode 100644 index 0000000..8ffe45c --- /dev/null +++ b/src/test/java/me/figo/FigoApiExceptionTest.java @@ -0,0 +1,29 @@ +package me.figo; + +import com.google.gson.Gson; +import me.figo.internal.GsonAdapter; +import me.figo.models.ErrorResponse; +import org.junit.Assert; +import org.junit.Test; + +public class FigoApiExceptionTest { + + @Test + public void ensureNonNullMessage() { + Gson g = GsonAdapter.createGson(); + + String errorResponse = "{\n" + + " \"error\": {\n" + + " \"code\": 1000,\n" + + " \"description\": \"Request body doesn't match input schema.\"\n" + + " }\n" + + "}"; + + ErrorResponse resp = g.fromJson(errorResponse, ErrorResponse.class); + FigoApiException ex = new FigoApiException(resp); + + Assert.assertNotNull(ex.getMessage()); + Assert.assertEquals(ex.getMessage(), ex.getError().toString()); + } + +} diff --git a/src/test/java/me/figo/SessionTest.java b/src/test/java/me/figo/SessionTest.java index 95d5b53..dd27458 100644 --- a/src/test/java/me/figo/SessionTest.java +++ b/src/test/java/me/figo/SessionTest.java @@ -153,7 +153,7 @@ public void testGetErrorMessage() throws IOException { fail(acc.getName()); } catch(FigoException e) { - assertEquals(null, e.getErrorMessage()); + assertEquals("ErrorObject [code=1002, description=Not Found, data={}, group=client]", e.getErrorMessage()); assertEquals("Not Found", e.getErrorDescription()); } } diff --git a/src/test/java/me/figo/models/ErrorObjectTest.java b/src/test/java/me/figo/models/ErrorObjectTest.java new file mode 100644 index 0000000..ecd98c5 --- /dev/null +++ b/src/test/java/me/figo/models/ErrorObjectTest.java @@ -0,0 +1,33 @@ +package me.figo.models; + +import com.google.gson.Gson; +import me.figo.internal.GsonAdapter; +import org.junit.Assert; +import org.junit.Test; + +public class ErrorObjectTest { + + @Test + public void testGson() { + Gson g = GsonAdapter.createGson(); + + String errorResponse = "{\n" + + " \"error\": {\n" + + " \"code\": 1000,\n" + + " \"data\": {\"bank_code\": [\"Not a valid string.\"],\n" + + " \"credentials\": [\"Credentials must contain at least 2 strings.\"]},\n" + + " \"description\": \"Request body doesn't match input schema.\",\n" + + " \"group\": \"client\"\n" + + " }\n" + + "}"; + + ErrorResponse resp = g.fromJson(errorResponse, ErrorResponse.class); + + ErrorObject obj = resp.getError(); + + Assert.assertNotNull(obj.getData()); + Assert.assertTrue(obj.getData().containsKey("bank_code")); + Assert.assertEquals(obj.getData().get("bank_code").get(0), "Not a valid string."); + } + +}