Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 39 additions & 23 deletions PluginBase/src/org/bimserver/shared/HashMapVirtualObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -120,22 +120,15 @@ private int getWrappedValueSize(Object val, EReference eReference) {
if (val instanceof VirtualObject) {
VirtualObject eObject = (VirtualObject) val;
if (eReference.getEAnnotation("twodimensionalarray") != null) {
int refSize = 6;
EStructuralFeature eStructuralFeature = eObject.eClass().getEStructuralFeature("List");
List<?> l = (List<?>)eObject.eGet(eStructuralFeature);
for (Object o : l) {
if (o instanceof VirtualObject) {
refSize += 8;
} else if (o instanceof WrappedVirtualObject) {
refSize += ((WrappedVirtualObject)o).getSize();
} else {
refSize += getPrimitiveSize((EDataType) eStructuralFeature.getEType(), o);
}
}
return refSize;
return getEmbeddedListSize(eObject, "List");
} else if (eObject.eClass().getEAnnotation("wrapped") != null) {
VirtualObject wrappedValue = (VirtualObject) val;
EStructuralFeature wrappedValueFeature = wrappedValue.eClass().getEStructuralFeature("wrappedValue");

if (wrappedValueFeature.isMany()) {
return getEmbeddedListSize(eObject, "wrappedValue");
}

Object wrappedVal = eObject.eGet(wrappedValueFeature);
return 2 + getPrimitiveSize((EDataType) wrappedValueFeature.getEType(), wrappedVal);
} else {
Expand All @@ -150,6 +143,22 @@ private int getWrappedValueSize(Object val, EReference eReference) {
throw new RuntimeException("Programming error, should not happen " + val);
}
}

private int getEmbeddedListSize(VirtualObject eObject, String featureName) {
int refSize = 6;
EStructuralFeature eStructuralFeature = eObject.eClass().getEStructuralFeature(featureName);
List<?> l = (List<?>)eObject.eGet(eStructuralFeature);
for (Object o : l) {
if (o instanceof VirtualObject) {
refSize += 8;
} else if (o instanceof WrappedVirtualObject) {
refSize += ((WrappedVirtualObject)o).getSize();
} else {
refSize += getPrimitiveSize((EDataType) eStructuralFeature.getEType(), o);
}
}
return refSize;
}

private int getExactSize(VirtualObject virtualObject) {
int size = 16;
Expand Down Expand Up @@ -371,16 +380,11 @@ private void writeList(VirtualObject virtualObject, ByteBuffer buffer, PackageMe
if (o instanceof VirtualObject) {
VirtualObject listObject = (VirtualObject)o;
if (feature.getEAnnotation("twodimensionalarray") != null) {
Short cid = getDatabaseInterface().getCidOfEClass((EClass) feature.getEType());

buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.putShort((short) -cid);
buffer.order(ByteOrder.BIG_ENDIAN);

EStructuralFeature lf = listObject.eClass().getEStructuralFeature("List");
writeList(listObject, buffer, packageMetaData, lf);
} else {
if (listObject.eClass().getEAnnotation("wrapped") != null || listObject.eClass().getEStructuralFeature("wrappedValue") != null) {
writeEmbeddedList(listObject, "List", (EClass) feature.getEType(), buffer, packageMetaData);
} else if (listObject.eClass().getEAnnotation("wrapped") != null || listObject.eClass().getEStructuralFeature("wrappedValue") != null) {
if (feature.isMany()) {
writeEmbeddedList(listObject, "wrappedValue", listObject.eClass(), buffer, packageMetaData);
} else {
writeWrappedValue(getPid(), getRid(), listObject, buffer, packageMetaData);
}
}
Expand All @@ -406,6 +410,18 @@ private void writeList(VirtualObject virtualObject, ByteBuffer buffer, PackageMe
}
}

private void writeEmbeddedList(VirtualObject listObject, String featureName, EClass eClass, ByteBuffer buffer, PackageMetaData packageMetaData)
throws BimserverDatabaseException {
Short cid = getDatabaseInterface().getCidOfEClass(eClass);

buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.putShort((short) -cid);
buffer.order(ByteOrder.BIG_ENDIAN);

EStructuralFeature lf = listObject.eClass().getEStructuralFeature(featureName);
writeList(listObject, buffer, packageMetaData, lf);
}

private void writePrimitiveValue(EStructuralFeature feature, Object value, ByteBuffer buffer) throws BimserverDatabaseException {
EClassifier type = feature.getEType();
if (type == EcorePackage.eINSTANCE.getEString()) {
Expand Down