@@ -120,22 +120,15 @@ private int getWrappedValueSize(Object val, EReference eReference) {
120
120
if (val instanceof VirtualObject ) {
121
121
VirtualObject eObject = (VirtualObject ) val ;
122
122
if (eReference .getEAnnotation ("twodimensionalarray" ) != null ) {
123
- int refSize = 6 ;
124
- EStructuralFeature eStructuralFeature = eObject .eClass ().getEStructuralFeature ("List" );
125
- List <?> l = (List <?>)eObject .eGet (eStructuralFeature );
126
- for (Object o : l ) {
127
- if (o instanceof VirtualObject ) {
128
- refSize += 8 ;
129
- } else if (o instanceof WrappedVirtualObject ) {
130
- refSize += ((WrappedVirtualObject )o ).getSize ();
131
- } else {
132
- refSize += getPrimitiveSize ((EDataType ) eStructuralFeature .getEType (), o );
133
- }
134
- }
135
- return refSize ;
123
+ return getEmbeddedListSize (eObject , "List" );
136
124
} else if (eObject .eClass ().getEAnnotation ("wrapped" ) != null ) {
137
125
VirtualObject wrappedValue = (VirtualObject ) val ;
138
126
EStructuralFeature wrappedValueFeature = wrappedValue .eClass ().getEStructuralFeature ("wrappedValue" );
127
+
128
+ if (wrappedValueFeature .isMany ()) {
129
+ return getEmbeddedListSize (eObject , "wrappedValue" );
130
+ }
131
+
139
132
Object wrappedVal = eObject .eGet (wrappedValueFeature );
140
133
return 2 + getPrimitiveSize ((EDataType ) wrappedValueFeature .getEType (), wrappedVal );
141
134
} else {
@@ -150,6 +143,22 @@ private int getWrappedValueSize(Object val, EReference eReference) {
150
143
throw new RuntimeException ("Programming error, should not happen " + val );
151
144
}
152
145
}
146
+
147
+ private int getEmbeddedListSize (VirtualObject eObject , String featureName ) {
148
+ int refSize = 6 ;
149
+ EStructuralFeature eStructuralFeature = eObject .eClass ().getEStructuralFeature (featureName );
150
+ List <?> l = (List <?>)eObject .eGet (eStructuralFeature );
151
+ for (Object o : l ) {
152
+ if (o instanceof VirtualObject ) {
153
+ refSize += 8 ;
154
+ } else if (o instanceof WrappedVirtualObject ) {
155
+ refSize += ((WrappedVirtualObject )o ).getSize ();
156
+ } else {
157
+ refSize += getPrimitiveSize ((EDataType ) eStructuralFeature .getEType (), o );
158
+ }
159
+ }
160
+ return refSize ;
161
+ }
153
162
154
163
private int getExactSize (VirtualObject virtualObject ) {
155
164
int size = 16 ;
@@ -371,16 +380,11 @@ private void writeList(VirtualObject virtualObject, ByteBuffer buffer, PackageMe
371
380
if (o instanceof VirtualObject ) {
372
381
VirtualObject listObject = (VirtualObject )o ;
373
382
if (feature .getEAnnotation ("twodimensionalarray" ) != null ) {
374
- Short cid = getDatabaseInterface ().getCidOfEClass ((EClass ) feature .getEType ());
375
-
376
- buffer .order (ByteOrder .LITTLE_ENDIAN );
377
- buffer .putShort ((short ) -cid );
378
- buffer .order (ByteOrder .BIG_ENDIAN );
379
-
380
- EStructuralFeature lf = listObject .eClass ().getEStructuralFeature ("List" );
381
- writeList (listObject , buffer , packageMetaData , lf );
382
- } else {
383
- if (listObject .eClass ().getEAnnotation ("wrapped" ) != null || listObject .eClass ().getEStructuralFeature ("wrappedValue" ) != null ) {
383
+ writeEmbeddedList (listObject , "List" , (EClass ) feature .getEType (), buffer , packageMetaData );
384
+ } else if (listObject .eClass ().getEAnnotation ("wrapped" ) != null || listObject .eClass ().getEStructuralFeature ("wrappedValue" ) != null ) {
385
+ if (feature .isMany ()) {
386
+ writeEmbeddedList (listObject , "wrappedValue" , listObject .eClass (), buffer , packageMetaData );
387
+ } else {
384
388
writeWrappedValue (getPid (), getRid (), listObject , buffer , packageMetaData );
385
389
}
386
390
}
@@ -406,6 +410,18 @@ private void writeList(VirtualObject virtualObject, ByteBuffer buffer, PackageMe
406
410
}
407
411
}
408
412
413
+ private void writeEmbeddedList (VirtualObject listObject , String featureName , EClass eClass , ByteBuffer buffer , PackageMetaData packageMetaData )
414
+ throws BimserverDatabaseException {
415
+ Short cid = getDatabaseInterface ().getCidOfEClass (eClass );
416
+
417
+ buffer .order (ByteOrder .LITTLE_ENDIAN );
418
+ buffer .putShort ((short ) -cid );
419
+ buffer .order (ByteOrder .BIG_ENDIAN );
420
+
421
+ EStructuralFeature lf = listObject .eClass ().getEStructuralFeature (featureName );
422
+ writeList (listObject , buffer , packageMetaData , lf );
423
+ }
424
+
409
425
private void writePrimitiveValue (EStructuralFeature feature , Object value , ByteBuffer buffer ) throws BimserverDatabaseException {
410
426
EClassifier type = feature .getEType ();
411
427
if (type == EcorePackage .eINSTANCE .getEString ()) {
0 commit comments