cdm/src/main/java/ucar/nc2/stream/NcStreamIosp.java
public void openDebug(RandomAccessFile raf, NetcdfFile ncfile, List<NcsMess> ncm) throws IOException {
    raf.seek(0);
    long pos = raf.getFilePointer();

    if (!readAndTest(raf, NcStream.MAGIC_START)) {
      if (ncm != null) {
        ncm.add(new NcsMess(pos, 0, "MAGIC_START missing - abort"));
        return;
      }
      throw new IOException("Data corrupted on " + raf.getLocation());
    }
    if (ncm != null) ncm.add(new NcsMess(pos, 4, "MAGIC_START"));

    pos = raf.getFilePointer();
    if (!readAndTest(raf, NcStream.MAGIC_HEADER)) {
      if (ncm != null) {
        ncm.add(new NcsMess(pos, 0, "MAGIC_HEADER missing - abort"));
        return;
      }
      throw new IOException("Data corrupted on " + ncfile.getLocation());
    }
    if (ncm != null) ncm.add(new NcsMess(pos, 4,  "MAGIC_HEADER"));

    // assume for the moment it always starts with one header message
    pos = raf.getFilePointer();
    int msize = readVInt(raf);
    byte[] m = new byte[msize];
    raf.readFully(m);
    NcStreamProto.Header proto = NcStreamProto.Header.parseFrom(m);
    if (ncm != null) ncm.add(new NcsMess(pos, msize, proto));
    version = proto.getVersion();

    NcStreamProto.Group root = proto.getRoot();
    NcStream.readGroup(root, ncfile, ncfile.getRootGroup());
    ncfile.finish();

    // then we have a stream of data messages with a final END or ERR
    while (!raf.isAtEndOfFile()) {
      pos = raf.getFilePointer();
      byte[] b = new byte[4];
      raf.readFully(b);
      if (test(b, NcStream.MAGIC_END)) {
        if (ncm != null) ncm.add(new NcsMess(pos, 4, "MAGIC_END"));
        break;
      }

      if (test(b, NcStream.MAGIC_ERR)) {
        int esize = readVInt(raf);
        byte[] dp = new byte[esize];
        raf.readFully(dp);
        NcStreamProto.Error error = NcStreamProto.Error.parseFrom(dp);
        if (ncm != null) ncm.add(new NcsMess(pos, esize, error.getMessage()));
        break; // assume broken now ?
      }

      if (!test(b, NcStream.MAGIC_DATA)) {
        if (ncm != null) ncm.add(new NcsMess(pos, 4, "MAGIC_DATA missing - abort"));
        break;
      }
      if (ncm != null) ncm.add(new NcsMess(pos, 4, "MAGIC_DATA"));

      // data messages
      pos = raf.getFilePointer();
      int psize = readVInt(raf);
      byte[] dp = new byte[psize];
      raf.readFully(dp);
      NcStreamProto.Data dproto = NcStreamProto.Data.parseFrom(dp);
      ByteOrder bo = NcStream.decodeDataByteOrder(dproto); // LOOK not using bo !!

      Variable v = ncfile.findVariable(dproto.getVarName());
      if (v == null) {
        System.out.printf(" ERR cant find var %s%n%s%n", dproto.getVarName(), dproto);
      }
      if (debug) System.out.printf(" dproto = %s for %s%n", dproto, v.getShortName());
      if (ncm != null) ncm.add(new NcsMess(pos, psize, dproto));
      List<DataStorage> storage;
      if (v != null) {
        storage = (List<DataStorage>) v.getSPobject(); // LOOK could be an in memory Rtree using section
        if (storage == null) {
          storage = new ArrayList<>();
          v.setSPobject(storage);
        }
      } else
        storage = new ArrayList<>(); // barf

      // version < 3
      if (dproto.getDataType() == NcStreamProto.DataType.STRUCTURE) {
        pos = raf.getFilePointer();
        msize = readVInt(raf);
        m = new byte[msize];
        raf.readFully(m);
        NcStreamProto.StructureData sdata = NcStreamProto.StructureData.parseFrom(m);
        DataStorage dataStorage = new DataStorage(msize, pos, dproto);
        dataStorage.sdata = sdata;
        if (ncm != null) ncm.add(new NcsMess(dataStorage.filePos, msize, sdata));
        storage.add(dataStorage);

      } else if (dproto.getVdata()) {
        DataStorage dataStorage = new DataStorage(0, raf.getFilePointer(), dproto);
        int nelems = readVInt(raf);
        int totalSize = 0;
        for (int i = 0; i < nelems; i++) {
          int dsize = readVInt(raf);
          totalSize += dsize;
          raf.skipBytes(dsize);
        }
        dataStorage.nelems = nelems;
        dataStorage.size = totalSize;
        if (ncm != null) ncm.add(new NcsMess(dataStorage.filePos, totalSize, dataStorage));
        storage.add(dataStorage);

      } else {  // regular data
        int dsize = readVInt(raf);
        DataStorage dataStorage = new DataStorage(dsize, raf.getFilePointer(), dproto);
        if (ncm != null) ncm.add(new NcsMess(dataStorage.filePos, dsize, dataStorage));
        storage.add(dataStorage);
        raf.skipBytes(dsize);

      }
    }
  }
public void openDebug(RandomAccessFile raf, NetcdfFile ncfile, List<NcsMess> ncm) throws IOException {
    raf.seek(0);
    long pos = raf.getFilePointer();

    if (!readAndTest(raf, NcStream.MAGIC_START)) {
      if (ncm != null) {
        ncm.add(new NcsMess(pos, 0, "MAGIC_START missing - abort"));
        return;
      }
      throw new IOException("Data corrupted on " + raf.getLocation());
    }
    if (ncm != null) ncm.add(new NcsMess(pos, 4, "MAGIC_START"));

    pos = raf.getFilePointer();
    if (!readAndTest(raf, NcStream.MAGIC_HEADER)) {
      if (ncm != null) {
        ncm.add(new NcsMess(pos, 0, "MAGIC_HEADER missing - abort"));
        return;
      }
      throw new IOException("Data corrupted on " + ncfile.getLocation());
    }
    if (ncm != null) ncm.add(new NcsMess(pos, 4,  "MAGIC_HEADER"));

    // assume for the moment it always starts with one header message
    pos = raf.getFilePointer();
    int msize = readVInt(raf);
    byte[] m = new byte[msize];
    raf.readFully(m);
    NcStreamProto.Header proto = NcStreamProto.Header.parseFrom(m);
    if (ncm != null) ncm.add(new NcsMess(pos, msize, proto));
    version = proto.getVersion();

    NcStreamProto.Group root = proto.getRoot();
    NcStream.readGroup(root, ncfile, ncfile.getRootGroup());
    ncfile.finish();

    // then we have a stream of data messages with a final END or ERR
    while (!raf.isAtEndOfFile()) {
      pos = raf.getFilePointer();
      byte[] b = new byte[4];
      raf.readFully(b);
      if (test(b, NcStream.MAGIC_END)) {
        if (ncm != null) ncm.add(new NcsMess(pos, 4, "MAGIC_END"));
        break;
      }

      if (test(b, NcStream.MAGIC_ERR)) {
        int esize = readVInt(raf);
        byte[] dp = new byte[esize];
        raf.readFully(dp);
        NcStreamProto.Error error = NcStreamProto.Error.parseFrom(dp);
        if (ncm != null) ncm.add(new NcsMess(pos, esize, error.getMessage()));
        break; // assume broken now ?
      }

      if (!test(b, NcStream.MAGIC_DATA)) {
        if (ncm != null) ncm.add(new NcsMess(pos, 4, "MAGIC_DATA missing - abort"));
        break;
      }
      if (ncm != null) ncm.add(new NcsMess(pos, 4, "MAGIC_DATA"));

      // data messages
      pos = raf.getFilePointer();
      int psize = readVInt(raf);
      byte[] dp = new byte[psize];
      raf.readFully(dp);
      NcStreamProto.Data dproto = NcStreamProto.Data.parseFrom(dp);
      ByteOrder bo = NcStream.decodeDataByteOrder(dproto); // LOOK not using bo !!

      Variable v = ncfile.findVariable(dproto.getVarName());
      if (v == null) {
        System.out.printf(" ERR cant find var %s%n%s%n", dproto.getVarName(), dproto);
      }
      if (debug) System.out.printf(" dproto = %s for %s%n", dproto, v.getShortName());
      if (ncm != null) ncm.add(new NcsMess(pos, psize, dproto));
      List<DataStorage> storage;
      if (v != null) {
        storage = (List<DataStorage>) v.getSPobject(); // LOOK could be an in memory Rtree using section
        if (storage == null) {
          storage = new ArrayList<>();
          v.setSPobject(storage);
        }
      } else
        storage = new ArrayList<>(); // barf

      // version < 3
      if (dproto.getDataType() == NcStreamProto.DataType.STRUCTURE) {
        pos = raf.getFilePointer();
        msize = readVInt(raf);
        m = new byte[msize];
        raf.readFully(m);
        NcStreamProto.StructureData sdata = NcStreamProto.StructureData.parseFrom(m);
        DataStorage dataStorage = new DataStorage(msize, pos, dproto);
        dataStorage.sdata = sdata;
        if (ncm != null) ncm.add(new NcsMess(dataStorage.filePos, msize, sdata));
        storage.add(dataStorage);

      } else if (dproto.getVdata()) {
        DataStorage dataStorage = new DataStorage(0, raf.getFilePointer(), dproto);
        int nelems = readVInt(raf);
        int totalSize = 0;
        for (int i = 0; i < nelems; i++) {
          int dsize = readVInt(raf);
          totalSize += dsize;
          raf.skipBytes(dsize);
        }
        dataStorage.nelems = nelems;
        dataStorage.size = totalSize;
        if (ncm != null) ncm.add(new NcsMess(dataStorage.filePos, totalSize, dataStorage));
        storage.add(dataStorage);

      } else {  // regular data
        int dsize = readVInt(raf);
        DataStorage dataStorage = new DataStorage(dsize, raf.getFilePointer(), dproto);
        if (ncm != null) ncm.add(new NcsMess(dataStorage.filePos, dsize, dataStorage));
        storage.add(dataStorage);
        raf.skipBytes(dsize);

      }
    }
  }
public void openDebug ( RandomAccessFile raf , NetcdfFile ncfile , List < NcsMess > ncm ) throws IOException { raf . seek ( 0 ) ; long pos = raf . getFilePointer ( ) ; if ( ! readAndTest ( raf , NcStream . MAGIC_START ) ) { if ( ncm != null ) { ncm . add ( new NcsMess ( pos , 0 , "MAGIC_START missing - abort" ) ) ; return ; } throw new IOException ( "Data corrupted on " + raf . getLocation ( ) ) ; } if ( ncm != null ) ncm . add ( new NcsMess ( pos , 4 , "MAGIC_START" ) ) ; pos = raf . getFilePointer ( ) ; if ( ! readAndTest ( raf , NcStream . MAGIC_HEADER ) ) { if ( ncm != null ) { ncm . add ( new NcsMess ( pos , 0 , "MAGIC_HEADER missing - abort" ) ) ; return ; } throw new IOException ( "Data corrupted on " + ncfile . getLocation ( ) ) ; } if ( ncm != null ) ncm . add ( new NcsMess ( pos , 4 , "MAGIC_HEADER" ) ) ; // assume for the moment it always starts with one header message
 pos = raf . getFilePointer ( ) ; int msize = readVInt ( raf ) ; byte [ ] m = new byte [ msize ] ; raf . readFully ( m ) ; NcStreamProto . Header proto = NcStreamProto . Header . parseFrom ( m ) ; if ( ncm != null ) ncm . add ( new NcsMess ( pos , msize , proto ) ) ; version = proto . getVersion ( ) ; NcStreamProto . Group root = proto . getRoot ( ) ; NcStream . readGroup ( root , ncfile , ncfile . getRootGroup ( ) ) ; ncfile . finish ( ) ; // then we have a stream of data messages with a final END or ERR
 while ( ! raf . isAtEndOfFile ( ) ) { pos = raf . getFilePointer ( ) ; byte [ ] b = new byte [ 4 ] ; raf . readFully ( b ) ; if ( test ( b , NcStream . MAGIC_END ) ) { if ( ncm != null ) ncm . add ( new NcsMess ( pos , 4 , "MAGIC_END" ) ) ; break ; } if ( test ( b , NcStream . MAGIC_ERR ) ) { int esize = readVInt ( raf ) ; byte [ ] dp = new byte [ esize ] ; raf . readFully ( dp ) ; NcStreamProto . Error error = NcStreamProto . Error . parseFrom ( dp ) ; if ( ncm != null ) ncm . add ( new NcsMess ( pos , esize , error . getMessage ( ) ) ) ; break ; // assume broken now ?
 } if ( ! test ( b , NcStream . MAGIC_DATA ) ) { if ( ncm != null ) ncm . add ( new NcsMess ( pos , 4 , "MAGIC_DATA missing - abort" ) ) ; break ; } if ( ncm != null ) ncm . add ( new NcsMess ( pos , 4 , "MAGIC_DATA" ) ) ; // data messages
 pos = raf . getFilePointer ( ) ; int psize = readVInt ( raf ) ; byte [ ] dp = new byte [ psize ] ; raf . readFully ( dp ) ; NcStreamProto . Data dproto = NcStreamProto . Data . parseFrom ( dp ) ; ByteOrder bo = NcStream . decodeDataByteOrder ( dproto ) ; // LOOK not using bo !!
 Variable v = ncfile . findVariable ( dproto . getVarName ( ) ) ; if ( v == null ) { System . out . printf ( " ERR cant find var %s%n%s%n" , dproto . getVarName ( ) , dproto ) ; } if ( debug ) System . out . printf ( " dproto = %s for %s%n" , dproto , v . getShortName ( ) ) ; if ( ncm != null ) ncm . add ( new NcsMess ( pos , psize , dproto ) ) ; List < DataStorage > storage ; if ( v != null ) { storage = ( List < DataStorage > ) v . getSPobject ( ) ; // LOOK could be an in memory Rtree using section
 if ( storage == null ) { storage = new ArrayList <> ( ) ; v . setSPobject ( storage ) ; } } else storage = new ArrayList <> ( ) ; // barf
 // version < 3
 if ( dproto . getDataType ( ) == NcStreamProto . DataType . STRUCTURE ) { pos = raf . getFilePointer ( ) ; msize = readVInt ( raf ) ; m = new byte [ msize ] ; raf . readFully ( m ) ; NcStreamProto . StructureData sdata = NcStreamProto . StructureData . parseFrom ( m ) ; DataStorage dataStorage = new DataStorage ( msize , pos , dproto ) ; dataStorage . sdata = sdata ; if ( ncm != null ) ncm . add ( new NcsMess ( dataStorage . filePos , msize , sdata ) ) ; storage . add ( dataStorage ) ; } else if ( dproto . getVdata ( ) ) { DataStorage dataStorage = new DataStorage ( 0 , raf . getFilePointer ( ) , dproto ) ; int nelems = readVInt ( raf ) ; int totalSize = 0 ; for ( int i = 0 ; i < nelems ; i ++ ) { int dsize = readVInt ( raf ) ; totalSize += dsize ; raf . skipBytes ( dsize ) ; } dataStorage . nelems = nelems ; dataStorage . size = totalSize ; if ( ncm != null ) ncm . add ( new NcsMess ( dataStorage . filePos , totalSize , dataStorage ) ) ; storage . add ( dataStorage ) ; } else { // regular data
 int dsize = readVInt ( raf ) ; DataStorage dataStorage = new DataStorage ( dsize , raf . getFilePointer ( ) , dproto ) ; if ( ncm != null ) ncm . add ( new NcsMess ( dataStorage . filePos , dsize , dataStorage ) ) ; storage . add ( dataStorage ) ; raf . skipBytes ( dsize ) ; } } }
optionally read in all messages, return as List<NcMess>
optionally read in all messages return as List<NcMess >