Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.buffer.impl / src / main / java / org / gvsig / raster / lib / buffer / impl / AbstractBand.java @ 44831

History | View | Annotate | Download (5.98 KB)

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

    
3
import org.slf4j.Logger;
4
import org.slf4j.LoggerFactory;
5

    
6
import org.gvsig.raster.lib.buffer.api.Band;
7
import org.gvsig.raster.lib.buffer.api.BandInfo;
8
import org.gvsig.raster.lib.buffer.api.BandNotification;
9
import org.gvsig.raster.lib.buffer.api.BufferManager;
10
import org.gvsig.raster.lib.buffer.api.NoData;
11
import org.gvsig.raster.lib.buffer.api.exceptions.BandException;
12
import org.gvsig.raster.lib.buffer.impl.exceptions.CopyFromBandException;
13
import org.gvsig.tools.ToolsLocator;
14
import org.gvsig.tools.exception.BaseException;
15
import org.gvsig.tools.observer.impl.BaseWeakReferencingObservable;
16

    
17
/**
18
 * @author fdiaz
19
 *
20
 */
21
public abstract class AbstractBand extends BaseWeakReferencingObservable implements Band {
22

    
23
    protected static final Logger logger = LoggerFactory.getLogger(AbstractBand.class);
24

    
25
    int rows;
26
    int columns;
27
    NoData noData;
28

    
29
    // to make it disposable
30
    private final Object lock = new Object();
31
    private boolean disposed = false;
32

    
33
    public AbstractBand() {
34
        if(ToolsLocator.getDisposableManager() != null) {
35
            ToolsLocator.getDisposableManager().bind(this);
36
        } else {
37
            logger.warn("Can't retrieve the disposable manager,");
38
        }
39
    }
40

    
41
    public Double getAsDouble(int row, int column) {
42
        Object obj = this.get(row, column);
43
        if (obj == this.getNoData().getValue()) {
44
            return null;
45
        }
46
        if (! (obj instanceof Number) ) {
47
            return null;
48
        }
49
        double value = valueToDoubleByType(this.getDataType(), obj);
50
        return value;
51
    }
52

    
53
    /**
54
     * @param obj
55
     * @return
56
     */
57
    private static double valueToDoubleByType(int dataType, Object obj) {
58
        double value;
59
        switch (dataType) {
60
        case BufferManager.TYPE_BYTE:
61
            value = (0xFF & ((Number) obj).byteValue());
62
            break;
63
        case BufferManager.TYPE_SHORT:
64
            value = ((Number) obj).shortValue();
65
            break;
66
        case BufferManager.TYPE_USHORT:
67
            value = (0xFFFF & ((Number) obj).shortValue());
68
            break;
69
        case BufferManager.TYPE_INT:
70
            value = ((Number) obj).intValue();
71
            break;
72
        case BufferManager.TYPE_FLOAT:
73
            value = ((Number) obj).floatValue();
74
            break;
75
        case BufferManager.TYPE_DOUBLE:
76
            value = ((Number) obj).floatValue();
77
            break;
78
        default:
79
            value = ((Number) obj).doubleValue();
80
        }
81
        return value;
82
    }
83

    
84
    @Override
85
    public int getColumns() {
86
        return columns;
87
    }
88

    
89
    @Override
90
    public int getRows() {
91
        return rows;
92
    }
93

    
94
    @Override
95
    public NoData getNoData() {
96
        return this.noData;
97
    }
98

    
99
    @Override
100
    public BandInfo getBandInfo() {
101
        return null;
102
    }
103

    
104
    public Object clone() throws CloneNotSupportedException {
105
        AbstractBand cloned = (AbstractBand) super.clone();
106
        cloned.rows = this.rows;
107
        cloned.columns = this.columns;
108
        cloned.noData = (NoData) this.noData.clone();
109
        try {
110
            cloned.copyFrom(this);
111
        } catch (BandException e) {
112
            throw new CloneNotSupportedException(e.getMessage());
113
        }
114
        return cloned;
115
    }
116

    
117
    @Override
118
    public boolean isReadOnly() {
119
        return false;
120
    }
121

    
122
    @Override
123
    public boolean isPaginated() {
124
        return false;
125
    }
126

    
127
    public void set(int row, int column, Object value){
128
        doSet(row, column, value);
129
        notifyObservers(new DefaultBandNotification(BandNotification.SET, new Object[]{row, column, value}));
130
    }
131

    
132
    protected abstract void doSet(int row, int column, Object value);
133

    
134
    @Override
135
    public void fill(Object value) {
136
        doFill(value);
137
        notifyObservers(new DefaultBandNotification(BandNotification.FILL, new Object[]{value}));
138
    }
139

    
140
    protected abstract void doFill(Object value);
141

    
142
    /**
143
     * @param value NoData value
144
     * @return
145
     */
146
    protected Object nullValueToNoData(Object value) {
147
        if (value == null) {
148
            if (getNoData().isDefined()) {
149
                value = getNoData().getValue();
150
            } else {
151
                // Do nothing, no data value is undefined
152
                return null;
153
            }
154
        }
155
        return value;
156
    }
157

    
158
    @Override
159
    public void copyFrom(Band source) throws BandException {
160
        doCopyFrom(source);
161
        notifyObservers(new DefaultBandNotification(BandNotification.COPY_FROM, new Object[]{source}));
162
    }
163

    
164
    protected abstract void doCopyFrom(Band source) throws CopyFromBandException;
165

    
166
    @Override
167
    public void copyFrom(Band source, int row, int column) throws BandException {
168
        doCopyFrom(source, row, column);
169
        notifyObservers(new DefaultBandNotification(BandNotification.COPY_FROM, new Object[]{source}));
170
    }
171

    
172
    protected abstract void doCopyFrom(Band source, int row, int column) throws CopyFromBandException;
173

    
174
    @Override
175
    public void putRow(int row, Object rowBuffer) {
176
        doPutRow(row, rowBuffer);
177
        notifyObservers(new DefaultBandNotification(BandNotification.PUT_ROW, new Object[]{row, rowBuffer}));
178
    }
179

    
180
    protected abstract void doPutRow(int row, Object rowBuffer);
181

    
182
    @Override
183
    protected void finalize() throws Throwable {
184
        super.finalize();
185
    }
186

    
187
    public final void dispose() {
188
        synchronized (lock) {
189
            // Check if we have already been disposed, and don't do it again
190
            if (!disposed) {
191
                if ( ToolsLocator.getDisposableManager().release(this) ) {
192
                    try {
193
                        doDispose();
194
                    } catch (BaseException ex) {
195
                        logger.error("Error performing dispose", ex);
196
                    }
197
                    disposed = true;
198
                }
199
            }
200
        }
201
    }
202

    
203
    /**
204
     * Internal implementation for the {@link #dispose()} method.
205
     *
206
     * @see #dispose()
207
     */
208
    public void doDispose() throws BaseException {
209
        noData = null;
210
    }
211

    
212

    
213
}