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

History | View | Annotate | Download (17.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.task.SimpleTaskStatus;
75
import org.gvsig.tools.task.TaskStatusManager;
76

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

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

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

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

    
95
    private TileStructImage tileStructImage = null;
96

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

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

    
102
//    private RasterStore innerStore;
103

    
104
    private RasterStoreProvider innerProvider;
105
    private int bandsNumber;
106

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

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

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

    
137
    protected void init(TileCacheStoreProviderParameters params,
138
        DataStoreProviderServices storeServices) throws InitializeException {
139
//        store = (RasterStore) storeServices.getStore();
140
        bandsNumber = ((RasterStore)storeServices).getBands();
141

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

    
147
        this.projection=params.getCRS();
148

    
149
//      String rcacheDir = Launcher.getAppHomeDir() + File.separator + "gvsig_rcache";
150

    
151

    
152
//      Envelope storeEnvelope = store.getEnvelope();
153
//      store.getRasterSet().getPixelSizeX();
154

    
155
      File cacheFolder = (File) params.getDynValue(TileCacheStoreProviderParameters.TILECACHE_CACHEFOLDER_PARAMTER_NAME);
156

    
157
        resource = this.createResource(
158
            FileResource.NAME,
159
            new Object[] { cacheFolder.getAbsolutePath() }
160
        );
161

    
162
        resource.addConsumer(this);
163

    
164
    }
165

    
166
    private TileCacheStoreProviderParameters getTileCacheParameters() {
167
        return (TileCacheStoreProviderParameters) this.getParameters();
168
    }
169

    
170
    @Override
171
    public BandDescriptor getBandDescriptor(int band) {
172
        if (band > this.getBands()) {
173
            throw new IllegalArgumentException("Invalid band");
174
        }
175
        return getStoreServices().createBandDescriptor(band, new ArrayList<BandAttributeDescriptor>());
176
    }
177

    
178
    @Override
179
    public int getBands() {
180
        return bandsNumber;
181
    }
182

    
183
    @Override
184
    public Buffer createBuffer(RasterQuery rasterQuery) throws BufferException {
185
        BufferManager bufferManager = BufferLocator.getBufferManager();
186
        int[] bandDataTypes;
187
        List<PageManager> pageManagers = new ArrayList<PageManager>();
188
        NoData[] bandNoData;
189
        // if (rasterQuery != null) {
190
        List<BandQuery> bands;
191
        bands = rasterQuery.getBands();
192
        bandDataTypes = new int[bandsNumber];
193
        bandNoData = new NoData[bandsNumber];
194

    
195
        int zoomLevel = tileStructImage.getZoomLvlForPixelSize(rasterQuery.getPixelSize());
196
        List<PageManager> pageManagersInZoom;
197
        int[] tileStructDataTypes;
198
        try {
199
            pageManagersInZoom = getPageManagersInZoom(zoomLevel);
200
            tileStructDataTypes = tileStructImage.getDataTypes();
201
        } catch (ValidateDataParametersException | CreateEnvelopeException | DataException | CloneNotSupportedException e) {
202
            throw new BufferException(e);
203
        }
204
        try {
205
            for(int i = 0; i<tileStructImage.getBandNumber(); i++){
206
                bandDataTypes[i] = tileStructDataTypes[i];
207
                bandNoData[i] = null;
208
                pageManagers.add(pageManagersInZoom.get(i));
209
            }
210
        } catch (ValidateDataParametersException | CreateEnvelopeException | DataException | CloneNotSupportedException e) {
211
            throw new BufferException(e);
212
        }
213

    
214
//        for (BandQuery bandQuery : bands) {
215
//            // FIXME:
216
//            int band = bandQuery.getBand();
217
//            bandDataTypes[band] = tileStructDataTypes[band];
218
//            bandNoData[band] = null;
219
//            pageManagers.add(pageManagersInZoom.get(band));
220
//        }
221
        // } else {
222
        // int bands = getBands();
223
        // bandDataTypes = new int[bands];
224
        // bandNoData = new NoData[bands];
225
        // for (int i = 0; i < bands; i++) {
226
        // bandDataTypes[i] = tileStructImage.getDataTypes()[i];
227
        // bandNoData[i] = null;
228
        // pageManagers.add(new TileCacheBandPageManager(tileStructImage,
229
        // rasterQuery.getPixelSize(), i));
230
        // }
231
        // }
232
        envelope = tileStructImage.getEnvelope();
233
        Buffer buffer =
234
            bufferManager.createBuffer(tileStructImage.getRows(zoomLevel), tileStructImage.getColumns(zoomLevel),
235
                bandDataTypes, bandNoData, projection, envelope, pageManagers);
236

    
237
        return buffer;
238
    }
239

    
240
    private List<PageManager> getPageManagersInZoom(int zoomLevel) throws ValidateDataParametersException, CreateEnvelopeException, BufferException, DataException, CloneNotSupportedException {
241
        List<PageManager> pageManagersInZoom = this.pageManagersPerZoomLevel.get(zoomLevel);
242
        if (pageManagersInZoom == null) {
243
            pageManagersInZoom = new ArrayList<PageManager>();
244
            for (int i = 0; i < tileStructImage.getBandNumber(); i++) {
245
                pageManagersInZoom.add(new TileCacheBandPageManager(tileStructImage, zoomLevel, i));
246
            }
247
            this.pageManagersPerZoomLevel.put(zoomLevel, pageManagersInZoom);
248
        }
249
        return pageManagersInZoom;
250
    }
251

    
252
    @Override
253
    public BandInfo getBandInfo(int band) {
254
        // FIXME
255
        return null;// tileStructImage.getBandInfo(band);
256
    }
257

    
258
    @Override
259
    public DataServerExplorer getExplorer() throws ReadException, ValidateDataParametersException {
260
        // DataManager manager = DALLocator.getDataManager();
261
        // FilesystemServerExplorerParameters params;
262
        // try {
263
        // params = (FilesystemServerExplorerParameters) manager
264
        // .createServerExplorerParameters(FilesystemServerExplorer.NAME);
265
        // params.setRoot(this.getTileCacheParameters().getFile().getParent());
266
        // return
267
        // manager.openServerExplorer(FilesystemServerExplorer.NAME,params);
268
        // } catch (DataException e) {
269
        // throw new ReadException(this.getProviderName(), e);
270
        // } catch (ValidateDataParametersException e) {
271
        // throw new ReadException(this.getProviderName(), e);
272
        // }
273
        // FIXME
274
        return null;
275
    }
276

    
277
    public void open() throws OpenException {
278
        if (this.tileStructImage != null) {
279
            return;
280
        }
281
//        openEver();
282
    }
283

    
284
//    private void openEver() throws OpenException {
285
//        try {
286
//
287
//            getResource().execute(new ResourceAction() {
288
//
289
//                public Object run() throws Exception {
290
//
291
//                    try {
292
//                        File folder = (File) resource.get();
293
//                        resource.notifyOpen();
294
//
295
//                        // FIXME
296
//                        tileStructImage = new TileStructImage(folder, getTileCacheParameters().getCRS(), null);
297
//                        pageManagersPerZoomLevel = new HashMap<Integer, List<PageManager>>();
298
//
299
//                        // if (getTileCacheParameters().getWldParams()!=null){
300
//                        // envelope=createWLDEnvelope(getTileCacheParameters().getWldParams());
301
//                        // }else{
302
//                        // envelope =
303
//                        // GeometryLocator.getGeometryManager().createEnvelope(0,
304
//                        // 0,
305
//                        // tileStructImage.getColumns(),
306
//                        // tileStructImage.getRows(), Geometry.SUBTYPES.GEOM2D);
307
//                        // }
308
//
309
//                        resource.notifyClose();
310
//
311
//                        resource.setData(tileStructImage);
312
//                    } finally {
313
//                        // TODO
314
//                    }
315
//                    return null;
316
//                }
317
//
318
//            });
319
//        } catch (Exception e) {
320
//            this.tileStructImage = null;
321
//            try {
322
//                throw new OpenException(resource.getName(), e);
323
//            } catch (AccessResourceException e1) {
324
//                throw new OpenException(getProviderName(), e);
325
//            }
326
//        } finally {
327
//            this.taskStatus.remove();
328
//        }
329
//    }
330

    
331
    // private Envelope createWLDEnvelope(List<String> wldParams){
332
    // double pixelSizeX=Double.valueOf(wldParams.get(0));
333
    // double rotationAxisY = Double.valueOf(wldParams.get(1));
334
    // double rotationAxisX = Double.valueOf(wldParams.get(2));
335
    // double pixelSizeY = Double.valueOf(wldParams.get(3));
336
    // double upperLeftPixelCenterCoordX = Double.valueOf(wldParams.get(4));
337
    // double upperLeftPixelCenterCoordY = Double.valueOf(wldParams.get(5));
338
    //
339
    // if (0.0 != rotationAxisX || 0.0 != rotationAxisY) {
340
    // logger.warn(
341
    // "Rotation in wld file not implemented yet. It will be ignored");
342
    // }
343
    //
344
    // double leftMostX = upperLeftPixelCenterCoordX - (pixelSizeX * 0.5);
345
    // double upperMostY = upperLeftPixelCenterCoordY - (pixelSizeY * 0.5);
346
    // double height=tileStructImage.getRows()*pixelSizeY;
347
    // double width=tileStructImage.getColumns()*pixelSizeX;
348
    //
349
    // // double minX, double minY, double maxX, double maxY, int subType
350
    // try {
351
    // envelope = GeometryLocator.getGeometryManager().createEnvelope(
352
    // Math.min(leftMostX,leftMostX + width),
353
    // Math.min(upperMostY,upperMostY + height),
354
    // Math.max(leftMostX,leftMostX + width),
355
    // Math.max(upperMostY,upperMostY + height),
356
    // Geometry.SUBTYPES.GEOM2D);
357
    // } catch (LocatorException | CreateEnvelopeException e) {
358
    // logger.warn(
359
    // "Failed to create envelope from wld file with coords: minx:"+leftMostX+
360
    // ", miny:"+upperMostY+", maxX: "+leftMostX + width+", maxY: "+upperMostY +
361
    // height);
362
    // e.printStackTrace();
363
    // }
364
    //
365
    // return envelope;
366
    // }
367

    
368
    @Override
369
    public Object getDynValue(String name) throws DynFieldNotFoundException {
370
        if (DataStore.METADATA_ENVELOPE.equalsIgnoreCase(name)) {
371
            return this.envelope;
372
        } else if (DataStore.METADATA_CRS.equalsIgnoreCase(name)) {
373
            IProjection pro = this.getTileCacheParameters().getCRS();
374
            if (pro != null) {
375
                return pro;
376
            }
377
        }
378
        return super.getDynValue(name);
379
    }
380

    
381
    @Override
382
    public void close() throws CloseException {
383
        this.tileStructImage = null;
384
    }
385

    
386
    @Override
387
    public ResourceProvider getResource() {
388
        return this.resource;
389
    }
390

    
391
    @Override
392
    public Object getSourceId() {
393
        return this.getTileCacheParameters().getCacheFolder();
394
    }
395

    
396
    @Override
397
    public String getProviderName() {
398
        return NAME;
399
    }
400

    
401
    @Override
402
    public String getName() {
403
        String name = this.getTileCacheParameters().getCacheFolder().getName();
404
        return name; // FilenameUtils.getBaseName(name);
405

    
406
    }
407

    
408
    @Override
409
    public String getFullName() {
410
        return this.getTileCacheParameters().getCacheFolder().getAbsolutePath();
411
    }
412

    
413
    @Override
414
    public boolean closeResourceRequested(ResourceProvider resource) {
415
        return true;
416
    }
417

    
418
    @Override
419
    /*
420
     * (non-Javadoc)
421
     *
422
     * @see
423
     * org.gvsig.fmap.dal.resource.spi.ResourceConsumer#resourceChanged(org.
424
     * gvsig.fmap.dal.resource.spi.ResourceProvider)
425
     */
426
    public void resourceChanged(ResourceProvider resource) {
427
        this.getStoreServices().notifyChange(DataStoreNotification.RESOURCE_CHANGED, resource);
428
    }
429

    
430
    @Override
431
    /*
432
     * (non-Javadoc)
433
     *
434
     * @see
435
     * org.gvsig.fmap.dal.feature.spi.memory.AbstractMemoryStoreProvider#doDispose
436
     * ()
437
     */
438
    protected void doDispose() throws BaseException {
439
        super.doDispose();
440
        resource.removeConsumer(this);
441
        if(this.tileStructImage!=null){
442
            DisposeUtils.dispose(tileStructImage);
443
            this.tileStructImage = null;
444
        }
445
    }
446

    
447
    /**
448
     * @return TileStructImage
449
     */
450
    public TileStructImage getTileStructImage() {
451
        return tileStructImage;
452
    }
453

    
454
    @Override
455
    public void apply(RasterStoreProvider provider, IProjection crs, RasterQuery query) throws DataException {
456

    
457
        this.innerProvider = provider;
458
        pageManagersPerZoomLevel = new HashMap<Integer, List<PageManager>>();
459

    
460
        this.tileStructImage =
461
            new TileStructImage(((FileResource)resource).getFile(), crs, provider, query);
462
    }
463

    
464
    @Override
465
    public RasterStoreProvider getInnerProvider() {
466
        return innerProvider;
467
    }
468
}