rpc.client.HTTPClient.java Source code

Java tutorial

Introduction

Here is the source code for rpc.client.HTTPClient.java

Source

/*
 * WBI Indicator Explorer
 *
 * Copyright 2015 Sebastian Nogara <snogaraleal@gmail.com>
 *
 * This file is part of WBI.
 *
 * 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 rpc.client;

import java.util.HashMap;
import java.util.Map;

import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;

import rpc.shared.call.CallRequest;
import rpc.shared.call.CallResponse;
import rpc.shared.call.InvalidPayload;
import rpc.shared.data.Serializer;
import rpc.shared.data.SerializerException;

public class HTTPClient extends Client implements RequestCallback {
    private RequestBuilder builder;

    private Map<ClientRequest<?>, Request> pendingByClientRequest = new HashMap<ClientRequest<?>, Request>();
    private Map<Request, ClientRequest<?>> pendingByRequest = new HashMap<Request, ClientRequest<?>>();

    public HTTPClient(Serializer serializer, String url) {
        super(serializer);

        builder = new RequestBuilder(RequestBuilder.POST, url);
    }

    @Override
    public void send(ClientRequest<?> clientRequest) {
        String body;

        try {
            CallRequest callRequest = buildCallRequest(clientRequest);
            body = toRequestMessage(callRequest);
        } catch (SerializerException exception) {
            clientRequest.finish(new ClientRequest.Error(exception));
            return;
        }

        try {
            builder.setHeader("Content-Type", "application/json");
            Request request = builder.sendRequest(body, this);

            pendingByClientRequest.put(clientRequest, request);
            pendingByRequest.put(request, clientRequest);
        } catch (RequestException exception) {
            clientRequest.finish(new ClientRequest.Error(exception));
        }
    }

    @Override
    public void cancel(ClientRequest<?> clientRequest) {
        Request request = pendingByClientRequest.get(clientRequest);

        if (request != null) {
            request.cancel();

            pendingByClientRequest.remove(clientRequest);
            pendingByRequest.remove(request);
        }
    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Override
    public void onResponseReceived(Request request, Response response) {
        ClientRequest clientRequest = pendingByRequest.get(request);

        pendingByClientRequest.remove(clientRequest);
        pendingByRequest.remove(request);

        if (response.getStatusCode() == Response.SC_OK) {
            try {
                CallResponse callResponse = fromResponseMessage(response.getText());

                String payload = callResponse.getPayload();

                if (callResponse.isSuccess()) {
                    clientRequest.finish(deserialize(payload, clientRequest.getExpected()));
                } else {
                    clientRequest.finish(new ClientRequest.Error(payload));
                }
            } catch (InvalidPayload exception) {
                clientRequest.finish(new ClientRequest.Error(exception));

            } catch (SerializerException exception) {
                clientRequest.finish(new ClientRequest.Error(exception));
            }
        } else {
            String reason = response.getStatusText();
            clientRequest.finish(new ClientRequest.Error(reason));
        }
    };

    @Override
    public void onError(Request request, Throwable exception) {
        ClientRequest<?> clientRequest = pendingByRequest.get(request);

        pendingByClientRequest.remove(clientRequest);
        pendingByRequest.remove(request);

        clientRequest.finish(new ClientRequest.Error(exception));
    };
}