The exception stores the HttpStatus and HttpHeaders of the failed request
authorKai Moritz <kai@juplo.de>
Mon, 9 Jul 2018 19:00:42 +0000 (21:00 +0200)
committerKai Moritz <kai@juplo.de>
Mon, 9 Jul 2018 19:00:42 +0000 (21:00 +0200)
22 files changed:
src/main/java/de/juplo/facebook/errors/AccessTokenRequiredException.java
src/main/java/de/juplo/facebook/errors/AccountRequestLimitReachedException.java
src/main/java/de/juplo/facebook/errors/ApplicationRequestLimitReachedException.java
src/main/java/de/juplo/facebook/errors/AuthorizationMissingException.java
src/main/java/de/juplo/facebook/errors/CallbackVerificationFailedException.java
src/main/java/de/juplo/facebook/errors/CustomRequestLimitReachedException.java
src/main/java/de/juplo/facebook/errors/DeprecatedException.java
src/main/java/de/juplo/facebook/errors/GraphApiErrorHandler.java
src/main/java/de/juplo/facebook/errors/GraphApiException.java
src/main/java/de/juplo/facebook/errors/GraphMethodException.java
src/main/java/de/juplo/facebook/errors/LinkPostFailureException.java
src/main/java/de/juplo/facebook/errors/MultipleConcurrentPostsException.java
src/main/java/de/juplo/facebook/errors/OAuth2GraphApiErrorHandler.java
src/main/java/de/juplo/facebook/errors/OAuthException.java
src/main/java/de/juplo/facebook/errors/PageMigratedException.java
src/main/java/de/juplo/facebook/errors/PageRequestLimitReachedException.java
src/main/java/de/juplo/facebook/errors/TemporaryRateLimitExceededException.java
src/main/java/de/juplo/facebook/errors/UnexpectedErrorException.java
src/main/java/de/juplo/facebook/errors/UnknownErrorException.java
src/main/java/de/juplo/facebook/errors/UnmappedErrorException.java
src/main/java/de/juplo/facebook/errors/UnsupportedGetRequestException.java
src/main/java/de/juplo/facebook/errors/UserAccessTokenRequiredException.java

index 5b54096..980e2dc 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * 104: An access token is required to request this resource.
@@ -8,8 +13,12 @@ package de.juplo.facebook.errors;
  */
 public class AccessTokenRequiredException extends OAuthException
 {
-  protected AccessTokenRequiredException(FacebookErrorMessage error)
+  protected AccessTokenRequiredException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index ab0af95..d21ed94 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * 17: Account request limit reached.
@@ -9,8 +14,12 @@ package de.juplo.facebook.errors;
  */
 public class AccountRequestLimitReachedException extends OAuthException
 {
-  protected AccountRequestLimitReachedException(FacebookErrorMessage error)
+  protected AccountRequestLimitReachedException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index 6a2196c..1b52f27 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * 4: (#4) Application request limit reached.
@@ -8,8 +13,12 @@ package de.juplo.facebook.errors;
  */
 public class ApplicationRequestLimitReachedException extends OAuthException
 {
-  protected ApplicationRequestLimitReachedException(FacebookErrorMessage error)
+  protected ApplicationRequestLimitReachedException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index 440684c..d6f94fd 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * 10: Authorization declined / not granted
@@ -10,8 +15,12 @@ package de.juplo.facebook.errors;
  */
 public class AuthorizationMissingException extends OAuthException
 {
-  protected AuthorizationMissingException(FacebookErrorMessage error)
+  protected AuthorizationMissingException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index 27ef936..ede94d4 100644 (file)
@@ -1,14 +1,23 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 /**
  * 2200: Callback verification failed.
  * @author Kai Moritz
  */
 public class CallbackVerificationFailedException extends OAuthException
 {
-  protected CallbackVerificationFailedException(FacebookErrorMessage error)
+  protected CallbackVerificationFailedException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index 7beaea2..be3caa2 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * 613: Calls to stream have exceeded the rate of 600 calls per 600 seconds.
@@ -12,8 +17,12 @@ package de.juplo.facebook.errors;
  */
 public class CustomRequestLimitReachedException extends OAuthException
 {
-  protected CustomRequestLimitReachedException(FacebookErrorMessage error)
+  protected CustomRequestLimitReachedException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index 8274cb6..8438e27 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * 12: XYZ field is deprecated for versions vZ.Z and higher
@@ -9,8 +14,12 @@ package de.juplo.facebook.errors;
  */
 public class DeprecatedException extends OAuthException
 {
-  protected DeprecatedException(FacebookErrorMessage error)
+  protected DeprecatedException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index fe2932c..265f145 100644 (file)
@@ -80,7 +80,7 @@ public class GraphApiErrorHandler implements ResponseErrorHandler
 
     try
     {
-      error = GraphApiException.create(body);
+      error = GraphApiException.create(response.getStatusCode(), response.getHeaders(), body);
       if (LOG.isInfoEnabled())
         LOG.info("error-response: {}", new String(body, Charset.forName("UTF-8")));
     }
index 53bbbe6..7263c4f 100644 (file)
@@ -11,6 +11,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
 
 
 
@@ -27,7 +29,9 @@ public class GraphApiException extends RuntimeException
   final static Logger LOG = LoggerFactory.getLogger(GraphApiException.class);
   final static ObjectMapper OBJECT_MAPPER;
 
-  private final FacebookErrorMessage error;
+  public final HttpStatus status;
+  public final HttpHeaders headers;
+  public final FacebookErrorMessage error;
 
 
   static
@@ -39,42 +43,54 @@ public class GraphApiException extends RuntimeException
   }
 
 
-  public static GraphApiException create(InputStream in)
+  public static GraphApiException create(
+      HttpStatus status,
+      HttpHeaders headers,
+      InputStream in
+      )
       throws
         IOException,
         JsonParseException,
         JsonMappingException
   {
-    return create(OBJECT_MAPPER.readValue(in, FacebookErrorMessage.class));
+    return create(status, headers, OBJECT_MAPPER.readValue(in, FacebookErrorMessage.class));
   }
 
-  public static GraphApiException create(byte[] message)
+  public static GraphApiException create(
+      HttpStatus status,
+      HttpHeaders headers,
+      byte[] message
+      )
       throws
         IOException,
         JsonParseException,
         JsonMappingException
   {
-    return create(OBJECT_MAPPER.readValue(message, FacebookErrorMessage.class));
+    return create(status, headers, OBJECT_MAPPER.readValue(message, FacebookErrorMessage.class));
   }
 
-  public static GraphApiException create(FacebookErrorMessage error)
+  public static GraphApiException create(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
     // see: http://fbdevwiki.com/wiki/Error_codes
     switch(error.code)
     {
       // 1..99: general errors
-      case 1:     return new UnknownErrorException(error);
-      case 2:     return new UnexpectedErrorException(error);
-      case 4:     return new ApplicationRequestLimitReachedException(error);
-      case 10:    return new AuthorizationMissingException(error);
-      case 12:    return new DeprecatedException(error);
-      case 17:    return new AccountRequestLimitReachedException(error);
-      case 21:    return new PageMigratedException(error);
-      case 32:    return new PageRequestLimitReachedException(error);
+      case 1:     return new UnknownErrorException(status, headers, error);
+      case 2:     return new UnexpectedErrorException(status, headers, error);
+      case 4:     return new ApplicationRequestLimitReachedException(status, headers, error);
+      case 10:    return new AuthorizationMissingException(status, headers, error);
+      case 12:    return new DeprecatedException(status, headers, error);
+      case 17:    return new AccountRequestLimitReachedException(status, headers, error);
+      case 21:    return new PageMigratedException(status, headers, error);
+      case 32:    return new PageRequestLimitReachedException(status, headers, error);
       // 100..199: graph method errors
-      case 100:   return new UnsupportedGetRequestException(error);
-      case 102:   return new UserAccessTokenRequiredException(error);
-      case 104:   return new AccessTokenRequiredException(error);
+      case 100:   return new UnsupportedGetRequestException(status, headers, error);
+      case 102:   return new UserAccessTokenRequiredException(status, headers, error);
+      case 104:   return new AccessTokenRequiredException(status, headers, error);
       // 200..299: permission errors
       case 200:
       case 201:
@@ -175,39 +191,55 @@ public class GraphApiException extends RuntimeException
       case 296:
       case 297:
       case 298:
-      case 299:   return new AuthorizationMissingException(error);
+      case 299:   return new AuthorizationMissingException(status, headers, error);
       // 200..299: permission errors
       // 300..399: data editing errors ?
-      case 341:   return new TemporaryRateLimitExceededException(error);
+      case 341:   return new TemporaryRateLimitExceededException(status, headers, error);
       // 400..449: authentication error
       // 450..499: session errors
       // 500..599: application messaging errors ?
-      case 506:   return new MultipleConcurrentPostsException(error);
+      case 506:   return new MultipleConcurrentPostsException(status, headers, error);
       // 600..699: FQL errors
-      case 613:   return new CustomRequestLimitReachedException(error);
+      case 613:   return new CustomRequestLimitReachedException(status, headers, error);
       // 700..749: ref errors
       // 750..799: application integration errors
       // 900..949: application information errors
       // 950..999: batch api errors
       // 1000..1099: event api errors
       // 1100..1199: live-message errors
-      case 1609005: return new LinkPostFailureException(error);
-      case 2200:  return new CallbackVerificationFailedException(error);
+      case 1609005: return new LinkPostFailureException(status, headers, error);
+      case 2200:  return new CallbackVerificationFailedException(status, headers, error);
 
       default:
         LOG.info("unmapped error: {}", error);
-        return new UnmappedErrorException(error);
+        return new UnmappedErrorException(status, headers, error);
     }
   }
 
 
-  protected GraphApiException(FacebookErrorMessage error)
+  protected GraphApiException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
     super(error.message);
+    this.status = status;
+    this.headers = headers;
     this.error = error;
   }
 
 
+  public HttpStatus getStatus()
+  {
+    return status;
+  }
+
+  public HttpHeaders getHeaders()
+  {
+    return headers;
+  }
+
   public Type getType()
   {
     return error.type == null ? null : Type.valueOf(error.type);
index afe83cb..42dc23f 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * Baseclass for exceptions of type {@code GraphMethodException}.
@@ -8,8 +13,12 @@ package de.juplo.facebook.errors;
  */
 public abstract class GraphMethodException extends GraphApiException
 {
-  GraphMethodException(FacebookErrorMessage error)
+  GraphMethodException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index 7169861..0039a53 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * 1609005: Failure while posting link (data could not be read from link)
@@ -9,8 +14,12 @@ package de.juplo.facebook.errors;
  */
 public class LinkPostFailureException extends OAuthException
 {
-  protected LinkPostFailureException(FacebookErrorMessage error)
+  protected LinkPostFailureException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index b99bed7..8fd50b0 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * 506: Multiple concurrent posts
@@ -9,8 +14,12 @@ package de.juplo.facebook.errors;
  */
 public class MultipleConcurrentPostsException extends OAuthException
 {
-  protected MultipleConcurrentPostsException(FacebookErrorMessage error)
+  protected MultipleConcurrentPostsException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index a0b5e45..9158987 100644 (file)
@@ -7,7 +7,6 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.client.ClientHttpResponse;
 import org.springframework.http.converter.HttpMessageConverter;
 import org.springframework.security.oauth2.client.http.OAuth2ErrorHandler;
-import org.springframework.web.client.ResponseErrorHandler;
 
 
 
index 4153dbc..ca672bc 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * Baseclass for exceptions of type {@code OAuthException}.
@@ -8,8 +13,12 @@ package de.juplo.facebook.errors;
  */
 public class OAuthException extends GraphApiException
 {
-  protected OAuthException(FacebookErrorMessage error)
+  protected OAuthException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index c339d83..3c7ee01 100644 (file)
@@ -3,6 +3,8 @@ package de.juplo.facebook.errors;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
 
 
 
@@ -18,9 +20,13 @@ public class PageMigratedException extends OAuthException
   private final Long oldId, newId;
 
 
-  protected PageMigratedException(FacebookErrorMessage error)
+  protected PageMigratedException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
     Matcher matcher = pattern.matcher(error.message);
     if (!matcher.find())
     {
index e4ee191..23c2bca 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * 32: Account request limit reached.
@@ -9,8 +14,12 @@ package de.juplo.facebook.errors;
  */
 public class PageRequestLimitReachedException extends OAuthException
 {
-  protected PageRequestLimitReachedException(FacebookErrorMessage error)
+  protected PageRequestLimitReachedException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index 0eba617..e87d5b7 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * 341: Temporary rate-limit excession because of server-failure or throtteling
@@ -9,8 +14,12 @@ package de.juplo.facebook.errors;
  */
 public class TemporaryRateLimitExceededException extends OAuthException
 {
-  protected TemporaryRateLimitExceededException(FacebookErrorMessage error)
+  protected TemporaryRateLimitExceededException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index 72c071b..2278e57 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * 2: An unexpected error has occurred.
@@ -8,8 +13,12 @@ package de.juplo.facebook.errors;
  */
 public class UnexpectedErrorException extends OAuthException
 {
-  protected UnexpectedErrorException(FacebookErrorMessage error)
+  protected UnexpectedErrorException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index 7f5e8ff..4115f7b 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * 1: An unknown error has occurred.
@@ -8,8 +13,12 @@ package de.juplo.facebook.errors;
  */
 public class UnknownErrorException extends OAuthException
 {
-  protected UnknownErrorException(FacebookErrorMessage error)
+  protected UnknownErrorException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index 839de09..997f53f 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * Marker class for error-messages, that are not mapped yet.
@@ -11,8 +16,12 @@ package de.juplo.facebook.errors;
  */
 public class UnmappedErrorException extends GraphApiException
 {
-  protected  UnmappedErrorException(FacebookErrorMessage error)
+  protected  UnmappedErrorException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index 4a5a9b8..74f82f8 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * 100: Unsupported get request.
@@ -8,8 +13,12 @@ package de.juplo.facebook.errors;
  */
 public class UnsupportedGetRequestException extends GraphMethodException
 {
-  protected UnsupportedGetRequestException(FacebookErrorMessage error)
+  protected UnsupportedGetRequestException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }
index cb91950..0d3a909 100644 (file)
@@ -1,6 +1,11 @@
 package de.juplo.facebook.errors;
 
 
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
 
 /**
  * A user access token is required to request this resource.
@@ -8,8 +13,12 @@ package de.juplo.facebook.errors;
  */
 public class UserAccessTokenRequiredException extends OAuthException
 {
-  public UserAccessTokenRequiredException(FacebookErrorMessage error)
+  public UserAccessTokenRequiredException(
+      HttpStatus status,
+      HttpHeaders headers,
+      FacebookErrorMessage error
+      )
   {
-    super(error);
+    super(status, headers, error);
   }
 }