in uimaj-core/src/main/java/org/apache/uima/cas/impl/BinaryCasSerDes6.java [1685:1818]
private void writeModsForOneFs(FsChange fsChange) throws IOException {
TOP fs = fsChange.fs;
TypeImpl ti = fs._getTypeImpl();
if (fsChange.arrayUpdates != null) {
int prevIndex = 0;
writeVnumber(fsIndexes_dos, fsChange.arrayUpdates.size());
IntListIterator it = fsChange.arrayUpdates.iterator();
final SlotKind slotKind = ti.getComponentSlotKind();
if (TRACE_MOD_SER) {
System.out.format("trace ser mod array fsId: %,d nbrMods: %,d type: %s%n", fs._id,
fsChange.arrayUpdates.size(), ti.getShortName());
}
while (it.hasNext()) {
int index = it.nextNvc();
writeVnumber(fsIndexes_dos, index - prevIndex);
prevIndex = index;
if (TRACE_MOD_SER) {
System.out.format(" tr se mod fsId: %,d offset: %,d%n", fs._id, index);
}
switch (slotKind) {
case Slot_BooleanRef:
writeUnsignedByte(byte_dos, ((BooleanArray) fs).get(index) ? 1 : 0);
break;
case Slot_ByteRef:
writeUnsignedByte(byte_dos, ((ByteArray) fs).get(index));
break;
case Slot_ShortRef:
final short vs = ((ShortArray) fs).get(index);
writeDiff(int_i, vs, vPrevModShort);
vPrevModShort = vs;
break;
case Slot_LongRef: {
final long v = ((LongArray) fs).get(index);
writeLong(v, vPrevModLong);
vPrevModLong = v;
break;
}
case Slot_DoubleRef: {
final long v = Double.doubleToRawLongBits(((DoubleArray) fs).get(index));
writeDouble(v);
break;
}
case Slot_Int:
vPrevModInt = writeDiff(int_i, ((IntegerArray) fs).get(index), vPrevModInt);
break;
case Slot_Float:
writeFloat(CASImpl.float2int(((FloatArray) fs).get(index)));
break;
case Slot_HeapRef: {
final int v = getTgtSeqFromSrcFS((TOP) ((FSArray) fs).get(index));
vPrevModHeapRef = writeDiff(heapRef_i, v, vPrevModHeapRef);
break;
}
case Slot_StrRef:
writeString(((StringArray) fs).get(index));
break;
default:
Misc.internalError();
} // end of switch for array types
} // end of loop for elements in array
return;
} // end of if array type
// normal Feature mods, not array
writeVnumber(fsIndexes_dos, fsChange.featuresModified.cardinality());
int iPrevOffsetInFs = 0;
if (TRACE_MOD_SER) {
System.out.format("trace ser mod feats fsId: %,d nbrMods: %,d type: %s%n", fs._id,
fsChange.featuresModified.cardinality(), ti.getShortName());
}
BitSet bs = fsChange.featuresModified;
int offset = bs.nextSetBit(0);
while (offset >= 0) {
writeVnumber(fsIndexes_dos, offset - iPrevOffsetInFs);
iPrevOffsetInFs = offset;
final FeatureImpl fi = ti.getFeatureImpls()[offset];
if (TRACE_MOD_SER) {
System.out.format(" tr se mod fsId: %,d offset: %,d type: %s%n", fs._id, offset,
fi.getShortName());
}
final SlotKind slotKind = fi.getSlotKind();
switch (slotKind) {
case Slot_Boolean:
byte_dos.write(fs._getBooleanValueNc(fi) ? 1 : 0);
break;
case Slot_Byte:
byte_dos.write(fs._getByteValueNc(fi));
break;
case Slot_Short:
vPrevModShort = (short) writeDiff(int_i, fs._getShortValueNc(fi), vPrevModShort);
break;
case Slot_Int:
vPrevModInt = writeDiff(int_i, fs._getIntValueNc(fi), vPrevModInt);
break;
case Slot_LongRef: {
long v = fs._getLongValueNc(fi);
writeLong(v, vPrevModLong);
vPrevModLong = v;
break;
}
case Slot_Float:
writeFloat(CASImpl.float2int(fs._getFloatValueNc(fi)));
break;
case Slot_DoubleRef:
writeDouble(Double.doubleToRawLongBits(fs._getDoubleValueNc(fi)));
break;
case Slot_HeapRef: {
final int v = getTgtSeqFromSrcFS(fs._getFeatureValueNc(fi));
vPrevModHeapRef = writeDiff(heapRef_i, v, vPrevModHeapRef);
}
break;
case Slot_StrRef:
writeString(fs._getStringValueNc(fi));
break;
default:
Misc.internalError();
} // end of Switch
offset = bs.nextSetBit(offset + 1);
} // end of iterator over all features
}