Search in sources :

Example 26 with JsonToken

use of com.google.gson.stream.JsonToken in project BIMserver by opensourceBIM.

the class SharedJsonDeserializer method processObject.

@SuppressWarnings({ "rawtypes", "unchecked" })
private IdEObject processObject(IfcModelInterface model, WaitingList<Long> waitingList, JsonReader jsonReader, EClass eClass) throws IOException, DeserializeException, IfcModelInterfaceException {
    IdEObjectImpl object = null;
    jsonReader.beginObject();
    if (jsonReader.nextName().equals("_i")) {
        long oid = jsonReader.nextLong();
        if (jsonReader.nextName().equals("_u")) {
            UUID uuid = UUID.fromString(jsonReader.nextString());
            if (jsonReader.nextName().equals("_r")) {
                int rid = jsonReader.nextInt();
                if (jsonReader.nextName().equals("_t")) {
                    String type = jsonReader.nextString();
                    if (eClass == null) {
                        eClass = model.getPackageMetaData().getEClassIncludingDependencies(type);
                    }
                    if (eClass == null) {
                        throw new DeserializeException(DeserializerErrorCode.UNKNOWN_ENTITY, "No class found with name " + type);
                    }
                    if (model.containsNoFetch(oid)) {
                        object = (IdEObjectImpl) model.getNoFetch(oid);
                    } else {
                        if (eClass == StorePackage.eINSTANCE.getIfcHeader()) {
                            object = (IdEObjectImpl) StoreFactory.eINSTANCE.createIfcHeader();
                        } else {
                            object = (IdEObjectImpl) model.create(eClass, oid);
                        }
                    }
                    object.useInverses(false);
                    ((IdEObjectImpl) object).setUuid(uuid);
                    ((IdEObjectImpl) object).setRid(rid);
                    if (jsonReader.nextName().equals("_s")) {
                        int state = jsonReader.nextInt();
                        if (state == 1) {
                            object.setLoadingState(State.LOADING);
                            while (jsonReader.hasNext()) {
                                String featureName = jsonReader.nextName();
                                boolean embedded = false;
                                if (featureName.startsWith("_r")) {
                                    featureName = featureName.substring(2);
                                } else if (featureName.startsWith("_e")) {
                                    embedded = true;
                                    featureName = featureName.substring(2);
                                }
                                EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature(featureName);
                                if (eStructuralFeature == null) {
                                    throw new DeserializeException(DeserializerErrorCode.UNKNOWN_FIELD, "Unknown field (" + featureName + ") on class " + eClass.getName());
                                }
                                if (eStructuralFeature.isMany()) {
                                    jsonReader.beginArray();
                                    if (eStructuralFeature instanceof EAttribute) {
                                        List list = (List) object.eGet(eStructuralFeature);
                                        List<String> stringList = null;
                                        if (eStructuralFeature.getEType() == EcorePackage.eINSTANCE.getEDoubleObject() || eStructuralFeature.getEType() == EcorePackage.eINSTANCE.getEDouble()) {
                                            EStructuralFeature asStringFeature = eClass.getEStructuralFeature(eStructuralFeature.getName() + "AsString");
                                            stringList = (List<String>) object.eGet(asStringFeature);
                                        }
                                        while (jsonReader.hasNext()) {
                                            Object e = readPrimitive(jsonReader, eStructuralFeature);
                                            list.add(e);
                                            if (eStructuralFeature.getEType() == EcorePackage.eINSTANCE.getEDouble()) {
                                                double val = (Double) e;
                                                // TODO
                                                stringList.add("" + val);
                                            // this
                                            // is
                                            // losing
                                            // precision,
                                            // maybe
                                            // also
                                            // send
                                            // the
                                            // string
                                            // value?
                                            }
                                        }
                                    } else if (eStructuralFeature instanceof EReference) {
                                        int index = 0;
                                        AbstractEList list = (AbstractEList) object.eGet(eStructuralFeature);
                                        while (jsonReader.hasNext()) {
                                            if (embedded) {
                                                JsonToken peek = jsonReader.peek();
                                                if (peek == JsonToken.NUMBER) {
                                                    long refOid = jsonReader.nextLong();
                                                    processRef(model, waitingList, object, eStructuralFeature, index, list, refOid);
                                                } else if (eStructuralFeature.getEAnnotation("twodimensionalarray") != null) {
                                                    IdEObjectImpl listObject = model.create(((EReference) eStructuralFeature).getEReferenceType());
                                                    addToList(eStructuralFeature, index, list, listObject);
                                                    EStructuralFeature listFeature = listObject.eClass().getEStructuralFeature("List");
                                                    jsonReader.beginArray();
                                                    AbstractEList innerList = (AbstractEList) listObject.eGet(listFeature);
                                                    if (listFeature instanceof EAttribute) {
                                                        while (jsonReader.hasNext()) {
                                                            innerList.add(readPrimitive(jsonReader, listFeature));
                                                        }
                                                    } else {
                                                        while (jsonReader.hasNext()) {
                                                            jsonReader.beginObject();
                                                            String nextName = jsonReader.nextName();
                                                            if (nextName.equals("_t")) {
                                                                String t = jsonReader.nextString();
                                                                IdEObject wrappedObject = model.create(model.getPackageMetaData().getEClass(t), -1);
                                                                EList<EStructuralFeature> eAllStructuralFeatures = wrappedObject.eClass().getEAllStructuralFeatures();
                                                                for (EStructuralFeature eStructuralFeature2 : eAllStructuralFeatures) {
                                                                    if (jsonReader.nextName().contentEquals(eStructuralFeature2.getName())) {
                                                                        wrappedObject.eSet(eStructuralFeature2, readPrimitive(jsonReader, eStructuralFeature2));
                                                                    } else {
                                                                    // trouble
                                                                    }
                                                                }
                                                                innerList.add(wrappedObject);
                                                            } else if (nextName.equals("_r")) {
                                                                // Reference
                                                                long referenceOid = jsonReader.nextLong();
                                                                if (jsonReader.nextName().equals("_t")) {
                                                                    String refType = jsonReader.nextString();
                                                                    IdEObject refObject = (IdEObject) model.create(model.getPackageMetaData().getEClassIncludingDependencies(refType), referenceOid);
                                                                    ((IdEObjectImpl) refObject).setLoadingState(State.OPPOSITE_SETTING);
                                                                    model.add(refObject.getOid(), refObject);
                                                                    addToList(listFeature, index, innerList, refObject);
                                                                    ((IdEObjectImpl) refObject).setLoadingState(State.TO_BE_LOADED);
                                                                }
                                                            }
                                                            jsonReader.endObject();
                                                        }
                                                    }
                                                    jsonReader.endArray();
                                                } else {
                                                    jsonReader.beginObject();
                                                    String nextName = jsonReader.nextName();
                                                    if (nextName.equals("_t")) {
                                                        String t = jsonReader.nextString();
                                                        if (jsonReader.nextName().equals("_v")) {
                                                            if (jsonReader.peek() == JsonToken.BEGIN_ARRAY) {
                                                                // Embedded array
                                                                jsonReader.beginArray();
                                                                // Here we are, IfcLineIndex should implement IfcSegmentIndexSelect, just as IfcArcIndex should
                                                                IdEObjectImpl listObject = model.create(model.getPackageMetaData().getEClassIncludingDependencies(t));
                                                                // addToList(eStructuralFeature, index, list, listObject);
                                                                EStructuralFeature listFeature = listObject.eClass().getEStructuralFeature("wrappedValue");
                                                                AbstractEList innerList = (AbstractEList) listObject.eGet(listFeature);
                                                                while (jsonReader.hasNext()) {
                                                                    innerList.add(readPrimitive(jsonReader, listFeature));
                                                                }
                                                                jsonReader.endArray();
                                                                list.add(listObject);
                                                            } else {
                                                                IdEObject wrappedObject = (IdEObject) model.create(model.getPackageMetaData().getEClass(t), -1);
                                                                EStructuralFeature wv = wrappedObject.eClass().getEStructuralFeature("wrappedValue");
                                                                wrappedObject.eSet(wv, readPrimitive(jsonReader, wv));
                                                                list.add(wrappedObject);
                                                            }
                                                        } else {
                                                            throw new DeserializeException(DeserializerErrorCode.UNEXPECTED_FIELD, "Expected _v");
                                                        }
                                                    } else if (nextName.equals("_i")) {
                                                        // Not all are embedded...
                                                        long refOid = jsonReader.nextLong();
                                                        if (jsonReader.nextName().equals("_t")) {
                                                            String refType = jsonReader.nextString();
                                                            IdEObject refObject = (IdEObject) model.create(model.getPackageMetaData().getEClassIncludingDependencies(refType), refOid);
                                                            ((IdEObjectImpl) refObject).setLoadingState(State.OPPOSITE_SETTING);
                                                            model.add(refObject.getOid(), refObject);
                                                            addToList(eStructuralFeature, index, list, refObject);
                                                            ((IdEObjectImpl) refObject).setLoadingState(State.TO_BE_LOADED);
                                                        } else {
                                                            processRef(model, waitingList, object, eStructuralFeature, index, list, refOid);
                                                        }
                                                    }
                                                    jsonReader.endObject();
                                                }
                                            } else {
                                                jsonReader.beginObject();
                                                if (jsonReader.nextName().equals("_i")) {
                                                    long refOid = jsonReader.nextLong();
                                                    if (jsonReader.nextName().equals("_t")) {
                                                        String refType = jsonReader.nextString();
                                                        EClass referenceEClass = model.getPackageMetaData().getEClassIncludingDependencies(refType);
                                                        if (model.getNoFetch(refOid) != null) {
                                                            processRef(model, waitingList, object, eStructuralFeature, index, list, refOid);
                                                        } else {
                                                            IdEObject refObject = (IdEObject) model.create(referenceEClass, refOid);
                                                            ((IdEObjectImpl) refObject).setLoadingState(State.OPPOSITE_SETTING);
                                                            model.add(refObject.getOid(), refObject);
                                                            addToList(eStructuralFeature, index, list, refObject);
                                                            ((IdEObjectImpl) refObject).setLoadingState(State.TO_BE_LOADED);
                                                        }
                                                    }
                                                }
                                                jsonReader.endObject();
                                            }
                                            index++;
                                        }
                                    }
                                    jsonReader.endArray();
                                } else {
                                    if (eStructuralFeature instanceof EAttribute) {
                                        Object x = readPrimitive(jsonReader, eStructuralFeature);
                                        if (eStructuralFeature.getEType() == EcorePackage.eINSTANCE.getEDouble()) {
                                            EStructuralFeature asStringFeature = object.eClass().getEStructuralFeature(eStructuralFeature.getName() + "AsString");
                                            if (asStringFeature != null) {
                                                // TODO
                                                object.eSet(asStringFeature, "" + x);
                                            }
                                        // this
                                        // is
                                        // losing
                                        // precision,
                                        // maybe
                                        // also
                                        // send
                                        // the
                                        // string
                                        // value?
                                        }
                                        object.eSet(eStructuralFeature, x);
                                    } else if (eStructuralFeature instanceof EReference) {
                                        if (eStructuralFeature.getName().equals("GlobalId")) {
                                            IfcGloballyUniqueId globallyUniqueId = Ifc2x3tc1Factory.eINSTANCE.createIfcGloballyUniqueId();
                                            globallyUniqueId.setWrappedValue(jsonReader.nextString());
                                            object.eSet(eStructuralFeature, globallyUniqueId);
                                        } else if (embedded) {
                                            jsonReader.beginObject();
                                            if (jsonReader.nextName().equals("_t")) {
                                                String t = jsonReader.nextString();
                                                IdEObject wrappedObject = (IdEObject) model.create(model.getPackageMetaData().getEClassIncludingDependencies(t), -1);
                                                ((IdEObjectImpl) wrappedObject).setLoadingState(State.LOADING);
                                                if (eStructuralFeature.getEAnnotation("dbembed") != null) {
                                                    for (EStructuralFeature eStructuralFeature2 : wrappedObject.eClass().getEAllStructuralFeatures()) {
                                                        String fn = jsonReader.nextName();
                                                        if (fn.equals(eStructuralFeature2.getName())) {
                                                            wrappedObject.eSet(eStructuralFeature2, readPrimitive(jsonReader, eStructuralFeature2));
                                                        } else {
                                                            throw new DeserializeException(DeserializerErrorCode.UNEXPECTED_FIELD, fn + " / " + eStructuralFeature2.getName());
                                                        }
                                                    }
                                                    object.eSet(eStructuralFeature, wrappedObject);
                                                } else {
                                                    if (jsonReader.nextName().equals("_v")) {
                                                        EStructuralFeature wv = wrappedObject.eClass().getEStructuralFeature("wrappedValue");
                                                        wrappedObject.eSet(wv, readPrimitive(jsonReader, wv));
                                                        object.eSet(eStructuralFeature, wrappedObject);
                                                    }
                                                }
                                                ((IdEObjectImpl) wrappedObject).setLoadingState(State.LOADED);
                                            }
                                            jsonReader.endObject();
                                        } else {
                                            jsonReader.beginObject();
                                            if (jsonReader.nextName().equals("_i")) {
                                                long refOid = jsonReader.nextLong();
                                                if (jsonReader.nextName().equals("_t")) {
                                                    String refType = jsonReader.nextString();
                                                    boolean isInverse = false;
                                                    EntityDefinition entityBN = model.getPackageMetaData().getSchemaDefinition().getEntityBN(object.eClass().getName());
                                                    if (entityBN != null) {
                                                        // Some entities like GeometryInfo/Data are not in IFC schema, but valid
                                                        Attribute attributeBN = entityBN.getAttributeBNWithSuper(eStructuralFeature.getName());
                                                        if (attributeBN != null) {
                                                            if (attributeBN instanceof InverseAttribute) {
                                                                isInverse = true;
                                                            }
                                                        }
                                                    }
                                                    // if (!isInverse) {
                                                    if (model.getNoFetch(refOid) != null) {
                                                        object.eSet(eStructuralFeature, model.getNoFetch(refOid));
                                                    } else {
                                                        IdEObject refObject = (IdEObject) model.create(model.getPackageMetaData().getEClassIncludingDependencies(refType), refOid);
                                                        ((IdEObjectImpl) refObject).setLoadingState(State.OPPOSITE_SETTING);
                                                        model.add(refObject.getOid(), refObject);
                                                        object.eSet(eStructuralFeature, refObject);
                                                        ((IdEObjectImpl) refObject).setLoadingState(State.TO_BE_LOADED);
                                                    }
                                                // }
                                                }
                                            }
                                            jsonReader.endObject();
                                        }
                                    }
                                }
                            }
                            object.useInverses(true);
                            object.setLoadingState(State.LOADED);
                        } else {
                            // state not_loaded
                            object.setLoadingState(State.TO_BE_LOADED);
                        }
                        if (waitingList.containsKey(oid)) {
                            waitingList.updateNode(oid, eClass, object);
                        }
                        model.add(object.getOid(), object);
                    } else {
                        LOGGER.info("_s expected");
                    }
                } else {
                    LOGGER.info("_t expected");
                }
            } else {
                LOGGER.info("_r expected");
            }
        } else {
            LOGGER.info("_u expected");
        }
    } else {
        LOGGER.info("_i expected");
    }
    jsonReader.endObject();
    return object;
}
Also used : AbstractEList(org.eclipse.emf.common.util.AbstractEList) EAttribute(org.eclipse.emf.ecore.EAttribute) Attribute(nl.tue.buildingsmart.schema.Attribute) InverseAttribute(nl.tue.buildingsmart.schema.InverseAttribute) EStructuralFeature(org.eclipse.emf.ecore.EStructuralFeature) IfcGloballyUniqueId(org.bimserver.models.ifc2x3tc1.IfcGloballyUniqueId) DeserializeException(org.bimserver.plugins.deserializers.DeserializeException) EntityDefinition(nl.tue.buildingsmart.schema.EntityDefinition) EAttribute(org.eclipse.emf.ecore.EAttribute) EClass(org.eclipse.emf.ecore.EClass) EList(org.eclipse.emf.common.util.EList) AbstractEList(org.eclipse.emf.common.util.AbstractEList) WaitingList(org.bimserver.shared.WaitingList) List(java.util.List) ListWaitingObject(org.bimserver.shared.ListWaitingObject) EObject(org.eclipse.emf.ecore.EObject) JsonToken(com.google.gson.stream.JsonToken) InverseAttribute(nl.tue.buildingsmart.schema.InverseAttribute) UUID(java.util.UUID) EReference(org.eclipse.emf.ecore.EReference)

Aggregations

JsonToken (com.google.gson.stream.JsonToken)26 JsonReader (com.google.gson.stream.JsonReader)9 IOException (java.io.IOException)6 List (java.util.List)4 JsonPrimitive (com.google.gson.JsonPrimitive)3 InputStreamReader (java.io.InputStreamReader)3 ArrayList (java.util.ArrayList)3 HashSet (java.util.HashSet)3 BufferedReader (java.io.BufferedReader)2 PortModel (org.apache.airavata.model.PortModel)2 DeserializeException (org.bimserver.plugins.deserializers.DeserializeException)2 ListWaitingObject (org.bimserver.shared.ListWaitingObject)2 WaitingList (org.bimserver.shared.WaitingList)2 AbstractEList (org.eclipse.emf.common.util.AbstractEList)2 EList (org.eclipse.emf.common.util.EList)2 EObject (org.eclipse.emf.ecore.EObject)2 EReference (org.eclipse.emf.ecore.EReference)2 EStructuralFeature (org.eclipse.emf.ecore.EStructuralFeature)2 ParsingException (org.eclipse.smarthome.automation.parser.ParsingException)2 ParsingNestedException (org.eclipse.smarthome.automation.parser.ParsingNestedException)2