Mercurial > hg4j
comparison src/org/tmatesoft/hg/repo/HgDataFile.java @ 148:1a7a9a20e1f9
Exceptions, javadoc. Initial cancel and progress support
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Wed, 23 Feb 2011 22:36:28 +0100 |
parents | 3959bffb14e9 |
children | d5268ca7715b |
comparison
equal
deleted
inserted
replaced
147:a05145db4d0c | 148:1a7a9a20e1f9 |
---|---|
14 * the terms of a license other than GNU General Public License | 14 * the terms of a license other than GNU General Public License |
15 * contact TMate Software at support@hg4j.com | 15 * contact TMate Software at support@hg4j.com |
16 */ | 16 */ |
17 package org.tmatesoft.hg.repo; | 17 package org.tmatesoft.hg.repo; |
18 | 18 |
19 import static org.tmatesoft.hg.repo.HgInternals.wrongLocalRevision; | |
20 import static org.tmatesoft.hg.repo.HgRepository.*; | |
19 import static org.tmatesoft.hg.repo.HgRepository.TIP; | 21 import static org.tmatesoft.hg.repo.HgRepository.TIP; |
20 | 22 import static org.tmatesoft.hg.repo.HgRepository.WORKING_COPY; |
23 | |
24 import java.io.IOException; | |
21 import java.nio.ByteBuffer; | 25 import java.nio.ByteBuffer; |
22 import java.util.ArrayList; | 26 import java.util.ArrayList; |
23 import java.util.Collection; | 27 import java.util.Collection; |
24 import java.util.TreeMap; | 28 import java.util.TreeMap; |
25 | 29 |
30 import org.tmatesoft.hg.core.HgDataStreamException; | |
26 import org.tmatesoft.hg.core.Nodeid; | 31 import org.tmatesoft.hg.core.Nodeid; |
27 import org.tmatesoft.hg.internal.FilterByteChannel; | 32 import org.tmatesoft.hg.internal.FilterByteChannel; |
28 import org.tmatesoft.hg.internal.RevlogStream; | 33 import org.tmatesoft.hg.internal.RevlogStream; |
29 import org.tmatesoft.hg.util.ByteChannel; | 34 import org.tmatesoft.hg.util.ByteChannel; |
35 import org.tmatesoft.hg.util.CancelSupport; | |
36 import org.tmatesoft.hg.util.CancelledException; | |
30 import org.tmatesoft.hg.util.Path; | 37 import org.tmatesoft.hg.util.Path; |
38 import org.tmatesoft.hg.util.ProgressSupport; | |
31 | 39 |
32 | 40 |
33 | 41 |
34 /** | 42 /** |
35 * ? name:HgFileNode? | 43 * ? name:HgFileNode? |
73 public byte[] content() { | 81 public byte[] content() { |
74 return content(TIP); | 82 return content(TIP); |
75 } | 83 } |
76 | 84 |
77 /*XXX not sure applyFilters is the best way to do, perhaps, callers shall add filters themselves?*/ | 85 /*XXX not sure applyFilters is the best way to do, perhaps, callers shall add filters themselves?*/ |
78 public void content(int revision, ByteChannel sink, boolean applyFilters) throws /*TODO typed*/Exception { | 86 public void content(int revision, ByteChannel sink, boolean applyFilters) throws HgDataStreamException, IOException, CancelledException { |
79 byte[] content = content(revision); | 87 byte[] content = content(revision); |
88 final CancelSupport cancelSupport = CancelSupport.Factory.get(sink); | |
89 final ProgressSupport progressSupport = ProgressSupport.Factory.get(sink); | |
80 ByteBuffer buf = ByteBuffer.allocate(512); | 90 ByteBuffer buf = ByteBuffer.allocate(512); |
81 int left = content.length; | 91 int left = content.length; |
92 progressSupport.start(left); | |
82 int offset = 0; | 93 int offset = 0; |
94 cancelSupport.checkCancelled(); | |
83 ByteChannel _sink = applyFilters ? new FilterByteChannel(sink, getRepo().getFiltersFromRepoToWorkingDir(getPath())) : sink; | 95 ByteChannel _sink = applyFilters ? new FilterByteChannel(sink, getRepo().getFiltersFromRepoToWorkingDir(getPath())) : sink; |
84 do { | 96 do { |
85 buf.put(content, offset, Math.min(left, buf.remaining())); | 97 buf.put(content, offset, Math.min(left, buf.remaining())); |
86 buf.flip(); | 98 buf.flip(); |
99 cancelSupport.checkCancelled(); | |
87 // XXX I may not rely on returned number of bytes but track change in buf position instead. | 100 // XXX I may not rely on returned number of bytes but track change in buf position instead. |
88 int consumed = _sink.write(buf); | 101 int consumed = _sink.write(buf); |
89 buf.compact(); | 102 buf.compact(); |
90 offset += consumed; | 103 offset += consumed; |
91 left -= consumed; | 104 left -= consumed; |
105 progressSupport.worked(consumed); | |
92 } while (left > 0); | 106 } while (left > 0); |
107 progressSupport.done(); // XXX shall specify whether #done() is invoked always or only if completed successfully. | |
93 } | 108 } |
94 | 109 |
95 // for data files need to check heading of the file content for possible metadata | 110 // for data files need to check heading of the file content for possible metadata |
96 // @see http://mercurial.selenic.com/wiki/FileFormats#data.2BAC8- | 111 // @see http://mercurial.selenic.com/wiki/FileFormats#data.2BAC8- |
97 @Override | 112 @Override |
98 public byte[] content(int revision) { | 113 public byte[] content(int revision) { |
99 if (revision == TIP) { | 114 if (revision == TIP) { |
100 revision = getLastRevision(); | 115 revision = getLastRevision(); |
116 } | |
117 if (wrongLocalRevision(revision) || revision == BAD_REVISION || revision == WORKING_COPY) { | |
118 throw new IllegalArgumentException(String.valueOf(revision)); | |
101 } | 119 } |
102 byte[] data = super.content(revision); | 120 byte[] data = super.content(revision); |
103 if (metadata == null) { | 121 if (metadata == null) { |
104 metadata = new Metadata(); | 122 metadata = new Metadata(); |
105 } | 123 } |