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

Java tutorial

Introduction

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

Source

/*
 * Copyright (c) 2015 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.emfjson.gwt.handlers;

import com.google.gwt.http.client.*;
import org.eclipse.emf.common.util.Callback;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.URIHandler;
import org.eclipse.emf.ecore.resource.impl.URIHandlerImpl;

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

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

    public static void create(final ResourceSet resourceSet, URI createService, final Callback<Resource> callback) {
        RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, URL.encode(createService.toString()));
        builder.setHeader("Content-Type", "application/json");
        builder.setCallback(new RequestCallback() {
            @Override
            public void onResponseReceived(Request request, Response response) {
                if (response.getStatusCode() == 201) {
                    String location = response.getHeader("Location");
                    Resource resource = resourceSet.createResource(URI.createURI(location));
                    callback.onSuccess(resource);
                } else {
                    callback.onFailure(new Exception("Resource has not been created"));
                }
            }

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

        try {
            builder.send();
        } catch (RequestException e) {
            callback.onFailure(e);
        }
    }

    @Override
    public void createInputStream(final URI uri, Map<?, ?> options, final Callback<Map<?, ?>> callback) {
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(uri.toString()));
        builder.setHeader("Content-Type", "application/json");
        builder.setCallback(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);
                    }
                    callback.onSuccess(resultMap);
                } else {
                    callback.onFailure(new Exception("Error " + response.getStatusCode()));
                }
            }

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

        try {
            builder.send();
        } catch (RequestException e) {
            callback.onFailure(e);
        }
    }

    @Override
    public void delete(URI uri, Map<?, ?> options, final Callback<Map<?, ?>> callback) {
        RequestBuilder builder = new RequestBuilder(RequestBuilder.DELETE, URL.encode(uri.toString()));
        builder.setHeader("Content-Type", "application/json");
        builder.setCallback(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);
                } else {
                    callback.onFailure(new Exception(response.getStatusText()));
                }
            }

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

        try {
            builder.send();
        } catch (RequestException e) {
            callback.onFailure(e);
        }
    }

    @Override
    public void store(URI uri, byte[] bytes, Map<?, ?> options, final Callback<Map<?, ?>> callback) {
        RequestBuilder builder = new RequestBuilder(RequestBuilder.PUT, URL.encode(uri.toString()));
        builder.setHeader("Content-Type", "application/json");
        builder.setRequestData(new String(bytes));
        builder.setCallback(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,
                            new ByteArrayInputStream(response.getText().getBytes()));
                    responseMap.put(URIConverter.RESPONSE_TIME_STAMP_PROPERTY, null);
                    responseMap.put(URIConverter.RESPONSE_URI, null);
                    callback.onSuccess(resultMap);
                } else {
                    callback.onFailure(new Exception("Error " + response.getStatusCode()));
                }
            }

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

        try {
            builder.send();
        } catch (RequestException e) {
            callback.onFailure(e);
        }
    }

    @Override
    public void exists(URI uri, Map<?, ?> options, final Callback<Boolean> callback) {
        RequestBuilder builder = new RequestBuilder(RequestBuilder.HEAD, URL.encode(uri.toString()));
        builder.setHeader("Content-Type", "application/json");
        builder.setCallback(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);
            }
        });

        try {
            builder.send();
        } catch (RequestException e) {
            callback.onFailure(e);
        }
    }

}