/*
* Copyright (C) 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.api.explorer.client.base;
import com.google.api.explorer.client.base.dynamicjso.DynamicJso;
import com.google.common.collect.Maps;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArrayString;
import java.util.Map;
/**
* Represents a response from a call to an API service.
*
* @author jasonhall@google.com (Jason Hall)
*/
public class ApiResponse {
/**
* Class to store a key and value of a header.
*
*/
public static class HeaderValue {
final String key;
final String value;
/**
* Create a new header with the specified key and value.
*/
public HeaderValue(String key, String value) {
this.key = key;
this.value = value;
}
/**
* Returns the key.
*/
public String getKey() {
return key;
}
/**
* Returns the value.
*/
public String getValue() {
return value;
}
}
/** The response object */
private DynamicJso object;
/**
* A {@link Map} of normalized lower case response header keys to tuples
* containing the original key and the value.
*/
private final Map<String, HeaderValue> headers;
private ApiResponse(DynamicJso object) {
this.object = object;
this.headers = createHeadersMap(object);
}
/** Returns the value of the body element as a String. */
public String getBodyAsString() {
return object.getString("body");
}
/** Returns the status code of the response. */
public int getStatus() {
return object.getInteger("status");
}
/** Returns the text associated with the status code. */
public String getStatusText() {
return object.getString("statusText");
}
/**
* Returns a map of normalized lower case header keys, associated with a tuple
* containing the original key and the value.
*/
public Map<String, HeaderValue> getHeaders() {
return headers;
}
/** Instantiates a response from the JS object representation of a response. */
public static ApiResponse fromData(JavaScriptObject data) {
DynamicJso jso = data.cast();
return new ApiResponse(jso);
}
/**
* Inspects the headers object of the given JS object and constructs a
* {@link Map} of its keys and values.
*/
private static Map<String, HeaderValue> createHeadersMap(DynamicJso data) {
DynamicJso headers = data.get("headers");
JsArrayString keys = headers.keys();
Map<String, HeaderValue> headersMap = Maps.newHashMapWithExpectedSize(keys.length());
for (int i = 0; i < keys.length(); i++) {
String key = keys.get(i);
String value = "";
switch (headers.typeofKey(key)) {
case STRING:
value = headers.getString(key);
break;
case BOOLEAN:
value = String.valueOf(headers.getBoolean(key));
break;
case NUMBER:
value = String.valueOf(headers.getInteger(key));
break;
case INTEGER:
value = String.valueOf(headers.getDouble(key));
break;
}
headersMap.put(key.toLowerCase(), new HeaderValue(key, value));
}
return headersMap;
}
}