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

History | View | Annotate | Download (12.5 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.dispose.impl.AbstractDisposable;
72
import org.gvsig.tools.dynobject.DynObject;
73
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
74
import org.gvsig.tools.exception.BaseException;
75
import org.gvsig.tools.i18n.I18nManager;
76
import org.gvsig.tools.task.SimpleTaskStatus;
77
import org.gvsig.tools.task.TaskStatusManager;
78

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

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

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

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

    
97
    private TileCacheStructImage fileTileCacheStructImage = null;
98

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

    
102
    Map<Integer,List<PageManager>> pageManagersPerZoomLevel = null;
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
        bandsNumber = ((RasterStore)storeServices).getBands();
140

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

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

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

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

    
155
        resource.addConsumer(this);
156

    
157
    }
158

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

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

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

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

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

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

    
212
        return buffer;
213
    }
214

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
335
        this.fileTileCacheStructImage =
336
            new FileTileCacheStructImage(((FileResource)resource).getFile(), crs, provider, query);
337
    }
338

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

    
344
    @Override
345
    public void forgetCache() {
346
        fileTileCacheStructImage.forgetCache();
347

    
348
    }
349
}