org.eclipselabs.emfjson.gwt.handlers.HttpHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipselabs.emfjson.gwt.handlers.HttpHandler.java

Source

/*******************************************************************************
 * Copyright (c) 2013 Guillaume Hillairet.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Guillaume Hillairet - initial API and implementation
 *******************************************************************************/
package org.eclipselabs.emfjson.gwt.handlers;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.emf.common.util.Callback;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.URIHandler;
import org.eclipse.emf.ecore.resource.impl.URIHandlerImpl;

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 com.google.gwt.http.client.URL;

/**
 * {@link HttpHandler}
 * 
 * {@link URIHandler} implementation that uses {@link RequestBuilder} to communicate with 
 * an HTTP server in JSON format.
 * 
 * @author ghillairet
 * @since 0.6.0
 */
public class HttpHandler extends URIHandlerImpl implements URIHandler {

    @Override
    public void createInputStream(URI uri, Map<?, ?> options, final Callback<Map<?, ?>> callback) {
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(uri.toString()));

        try {
            builder.sendRequest(null, new RequestCallback() {
                @Override
                public void onResponseReceived(Request request, Response response) {
                    Map<String, Object> resultMap = new HashMap<String, Object>();
                    Map<String, Object> responseMap = new HashMap<String, Object>();
                    resultMap.put(URIConverter.OPTION_RESPONSE, responseMap);

                    if (200 == response.getStatusCode()) {
                        String responseText = response.getText();
                        if (responseText != null) {
                            InputStream stream = new ByteArrayInputStream(responseText.getBytes());
                            responseMap.put(URIConverter.RESPONSE_RESULT, stream);
                        }
                    } else {
                        responseMap.put(URIConverter.RESPONSE_RESULT, null);
                    }
                    callback.onSuccess(resultMap);
                }

                @Override
                public void onError(Request request, Throwable exception) {
                    callback.onFailure(exception);
                }
            });
        } catch (RequestException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void delete(URI uri, Map<?, ?> options, final Callback<Map<?, ?>> callback) {
        RequestBuilder builder = new RequestBuilder(RequestBuilder.DELETE, URL.encode(uri.toString()));

        try {
            builder.sendRequest(null, new RequestCallback() {
                @Override
                public void onResponseReceived(Request request, Response response) {
                    Map<String, Object> resultMap = new HashMap<String, Object>();
                    Map<String, Object> responseMap = new HashMap<String, Object>();
                    resultMap.put(URIConverter.OPTION_RESPONSE, responseMap);

                    int code = response.getStatusCode();
                    if (code >= 200 && code < 300) {
                        responseMap.put(URIConverter.RESPONSE_RESULT, null);
                        responseMap.put(URIConverter.RESPONSE_TIME_STAMP_PROPERTY, null);
                        responseMap.put(URIConverter.RESPONSE_URI, null);
                    }

                    callback.onSuccess(resultMap);
                }

                @Override
                public void onError(Request request, Throwable exception) {
                    callback.onFailure(exception);
                }
            });
        } catch (RequestException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void store(URI uri, byte[] bytes, Map<?, ?> options, final Callback<Map<?, ?>> callback) {
        RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, URL.encode(uri.toString()));

        String data = new String(bytes);
        try {
            builder.sendRequest(data, new RequestCallback() {
                @Override
                public void onResponseReceived(Request request, Response response) {
                    Map<String, Object> resultMap = new HashMap<String, Object>();
                    Map<String, Object> responseMap = new HashMap<String, Object>();
                    resultMap.put(URIConverter.OPTION_RESPONSE, responseMap);

                    int code = response.getStatusCode();
                    if (code > 200 && code < 300) {
                        responseMap.put(URIConverter.RESPONSE_RESULT, null);
                        responseMap.put(URIConverter.RESPONSE_TIME_STAMP_PROPERTY, null);
                        responseMap.put(URIConverter.RESPONSE_URI, null);
                    }

                    callback.onSuccess(resultMap);
                }

                @Override
                public void onError(Request request, Throwable exception) {
                    callback.onFailure(exception);
                }
            });
        } catch (RequestException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void exists(URI uri, Map<?, ?> options, final Callback<Boolean> callback) {
        RequestBuilder builder = new RequestBuilder(RequestBuilder.HEAD, URL.encode(uri.toString()));

        try {
            builder.sendRequest(null, new RequestCallback() {
                @Override
                public void onResponseReceived(Request request, Response response) {
                    int code = response.getStatusCode();
                    if (code >= 200 && code < 300) {
                        callback.onSuccess(true);
                    } else {
                        callback.onSuccess(false);
                    }
                }

                @Override
                public void onError(Request request, Throwable exception) {
                    callback.onFailure(exception);
                }
            });
        } catch (RequestException e) {
            e.printStackTrace();
        }
    }

}