Mercurial > jhg
annotate src/com/tmate/hgkit/fs/DataAccessProvider.java @ 58:4cfc47bc14cc
Status against local working dir extracted into distinct class. Iterating over local files extracted for ease of os-dependant patching
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Mon, 17 Jan 2011 23:01:19 +0100 | 
| parents | b0a15cefdfd6 | 
| children | 9429c7bd1920 | 
| 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 | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 75 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 | 76 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 | 77 // 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 | 78 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 | 79 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 | 80 } 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 | 81 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 | 82 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 | 83 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 84 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 85 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 86 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 87 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 | 88 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 | 89 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 | 90 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 | 91 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 | 92 } | 
| 
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 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 | 94 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 | 95 } 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 | 96 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 | 97 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 | 98 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 99 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 100 | 
| 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 | 101 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 | 102 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 | 103 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 | 104 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 105 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 | 106 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 | 107 } | 
| 
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 | 
| 
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 | 109 @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 | 110 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 | 111 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 | 112 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 | 113 } | 
| 
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 // 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 | 115 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 | 116 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 | 117 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 | 118 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 | 119 } | 
| 
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 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 | 121 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 | 122 } 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 | 123 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 | 124 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 | 125 } | 
| 
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 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 | 127 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 | 128 } | 
| 
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 | 
| 
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 @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 | 132 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 | 133 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 | 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 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 | 137 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 | 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 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 | 140 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 141 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 142 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 143 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 | 144 buffer = null; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 145 if (fileChannel != null) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 146 try { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 147 fileChannel.close(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 148 } catch (IOException ex) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 149 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 | 150 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 151 fileChannel = null; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 152 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 153 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 154 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 155 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 156 // (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 | 157 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 | 158 private FileChannel fileChannel; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 159 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 | 160 private ByteBuffer buffer; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 161 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 | 162 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 163 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 | 164 fileChannel = fc; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 165 size = channelSize; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 166 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 | 167 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 | 168 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 | 169 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 170 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 171 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 172 public boolean isEmpty() { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 173 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 | 174 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 175 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 176 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 177 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 | 178 if (offset > size) { | 
| 
6f9aca1a97be
Severe defect in buffer wrap on seek
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 179 throw new IllegalArgumentException(); | 
| 
6f9aca1a97be
Severe defect in buffer wrap on seek
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 180 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 181 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 | 182 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 | 183 } else { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 184 // 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 | 185 // 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 | 186 bufferStartInFile = offset; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 187 buffer.clear(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 188 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 | 189 fileChannel.position(offset); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 190 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 191 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 192 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 193 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 194 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 | 195 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 | 196 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 | 197 // 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 | 198 buffer.position(newPos); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 199 } else { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 200 // | 
| 23 
6f9aca1a97be
Severe defect in buffer wrap on seek
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 201 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 | 202 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 203 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 204 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 205 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 | 206 if (!buffer.hasRemaining()) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 207 bufferStartInFile += buffer.limit(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 208 buffer.clear(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 209 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 | 210 fileChannel.read(buffer); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 211 // 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 | 212 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 213 buffer.flip(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 214 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 215 return buffer.hasRemaining(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 216 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 217 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 218 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 219 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 | 220 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 | 221 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 | 222 } | 
| 
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 | 223 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 | 224 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 | 225 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 | 226 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 | 227 } | 
| 
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 | 228 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 | 229 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 | 230 } 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 | 231 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 | 232 fill(); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 233 } | 
| 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 | 234 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 | 235 length -= tail; | 
| 10 
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 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 239 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 240 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 | 241 if (buffer.hasRemaining()) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 242 return buffer.get(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 243 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 244 if (fill()) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 245 return buffer.get(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 246 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 247 throw new IOException(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 248 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 249 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 250 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 251 public void done() { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 252 if (buffer != null) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 253 buffer = null; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 254 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 255 if (fileChannel != null) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 256 try { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 257 fileChannel.close(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 258 } catch (IOException ex) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 259 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 | 260 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 261 fileChannel = null; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 262 } | 
| 
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 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 265 } | 
