// Can't trust the type to be useful. It's often OAuthException, even for things not OAuth-related.
// Can rely only on the message (which itself isn't very consistent).
String message = errorDetails.get("message");
if (statusCode == HttpStatus.NOT_FOUND) {
if (message.contains("Some of the aliases you requested do not exist")) {
throw new ResourceNotFoundException(FACEBOOK, message);
}
} else if (statusCode == HttpStatus.BAD_REQUEST) {
if (message.contains("Unknown path components")) {
throw new ResourceNotFoundException(FACEBOOK, message);
} else if (message.equals("An access token is required to request this resource.")) {
throw new MissingAuthorizationException(FACEBOOK);
} else if (message.equals("An active access token must be used to query information about the current user.")) {
throw new MissingAuthorizationException(FACEBOOK);
} else if (message.startsWith("Error validating access token")) {
handleInvalidAccessToken(message);
} else if (message.equals("Invalid access token signature.")) { // Access token that fails signature validation
throw new InvalidAuthorizationException(FACEBOOK, message);
} else if (message.contains("Application does not have the capability to make this API call.") || message.contains("App must be on whitelist")) {
throw new OperationNotPermittedException(FACEBOOK, message);
} else if (message.contains("Invalid fbid") || message.contains("The parameter url is required")) {
throw new OperationNotPermittedException(FACEBOOK, "Invalid object for this operation");
} else if (message.contains("Duplicate status message") ) {
throw new DuplicateStatusException(FACEBOOK, message);
} else if (message.contains("Feed action request limit reached")) {
throw new RateLimitExceededException(FACEBOOK);
} else if (message.contains("The status you are trying to publish is a duplicate of, or too similar to, one that we recently posted to Twitter")) {
throw new DuplicateStatusException(FACEBOOK, message);
}
} else if (statusCode == HttpStatus.UNAUTHORIZED) {
if (message.startsWith("Error validating access token")) {
handleInvalidAccessToken(message);
} else if (message.equals("Invalid OAuth access token.")) { // Bogus access token
throw new InvalidAuthorizationException(FACEBOOK, message);
} else if (message.startsWith("Error validating application.")) { // Access token with incorrect app ID
throw new InvalidAuthorizationException(FACEBOOK, message);
}
throw new NotAuthorizedException(FACEBOOK, message);
} else if (statusCode == HttpStatus.FORBIDDEN) {
if (message.contains("Requires extended permission")) {
throw new InsufficientPermissionException(FACEBOOK, message.split(": ")[1]);
} else if (message.contains("Permissions error")) {
throw new InsufficientPermissionException(FACEBOOK);
} else if (message.contains("The user hasn't authorized the application to perform this action")) {
throw new InsufficientPermissionException(FACEBOOK);
} else {
throw new OperationNotPermittedException(FACEBOOK, message);
}
} else if (statusCode == HttpStatus.NOT_FOUND) {
throw new ResourceNotFoundException(FACEBOOK, message);
} else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR) {
if (message.equals("User must be an owner of the friendlist")) { // watch for pattern in similar message in other resources
throw new ResourceOwnershipException(message);
} else if (message.equals("The member must be a friend of the current user.")) {
throw new NotAFriendException(message);