Metuuu
11/21/2017 - 11:12 PM

Async Task Rajapinta

package com.metuproducts.kokemuksia.services;

import android.os.AsyncTask;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by lauri on 01/03/2017.
 */

public class YritysService {

    // RAJAPINNAN URL JA HAUN ASETUKSET
    public static final String _URL = "http://avoindata.prh.fi:80/bis/v1?";    // Rajapinnan base URL osoite 
    public static final Boolean TOTAL_REQUESTS = false;
    public static final Integer MAX_RESULTS = 6;
    public static final Integer RESULTS_FROM = 0;


    /* ---- Listener ----
        Listener on sellanen joka triggeroidään kun jokin asia valmistuu. Eli tässä tapauksessa listener triggeröidään kun rajapinta palauttaa vastauksen
        Listenerit tehdään public interfacena ja sisälle laitetaan eri tapaukset funktioina mitä voi tapahtua. tässä tilanteessa esim kun valmista tai jos on tapahtunut error. 
    */
    public interface CompletionListener {
        void onComplete(List<String> yritykset);
        void onError(Integer error);
    }
    private CompletionListener completionListener;



    // ---- Request Companies ----
    // Tätä kutsutaan muualta koodista! keyword on millä hakusanalla yrityksen nimeä haetaan, ja completionListener ilmoittaa kun haku on valmis
    public void requestCompanies(String keyword, CompletionListener completionListener) {
        this.completionListener = completionListener;
        RequestCompanies requestCompanies = new RequestCompanies();
        requestCompanies.execute(getQueryUrl(keyword, YritysService.TOTAL_REQUESTS, YritysService.MAX_RESULTS, YritysService.RESULTS_FROM));
    }



    // ---- Get query URL ---- (tässä luodaan rajapinta haku URL johon menee kaikki haun tiedot)
    private URL getQueryUrl(String keyword, Boolean totalResults, Integer maxResults, Integer resultsFrom) {
        URL url;
        try {
            url = new URL(_URL + "totalResults="+totalResults + "&maxResults="+maxResults + "&resultsFrom="+resultsFrom + "&name="+keyword);
            return url; // Returnaa URL
        } catch (MalformedURLException e) { // vaatii try catching
            e.printStackTrace();
        }
        return null;
    }


    // ---- Converting InputStream to String ---- (muuttaa siis input steramin stringiks)
    private String readStream(InputStream in) {
        BufferedReader reader = null;
        StringBuffer response = new StringBuffer();
        try {
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return response.toString();
    }


 
    /*
    ---- TÄSSÄ TULEE ASYNC TASK OSUUS ----

    PARAMETRIT:
    do in backgroundiin syötetään url, void toiseks en muista nyt miks ja kolmanneks parametriks String koska halutaan palauttaa string onPostExecutessa
    (URL luotiin getQueryUrl funktiossa)
    */

    private class RequestCompanies extends AsyncTask<URL, Void, String> {
        List<String> yritykset = new ArrayList<>(); // yritykset lista joka palautetaan listenerin kautta tästä hausta


        // Do in background osio tekee työn taustalla
        @Override
        protected String doInBackground(URL... urls) {

            HttpURLConnection urlConnection = null;

            try {
                urlConnection = (HttpURLConnection) urls[0].openConnection(); // url[0] on eka url. eka url parametri on siis URL lista kai oikeesti mut halutaan vaan yks haku tehä tässä joten aina url[0] ja syötetään vaan yksittäinen URL funktion parametrina 

                int responseCode = urlConnection.getResponseCode();

                if (responseCode == HttpURLConnection.HTTP_OK) {
                    String serverResponse = readStream(urlConnection.getInputStream());
                    JSONObject jsonObject = new JSONObject(serverResponse);
                    JSONArray results = jsonObject.getJSONArray("results");
                    for (int i = 0; i < results.length(); ++i) {
                        yritykset.add(results.getJSONObject(i).getString("name")); // lukee jsonista eri yritykset ja laittaa ne yritykset listaan
                    }
                    //Log.v("CatalogClient", server_response);
                }

            } catch (IOException e) { // triggeröidään listener error jos tulee erroreita
                e.printStackTrace();
                completionListener.onError(1); // numero 1 ja 2 on erroreitten tunnistamiseen että mihin erroriin jumahti.
            } catch (JSONException e) {
                e.printStackTrace();
                completionListener.onError(2);
            }
            return null;
        }

        // ---- onPostExecute suoriutuu automaattisesti kun doInBackground on saanut vastauksen rajapinnasta ----
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            if (yritykset != null) {
                completionListener.onComplete(yritykset); // triggeröi listenerin ja lähettää sinne yritykset listan
            }
        }

    }


}











/*

 ----- TOINEN FILU ESIM JOKU ACTIVITY -----

    private YritysService yritysService = new YritysService(); // luodaan YritysService


    // tää jonnekkin funktioon
    yritysService.requestCompanies("tähän string hakusana jolla haetaan yritystä, tää voi tulla vaikka text inputista", new YritysService.CompletionListener() { // eka parametri keyword ja toka listener
        @Override
        public void onComplete(List<String> yritykset) { // tän sisällä oleva koodi lähtee juoksemaan kun rajapinta haku on tehty
            
            // tähän koodi mitä halutaan tehä palautetulla datalla

        }
        @Override
        public void onError(Integer error) {
            // tää sillon jos erroria tullu rajapintahaussa
        }
    });



*/