Revision 43876 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/BSQFileSystemServerProvider.java

View differences:

BSQFileSystemServerProvider.java
22 22
 */
23 23
package org.gvsig.fmap.dal.file.bsq;
24 24

  
25
import java.io.DataOutputStream;
25 26
import java.io.File;
27
import java.io.FileOutputStream;
28
import java.io.IOException;
29
import java.nio.ByteOrder;
26 30
import org.apache.commons.io.FilenameUtils;
31
import org.apache.commons.io.IOUtils;
32
import org.gvsig.basicformats.FormatsFile;
33
import org.gvsig.basicformats.HDRFile;
27 34

  
28 35
import org.gvsig.fmap.dal.DataServerExplorer;
29 36
import org.gvsig.fmap.dal.NewDataStoreParameters;
30 37
import org.gvsig.fmap.dal.exception.CreateException;
31 38
import org.gvsig.fmap.dal.exception.DataException;
39
import org.gvsig.fmap.dal.raster.NewRasterStoreParameters;
40
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
32 41
import org.gvsig.fmap.dal.serverexplorer.filesystem.impl.AbstractFilesystemServerExplorerProvider;
42
import org.gvsig.raster.lib.buffer.api.Band;
43
import org.gvsig.raster.lib.buffer.api.Buffer;
44
import org.gvsig.raster.lib.buffer.api.BufferDimensions;
45
import org.gvsig.raster.lib.buffer.api.BufferManager;
33 46

  
34 47
public class BSQFileSystemServerProvider extends AbstractFilesystemServerExplorerProvider {
35 48

  
36 49
    protected String[] fileExtensions;
37
    protected boolean canCreate;
38 50

  
39 51
    public BSQFileSystemServerProvider(
40
            String name, 
41
            String description, 
52
            String name,
53
            String description,
42 54
            String[] fileExtensions
43
        ) {
44
        this(name, description, fileExtensions, false);
45
    }
46
    
47
    public BSQFileSystemServerProvider(
48
            String name, 
49
            String description, 
50
            String[] fileExtensions,
51
            boolean canCreate
52
        ) {
55
    ) {
53 56
        super(name, description);
54 57
        this.fileExtensions = fileExtensions;
55
        this.canCreate = canCreate;
56 58
    }
57
    
59

  
58 60
    @Override
59 61
    public boolean canCreate() {
60
        return canCreate;
62
        return true;
61 63
    }
62 64

  
63 65
    @Override
......
67 69

  
68 70
    @Override
69 71
    public void create(NewDataStoreParameters parameters, boolean overwrite) throws CreateException {
70
        throw new UnsupportedOperationException();
72
        FileOutputStream fos = null;
73
        try {
74
            Buffer buffer = ((NewRasterStoreParameters) parameters).getBuffer();
75
            if (!buffer.areAllBandsOfTheSameType()) {
76
                throw new IllegalArgumentException("The BSQ format does not support bands of different types.");
77
            }
78
            BufferDimensions dimensions = buffer.getDimensions();
79
            File file = ((FilesystemStoreParameters) parameters).getFile();
80
            fos = new FileOutputStream(file);
81
            DataOutputStream dos = new DataOutputStream(fos);
82
            HDRFile hdr = FormatsFile.createHDRFile();
83
            hdr.setDataType(buffer.getBandTypes()[0]);
84
            hdr.setNBands(buffer.getBandCount());
85
            hdr.setByteOrder(ByteOrder.nativeOrder());
86
            hdr.setDimensions(
87
                    dimensions.getRows(),
88
                    dimensions.getColumns(),
89
                    dimensions.getEnvelope()
90
            );
91
            for (int nband = 0; nband < buffer.getBandCount(); nband++) {
92
                writeBand(dos, buffer.getBand(nband));
93
            }
94
            hdr.write(file);
95
        } catch (Exception ex) {
96
            throw new CreateException(this.getName(), ex);
97
        } finally {
98
            IOUtils.closeQuietly(fos);
99
        }
71 100
    }
72
        
101

  
102
    void writeBand(DataOutputStream dos, Band band) throws IOException {
103
        int dataType = band.getDataType();
104
        Object rowBuffer = band.createRowBuffer();
105
        for (int row = 0; row < band.getRows(); row++) {
106
            band.fetchRow(row, rowBuffer);
107
            switch (dataType) {
108
                case BufferManager.TYPE_BYTE:
109
                    byte[] byteBuffer = (byte[]) rowBuffer;
110
                    for (int n = 0; n < byteBuffer.length; n++) {
111
                        dos.writeByte(byteBuffer[n]);
112
                    }
113
                    break;
114
                case BufferManager.TYPE_SHORT:
115
                case BufferManager.TYPE_USHORT:
116
                    short[] shortBuffer = (short[]) rowBuffer;
117
                    for (int n = 0; n < shortBuffer.length; n++) {
118
                        dos.writeShort(shortBuffer[n]);
119
                    }
120
                    break;
121
                case BufferManager.TYPE_INT:
122
                    int[] intBuffer = (int[]) rowBuffer;
123
                    for (int n = 0; n < intBuffer.length; n++) {
124
                        dos.writeInt(intBuffer[n]);
125
                    }
126
                    break;
127
                case BufferManager.TYPE_FLOAT:
128
                    float[] floatBuffer = (float[]) rowBuffer;
129
                    for (int n = 0; n < floatBuffer.length; n++) {
130
                        dos.writeFloat(floatBuffer[n]);
131
                    }
132
                    break;
133

  
134
                case BufferManager.TYPE_DOUBLE:
135
                    double[] doubleBuffer = (double[]) rowBuffer;
136
                    for (int n = 0; n < doubleBuffer.length; n++) {
137
                        dos.writeDouble(doubleBuffer[n]);
138
                    }
139
                    break;
140

  
141
                default:
142
                    throw new IllegalArgumentException("Data Type " + dataType + " not supported.");
143
            }
144
        }
145
    }
146

  
73 147
    @Override
74 148
    public int getMode() {
75 149
        return DataServerExplorer.MODE_RASTER;

Also available in: Unified diff