package com.cattong.commons.oauth;
import java.util.HashMap;
import java.util.Map;
public class OAuthProblemException extends OAuthException {
private static final long serialVersionUID = 4917291056200936273L;
public static final String OAUTH_PROBLEM = "oauth_problem";
/** The name of a parameter whose value is the HTTP request. */
public static final String HTTP_REQUEST = "HTTP request";
/** The name of a parameter whose value is the HTTP response. */
public static final String HTTP_RESPONSE = "HTTP response";
/** The name of a parameter whose value is the HTTP resopnse status code. */
public static final String HTTP_STATUS_CODE = "HTTP status";
/** The name of a parameter whose value is the response Location header. */
public static final String HTTP_LOCATION = "Location";
/** The name of a parameter whose value is the OAuth signature base string. */
public static final String SIGNATURE_BASE_STRING = OAuth.OAUTH_SIGNATURE + " base string";
/** The name of a parameter whose value is the request URL. */
public static final String URL = "URL";
public OAuthProblemException() {
}
public OAuthProblemException(String problem) {
super(problem);
if (problem != null) {
parameters.put(OAUTH_PROBLEM, problem);
}
}
private final Map<String, Object> parameters = new HashMap<String, Object>();
@Override
public String getMessage() {
String msg = super.getMessage();
if (msg != null)
return msg;
msg = getProblem();
if (msg != null)
return msg;
Object response = getParameters().get(HTTP_RESPONSE);
if (response != null) {
msg = response.toString();
int eol = msg.indexOf("\n");
if (eol < 0) {
eol = msg.indexOf("\r");
}
if (eol >= 0) {
msg = msg.substring(0, eol);
}
msg = msg.trim();
if (msg.length() > 0) {
return msg;
}
}
response = getHttpStatusCode();
if (response != null) {
return HTTP_STATUS_CODE + " " + response;
}
return null;
}
public void setParameter(String name, Object value) {
getParameters().put(name, value);
}
public Map<String, Object> getParameters() {
return parameters;
}
public String getProblem() {
return (String) getParameters().get(OAUTH_PROBLEM);
}
public int getHttpStatusCode() {
Object code = getParameters().get(HTTP_STATUS_CODE);
if (code == null) {
return 200;
} else if (code instanceof Number) { // the usual case
return ((Number) code).intValue();
} else {
return Integer.parseInt(code.toString());
}
}
@Override
public String toString() {
final StringBuilder s = new StringBuilder(super.toString());
try {
final String eol = System.getProperty("line.separator", "\n");
final Map<String, Object> parameters = getParameters();
for (String key : new String[] {OAuth.Problems.OAUTH_PROBLEM_ADVICE, URL,
SIGNATURE_BASE_STRING }) {
Object value = parameters.get(key);
if (value != null)
s.append(eol + key + ": " + value);
}
Object msg = parameters.get(HTTP_REQUEST);
if ((msg != null))
s.append(eol + ">>>>>>>> " + HTTP_REQUEST + ":" + eol + msg);
msg = parameters.get(HTTP_RESPONSE);
if (msg != null) {
s.append(eol + "<<<<<<<< " + HTTP_RESPONSE + ":" + eol + msg);
} else {
for (Map.Entry<String, Object> parameter : parameters.entrySet()) {
String key = parameter.getKey();
if (OAuth.Problems.OAUTH_PROBLEM_ADVICE.equals(key)
|| URL.equals(key) || SIGNATURE_BASE_STRING.equals(key)
|| HTTP_REQUEST.equals(key) || HTTP_RESPONSE.equals(key))
continue;
s.append(eol + key + ": " + parameter.getValue());
}
}
} catch (Exception ignored) {
}
return s.toString();
}
}