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 / TileCacheStoreProvider.java @ 6516

History | View | Annotate | Download (12.2 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2016 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.raster.tilecache.provider;
24

    
25
import java.io.File;
26
import java.util.ArrayList;
27
import java.util.HashMap;
28
import java.util.List;
29
import java.util.Map;
30

    
31
import org.cresques.cts.IProjection;
32
import org.slf4j.Logger;
33
import org.slf4j.LoggerFactory;
34

    
35
import org.gvsig.fmap.dal.DataServerExplorer;
36
import org.gvsig.fmap.dal.DataStore;
37
import org.gvsig.fmap.dal.DataStoreNotification;
38
import org.gvsig.fmap.dal.FileHelper;
39
import org.gvsig.fmap.dal.exception.CloseException;
40
import org.gvsig.fmap.dal.exception.DataException;
41
import org.gvsig.fmap.dal.exception.InitializeException;
42
import org.gvsig.fmap.dal.exception.OpenException;
43
import org.gvsig.fmap.dal.exception.ReadException;
44
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
45
import org.gvsig.fmap.dal.raster.api.BandAttributeDescriptor;
46
import org.gvsig.fmap.dal.raster.api.BandDescriptor;
47
import org.gvsig.fmap.dal.raster.api.BandQuery;
48
import org.gvsig.fmap.dal.raster.api.RasterQuery;
49
import org.gvsig.fmap.dal.raster.api.RasterStore;
50
import org.gvsig.fmap.dal.raster.spi.AbstractRasterStoreProvider;
51
import org.gvsig.fmap.dal.raster.spi.RasterCacheStoreProvider;
52
import org.gvsig.fmap.dal.raster.spi.RasterStoreProvider;
53
import org.gvsig.fmap.dal.resource.file.FileResource;
54
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
55
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
56
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
57
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
58
import org.gvsig.fmap.geom.primitive.Envelope;
59
import org.gvsig.metadata.MetadataLocator;
60
import org.gvsig.metadata.MetadataManager;
61
import org.gvsig.metadata.exceptions.MetadataException;
62
import org.gvsig.raster.lib.buffer.api.BandInfo;
63
import org.gvsig.raster.lib.buffer.api.Buffer;
64
import org.gvsig.raster.lib.buffer.api.BufferLocator;
65
import org.gvsig.raster.lib.buffer.api.BufferManager;
66
import org.gvsig.raster.lib.buffer.api.NoData;
67
import org.gvsig.raster.lib.buffer.api.PageManager;
68
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException;
69
import org.gvsig.tools.ToolsLocator;
70
import org.gvsig.tools.dispose.DisposeUtils;
71
import org.gvsig.tools.dynobject.DynObject;
72
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
73
import org.gvsig.tools.exception.BaseException;
74
import org.gvsig.tools.i18n.I18nManager;
75
import org.gvsig.tools.task.SimpleTaskStatus;
76
import org.gvsig.tools.task.TaskStatusManager;
77

    
78
/**
79
 * Provider for Tile Cache
80
 *
81
 * @author dmartinezizquierdo
82
 *
83
 */
84
public class TileCacheStoreProvider extends AbstractRasterStoreProvider implements RasterCacheStoreProvider,
85
    ResourceConsumer {
86

    
87
    private static final Logger logger = LoggerFactory.getLogger(TileCacheStoreProvider.class);
88

    
89
    public static String NAME = "TileCache";
90
    public static String DESCRIPTION = "Tile cache provider";
91
    public static final String METADATA_DEFINITION_NAME = NAME;
92

    
93
    private ResourceProvider resource;
94
    private final SimpleTaskStatus taskStatus;
95

    
96
    private TileCacheStructImage tileCacheStructImage = null;
97

    
98
    private Envelope envelope = null;
99
    private IProjection projection = null;
100

    
101
    Map<Integer,List<PageManager>> pageManagersPerZoomLevel = null;
102

    
103
    private RasterStoreProvider innerProvider;
104
    private int bandsNumber;
105

    
106
    protected static void registerMetadataDefinition() throws MetadataException {
107
        MetadataManager manager = MetadataLocator.getMetadataManager();
108
        if (manager.getDefinition(METADATA_DEFINITION_NAME) == null) {
109
            manager.addDefinition(METADATA_DEFINITION_NAME,
110
                TileCacheStoreProviderParameters.class.getResourceAsStream("TileCacheMetadata.xml"),
111
                TileCacheStoreProviderParameters.class.getClassLoader());
112
        }
113
    }
114

    
115
    /**
116
     * @param params
117
     * @param storeServices
118
     * @throws InitializeException
119
     */
120
    public TileCacheStoreProvider(TileCacheStoreProviderParameters params, DataStoreProviderServices storeServices)
121
        throws InitializeException {
122
        super(params, storeServices, FileHelper.newMetadataContainer(METADATA_DEFINITION_NAME));
123
        TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
124
        this.taskStatus = manager.createDefaultSimpleTaskStatus("TileCache");
125
        this.init(params, storeServices);
126
    }
127

    
128
    protected TileCacheStoreProvider(TileCacheStoreProviderParameters params, DataStoreProviderServices storeServices,
129
        DynObject metadata) throws InitializeException {
130
        super(params, storeServices, metadata);
131
        TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
132
        this.taskStatus = manager.createDefaultSimpleTaskStatus("TileCache");
133
        this.init(params, storeServices);
134
    }
135

    
136
    protected void init(TileCacheStoreProviderParameters params,
137
        DataStoreProviderServices storeServices) throws InitializeException {
138
        bandsNumber = ((RasterStore)storeServices).getBands();
139

    
140
        if (params == null) {
141
            throw new InitializeException(
142
                new NullPointerException("params is null"));
143
        }
144

    
145
        this.projection=params.getCRS();
146

    
147
      File cacheFolder = (File) params.getDynValue(TileCacheStoreProviderParameters.TILECACHE_CACHEFOLDER_PARAMTER_NAME);
148

    
149
        resource = this.createResource(
150
            FileResource.NAME,
151
            new Object[] { cacheFolder.getAbsolutePath() }
152
        );
153

    
154
        resource.addConsumer(this);
155

    
156
    }
157

    
158
    private TileCacheStoreProviderParameters getTileCacheParameters() {
159
        return (TileCacheStoreProviderParameters) this.getParameters();
160
    }
161

    
162
    @Override
163
    public BandDescriptor getBandDescriptor(int band) {
164
        if (band > this.getBands()) {
165
            throw new IllegalArgumentException("Invalid band");
166
        }
167
        return getStoreServices().createBandDescriptor(band, new ArrayList<BandAttributeDescriptor>());
168
    }
169

    
170
    @Override
171
    public int getBands() {
172
        return bandsNumber;
173
    }
174

    
175
    @Override
176
    public Buffer createBuffer(RasterQuery rasterQuery) throws BufferException {
177
        BufferManager bufferManager = BufferLocator.getBufferManager();
178
        int[] bandDataTypes;
179
        List<PageManager> pageManagers = new ArrayList<PageManager>();
180
        NoData[] bandNoData;
181
        // if (rasterQuery != null) {
182
        List<BandQuery> bands;
183
        bands = rasterQuery.getBands();
184
        bandDataTypes = new int[bandsNumber];
185
        bandNoData = new NoData[bandsNumber];
186

    
187
        int zoomLevel = tileCacheStructImage.getZoomLvlForPixelSize(rasterQuery.getPixelSize());
188
        List<PageManager> pageManagersInZoom;
189
        int[] tileStructDataTypes;
190
        try {
191
            pageManagersInZoom = getPageManagersInZoom(zoomLevel);
192
            tileStructDataTypes = tileCacheStructImage.getDataTypes();
193
        } catch (ValidateDataParametersException | CreateEnvelopeException | DataException | CloneNotSupportedException e) {
194
            throw new BufferException(e);
195
        }
196
        try {
197
            for(int i = 0; i<tileCacheStructImage.getBandNumber(); i++){
198
                bandDataTypes[i] = tileStructDataTypes[i];
199
                bandNoData[i] = null;
200
                pageManagers.add(pageManagersInZoom.get(i));
201
            }
202
        } catch (ValidateDataParametersException | CreateEnvelopeException | DataException | CloneNotSupportedException e) {
203
            throw new BufferException(e);
204
        }
205

    
206
        envelope = tileCacheStructImage.getEnvelope();
207
        Buffer buffer =
208
            bufferManager.createBuffer(tileCacheStructImage.getRows(zoomLevel), tileCacheStructImage.getColumns(zoomLevel),
209
                bandDataTypes, bandNoData, projection, envelope, pageManagers);
210

    
211
        return buffer;
212
    }
213

    
214
    private List<PageManager> getPageManagersInZoom(int zoomLevel) throws ValidateDataParametersException, CreateEnvelopeException, BufferException, DataException, CloneNotSupportedException {
215
        List<PageManager> pageManagersInZoom = this.pageManagersPerZoomLevel.get(zoomLevel);
216
        if (pageManagersInZoom == null) {
217
            pageManagersInZoom = new ArrayList<PageManager>();
218
            for (int i = 0; i < tileCacheStructImage.getBandNumber(); i++) {
219
                pageManagersInZoom.add(new TileCacheBandPageManager(tileCacheStructImage, zoomLevel, i));
220
            }
221
            this.pageManagersPerZoomLevel.put(zoomLevel, pageManagersInZoom);
222
        }
223
        return pageManagersInZoom;
224
    }
225

    
226
    @Override
227
    public BandInfo getBandInfo(int band) {
228
        // FIXME
229
        return null;
230
    }
231

    
232
    @Override
233
    public DataServerExplorer getExplorer() throws ReadException, ValidateDataParametersException {
234
        return null;
235
    }
236

    
237
    public void open() throws OpenException {
238
        if (this.tileCacheStructImage != null) {
239
            return;
240
        }
241
    }
242

    
243
    @Override
244
    public Object getDynValue(String name) throws DynFieldNotFoundException {
245
        if (DataStore.METADATA_ENVELOPE.equalsIgnoreCase(name)) {
246
            return this.envelope;
247
        } else if (DataStore.METADATA_CRS.equalsIgnoreCase(name)) {
248
            IProjection pro = this.getTileCacheParameters().getCRS();
249
            if (pro != null) {
250
                return pro;
251
            }
252
        }
253
        return super.getDynValue(name);
254
    }
255

    
256
    @Override
257
    public void close() throws CloseException {
258
        this.tileCacheStructImage = null;
259
    }
260

    
261
    @Override
262
    public ResourceProvider getResource() {
263
        return this.resource;
264
    }
265

    
266
    @Override
267
    public Object getSourceId() {
268
        return this.getTileCacheParameters().getCacheFolder();
269
    }
270

    
271
    @Override
272
    public String getProviderName() {
273
        return NAME;
274
    }
275

    
276
    @Override
277
    public String getName() {
278
        return this.innerProvider.getSourceId()+"_TileCache";
279
    }
280

    
281
    @Override
282
    public String getFullName() {
283
        I18nManager i18nManager = ToolsLocator.getI18nManager();
284
        return this.innerProvider.getFullName()+"-"+i18nManager.getTranslation("_cached");
285
    }
286

    
287
    @Override
288
    public boolean closeResourceRequested(ResourceProvider resource) {
289
        return true;
290
    }
291

    
292
    @Override
293
    /*
294
     * (non-Javadoc)
295
     *
296
     * @see
297
     * org.gvsig.fmap.dal.resource.spi.ResourceConsumer#resourceChanged(org.
298
     * gvsig.fmap.dal.resource.spi.ResourceProvider)
299
     */
300
    public void resourceChanged(ResourceProvider resource) {
301
        this.getStoreServices().notifyChange(DataStoreNotification.RESOURCE_CHANGED, resource);
302
    }
303

    
304
    @Override
305
    /*
306
     * (non-Javadoc)
307
     *
308
     * @see
309
     * org.gvsig.fmap.dal.feature.spi.memory.AbstractMemoryStoreProvider#doDispose
310
     * ()
311
     */
312
    protected void doDispose() throws BaseException {
313
        super.doDispose();
314
        resource.removeConsumer(this);
315
        if(this.tileCacheStructImage!=null){
316
            DisposeUtils.dispose(tileCacheStructImage);
317
            this.tileCacheStructImage = null;
318
        }
319
    }
320

    
321
    /**
322
     * @return TileStructImage
323
     */
324
    public TileStructImage getTileStructImage() {
325
        return tileCacheStructImage;
326
    }
327

    
328
    @Override
329
    public void apply(RasterStoreProvider provider, IProjection crs, RasterQuery query) throws DataException {
330

    
331
        this.innerProvider = provider;
332
        pageManagersPerZoomLevel = new HashMap<Integer, List<PageManager>>();
333

    
334
        this.tileCacheStructImage =
335
            new TileCacheStructImage(((FileResource)resource).getFile(), crs, provider, query);
336
    }
337

    
338
    @Override
339
    public RasterStoreProvider getInnerProvider() {
340
        return innerProvider;
341
    }
342
}