Implemented FacebookErrorHandler to handle facebook-error-codes
[facebook-utils] / src / main / java / de / juplo / facebook / GraphApiErrorHandler.java
diff --git a/src/main/java/de/juplo/facebook/GraphApiErrorHandler.java b/src/main/java/de/juplo/facebook/GraphApiErrorHandler.java
new file mode 100644 (file)
index 0000000..ce4c98c
--- /dev/null
@@ -0,0 +1,79 @@
+package de.juplo.facebook;
+
+import java.io.IOException;
+import java.util.List;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.security.oauth2.client.http.OAuth2ErrorHandler;
+import org.springframework.web.client.HttpMessageConverterExtractor;
+import org.springframework.web.client.RestClientException;
+import org.springframework.web.client.RestTemplate;
+
+
+
+/**
+ *
+ * @author kai
+ */
+public class GraphApiErrorHandler extends OAuth2ErrorHandler
+{
+  private final OAuth2ErrorHandler errorHandler;
+  private List<HttpMessageConverter<?>> messageConverters =
+      new RestTemplate().getMessageConverters();
+
+
+  public GraphApiErrorHandler(OAuth2ErrorHandler errorHandler)
+  {
+    super(null);
+    this.errorHandler = errorHandler;
+  }
+
+
+       /**
+        * @param messageConverters the messageConverters to set
+        */
+  @Override
+  public void setMessageConverters(
+      List<HttpMessageConverter<?>> messageConverters
+      )
+  {
+    this.messageConverters = messageConverters;
+    errorHandler.setMessageConverters(messageConverters);
+  }
+
+  @Override
+  public boolean hasError(ClientHttpResponse response) throws IOException
+  {
+    return errorHandler.hasError(response);
+  }
+
+  @Override
+  public void handleError(ClientHttpResponse response) throws IOException
+  {
+    HttpMessageConverterExtractor<GraphApiException> extractor =
+        new HttpMessageConverterExtractor<>(
+            GraphApiException.class,
+            messageConverters
+            );
+
+    try
+    {
+      GraphApiException body = extractor.extractData(response);
+      if (body != null)
+      {
+        // If we can get an OAuth2Exception already from the body, it is likely
+        // to have more information than the header does, so just re-throw it
+        // here.
+        body.setHttpErrorCode(response.getRawStatusCode());
+        throw body;
+      }
+    }
+    catch (RestClientException|HttpMessageNotReadableException e)
+    {
+      // ignore
+    }
+
+    errorHandler.handleError(response);
+  }
+}