Statistics
| Revision:

gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.raster / org.gvsig.raster.tilecache / org.gvsig.raster.tilecache.provider / src / main / java / org / gvsig / raster / tilecache / provider / AbstractTileCacheStructImage.java @ 6520

History | View | Annotate | Download (9.11 KB)

1
package org.gvsig.raster.tilecache.provider;
2

    
3
import java.util.Iterator;
4
import java.util.Map;
5

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

    
9
import org.gvsig.fmap.dal.exception.DataException;
10
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
11
import org.gvsig.fmap.dal.raster.api.RasterQuery;
12
import org.gvsig.fmap.dal.raster.api.RasterStore;
13
import org.gvsig.fmap.dal.raster.spi.RasterStoreProvider;
14
import org.gvsig.fmap.geom.Geometry.DIMENSIONS;
15
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
16
import org.gvsig.fmap.geom.primitive.Envelope;
17
import org.gvsig.raster.lib.buffer.api.TileStruct;
18
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException;
19
import org.gvsig.tools.ToolsLocator;
20
import org.gvsig.tools.dispose.DisposeUtils;
21
import org.gvsig.tools.dispose.impl.AbstractDisposable;
22
import org.gvsig.tools.dynobject.exception.DynMethodException;
23
import org.gvsig.tools.exception.BaseException;
24

    
25
/**
26
 * @author fdiaz
27
 *
28
 */
29
public abstract class AbstractTileCacheStructImage extends AbstractDisposable implements TileCacheStructImage {
30

    
31
    private static final Logger logger = LoggerFactory.getLogger(AbstractTileCacheStructImage.class);
32

    
33
    protected RasterStoreProvider innerProvider;
34
    protected RasterQuery query;
35
    protected TileStruct tileStruct;
36

    
37
    protected Object colorInterpretation;
38
    protected Object legend;
39
    protected Object colorTable;
40

    
41
    protected Map<String, Tile> recentAccededTiles;
42

    
43
    protected Integer bandNumber = null;
44

    
45
    protected int[] dataTypes;
46

    
47
    /**
48
     * @param innerProvider
49
     * @param query
50
     */
51
    public AbstractTileCacheStructImage(RasterStoreProvider innerProvider, RasterQuery query) {
52
        super();
53
        this.innerProvider = innerProvider;
54
        this.query = query;
55
    }
56

    
57
    /**
58
     * @param pixelSize
59
     * @return The appropriate zoom level for the pizelSize
60
     */
61
    public int getZoomLvlForPixelSize(double pixelSize) {
62
        int zoom = 0;
63
        Map<Integer, Double> pixelSizePerZoomLevel = tileStruct.getPixelSizePerZoomLevel();
64
        for (int i : pixelSizePerZoomLevel.keySet()) {
65
            zoom = i;
66
            double levelPixelSize = pixelSizePerZoomLevel.get(zoom);
67
            if (pixelSize >= levelPixelSize) {
68
                return zoom;
69
            }
70
        }
71
        return zoom;
72
    }
73

    
74
    /**
75
     * @throws CloneNotSupportedException
76
     * @throws ValidateDataParametersException
77
     * @throws DynMethodException
78
     * @throws DataException
79
     * @throws BufferException
80
     * @throws CreateEnvelopeException
81
     *
82
     */
83
    protected void fillStoreInfo() throws ValidateDataParametersException, CreateEnvelopeException, BufferException,
84
        DataException, CloneNotSupportedException {
85
        this.bandNumber = this.innerProvider.getBands();
86
        this.dataTypes = new int[this.bandNumber];
87
        for (int i = 0; i < this.bandNumber; i++) {
88
            dataTypes[i] = this.innerProvider.getBandInfo(i).getDataType();
89
        }
90
        try {
91
            this.colorInterpretation =
92
                this.innerProvider.invokeDynMethod(RasterStore.DYNMETHOD_GETCOLORINTERPRETATION_NAME, null);
93
            this.colorTable = this.innerProvider.invokeDynMethod(RasterStore.DYNMETHOD_GETCOLORTABLE_NAME, null);
94
            this.legend = this.innerProvider.invokeDynMethod(RasterStore.DYNMETHOD_GETLEGEND_NAME, null);
95
        } catch (DynMethodException e) {
96
            logger.warn("Can't fill legend info from store.");
97
        }
98
    }
99

    
100
    /* (non-Javadoc)
101
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getBandNumber()
102
     */
103
    @Override
104
    public int getBandNumber() throws ValidateDataParametersException, CreateEnvelopeException, BufferException,
105
        DataException, CloneNotSupportedException {
106
        if (this.bandNumber == null) {
107
            fillStoreInfo();
108
        }
109
        return this.bandNumber;
110
    }
111

    
112

    
113
    /* (non-Javadoc)
114
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getDataTypes()
115
     */
116
    @Override
117
    public int[] getDataTypes() throws ValidateDataParametersException, CreateEnvelopeException, BufferException,
118
        DataException, CloneNotSupportedException {
119
        if (this.dataTypes == null) {
120
            fillStoreInfo();
121
        }
122
        return this.dataTypes;
123
    }
124

    
125
    /* (non-Javadoc)
126
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getRows(int)
127
     */
128
    @Override
129
    public int getRows(int zoomLevel) {
130
        return (int) (Math.round(getEnvelope().getLength(DIMENSIONS.Y) / this.tileStruct.getPixelSizePerZoomLevel().get(zoomLevel)));
131
    }
132

    
133
    /* (non-Javadoc)
134
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getColumns(int)
135
     */
136
    @Override
137
    public int getColumns(int zoomLevel) {
138
        return (int) (Math.round(this.getEnvelope().getLength(DIMENSIONS.X) / this.tileStruct.getPixelSizePerZoomLevel().get(zoomLevel)));
139
    }
140

    
141
    /* (non-Javadoc)
142
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getEnvelope()
143
     */
144
    @Override
145
    public Envelope getEnvelope() {
146
        return this.tileStruct.getEnvelope();
147
    }
148

    
149
    /* (non-Javadoc)
150
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getRowsPerTile()
151
     */
152
    @Override
153
    public int getRowsPerTile() {
154
        return this.tileStruct.getRowsPerTile();
155
    }
156

    
157
    /* (non-Javadoc)
158
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getColumnsPerTile()
159
     */
160
    @Override
161
    public int getColumnsPerTile() {
162
        return this.tileStruct.getColumnsPerTile();
163
    }
164

    
165
    /* (non-Javadoc)
166
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getProviderName()
167
     */
168
    @Override
169
    public String getProviderName() {
170
        return this.tileStruct.getProviderName();
171
    }
172

    
173
    protected String composeKeyForRecentTiles(int zoomLevel, int structRow, int structCol) {
174
        StringBuilder builder = new StringBuilder();
175
        builder.append(zoomLevel);
176
        builder.append(":");
177
        builder.append(structCol);
178
        builder.append(":");
179
        builder.append(structRow);
180
        return builder.toString();
181
    }
182

    
183
    protected void removeOlderTile() {
184
        Tile olderTile = null;
185
        for (Iterator<Tile> iterator = recentAccededTiles.values().iterator(); iterator.hasNext();) {
186
            Tile tile = (Tile) iterator.next();
187
            if (olderTile == null || tile.getLastAccess() < olderTile.getLastAccess()) {
188
                olderTile = tile;
189
            }
190
        }
191
        if (olderTile != null) {
192
            recentAccededTiles.remove(olderTile.getKey());
193
            DisposeUtils.dispose(olderTile);
194
        }
195
    }
196

    
197
    /* (non-Javadoc)
198
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getColorInterpretation()
199
     */
200
    @Override
201
    public Object getColorInterpretation() throws DynMethodException, ValidateDataParametersException,
202
        CreateEnvelopeException, BufferException, DataException, CloneNotSupportedException {
203
        if (this.colorInterpretation == null) {
204
            fillStoreInfo();
205
        }
206
        return this.colorInterpretation;
207
    }
208

    
209
    /* (non-Javadoc)
210
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getColorTable()
211
     */
212
    @Override
213
    public Object getColorTable() throws DynMethodException, ValidateDataParametersException, CreateEnvelopeException,
214
        BufferException, DataException, CloneNotSupportedException {
215
        if (this.colorTable == null) {
216
            fillStoreInfo();
217
        }
218
        return this.colorTable;
219
    }
220

    
221
    /* (non-Javadoc)
222
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getLegend()
223
     */
224
    @Override
225
    public Object getLegend() throws DynMethodException, ValidateDataParametersException, CreateEnvelopeException,
226
        BufferException, DataException, CloneNotSupportedException {
227
        if (this.legend == null) {
228
            fillStoreInfo();
229
        }
230
        return this.legend;
231
    }
232

    
233
    /**
234
     *
235
     */
236
    public void forgetCache(){
237
        this.recentAccededTiles.clear();
238
    }
239

    
240

    
241
    protected class Tile extends AbstractDisposable {
242

    
243
        org.gvsig.raster.lib.buffer.api.Buffer buffer;
244
        long lastAccess;
245
        String key;
246

    
247
        public Tile(org.gvsig.raster.lib.buffer.api.Buffer buffer, String key) {
248
            logger
249
                .info("CONSTRUCTOR hashCode = " + this.hashCode() + " className = " + this.getClass().getSimpleName());
250
            ToolsLocator.getDisposableManager().bind(buffer);
251
            this.buffer = buffer;
252
            this.key = key;
253
            lastAccess = System.currentTimeMillis();
254
        }
255

    
256
        public String getKey() {
257
            return key;
258
        }
259

    
260
        public org.gvsig.raster.lib.buffer.api.Buffer getBuffer() {
261
            lastAccess = System.currentTimeMillis();
262
            return buffer;
263
        }
264

    
265
        public long getLastAccess() {
266
            return lastAccess;
267
        }
268

    
269
        @Override
270
        protected void finalize() throws Throwable {
271
            super.finalize();
272
            logger.info("CLEANED key " + this.key + " hashCode = " + this.hashCode());
273
        }
274

    
275
        @Override
276
        protected void doDispose() throws BaseException {
277
            DisposeUtils.dispose(buffer);
278
            buffer = null;
279
        }
280
    }
281
}