fr.qinder.api.APIGetter.java Source code

Java tutorial

Introduction

Here is the source code for fr.qinder.api.APIGetter.java

Source

/*
 * Copyright (C) 2014 Maigret Aurelien / Colin Julien
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package fr.qinder.api;

import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;

import org.apache.http.HttpStatus;
import org.apache.http.client.entity.UrlEncodedFormEntity;

/**
 * TODO: Comments this class
 * 
 * @author Maigret Aurelien
 * @author Colin Julien
 */
public class APIGetter extends AsyncTask<APIRequest, APIRequest, Void> {

    public APIGetter() {
        APICookie.getInstance();
    }

    protected HttpsURLConnection post(String sUrl, APIRequest request) {
        HttpsURLConnection urlConnection;
        URL url;
        try {
            url = new URL(sUrl);
            urlConnection = (HttpsURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            if (request.getPosts().size() != 0) {
                urlConnection.setRequestMethod("POST");
                urlConnection.setDoInput(true);
                urlConnection.setDoOutput(true);
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(request.getPosts());
                OutputStream post = urlConnection.getOutputStream();
                entity.writeTo(post);
                post.flush();
            }
            urlConnection.connect();
        } catch (IOException e) {
            urlConnection = null;
        }
        return urlConnection;
    }

    @Override
    protected void onProgressUpdate(APIRequest... requests) {
        super.onProgressUpdate(requests);
        for (int i = 0; i < requests.length; i++) {
            requests[i].onResult();
        }
    }

    protected InputStream getInputStream(HttpsURLConnection request) throws IOException {
        InputStream res;

        if (request.getResponseCode() == HttpStatus.SC_OK) {
            res = request.getInputStream();
        } else {
            res = request.getErrorStream();
        }
        return res;
    }

    private void readResponse(APIRequest request) {
        APIResponse response = request.getResponse();

        try {
            response.setCode(response.getResponse().getResponseCode());
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(getInputStream(response.getResponse()), "UTF-8"));
            StringBuilder builder = new StringBuilder();
            String line = reader.readLine();
            while (line != null) {
                builder.append(line).append("\n");
                line = reader.readLine();
            }
            response.setData(builder.toString());
            if (request.isCached() && request.getPosts().size() == 0 && response.getCode() == HttpStatus.SC_OK) {
                APICache.getInstance().addCache(request.getUrl(), response.getResponse(), response.getData());
            }
        } catch (IOException e) {
            response.setCode(0);
            response.setData(null);
        }
    }

    private void executeRequest(APIRequest request) {
        APIResponse response = request.getResponse();

        Log.i("Request APIGetter", (request.getPosts().size() == 0 ? "GET" : "POST") + " " + request.getUrl());
        if (request.isCached() && request.getPosts().size() == 0
                && APICache.getInstance().getCache(request.getUrl()) != null) {
            response.setResponse(APICache.getInstance().getCacheResponse(request.getUrl()));
            response.setData(APICache.getInstance().getCacheData(request.getUrl()));
            response.setCode(HttpStatus.SC_OK);
            response.setIsCache(true);
        } else {
            response.setResponse(post(request.getUrl(), request));
            response.setIsCache(false);
            if (response.getResponse() != null) {
                readResponse(request);
            }
        }
    }

    @Override
    protected Void doInBackground(APIRequest... requests) {
        for (int i = 0; i < requests.length; i++) {
            requests[i].setResponse(new APIResponse());
            APIResponse response = requests[i].getResponse();
            response.setCode(0);
            response.setData(null);
            response.setResponse(null);
            requests[i].preExecute();
            for (int j = 0; j < requests[i].getGets().size(); j++) {
                requests[i].setUrl(fr.qinder.tools.URL.addParameter(requests[i].getUrl(),
                        requests[i].getGets().get(j).getName(), requests[i].getGets().get(j).getValue()));
            }
            executeRequest(requests[i]);
            requests[i].postExecute();
            publishProgress(requests[i]);
        }
        return null;
    }

}