Ejemplo n.º 1
0
  public void processClassCollection(final DefragmentServicesImpl services)
      throws CorruptionException, IOException {
    DefragmentContextImpl.processCopy(
        services,
        services.sourceClassCollectionID(),
        new SlotCopyHandler() {
          public void processCopy(DefragmentContextImpl context) {
            if (Deploy.debug) {
              context.readBegin(Const4.YAPCLASSCOLLECTION);
            }

            int acceptedClasses = 0;
            int numClassesOffset = context.targetBuffer().offset();
            acceptedClasses = copyAcceptedClasses(context, acceptedClasses);
            writeIntAt(context.targetBuffer(), numClassesOffset, acceptedClasses);

            if (Deploy.debug) {
              context.readEnd();
            }
          }

          private int copyAcceptedClasses(DefragmentContextImpl context, int acceptedClasses) {
            int numClasses = context.readInt();
            for (int classIdx = 0; classIdx < numClasses; classIdx++) {
              int classId = context.sourceBuffer().readInt();
              if (!accept(classId)) {
                continue;
              }
              ++acceptedClasses;
              context.writeMappedID(classId);
            }
            return acceptedClasses;
          }

          private void writeIntAt(ByteArrayBuffer target, int offset, int value) {
            int currentOffset = target.offset();
            target.seek(offset);
            target.writeInt(value);
            target.seek(currentOffset);
          }

          private boolean accept(int classId) {
            return services.accept(services.classMetadataForId(classId));
          }
        });
  }