Statistics
| Revision:

gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.buffer / org.gvsig.raster.lib.buffer.impl / src / main / java / org / gvsig / raster / lib / buffer / impl / SimpleBandPageManager.java @ 6220

History | View | Annotate | Download (4.63 KB)

1
package org.gvsig.raster.lib.buffer.impl;
2

    
3
import java.io.File;
4
import java.io.FileNotFoundException;
5
import java.io.FileOutputStream;
6
import java.io.IOException;
7
import java.io.OutputStream;
8
import java.io.RandomAccessFile;
9
import java.nio.Buffer;
10
import java.nio.ByteBuffer;
11
import java.nio.DoubleBuffer;
12
import java.nio.FloatBuffer;
13
import java.nio.IntBuffer;
14
import java.nio.ShortBuffer;
15

    
16
import org.apache.commons.io.FileUtils;
17

    
18
import org.gvsig.raster.lib.buffer.api.BandPageManager;
19
import org.gvsig.raster.lib.buffer.api.BufferLocator;
20
import org.gvsig.raster.lib.buffer.api.BufferManager;
21

    
22

    
23
/**
24
 * @author fdiaz
25
 *
26
 */
27
public class SimpleBandPageManager implements BandPageManager {
28

    
29
    private RandomAccessFile  raf;
30
    private int rows;
31
    private int columns;
32
    private int dataType;
33
    private File file;
34

    
35
    /**
36
     * @param file
37
     * @param rows
38
     * @param columns
39
     * @param dataType
40
     * @throws IOException
41
     */
42
    public SimpleBandPageManager(File file, int rows, int columns, int dataType) throws IOException {
43
        this.rows = rows;
44
        this.columns = columns;
45
        this.dataType = dataType;
46
        this.file = file;
47
        if(this.file==null){
48
            this.file = File.createTempFile("bandPageManager", "tmp");
49
        }
50

    
51
        this.raf = new RandomAccessFile(this.file, "rw");
52
        BufferManager bufferManager = BufferLocator.getBufferManager();
53
        raf.setLength(rows*columns*bufferManager.getDataTypeSize(dataType));
54

    
55
    }
56

    
57
    public void load(Buffer buffer, int row, int rows, int dataType) throws IOException {
58

    
59
        int pos = row*this.columns;
60
        raf.seek(pos);
61
        BufferManager bufferManager = BufferLocator.getBufferManager();
62
        int dataTypeSize = bufferManager.getDataTypeSize(dataType);
63
        byte[] byteArray = new byte[buffer.capacity() * dataTypeSize];
64
        raf.read(byteArray);
65
        buffer.rewind();
66

    
67
        switch (dataType) {
68
        case BufferManager.TYPE_BYTE:
69
            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
70
                ((ByteBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
71
            }
72
            break;
73
        case BufferManager.TYPE_SHORT:
74
        case BufferManager.TYPE_USHORT:
75
            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
76
                ((ShortBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
77
            }
78
            break;
79
        case BufferManager.TYPE_INT:
80
            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
81
                ((IntBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
82
            }
83
            break;
84
        case BufferManager.TYPE_FLOAT:
85
            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
86
                ((FloatBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
87
            }
88
            break;
89

    
90
        case BufferManager.TYPE_DOUBLE:
91
            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
92
                ((DoubleBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
93
            }
94
            break;
95

    
96
        default:
97
            throw new IllegalArgumentException("Data Type " + dataType + " not supported.");
98
        }
99

    
100

    
101

    
102

    
103
    }
104

    
105
    public void save(Buffer buffer, int row, int rows, int dataType) throws IOException {
106

    
107
        int pos = row*this.columns;
108
        raf.seek(pos);
109

    
110
        BufferManager bufferManager = BufferLocator.getBufferManager();
111
        ByteBuffer byteBuffer = ByteBuffer.allocate(buffer.capacity() * bufferManager.getDataTypeSize(dataType));
112
        switch (dataType) {
113
        case BufferManager.TYPE_BYTE:
114
            byteBuffer.put((ByteBuffer)buffer.array());
115
        case BufferManager.TYPE_SHORT:
116
        case BufferManager.TYPE_USHORT:
117
            ShortBuffer byteAsShortBuffer = byteBuffer.asShortBuffer();
118
            byteAsShortBuffer.put((short[]) buffer.array());
119
            break;
120
        case BufferManager.TYPE_INT:
121
            IntBuffer byteAsIntBuffer = byteBuffer.asIntBuffer();
122
            byteAsIntBuffer.put((int[]) buffer.array());
123
            break;
124
        case BufferManager.TYPE_FLOAT:
125
            FloatBuffer byteAsFloatBuffer = byteBuffer.asFloatBuffer();
126
            byteAsFloatBuffer.put((float[]) buffer.array());
127
            break;
128
        case BufferManager.TYPE_DOUBLE:
129
            DoubleBuffer byteAsDoubleBuffer = byteBuffer.asDoubleBuffer();
130
            byteAsDoubleBuffer.put((double[]) buffer.array());
131
            break;
132
        default:
133
            throw new IllegalArgumentException("Data Type " + dataType + " not supported.");
134
        }
135
        raf.write(byteBuffer.array());
136

    
137
    }
138

    
139
    @Override
140
    public boolean isSupportedSave() {
141
        return true;
142
    }
143
}