org.emfjson.gwt.common.AsyncIterator.java Source code

Java tutorial

Introduction

Here is the source code for org.emfjson.gwt.common.AsyncIterator.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.common;

import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONValue;
import org.eclipse.emf.common.util.Callback;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;

import org.emfjson.gwt.map.JsonReader;

import java.util.Iterator;
import java.util.Map;

import static org.emfjson.common.EObjects.setOrAdd;

public class AsyncIterator {

    final EObject object;
    final Iterator<EReference> it;
    final Map<EReference, JSONValue> map;
    final Callback<EObject> done;
    final JsonReader reader;

    public AsyncIterator(EObject object, Map<EReference, JSONValue> map, Callback<EObject> done,
            JsonReader reader) {

        this.object = object;
        this.it = map.keySet().iterator();
        this.map = map;
        this.done = done;
        this.reader = reader;
    }

    public static void forEach(EObject object, Map<EReference, JSONValue> map, Callback<EObject> done,
            JsonReader reader) {

        new AsyncIterator(object, map, done, reader).forEach();
    }

    public static void forEach(final Resource resource, final int position, final JSONArray array,
            final JsonReader reader, final Callback<Resource> callback) {

        if (position >= array.size()) {

            callback.onSuccess(resource);

        } else {

            final JSONValue current = array.get(position);
            final JSONObject currentObject = current.isObject();

            if (currentObject != null) {

                reader.parseObject(currentObject, null, new Callback<EObject>() {
                    @Override
                    public void onFailure(Throwable caught) {
                        callback.onFailure(caught);
                    }

                    @Override
                    public void onSuccess(EObject result) {
                        if (result != null) {
                            resource.getContents().add(result);
                        }
                        forEach(resource, position + 1, array, reader, callback);
                    }
                });

            } else {

                callback.onFailure(new ClassCastException());

            }
        }
    }

    public static void forEach(final Resource resource, final Iterator<AsyncReferenceEntry> it,
            final Callback<Resource> callback) {

        if (!it.hasNext()) {
            callback.onSuccess(resource);
        } else {
            AsyncReferenceEntry entry = it.next();
            entry.resolve(resource, new Callback<Resource>() {
                @Override
                public void onFailure(Throwable caught) {
                    callback.onFailure(caught);
                }

                @Override
                public void onSuccess(Resource result) {
                    forEach(resource, it, callback);
                }
            });
        }
    }

    private void forEach() {
        if (it.hasNext()) {
            final EReference reference = it.next();
            final JSONValue value = map.get(reference);
            final JSONArray array = value.isArray();

            if (array != null) {

                forEach(0, array, reference);

            } else {

                JSONObject obj = value.isObject();
                if (obj == null) {

                    done.onFailure(new ClassCastException());

                } else {

                    reader.parseObject(value.isObject(), reference, new Callback<EObject>() {
                        @Override
                        public void onFailure(Throwable caught) {
                            done.onFailure(caught);
                        }

                        @Override
                        public void onSuccess(EObject result) {
                            setOrAdd(object, reference, result);
                            forEach();
                        }
                    });

                }

            }

        } else {

            done.onSuccess(object);

        }
    }

    private void forEach(final int pos, final JSONArray array, final EReference reference) {
        if (pos >= array.size()) {

            forEach();

        } else {

            JSONValue current = array.get(pos);
            JSONObject obj = current.isObject();
            if (obj == null) {

                done.onFailure(new ClassCastException());

            } else {

                reader.parseObject(obj, reference, new Callback<EObject>() {
                    @Override
                    public void onFailure(Throwable caught) {
                        done.onFailure(caught);
                    }

                    @Override
                    public void onSuccess(EObject result) {
                        setOrAdd(object, reference, result);
                        forEach(pos + 1, array, reference);
                    }
                });

            }

        }
    }

}