All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.emfjson.gwt.handlers.HttpHandler Maven / Gradle / Ivy

The newest version!
/*
 * 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 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> 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 resultMap = new HashMap();
				Map responseMap = new HashMap();
				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> 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 resultMap = new HashMap();
				Map responseMap = new HashMap();
				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> 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 resultMap = new HashMap();
				Map responseMap = new HashMap();
				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 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);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy