Java tutorial
/******************************************************************************* * 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; // } }