Statistics
| Revision:

svn-gvsig-desktop / branches / org.gvsig.desktop-2018a / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.file / org.gvsig.fmap.dal.file.bsq / src / main / java / org / gvsig / fmap / dal / file / bsq / BSQBandPageManager.java @ 43873

History | View | Annotate | Download (5.07 KB)

1

    
2
package org.gvsig.fmap.dal.file.bsq;
3

    
4
import java.io.File;
5
import java.io.IOException;
6
import java.io.RandomAccessFile;
7
import java.nio.Buffer;
8
import java.nio.ByteBuffer;
9
import java.nio.DoubleBuffer;
10
import java.nio.FloatBuffer;
11
import java.nio.IntBuffer;
12
import java.nio.ShortBuffer;
13
import org.apache.commons.io.IOUtils;
14
import org.gvsig.raster.lib.buffer.api.BandInfo;
15
import org.gvsig.raster.lib.buffer.api.BandPageManager;
16
import org.gvsig.raster.lib.buffer.api.BufferLocator;
17
import org.gvsig.raster.lib.buffer.api.BufferManager;
18
import org.gvsig.tools.dispose.impl.AbstractDisposable;
19
import org.gvsig.tools.exception.BaseException;
20

    
21
public class BSQBandPageManager extends AbstractDisposable implements BandPageManager {
22

    
23
    private RandomAccessFile  raf;
24
    private final int rows;
25
    private final int columns;
26
    private final int dataType;
27
    private final File file;
28
    private final long startpos;
29

    
30
    /**
31
     * @param file
32
     * @param startpos
33
     * @param rows
34
     * @param columns
35
     * @param dataType
36
     * @throws IOException
37
     */
38
    public BSQBandPageManager(File file, long startpos, int rows, int columns, int dataType) throws IOException {
39
        this.rows = rows;
40
        this.columns = columns;
41
        this.dataType = dataType;
42
        this.file = file;
43
        this.startpos = startpos;
44

    
45
        this.raf = new RandomAccessFile(this.file, "r");
46
        // BufferManager bufferManager = BufferLocator.getBufferManager();
47
        //raf.setLength(rows*columns*bufferManager.getDataTypeSize(dataType));
48

    
49
    }
50

    
51
    @Override
52
    public void load(Buffer buffer, int row, int rows, int dataType) throws IOException {
53

    
54
        long pos = row*this.columns + this.startpos;
55
        raf.seek(pos);
56
        BufferManager bufferManager = BufferLocator.getBufferManager();
57
        int dataTypeSize = bufferManager.getDataTypeSize(dataType);
58
        byte[] byteArray = new byte[buffer.capacity() * dataTypeSize];
59
        raf.read(byteArray);
60
        buffer.rewind();
61

    
62
        switch (dataType) {
63
        case BufferManager.TYPE_BYTE:
64
            //FIXME: Elegir cual de las dos siguientes maneras de hacerlo es la id?nea
65

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

    
86
        case BufferManager.TYPE_DOUBLE:
87
            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
88
                ((DoubleBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
89
            }
90
            break;
91

    
92
        default:
93
            throw new IllegalArgumentException("Data Type " + dataType + " not supported.");
94
        }
95
    }
96

    
97
    @Override
98
    public void save(Buffer buffer, int row, int rows, int dataType) throws IOException {
99

    
100
        long pos = row*this.columns + this.startpos;
101
        raf.seek(pos);
102

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

    
131
    }
132

    
133
    @Override
134
    public boolean isSupportedSave() {
135
        return false;
136
    }
137

    
138
    @Override
139
    public BandInfo getBandInfo() {
140
        return null;
141
    }
142

    
143
    @Override
144
    protected void doDispose() throws BaseException {
145
        IOUtils.closeQuietly(this.raf);
146
        this.raf = null;
147
    }
148
}