Family-Map-Project / FamilyMap / app / src / main / java / com / example / familymap / ServerProxy.java
ServerProxy.java
Raw
package com.example.familymap;

import android.util.Log;

import com.google.gson.Gson;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

import request.EventRequest;
import request.LoginRequest;
import request.PersonRequest;
import request.RegisterRequest;
import result.ClearResult;
import result.EventsResult;
import result.LoginResult;
import result.PersonsResult;
import result.RegisterResult;

public class ServerProxy
{
    String serverHost;
    String portNumber;

    public ServerProxy(String serverHost, String portNumber)
    {
        this.serverHost = serverHost;
        this.portNumber = portNumber;
    }

    public RegisterResult register(RegisterRequest request)
    {
        Gson gson = new Gson();

        try
        {
            URL url = new URL("http://" + serverHost + ":" + portNumber + "/user/register");

            HttpURLConnection http = (HttpURLConnection) url.openConnection();

            http.setRequestMethod("POST");

            http.setDoOutput(true);

            http.connect();

            String reqData = gson.toJson(request);

            OutputStream reqBody = http.getOutputStream();

            writeString(reqData, reqBody);

            reqBody.close();

            if (http.getResponseCode() == HttpURLConnection.HTTP_OK)
            {
                InputStream respBody = http.getInputStream();

                String respData = readString(respBody);

                RegisterResult result = gson.fromJson(respData, RegisterResult.class);

                return result;
            }
            else
            {
                System.out.print("ERROR: " + http.getResponseMessage());

                InputStream respBody = http.getErrorStream();

                String respData = readString(respBody);

                RegisterResult result = gson.fromJson(respData, RegisterResult.class);

                return result;
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        return null;
    }

    public LoginResult login(LoginRequest request)
    {
        Gson gson = new Gson();

        try
        {
            URL url = new URL("http://" + serverHost + ":" + portNumber + "/user/login");

            HttpURLConnection http = (HttpURLConnection) url.openConnection();

            http.setRequestMethod("POST");

            http.setDoOutput(true);

            http.connect();

            String reqData = gson.toJson(request);

            OutputStream reqBody = http.getOutputStream();

            writeString(reqData, reqBody);

            reqBody.close();

            if (http.getResponseCode() == HttpURLConnection.HTTP_OK)
            {
                InputStream respBody = http.getInputStream();

                String respData = readString(respBody);

                LoginResult result = gson.fromJson(respData, LoginResult.class);

                return result;
            }
            else
            {
                System.out.print("ERROR: " + http.getResponseMessage());

                InputStream respBody = http.getErrorStream();

                String respData = readString(respBody);

                LoginResult result = gson.fromJson(respData, LoginResult.class);

                return result;
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        return null;
    }

    public PersonsResult getPersons(PersonRequest request)
    {
        Gson gson = new Gson();

        try
        {
            URL url = new URL("http://" + serverHost + ":" + portNumber + "/person");

            HttpURLConnection http = (HttpURLConnection) url.openConnection();

            http.setRequestMethod("GET");

            http.addRequestProperty("Authorization", request.getAuthToken());

            http.setDoOutput(false);

            http.connect();

            if (http.getResponseCode() == HttpURLConnection.HTTP_OK)
            {
                InputStream respBody = http.getInputStream();

                String respData = readString(respBody);

                PersonsResult result = gson.fromJson(respData, PersonsResult.class);

                return result;
            }
            else
            {
                System.out.print("ERROR: " + http.getResponseMessage());

                InputStream respBody = http.getErrorStream();

                String respData = readString(respBody);

                PersonsResult result = gson.fromJson(respData, PersonsResult.class);

                return result;
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        return null;
    }

    public EventsResult getEvents(EventRequest request)
    {
        Gson gson = new Gson();

        try
        {
            URL url = new URL("http://" + serverHost + ":" + portNumber + "/event");

            HttpURLConnection http = (HttpURLConnection) url.openConnection();

            http.setRequestMethod("GET");

            http.addRequestProperty("Authorization", request.getAuthToken());

            http.setDoOutput(false);

            http.connect();

            if (http.getResponseCode() == HttpURLConnection.HTTP_OK)
            {
                InputStream respBody = http.getInputStream();

                String respData = readString(respBody);

                EventsResult result = gson.fromJson(respData, EventsResult.class);

                return result;
            }
            else
            {
                System.out.print("ERROR: " + http.getResponseMessage());

                InputStream respBody = http.getErrorStream();

                String respData = readString(respBody);

                EventsResult result = gson.fromJson(respData, EventsResult.class);

                return result;
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * Used only for JUnit testing purposes
     */
    public ClearResult clear()
    {
        Gson gson = new Gson();

        try
        {
            URL url = new URL("http://" + serverHost + ":" + portNumber + "/clear");

            HttpURLConnection http = (HttpURLConnection) url.openConnection();

            http.setRequestMethod("POST");

            http.setDoOutput(false);

            http.connect();

            if (http.getResponseCode() == HttpURLConnection.HTTP_OK)
            {
                InputStream respBody = http.getInputStream();

                String respData = readString(respBody);

                ClearResult result = gson.fromJson(respData, ClearResult.class);

                return result;
            }
            else
            {
                System.out.print("ERROR: " + http.getResponseMessage());

                InputStream respBody = http.getErrorStream();

                String respData = readString(respBody);

                ClearResult result = gson.fromJson(respData, ClearResult.class);

                return result;
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        return null;
    }

    public String readString(InputStream is) throws IOException
    {
        StringBuilder sb = new StringBuilder();
        InputStreamReader sr = new InputStreamReader(is);
        char[] buf = new char[1024];
        int len;

        while ((len = sr.read(buf)) > 0)
        {
            sb.append(buf, 0, len);
        }
        return sb.toString();
    }

    public void writeString(String str, OutputStream os) throws IOException
    {
        OutputStreamWriter sw = new OutputStreamWriter(os);
        sw.write(str);
        sw.flush();
    }
}