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 / AbstractBand.java @ 8682

History | View | Annotate | Download (4.67 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.NoData;
10
import org.gvsig.raster.lib.buffer.api.exceptions.BandException;
11
import org.gvsig.raster.lib.buffer.impl.exceptions.CopyFromBandException;
12
import org.gvsig.tools.ToolsLocator;
13
import org.gvsig.tools.exception.BaseException;
14
import org.gvsig.tools.observer.impl.BaseWeakReferencingObservable;
15

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

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

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

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

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

    
40

    
41
    @Override
42
    public int getColumns() {
43
        return columns;
44
    }
45

    
46
    @Override
47
    public int getRows() {
48
        return rows;
49
    }
50

    
51
    @Override
52
    public NoData getNoData() {
53
        return this.noData;
54
    }
55

    
56
    @Override
57
    public BandInfo getBandInfo() {
58
        return null;
59
    }
60

    
61
    public Object clone() throws CloneNotSupportedException {
62
        AbstractBand cloned = (AbstractBand) super.clone();
63
        cloned.rows = this.rows;
64
        cloned.columns = this.columns;
65
        cloned.noData = (NoData) this.noData.clone();
66
        try {
67
            cloned.copyFrom(this);
68
        } catch (BandException e) {
69
            throw new CloneNotSupportedException(e.getMessage());
70
        }
71
        return cloned;
72
    }
73

    
74
    @Override
75
    public boolean isReadOnly() {
76
        return false;
77
    }
78

    
79
    @Override
80
    public boolean isPaginated() {
81
        return false;
82
    }
83

    
84
    public void set(int row, int column, Object value){
85
        doSet(row, column, value);
86
        notifyObservers(new DefaultBandNotification(BandNotification.SET, new Object[]{row, column, value}));
87
    }
88

    
89
    protected abstract void doSet(int row, int column, Object value);
90

    
91
    @Override
92
    public void fill(Object value) {
93
        doFill(value);
94
        notifyObservers(new DefaultBandNotification(BandNotification.FILL, new Object[]{value}));
95
    }
96

    
97
    protected abstract void doFill(Object value);
98

    
99
    /**
100
     * @param value NoData value
101
     * @return
102
     */
103
    protected Object nullValueToNoData(Object value) {
104
        if (value == null) {
105
            if (getNoData().isDefined()) {
106
                value = getNoData().getValue();
107
            } else {
108
                // Do nothing, no data value is undefined
109
                return null;
110
            }
111
        }
112
        return value;
113
    }
114

    
115
    @Override
116
    public void copyFrom(Band source) throws BandException {
117
        doCopyFrom(source);
118
        notifyObservers(new DefaultBandNotification(BandNotification.COPY_FROM, new Object[]{source}));
119
    }
120

    
121
    protected abstract void doCopyFrom(Band source) throws CopyFromBandException;
122

    
123
    @Override
124
    public void copyFrom(Band source, int row, int column) throws BandException {
125
        doCopyFrom(source, row, column);
126
        notifyObservers(new DefaultBandNotification(BandNotification.COPY_FROM, new Object[]{source}));
127
    }
128

    
129
    protected abstract void doCopyFrom(Band source, int row, int column) throws CopyFromBandException;
130

    
131
    @Override
132
    public void putRow(int row, Object rowBuffer) {
133
        doPutRow(row, rowBuffer);
134
        notifyObservers(new DefaultBandNotification(BandNotification.PUT_ROW, new Object[]{row, rowBuffer}));
135
    }
136

    
137
    protected abstract void doPutRow(int row, Object rowBuffer);
138

    
139
    @Override
140
    protected void finalize() throws Throwable {
141
        super.finalize();
142
    }
143

    
144
    public final void dispose() {
145
        synchronized (lock) {
146
            // Check if we have already been disposed, and don't do it again
147
            if (!disposed) {
148
                if ( ToolsLocator.getDisposableManager().release(this) ) {
149
                    try {
150
                        doDispose();
151
                    } catch (BaseException ex) {
152
                        logger.error("Error performing dispose", ex);
153
                    }
154
                    disposed = true;
155
                }
156
            }
157
        }
158
    }
159

    
160
    /**
161
     * Internal implementation for the {@link #dispose()} method.
162
     *
163
     * @see #dispose()
164
     */
165
    public void doDispose() throws BaseException {
166
        noData = null;
167
    }
168

    
169

    
170
}