org.eclipselabs.emfjson.gwt.map.JSUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipselabs.emfjson.gwt.map.JSUtil.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.map;

import static org.eclipselabs.emfjson.gwt.common.Constants.EJS_REF_KEYWORD;
import static org.eclipselabs.emfjson.gwt.common.Constants.EJS_TYPE_KEYWORD;
import static org.eclipselabs.emfjson.gwt.common.ModelUtil.getEObjectURI;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

import org.eclipse.emf.common.util.Callback;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.URIConverter;

import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;

public class JSUtil {

    public static JSONValue parse(InputStream inputStream) {
        return JSONParser.parseStrict(toString(inputStream));
    }

    static String toString(InputStream inStream) {
        final StringBuilder out = new StringBuilder();
        byte[] b = new byte[4096];
        try {
            for (int n; (n = inStream.read(b)) != -1;) {
                out.append(new String(b, 0, n));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return out.toString();
    }

    public static void getNode(Resource resource, URI objectURI, EClass eClass,
            final Callback<JSONValue> callback) {
        URI fileURI = objectURI.trimFragment();
        ResourceSet resourceSet = resource.getResourceSet();
        URIConverter uriConverter = resourceSet.getURIConverter();

        //      String slash = "/";
        //      String current = slash;

        uriConverter.createInputStream(fileURI, resourceSet.getLoadOptions(), new Callback<Map<?, ?>>() {
            @Override
            public void onSuccess(Map<?, ?> result) {
                //               JSONValue root = JSUtil.parse(inStream);
                //               findNode(root, resourceSet, current, objectURI);
                callback.onSuccess(null);
            }

            @Override
            public void onFailure(Throwable caught) {
                callback.onFailure(caught);
            }
        });
    }

    public static JSONValue findNode(JSONObject node, ResourceSet resourceSet, String fragment, URI objectURI) {
        if (node == null)
            return null;

        final EClass currentEClass = getEClass(node, resourceSet);
        if (currentEClass != null) {
            EAttribute id = currentEClass.getEIDAttribute();
            if (id != null) {
                JSONString stringNode = node.get(id.getName()).isString();
                if (stringNode != null
                        && objectURI.trimFragment().appendFragment(stringNode.stringValue()).equals(objectURI)) {
                    return node;
                }
            } else {
                if (objectURI.trimFragment().appendFragment(fragment).equals(objectURI)) {
                    return node;
                }
            }

            for (EReference reference : currentEClass.getEAllContainments()) {
                if (node.containsKey(reference.getName())) {
                    JSONValue found = findNode(node.get(reference.getName()), resourceSet,
                            fragment += "/@" + reference.getName() + (reference.isMany() ? "." : ""), objectURI);

                    if (found != null) {
                        return found;
                    }
                }
            }
        }

        return null;
    }

    public static JSONValue findNode(JSONArray node, ResourceSet resourceSet, String fragment, URI objectURI) {
        JSONArray array = node.isArray();
        int pos = 0;
        String idx = fragment;

        for (int i = 0; i < array.size(); i++) {
            idx = fragment + pos;
            JSONObject current = array.get(i).isObject();

            if (current == null)
                continue;

            final EClass currentEClass = getEClass(current, resourceSet);
            if (currentEClass != null) {
                EAttribute id = currentEClass.getEIDAttribute();
                if (id != null) {
                    JSONString stringNode = current.get(id.getName()).isString();
                    if (stringNode != null && objectURI.trimFragment().appendFragment(stringNode.stringValue())
                            .equals(objectURI)) {
                        return current;
                    }
                } else {
                    if (objectURI.trimFragment().appendFragment(idx).equals(objectURI)) {
                        return current;
                    }
                }

                for (EReference reference : currentEClass.getEAllContainments()) {
                    if (current.containsKey(reference.getName())) {
                        JSONValue found = findNode(current.get(reference.getName()), resourceSet,
                                idx += "/@" + reference.getName() + (reference.isMany() ? "." : ""), objectURI);
                        if (found != null) {
                            return found;
                        }
                    }
                }
            }

            pos++;
        }
        return null;
    }

    public static JSONValue findNode(JSONValue node, ResourceSet resourceSet, String fragment, URI objectURI) {
        if (node.isArray() != null) {
            return findNode(node.isArray(), resourceSet, fragment, objectURI);
        } else if (node.isObject() != null) {
            return findNode(node.isObject(), resourceSet, fragment, objectURI);
        }

        return null;
    }

    public static EClass getEClass(JSONObject node, ResourceSet resourceSet) {
        if (node.containsKey(EJS_TYPE_KEYWORD)) {
            return (EClass) resourceSet
                    .getEObject(URI.createURI(node.get(EJS_TYPE_KEYWORD).isString().stringValue()), false);
        } else {
            return null;
        }
    }

    public static EClass findEClass(EClass eReferenceType, JSONObject node, Resource resource,
            Map<String, String> namespaces) {

        ResourceSet resourceSet = resource.getResourceSet();

        if (eReferenceType.isAbstract()) {

            if (node.containsKey(EJS_TYPE_KEYWORD)) {
                JSONValue typeNode = node.get(EJS_TYPE_KEYWORD);
                final URI typeURI = getEObjectURI(typeNode, eReferenceType.eResource(), namespaces);

                try {
                    return (EClass) resourceSet.getEObject(typeURI, true);
                } catch (ClassCastException e) {
                    return null;
                }
            } else if (node.containsKey(EJS_REF_KEYWORD)) {
                JSONValue refNode = node.get(EJS_REF_KEYWORD);
                URI refURI = getEObjectURI(refNode, resource, namespaces);
                EObject eObject = resourceSet.getEObject(refURI, true);

                if (eObject != null) {
                    return eObject.eClass();
                } else {
                    return eReferenceType;
                }

                //            refNode = findNode(refURI, eReferenceType, root);
                //            if (refNode != null) {
                //               return findEClass(eReferenceType, refNode.isObject(), root, resource, namespaces);
                //            }
            }
        }

        return eReferenceType;
    }

    public static void findEClass(EClass eReferenceType, JSONObject node, Resource resource,
            Map<String, String> namespaces, final Callback<EClass> callback) {

        ResourceSet resourceSet = resource.getResourceSet();

        if (eReferenceType.isAbstract()) {
            if (node.containsKey(EJS_TYPE_KEYWORD)) {
                JSONValue typeNode = node.get(EJS_TYPE_KEYWORD);
                final URI typeURI = getEObjectURI(typeNode, eReferenceType.eResource(), namespaces);

                resourceSet.getEObject(typeURI, new Callback<EObject>() {
                    @Override
                    public void onFailure(Throwable caught) {
                        callback.onFailure(caught);
                    }

                    @Override
                    public void onSuccess(EObject result) {
                        if (result instanceof EObject)
                            callback.onSuccess((EClass) result);
                        else
                            callback.onFailure(new ClassCastException(result + " cannot be cast to EClass"));
                    }
                });
            } else if (node.containsKey(EJS_REF_KEYWORD)) {
                JSONValue refNode = node.get(EJS_REF_KEYWORD);
                URI refURI = getEObjectURI(refNode, resource, namespaces);
                resourceSet.getEObject(refURI, new Callback<EObject>() {
                    @Override
                    public void onFailure(Throwable caught) {
                        callback.onFailure(caught);
                    }

                    @Override
                    public void onSuccess(EObject result) {
                        callback.onSuccess(result.eClass());
                    }
                });
            }
        } else {
            callback.onSuccess(eReferenceType);
        }
    }

    //   private static JSONObject findNode(URI nodeURI, EClass eClass, JSONObject root) {
    //      EAttribute eID = eClass.getEIDAttribute();
    //      if (eID == null) {
    //         final EStructuralFeature featureName = eClass.getEStructuralFeature("name");
    //         if (featureName != null && featureName instanceof EAttribute) {
    //            eID = (EAttribute) featureName;
    //         } else {
    //            return null;
    //         }
    //      }
    //
    //      String fragment = nodeURI.fragment().startsWith("//") ? nodeURI.fragment().substring(2) : nodeURI.fragment();
    //
    ////      for (JsonNode node: root.findParents(eID.getName())) {
    ////         String value = node.get(eID.getName()).getTextValue();
    ////         if (value.equals(fragment)){
    ////            return node;
    ////         }
    ////      }
    //      return null;
    //   }

}