Search in sources :

Example 6 with InverseAttribute

use of nl.tue.buildingsmart.schema.InverseAttribute 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)

Example 7 with InverseAttribute

use of nl.tue.buildingsmart.schema.InverseAttribute in project BIMserver by opensourceBIM.

the class TracingGarbageCollector method mark.

@SuppressWarnings("rawtypes")
public void mark(Set<? extends IdEObject> rootObjects) {
    referencedObjects.addAll(rootObjects);
    SchemaDefinition schema = ifcModel.getPackageMetaData().getSchemaDefinition();
    for (IdEObject rootObject : rootObjects) {
        for (EReference eReference : rootObject.eClass().getEAllReferences()) {
            Attribute attributeBNWithSuper = null;
            if (schema != null) {
                EntityDefinition entityBN = schema.getEntityBN(rootObject.eClass().getName());
                if (entityBN == null) {
                    LOGGER.info(rootObject.eClass().getName() + " not found");
                } else {
                    attributeBNWithSuper = entityBN.getAttributeBNWithSuper(eReference.getName());
                    if (attributeBNWithSuper == null) {
                        LOGGER.info(eReference.getName() + " not found");
                    }
                }
            }
            if (schema == null || !(attributeBNWithSuper instanceof InverseAttribute)) {
                Object referredObject = rootObject.eGet(eReference);
                if (eReference.isMany()) {
                    List list = (List) referredObject;
                    for (Object o : list) {
                        if (!referencedObjects.contains(o)) {
                            mark(makeSet((IdEObject) o));
                        }
                    }
                } else {
                    IdEObject referredIdEObject = (IdEObject) referredObject;
                    if (referredIdEObject != null) {
                        if (!referencedObjects.contains(referredObject)) {
                            mark(makeSet(referredIdEObject));
                        }
                    }
                }
            }
        }
    }
}
Also used : EntityDefinition(nl.tue.buildingsmart.schema.EntityDefinition) SchemaDefinition(nl.tue.buildingsmart.schema.SchemaDefinition) IdEObject(org.bimserver.emf.IdEObject) InverseAttribute(nl.tue.buildingsmart.schema.InverseAttribute) Attribute(nl.tue.buildingsmart.schema.Attribute) IdEObject(org.bimserver.emf.IdEObject) List(java.util.List) InverseAttribute(nl.tue.buildingsmart.schema.InverseAttribute) EReference(org.eclipse.emf.ecore.EReference)

Example 8 with InverseAttribute

use of nl.tue.buildingsmart.schema.InverseAttribute in project BIMserver by opensourceBIM.

the class AbstractObjectIDM method isInverse.

protected boolean isInverse(EStructuralFeature eStructuralFeature) throws ObjectIDMException {
    if (eStructuralFeature instanceof EReference && eStructuralFeature.getEContainingClass().getEAnnotation("wrapped") == null) {
        if (eStructuralFeature.getEAnnotation("hidden") == null && eStructuralFeature.getEContainingClass().getEAnnotation("hidden") == null) {
            EntityDefinition entityBN = packageMetaData.getSchemaDefinition().getEntityBN(eStructuralFeature.getEContainingClass().getName());
            if (entityBN == null) {
                throw new ObjectIDMException(eStructuralFeature.getEContainingClass().getName() + " not found");
            }
            Attribute attribute = entityBN.getAttributeBNWithSuper(eStructuralFeature.getName());
            return attribute instanceof InverseAttribute;
        } else {
            return false;
        }
    }
    return false;
}
Also used : EntityDefinition(nl.tue.buildingsmart.schema.EntityDefinition) InverseAttribute(nl.tue.buildingsmart.schema.InverseAttribute) Attribute(nl.tue.buildingsmart.schema.Attribute) InverseAttribute(nl.tue.buildingsmart.schema.InverseAttribute) EReference(org.eclipse.emf.ecore.EReference)

Aggregations

InverseAttribute (nl.tue.buildingsmart.schema.InverseAttribute)8 Attribute (nl.tue.buildingsmart.schema.Attribute)7 EntityDefinition (nl.tue.buildingsmart.schema.EntityDefinition)7 EAttribute (org.eclipse.emf.ecore.EAttribute)5 EReference (org.eclipse.emf.ecore.EReference)5 ExplicitAttribute (nl.tue.buildingsmart.schema.ExplicitAttribute)3 EClass (org.eclipse.emf.ecore.EClass)3 List (java.util.List)2 ListWaitingObject (org.bimserver.shared.ListWaitingObject)2 EObject (org.eclipse.emf.ecore.EObject)2 EStructuralFeature (org.eclipse.emf.ecore.EStructuralFeature)2 JsonToken (com.google.gson.stream.JsonToken)1 HashSet (java.util.HashSet)1 IntegerBound (nl.tue.buildingsmart.schema.IntegerBound)1 SchemaDefinition (nl.tue.buildingsmart.schema.SchemaDefinition)1 IdEObject (org.bimserver.emf.IdEObject)1 IfcGloballyUniqueId (org.bimserver.models.ifc2x3tc1.IfcGloballyUniqueId)1 DeserializeException (org.bimserver.plugins.deserializers.DeserializeException)1 WaitingList (org.bimserver.shared.WaitingList)1 AbstractEList (org.eclipse.emf.common.util.AbstractEList)1