01: /*
02: * ============================================================================
03: * GNU Lesser General Public License
04: * ============================================================================
05: *
06: * JasperReports - Free Java report-generating library.
07: * Copyright (C) 2001-2006 JasperSoft Corporation http://www.jaspersoft.com
08: *
09: * This library is free software; you can redistribute it and/or
10: * modify it under the terms of the GNU Lesser General Public
11: * License as published by the Free Software Foundation; either
12: * version 2.1 of the License, or (at your option) any later version.
13: *
14: * This library is distributed in the hope that it will be useful,
15: * but WITHOUT ANY WARRANTY; without even the implied warranty of
16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17: * Lesser General Public License for more details.
18: *
19: * You should have received a copy of the GNU Lesser General Public
20: * License along with this library; if not, write to the Free Software
21: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
22: *
23: * JasperSoft Corporation
24: * 303 Second Street, Suite 450 North
25: * San Francisco, CA 94107
26: * http://www.jaspersoft.com
27: */
28: package net.sf.jasperreports.engine.util;
29:
30: import java.io.IOException;
31: import java.nio.ByteBuffer;
32: import java.nio.channels.FileChannel;
33:
34: import net.sf.jasperreports.engine.JRRuntimeException;
35:
36: /**
37: * {@link net.sf.jasperreports.engine.util.JRSwapFile JRSwapFile} derived class that uses
38: * a {@link java.nio.channels.FileChannel FileChannel} to perform concurrent I/O on the
39: * swap file.
40: *
41: * @author Lucian Chirita (lucianc@users.sourceforge.net)
42: * @version $Id: JRConcurrentSwapFile.java 1270 2006-05-29 17:13:26Z lucianc $
43: */
44: public class JRConcurrentSwapFile extends JRSwapFile {
45:
46: private final FileChannel fileChannel;
47:
48: /**
49: * Creates a swap file.
50: *
51: * The file name is generated automatically.
52: *
53: * @param directory the directory where the file should be created.
54: * @param blockSize the size of the blocks allocated by the swap file
55: * @param minGrowCount the minimum number of blocks by which the swap file grows when full
56: */
57: public JRConcurrentSwapFile(String directory, int blockSize,
58: int minGrowCount) {
59: super (directory, blockSize, minGrowCount);
60:
61: fileChannel = file.getChannel();
62: }
63:
64: protected void write(byte[] data, int dataSize, int dataOffset,
65: long fileOffset) throws IOException {
66: fileChannel.write(ByteBuffer.wrap(data, dataOffset, dataSize),
67: fileOffset);
68: }
69:
70: protected void read(byte[] data, int dataOffset, int dataLength,
71: long fileOffset) throws IOException {
72: ByteBuffer buffer = ByteBuffer.wrap(data, dataOffset,
73: dataLength);
74: int read, totalRead = 0;
75: do {
76: read = fileChannel.read(buffer, fileOffset + totalRead);
77: if (read < 0) {
78: throw new JRRuntimeException(
79: "Unable to read sufficient data from the swap file");
80: }
81: totalRead += read;
82: } while (totalRead < dataLength);
83: }
84:
85: }
|