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 |
} |