// Path: src/main/java/com/iobeam/api/RestException.java
// public class RestException extends ApiException {
// 
//     private final StatusCode statusCode;
//     private final int error;
//     private final String details;
// 
//     public RestException(final StatusCode statusCode,
//                          final int error,
//                          final String message) {
//         super(message);
//         this.statusCode = statusCode;
//         this.error = error;
//         this.details = "";
//     }
// 
//     public RestException(final StatusCode statusCode,
//                          final RestError error) {
//         super(error.getMessage());
//         this.statusCode = statusCode;
//         this.error = error.getError();
//         this.details = error.getDetails();
//     }
// 
//     public StatusCode getStatusCode() {
//         return statusCode;
//     }
// 
//     public int getError() {
//         return error;
//     }
// 
//     public String getDetails() {
//         return details;
//     }
// }
// 
// Path: src/main/java/com/iobeam/api/client/RestError.java
// public class RestError {
// 
//     private final int error;
//     private final String message;
//     private final String details;
// 
//     // Some useful errors. NOTE: must match Sleipnir REST errors.
//     public static final int RESOURCE_NOT_CREATED = 31;
//     public static final int RESOURCE_NOT_FOUND = 32;
//     public static final int RESOURCE_ALREADY_EXISTS = 33;
// 
//     public RestError(final int error,
//                      final String message,
//                      final String details) {
//         this.error = error;
//         this.message = message;
//         this.details = details;
//     }
// 
//     public int getError() {
//         return error;
//     }
// 
//     public String getMessage() {
//         return message;
//     }
// 
//     public String getDetails() {
//         return details;
//     }
// 
//     public static RestError fromJson(final JSONObject json) {
//         return new RestError(json.getInt("code"),
//                              json.getString("message"),
//                              json.optString("detailed_message", ""));
//     }
// }
// 
// Path: src/main/java/com/iobeam/api/http/StatusCode.java
// public enum StatusCode {
// 
//     OK(200),
//     CREATED(201),
//     ACCEPTED(202),
//     NO_CONTENT(204),
// 
//     MOVED_PERMANENTLY(301),
//     FOUND(302),
//     SEE_OTHER(303),
//     NOT_MODIFIED(304),
// 
//     BAD_REQUEST(400),
//     UNAUTHORIZED(401),
//     FORBIDDEN(403),
//     NOT_FOUND(404),
//     METHOD_NOT_ALLOWED(405),
//     NOT_ACCEPTABLE(406),
//     REQUEST_TIMEOUT(408),
//     CONFLICT(409),
//     LENGTH_REQUIRED(411),
//     PRECONDITION_FAILED(412),
//     REQUEST_ENTITY_TOO_LARGE(413),
//     TOO_MANY_REQUESTS(429),
// 
//     INTERNAL_SERVER_ERROR(500),
//     NOT_IMPLEMENTED(501),
//     BAD_GATEWAY(502),
//     SERVICE_UNAVAILABLE(503),
//     HTTP_VERSION_NOT_SUPPORTED(504);
// 
//     private static final EnumMap<StatusCode, String> descriptions =
//         new EnumMap<StatusCode, String>(StatusCode.class);
// 
//     private static final Map<Integer, StatusCode> reverseLookup =
//         new HashMap<Integer, StatusCode>();
// 
//     static {
//         for (final StatusCode status : StatusCode.values()) {
//             descriptions.put(status, status.name().toLowerCase().replace('_', ' '));
//             reverseLookup.put(status.getCode(), status);
//         }
//     }
// 
//     private final int status;
// 
//     private StatusCode(final int status) {
//         this.status = status;
//     }
// 
//     public int getCode() {
//         return status;
//     }
// 
//     public String getDescription() {
//         return descriptions.get(this);
//     }
// 
//     public static StatusCode fromValue(final int statusCode) {
//         return reverseLookup.get(statusCode);
//     }
// }


import com.iobeam.api.RestException;
import com.iobeam.api.client.RestError;
import com.iobeam.api.http.StatusCode;
package com.iobeam.api.auth;


/**
 * A specific RestException for authentication failures.
 */
public class AuthException extends RestException {

    public AuthException(final int error, final String message) {
        super(StatusCode.UNAUTHORIZED, error, message);
    }

    public AuthException(final RestError error) {
// Path: src/main/java/com/iobeam/api/RestException.java
// public class RestException extends ApiException {
// 
//     private final StatusCode statusCode;
//     private final int error;
//     private final String details;
// 
//     public RestException(final StatusCode statusCode,
//                          final int error,
//                          final String message) {
//         super(message);
//         this.statusCode = statusCode;
//         this.error = error;
//         this.details = "";
//     }
// 
//     public RestException(final StatusCode statusCode,
//                          final RestError error) {
//         super(error.getMessage());
//         this.statusCode = statusCode;
//         this.error = error.getError();
//         this.details = error.getDetails();
//     }
// 
//     public StatusCode getStatusCode() {
//         return statusCode;
//     }
// 
//     public int getError() {
//         return error;
//     }
// 
//     public String getDetails() {
//         return details;
//     }
// }
// 
// Path: src/main/java/com/iobeam/api/client/RestError.java
// public class RestError {
// 
//     private final int error;
//     private final String message;
//     private final String details;
// 
//     // Some useful errors. NOTE: must match Sleipnir REST errors.
//     public static final int RESOURCE_NOT_CREATED = 31;
//     public static final int RESOURCE_NOT_FOUND = 32;
//     public static final int RESOURCE_ALREADY_EXISTS = 33;
// 
//     public RestError(final int error,
//                      final String message,
//                      final String details) {
//         this.error = error;
//         this.message = message;
//         this.details = details;
//     }
// 
//     public int getError() {
//         return error;
//     }
// 
//     public String getMessage() {
//         return message;
//     }
// 
//     public String getDetails() {
//         return details;
//     }
// 
//     public static RestError fromJson(final JSONObject json) {
//         return new RestError(json.getInt("code"),
//                              json.getString("message"),
//                              json.optString("detailed_message", ""));
//     }
// }
// 
// Path: src/main/java/com/iobeam/api/http/StatusCode.java
// public enum StatusCode {
// 
//     OK(200),
//     CREATED(201),
//     ACCEPTED(202),
//     NO_CONTENT(204),
// 
//     MOVED_PERMANENTLY(301),
//     FOUND(302),
//     SEE_OTHER(303),
//     NOT_MODIFIED(304),
// 
//     BAD_REQUEST(400),
//     UNAUTHORIZED(401),
//     FORBIDDEN(403),
//     NOT_FOUND(404),
//     METHOD_NOT_ALLOWED(405),
//     NOT_ACCEPTABLE(406),
//     REQUEST_TIMEOUT(408),
//     CONFLICT(409),
//     LENGTH_REQUIRED(411),
//     PRECONDITION_FAILED(412),
//     REQUEST_ENTITY_TOO_LARGE(413),
//     TOO_MANY_REQUESTS(429),
// 
//     INTERNAL_SERVER_ERROR(500),
//     NOT_IMPLEMENTED(501),
//     BAD_GATEWAY(502),
//     SERVICE_UNAVAILABLE(503),
//     HTTP_VERSION_NOT_SUPPORTED(504);
// 
//     private static final EnumMap<StatusCode, String> descriptions =
//         new EnumMap<StatusCode, String>(StatusCode.class);
// 
//     private static final Map<Integer, StatusCode> reverseLookup =
//         new HashMap<Integer, StatusCode>();
// 
//     static {
//         for (final StatusCode status : StatusCode.values()) {
//             descriptions.put(status, status.name().toLowerCase().replace('_', ' '));
//             reverseLookup.put(status.getCode(), status);
//         }
//     }
// 
//     private final int status;
// 
//     private StatusCode(final int status) {
//         this.status = status;
//     }
// 
//     public int getCode() {
//         return status;
//     }
// 
//     public String getDescription() {
//         return descriptions.get(this);
//     }
// 
//     public static StatusCode fromValue(final int statusCode) {
//         return reverseLookup.get(statusCode);
//     }
// }


// Path: src/main/java/com/iobeam/api/auth/AuthException.java
import com.iobeam.api.RestException;
import com.iobeam.api.client.RestError;
import com.iobeam.api.http.StatusCode;

package com.iobeam.api.auth;


/**
 * A specific RestException for authentication failures.
 */
public class AuthException extends RestException {

    public AuthException(final int error, final String message) {
        super(StatusCode.UNAUTHORIZED, error, message);
    }

    public AuthException(final RestError error) {
        super(StatusCode.UNAUTHORIZED, error);