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 @ 6494

History | View | Annotate | Download (4.42 KB)

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

    
3
import java.util.Iterator;
4

    
5
import org.slf4j.Logger;
6
import org.slf4j.LoggerFactory;
7

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

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

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

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

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

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

    
42

    
43
    @Override
44
    public int getColumns() {
45
        return columns;
46
    }
47

    
48
    @Override
49
    public int getRows() {
50
        return rows;
51
    }
52

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

    
58
    @Override
59
    public BandInfo getBandInfo() {
60
        return null;
61
    }
62

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

    
76
    @Override
77
    public boolean isReadOnly() {
78
        return false;
79
    }
80

    
81
    @Override
82
    public boolean isPaginated() {
83
        return false;
84
    }
85

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

    
91
    protected abstract void doSet(int row, int column, Object value);
92

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

    
99
    protected abstract void doFill(Object value);
100

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

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

    
123
    protected abstract void doCopyFrom(Band source) throws CopyFromBandException;
124

    
125
    @Override
126
    public void putRow(int row, Object rowBuffer) {
127
        doPutRow(row, rowBuffer);
128
        notifyObservers(new DefaultBandNotification(BandNotification.PUT_ROW, new Object[]{row, rowBuffer}));
129
    }
130

    
131
    protected abstract void doPutRow(int row, Object rowBuffer);
132

    
133
    @Override
134
    protected void finalize() throws Throwable {
135
        super.finalize();
136
        logger.info("AbstractBand with rows = "+rows+" columns = "+columns+" CLEANED");
137

    
138
    }
139

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

    
156
    /**
157
     * Internal implementation for the {@link #dispose()} method.
158
     *
159
     * @see #dispose()
160
     */
161
    public void doDispose() throws BaseException {
162
        noData = null;
163
    }
164

    
165

    
166
}