com.fujitsu.dc.client.http.DcResponse.java Source code

Java tutorial

Introduction

Here is the source code for com.fujitsu.dc.client.http.DcResponse.java

Source

/**
 * personium.io
 * Copyright 2014 FUJITSU LIMITED
 *
 * 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.fujitsu.dc.client.http;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.zip.GZIPInputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import com.fujitsu.dc.client.DaoException;
import com.fujitsu.dc.client.utils.Log;

///**
// * DAV??.
// */
/**
 * It creates a new object of DcResponse. This class is used to handle DAV Response.
 */
public class DcResponse {
    // /** . */
    /** Log object. */
    private Log log = new Log(DcResponse.class);

    // /** ?. */
    /** Response object. */
    private HttpResponse response;

    // /**
    // * .
    // */
    /**
     * This is the default constructor.
     */
    public DcResponse() {
    }

    // /**
    // * .
    // * @param resObj ?
    // */
    /**
     * This is the parameterized constructor used to initialize response.
     * @param resObj Response object
     */
    public DcResponse(final HttpResponse resObj) {
        this.response = resObj;
        debugHttpResponse(resObj);
    }

    // /**
    // * ??.
    // * @return 
    // */
    /**
     * This method is used to return status code value.
     * @return Status Code value
     */
    public final int getStatusCode() {
        return response.getStatusLine().getStatusCode();
    }

    // /**
    // * ??????.
    // * @param key ?
    // * @return ???
    // */
    /**
     * This method is used to get the value of the specified response header.
     * @param key Header Key
     * @return Value of the key specified
     */
    public final String getHeader(final String key) {
        Header[] headers = response.getHeaders(key);
        if (headers.length > 0) {
            return headers[0].getValue();
        } else {
            return "";
        }
    }

    // /**
    // * ????.
    // * @return ??
    // */
    /**
     * This method is used to get a list of response headers.
     * @return List of response headers
     */
    public final Header[] getHeaderList() {
        return response.getAllHeaders();
    }

    // /**
    // * ???.
    // * @return 
    // */
    /**
     * This method is used to the response body in stream format.
     * @return Stream
     */
    public final InputStream bodyAsStream() {
        InputStream is = null;
        try {
            is = this.getResponseBodyInputStream(response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return is;
    }

    // /**
    // * ???.
    // * @return 
    // * @throws DaoException DAO
    // */
    /**
     * This method is used to the response body in string format. It internally calls its overloaded version.
     * @return Body text
     * @throws DaoException Exception thrown
     */
    public final String bodyAsString() throws DaoException {
        return this.bodyAsString("utf-8");
    }

    // /**
    // * ???.
    // * @param enc 
    // * @return 
    // * @throws DaoException DAO
    // */
    /**
     * This method is used to the response body in string format.
     * @param enc Character code
     * @return Body text
     * @throws DaoException Exception thrown
     */
    public final String bodyAsString(final String enc) throws DaoException {
        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader reader = null;
        try {
            is = this.getResponseBodyInputStream(response);
            if (is == null) {
                return "";
            }
            isr = new InputStreamReader(is, enc);
            reader = new BufferedReader(isr);
            StringBuffer sb = new StringBuffer();
            int chr;
            while ((chr = reader.read()) != -1) {
                sb.append((char) chr);
            }
            return sb.toString();
        } catch (IOException e) {
            throw DaoException.create("io exception", 0);
        } finally {
            try {
                if (is != null) {
                    is.close();
                }
                if (isr != null) {
                    isr.close();
                }
                if (reader != null) {
                    reader.close();
                }
            } catch (Exception e) {
                throw DaoException.create("io exception", 0);
            } finally {
                try {
                    if (isr != null) {
                        isr.close();
                    }
                    if (reader != null) {
                        reader.close();
                    }
                } catch (Exception e2) {
                    throw DaoException.create("io exception", 0);
                } finally {
                    try {
                        if (reader != null) {
                            reader.close();
                        }
                    } catch (Exception e3) {
                        throw DaoException.create("io exception", 0);
                    }
                }
            }
        }
    }

    // /**
    // * ?JSON??.
    // * @return JSON
    // * @throws DaoException DAO
    // */
    /**
     * This method is used to the response body in JSON format.
     * @return JSONObject
     * @throws DaoException Exception thrown
     */
    public JSONObject bodyAsJson() throws DaoException {
        String res = bodyAsString();
        try {
            return (JSONObject) new JSONParser().parse(res);
        } catch (ParseException e) {
            throw DaoException.create("parse exception: " + e.getMessage(), 0);
        }
    }

    // /**
    // * ?XML??.
    // * @return XML DOM
    // */
    /**
     * This method is used to the response body in XML format.
     * @return XML DOM Object
     */
    public final Document bodyAsXml() {
        String str = "";
        try {
            str = bodyAsString();
        } catch (DaoException e1) {
            throw new RuntimeException(e1);
        }
        DocumentBuilder builder = null;
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            builder = factory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            throw new RuntimeException(e);
        }
        Document document = null;
        InputStream is = new ByteArrayInputStream(str.getBytes());
        try {
            document = builder.parse(is);
        } catch (SAXException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return document;
    }

    // /**
    // * ?????.
    // * @param res Response
    // * @return 
    // * @throws IOException IO
    // */
    /**
     * This method is used to receive a stream of response body.
     * @param res Response object
     * @return Stream
     * @throws IOException Exception thrown
     */
    protected final InputStream getResponseBodyInputStream(final HttpResponse res) throws IOException {
        // GZip ??????
        /** thaw if it is GZip compression. */
        Header[] contentEncodingHeaders = res.getHeaders("Content-Encoding");
        if (contentEncodingHeaders.length > 0 && "gzip".equalsIgnoreCase(contentEncodingHeaders[0].getValue())) {
            return new GZIPInputStream(res.getEntity().getContent());
        } else {
            HttpEntity he = res.getEntity();
            if (he != null) {
                return he.getContent();
            } else {
                return null;
            }
        }
    }

    // /**
    // * ?.
    // * @param res ??Response
    // */
    /**
     * This method is used for debugging purpose.
     * @param res Response object with debugging output
     */
    private void debugHttpResponse(HttpResponse res) {
        if (res != null) {
            log.debug("?Response ResponseCode: " + res.getStatusLine().getStatusCode());
            Header[] headers = res.getAllHeaders();
            for (int i = 0; i < headers.length; i++) {
                log.debug("ResponseHeader[" + headers[i].getName() + "] : " + headers[i].getValue());
            }
        }
    }
}