// LOOK what about extending an index ?? public boolean makeIndex(String filename, RandomAccessFile dataRaf, Formatter f) throws IOException { File idxFile = GribCollection.getIndexFile(filename + GBX9_IDX); FileOutputStream fout = new FileOutputStream(idxFile); RandomAccessFile raf = null; try { //// header message fout.write(MAGIC_START.getBytes("UTF-8")); NcStream.writeVInt(fout, version); Map<Long, Integer> gdsMap = new HashMap<Long, Integer>(); gdsList = new ArrayList<Grib1SectionGridDefinition>(); records = new ArrayList<Grib1Record>(200); Grib1IndexProto.Grib1Index.Builder rootBuilder = Grib1IndexProto.Grib1Index.newBuilder(); rootBuilder.setFilename(filename); if (dataRaf == null) { raf = new RandomAccessFile(filename, "r"); dataRaf = raf; } Grib1RecordScanner scan = new Grib1RecordScanner(dataRaf); while (scan.hasNext()) { Grib1Record r = scan.next(); if (r == null) break; // done records.add(r); Grib1SectionGridDefinition gds = r.getGDSsection(); Integer index = gdsMap.get(gds.calcCRC()); if (gds.getPredefinedGridDefinition() >= 0) // skip predefined gds - they dont have raw bytes index = 0; else if (index == null) { gdsList.add(gds); index = gdsList.size() - 1; gdsMap.put(gds.calcCRC(), index); rootBuilder.addGdsList(makeGdsProto(gds)); } rootBuilder.addRecords(makeRecordProto(r, index)); } ucar.nc2.grib.grib1.Grib1IndexProto.Grib1Index index = rootBuilder.build(); byte[] b = index.toByteArray(); NcStream.writeVInt(fout, b.length); // message size fout.write(b); // message - all in one gulp f.format(" made gbx9 index for %s size=%d%n", filename, b.length); return true; } finally { fout.close(); if (raf != null) raf.close(); } }
private Grib1IndexProto.Grib1GdsSection makeGdsProto(Grib1SectionGridDefinition gds) throws IOException { Grib1IndexProto.Grib1GdsSection.Builder b = Grib1IndexProto.Grib1GdsSection.newBuilder(); b.setGds(ByteString.copyFrom(gds.getRawBytes())); return b.build(); }