Mercurial > jhg
annotate src/com/tmate/hgkit/fs/DataAccessProvider.java @ 159:f5aed108754e wrap-data-access
Approach with DataAccess instead of plain byte[] was merged into default branch
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Wed, 09 Mar 2011 13:28:02 +0100 | 
| parents | 9429c7bd1920 | 
| children | 
| rev | line source | 
|---|---|
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 1 /* | 
| 23 
6f9aca1a97be
Severe defect in buffer wrap on seek
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 2 * Copyright (c) 2010, 2011 Artem Tikhomirov | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 3 */ | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 4 package com.tmate.hgkit.fs; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 5 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 6 import java.io.File; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 7 import java.io.FileInputStream; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 8 import java.io.IOException; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 9 import java.nio.ByteBuffer; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 10 import java.nio.MappedByteBuffer; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 11 import java.nio.channels.FileChannel; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 12 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 13 /** | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 14 * | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 15 * @author artem | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 16 */ | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 17 public class DataAccessProvider { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 18 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 19 private final int mapioMagicBoundary; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 20 private final int bufferSize; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 21 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 22 public DataAccessProvider() { | 
| 27 
b0a15cefdfd6
Cons args instead of fixed consts
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
26diff
changeset | 23 this(100 * 1024, 8 * 1024); | 
| 
b0a15cefdfd6
Cons args instead of fixed consts
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
26diff
changeset | 24 } | 
| 
b0a15cefdfd6
Cons args instead of fixed consts
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
26diff
changeset | 25 | 
| 
b0a15cefdfd6
Cons args instead of fixed consts
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
26diff
changeset | 26 public DataAccessProvider(int mapioBoundary, int regularBufferSize) { | 
| 
b0a15cefdfd6
Cons args instead of fixed consts
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
26diff
changeset | 27 mapioMagicBoundary = mapioBoundary; | 
| 
b0a15cefdfd6
Cons args instead of fixed consts
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
26diff
changeset | 28 bufferSize = regularBufferSize; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 29 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 30 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 31 public DataAccess create(File f) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 32 if (!f.exists()) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 33 return new DataAccess(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 34 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 35 try { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 36 FileChannel fc = new FileInputStream(f).getChannel(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 37 if (fc.size() > mapioMagicBoundary) { | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 38 // TESTS: bufLen of 1024 was used to test MemMapFileAccess | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 39 return new MemoryMapFileAccess(fc, fc.size(), mapioMagicBoundary); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 40 } else { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 41 // XXX once implementation is more or less stable, | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 42 // may want to try ByteBuffer.allocateDirect() to see | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 43 // if there's any performance gain. | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 44 boolean useDirectBuffer = false; | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 45 // TESTS: bufferSize of 100 was used to check buffer underflow states when readBytes reads chunks bigger than bufSize | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 46 return new FileAccess(fc, fc.size(), bufferSize, useDirectBuffer); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 47 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 48 } catch (IOException ex) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 49 // unlikely to happen, we've made sure file exists. | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 50 ex.printStackTrace(); // FIXME log error | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 51 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 52 return new DataAccess(); // non-null, empty. | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 53 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 54 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 55 // DOESN'T WORK YET | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 56 private static class MemoryMapFileAccess extends DataAccess { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 57 private FileChannel fileChannel; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 58 private final long size; | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 59 private long position = 0; // always points to buffer's absolute position in the file | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 60 private final int memBufferSize; | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 61 private MappedByteBuffer buffer; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 62 | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 63 public MemoryMapFileAccess(FileChannel fc, long channelSize, int /*long?*/ bufferSize) { | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 64 fileChannel = fc; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 65 size = channelSize; | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 66 memBufferSize = bufferSize; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 67 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 68 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 69 @Override | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 70 public boolean isEmpty() { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 71 return position + (buffer == null ? 0 : buffer.position()) >= size; | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 72 } | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 73 | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 74 @Override | 
| 51 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 75 public long length() { | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 76 return size; | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 77 } | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 78 | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 79 @Override | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 80 public void reset() throws IOException { | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 81 seek(0); | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 82 } | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 83 | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 84 @Override | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 85 public void seek(long offset) { | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 86 assert offset >= 0; | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 87 // offset may not necessarily be further than current position in the file (e.g. rewind) | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 88 if (buffer != null && /*offset is within buffer*/ offset >= position && (offset - position) < buffer.limit()) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 89 buffer.position((int) (offset - position)); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 90 } else { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 91 position = offset; | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 92 buffer = null; | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 93 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 94 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 95 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 96 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 97 public void skip(int bytes) throws IOException { | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 98 assert bytes >= 0; | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 99 if (buffer == null) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 100 position += bytes; | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 101 return; | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 102 } | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 103 if (buffer.remaining() > bytes) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 104 buffer.position(buffer.position() + bytes); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 105 } else { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 106 position += buffer.position() + bytes; | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 107 buffer = null; | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 108 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 109 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 110 | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 111 private void fill() throws IOException { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 112 if (buffer != null) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 113 position += buffer.position(); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 114 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 115 long left = size - position; | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 116 buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, position, left < memBufferSize ? left : memBufferSize); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 117 } | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 118 | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 119 @Override | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 120 public void readBytes(byte[] buf, int offset, int length) throws IOException { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 121 if (buffer == null || !buffer.hasRemaining()) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 122 fill(); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 123 } | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 124 // XXX in fact, we may try to create a MappedByteBuffer of exactly length size here, and read right away | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 125 while (length > 0) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 126 int tail = buffer.remaining(); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 127 if (tail == 0) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 128 throw new IOException(); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 129 } | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 130 if (tail >= length) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 131 buffer.get(buf, offset, length); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 132 } else { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 133 buffer.get(buf, offset, tail); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 134 fill(); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 135 } | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 136 offset += tail; | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 137 length -= tail; | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 138 } | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 139 } | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 140 | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 141 @Override | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 142 public byte readByte() throws IOException { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 143 if (buffer == null || !buffer.hasRemaining()) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 144 fill(); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 145 } | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 146 if (buffer.hasRemaining()) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 147 return buffer.get(); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 148 } | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 149 throw new IOException(); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 150 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 151 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 152 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 153 public void done() { | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 154 buffer = null; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 155 if (fileChannel != null) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 156 try { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 157 fileChannel.close(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 158 } catch (IOException ex) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 159 ex.printStackTrace(); // log debug | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 160 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 161 fileChannel = null; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 162 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 163 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 164 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 165 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 166 // (almost) regular file access - FileChannel and buffers. | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 167 private static class FileAccess extends DataAccess { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 168 private FileChannel fileChannel; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 169 private final long size; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 170 private ByteBuffer buffer; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 171 private long bufferStartInFile = 0; // offset of this.buffer in the file. | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 172 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 173 public FileAccess(FileChannel fc, long channelSize, int bufferSizeHint, boolean useDirect) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 174 fileChannel = fc; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 175 size = channelSize; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 176 final int capacity = size < bufferSizeHint ? (int) size : bufferSizeHint; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 177 buffer = useDirect ? ByteBuffer.allocateDirect(capacity) : ByteBuffer.allocate(capacity); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 178 buffer.flip(); // or .limit(0) to indicate it's empty | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 179 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 180 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 181 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 182 public boolean isEmpty() { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 183 return bufferStartInFile + buffer.position() >= size; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 184 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 185 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 186 @Override | 
| 51 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 187 public long length() { | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 188 return size; | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 189 } | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 190 | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 191 @Override | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 192 public void reset() throws IOException { | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 193 seek(0); | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 194 } | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 195 | 
| 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 196 @Override | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 197 public void seek(long offset) throws IOException { | 
| 23 
6f9aca1a97be
Severe defect in buffer wrap on seek
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 198 if (offset > size) { | 
| 
6f9aca1a97be
Severe defect in buffer wrap on seek
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 199 throw new IllegalArgumentException(); | 
| 
6f9aca1a97be
Severe defect in buffer wrap on seek
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 200 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 201 if (offset < bufferStartInFile + buffer.limit() && offset >= bufferStartInFile) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 202 buffer.position((int) (offset - bufferStartInFile)); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 203 } else { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 204 // out of current buffer, invalidate it (force re-read) | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 205 // XXX or ever re-read it right away? | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 206 bufferStartInFile = offset; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 207 buffer.clear(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 208 buffer.limit(0); // or .flip() to indicate we switch to reading | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 209 fileChannel.position(offset); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 210 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 211 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 212 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 213 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 214 public void skip(int bytes) throws IOException { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 215 final int newPos = buffer.position() + bytes; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 216 if (newPos >= 0 && newPos < buffer.limit()) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 217 // no need to move file pointer, just rewind/seek buffer | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 218 buffer.position(newPos); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 219 } else { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 220 // | 
| 23 
6f9aca1a97be
Severe defect in buffer wrap on seek
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 221 seek(bufferStartInFile + newPos); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 222 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 223 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 224 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 225 private boolean fill() throws IOException { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 226 if (!buffer.hasRemaining()) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 227 bufferStartInFile += buffer.limit(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 228 buffer.clear(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 229 if (bufferStartInFile < size) { // just in case there'd be any exception on EOF, not -1 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 230 fileChannel.read(buffer); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 231 // may return -1 when EOF, but empty will reflect this, hence no explicit support here | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 232 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 233 buffer.flip(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 234 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 235 return buffer.hasRemaining(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 236 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 237 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 238 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 239 public void readBytes(byte[] buf, int offset, int length) throws IOException { | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 240 if (!buffer.hasRemaining()) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 241 fill(); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 242 } | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 243 while (length > 0) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 244 int tail = buffer.remaining(); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 245 if (tail == 0) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 246 throw new IOException(); // shall not happen provided stream contains expected data and no attempts to read past isEmpty() == true are made. | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 247 } | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 248 if (tail >= length) { | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 249 buffer.get(buf, offset, length); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 250 } else { | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 251 buffer.get(buf, offset, tail); | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 252 fill(); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 253 } | 
| 26 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 254 offset += tail; | 
| 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
23diff
changeset | 255 length -= tail; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 256 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 257 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 258 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 259 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 260 public byte readByte() throws IOException { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 261 if (buffer.hasRemaining()) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 262 return buffer.get(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 263 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 264 if (fill()) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 265 return buffer.get(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 266 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 267 throw new IOException(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 268 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 269 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 270 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 271 public void done() { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 272 if (buffer != null) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 273 buffer = null; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 274 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 275 if (fileChannel != null) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 276 try { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 277 fileChannel.close(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 278 } catch (IOException ex) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 279 ex.printStackTrace(); // log debug | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 280 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 281 fileChannel = null; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 282 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 283 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 284 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 285 } | 
