Mercurial > jhg
annotate src/org/tmatesoft/hg/internal/DataAccessProvider.java @ 126:b92a638764be
Dispatch chnagesets even if Handler is not FileHistoryHandler
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Tue, 15 Feb 2011 07:03:14 +0100 | 
| parents | a3a2e5deb320 | 
| children | d5268ca7715b | 
| 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 /* | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 2 * Copyright (c) 2010-2011 TMate Software Ltd | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 3 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 4 * This program is free software; you can redistribute it and/or modify | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 5 * it under the terms of the GNU General Public License as published by | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 6 * the Free Software Foundation; version 2 of the License. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 7 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 8 * This program is distributed in the hope that it will be useful, | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 11 * GNU General Public License for more details. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 12 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 13 * For information on how to redistribute this software under | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 14 * the terms of a license other than GNU General Public License | 
| 102 
a3a2e5deb320
Updated contact address to support@hg4j.com
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 15 * contact TMate Software at support@hg4j.com | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 16 */ | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 17 package org.tmatesoft.hg.internal; | 
| 10 
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 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 | 20 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 | 21 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 | 22 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 | 23 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 | 24 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 | 25 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 26 /** | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 27 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 28 * @author Artem Tikhomirov | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
27diff
changeset | 29 * @author TMate Software Ltd. | 
| 10 
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 class DataAccessProvider { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 32 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 33 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 | 34 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 | 35 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 36 public DataAccessProvider() { | 
| 27 
b0a15cefdfd6
Cons args instead of fixed consts
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
26diff
changeset | 37 this(100 * 1024, 8 * 1024); | 
| 
b0a15cefdfd6
Cons args instead of fixed consts
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
26diff
changeset | 38 } | 
| 
b0a15cefdfd6
Cons args instead of fixed consts
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
26diff
changeset | 39 | 
| 
b0a15cefdfd6
Cons args instead of fixed consts
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
26diff
changeset | 40 public DataAccessProvider(int mapioBoundary, int regularBufferSize) { | 
| 
b0a15cefdfd6
Cons args instead of fixed consts
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
26diff
changeset | 41 mapioMagicBoundary = mapioBoundary; | 
| 
b0a15cefdfd6
Cons args instead of fixed consts
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
26diff
changeset | 42 bufferSize = regularBufferSize; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 43 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 44 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 45 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 | 46 if (!f.exists()) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 47 return new DataAccess(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 48 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 49 try { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 50 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 | 51 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 | 52 // 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 | 53 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 | 54 } else { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 55 // 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 | 56 // 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 | 57 // 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 | 58 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 | 59 // 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 | 60 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 | 61 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 62 } catch (IOException ex) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 63 // 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 | 64 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 | 65 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 66 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 | 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 // 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 | 70 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 | 71 private FileChannel fileChannel; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 72 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 | 73 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 | 74 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 | 75 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 | 76 | 
| 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 | 77 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 | 78 fileChannel = fc; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 79 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 | 80 memBufferSize = bufferSize; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 81 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 82 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 83 @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 | 84 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 | 85 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 | 86 } | 
| 
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 | 
| 
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 @Override | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 89 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 | 90 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 | 91 // 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 | 92 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 | 93 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 | 94 } 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 | 95 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 | 96 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 | 97 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 98 } | 
| 
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 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 101 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 | 102 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 | 103 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 | 104 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 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 | 106 } | 
| 
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 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 | 108 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 | 109 } 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 | 110 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 | 111 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 | 112 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 113 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 114 | 
| 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 | 115 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 | 116 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 | 117 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 | 118 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 119 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 | 120 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 | 121 } | 
| 
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 | 
| 
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 @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 | 124 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 | 125 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 | 126 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 | 127 } | 
| 
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 // 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 | 129 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 | 130 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 | 131 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 | 132 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 | 133 } | 
| 
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 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 | 135 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 | 136 } 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 | 137 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 | 138 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 | 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 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 | 141 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 | 142 } | 
| 
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 } | 
| 
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 | 
| 
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 @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 | 146 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 | 147 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 | 148 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 | 149 } | 
| 
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 | 150 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 | 151 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 | 152 } | 
| 
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 | 153 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 | 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 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 157 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 | 158 buffer = null; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 159 if (fileChannel != null) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 160 try { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 161 fileChannel.close(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 162 } catch (IOException ex) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 163 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 | 164 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 165 fileChannel = null; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 166 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 167 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 168 } | 
| 
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 // (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 | 171 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 | 172 private FileChannel fileChannel; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 173 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 | 174 private ByteBuffer buffer; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 175 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 | 176 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 177 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 | 178 fileChannel = fc; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 179 size = channelSize; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 180 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 | 181 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 | 182 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 | 183 } | 
| 
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 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 186 public boolean isEmpty() { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 187 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 | 188 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 189 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 190 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 191 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 | 192 if (offset > size) { | 
| 
6f9aca1a97be
Severe defect in buffer wrap on seek
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 193 throw new IllegalArgumentException(); | 
| 
6f9aca1a97be
Severe defect in buffer wrap on seek
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 194 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 195 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 | 196 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 | 197 } else { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 198 // 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 | 199 // 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 | 200 bufferStartInFile = offset; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 201 buffer.clear(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 202 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 | 203 fileChannel.position(offset); | 
| 
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 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 206 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 207 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 208 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 | 209 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 | 210 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 | 211 // 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 | 212 buffer.position(newPos); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 213 } else { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 214 // | 
| 23 
6f9aca1a97be
Severe defect in buffer wrap on seek
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 215 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 | 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 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 219 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 | 220 if (!buffer.hasRemaining()) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 221 bufferStartInFile += buffer.limit(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 222 buffer.clear(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 223 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 | 224 fileChannel.read(buffer); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 225 // 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 | 226 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 227 buffer.flip(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 228 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 229 return buffer.hasRemaining(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 230 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 231 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 232 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 233 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 | 234 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 | 235 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 | 236 } | 
| 
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 | 237 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 | 238 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 | 239 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 | 240 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 | 241 } | 
| 
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 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 | 243 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 | 244 } 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 | 245 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 | 246 fill(); | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 247 } | 
| 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 | 248 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 | 249 length -= tail; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 250 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 251 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 252 | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 253 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 254 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 | 255 if (buffer.hasRemaining()) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 256 return buffer.get(); | 
| 
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 if (fill()) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 259 return buffer.get(); | 
| 
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 throw new IOException(); | 
| 
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 @Override | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 265 public void done() { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 266 if (buffer != null) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 267 buffer = null; | 
| 
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 if (fileChannel != null) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 270 try { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 271 fileChannel.close(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 272 } catch (IOException ex) { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 273 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 | 274 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 275 fileChannel = null; | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 276 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 277 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 278 } | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 279 } | 
