private void writeModsForOneFs()

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
    }