Search in sources :

Example 6 with AbstractEList

use of org.eclipse.emf.common.util.AbstractEList 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("_t")) {
            String type = jsonReader.nextString();
            if (eClass == null) {
                eClass = model.getPackageMetaData().getEClassIncludingDependencies(type);
            }
            if (eClass == null) {
                throw new DeserializeException("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);
                }
            }
            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("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 {
                                            // TODO: another case for two-dimensional arrays
                                            jsonReader.beginObject();
                                            String nextName = jsonReader.nextName();
                                            if (nextName.equals("_t")) {
                                                String t = jsonReader.nextString();
                                                IdEObject wrappedObject = (IdEObject) model.create(model.getPackageMetaData().getEClass(t), -1);
                                                if (jsonReader.nextName().equals("_v")) {
                                                    EStructuralFeature wv = wrappedObject.eClass().getEStructuralFeature("wrappedValue");
                                                    wrappedObject.eSet(wv, readPrimitive(jsonReader, wv));
                                                    list.add(wrappedObject);
                                                } else {
                                                    throw new DeserializeException("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(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.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("_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) 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) EReference(org.eclipse.emf.ecore.EReference)

Aggregations

AbstractEList (org.eclipse.emf.common.util.AbstractEList)6 IdEObject (org.bimserver.emf.IdEObject)5 IdEObjectImpl (org.bimserver.emf.IdEObjectImpl)5 EObject (org.eclipse.emf.ecore.EObject)5 EAttribute (org.eclipse.emf.ecore.EAttribute)4 EClass (org.eclipse.emf.ecore.EClass)4 EReference (org.eclipse.emf.ecore.EReference)4 List (java.util.List)3 EStructuralFeature (org.eclipse.emf.ecore.EStructuralFeature)3 DeserializeException (org.bimserver.plugins.deserializers.DeserializeException)2 HashMapVirtualObject (org.bimserver.shared.HashMapVirtualObject)2 EList (org.eclipse.emf.common.util.EList)2 EEnum (org.eclipse.emf.ecore.EEnum)2 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)1 JsonToken (com.google.gson.stream.JsonToken)1 IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1 Date (java.util.Date)1 HashMap (java.util.HashMap)1 Attribute (nl.tue.buildingsmart.schema.Attribute)1