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

History | View | Annotate | Download (11.8 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.util.ArrayList;
26
import java.util.HashMap;
27
import java.util.List;
28
import java.util.Map;
29

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

    
34
import org.gvsig.fmap.dal.DataServerExplorer;
35
import org.gvsig.fmap.dal.DataStore;
36
import org.gvsig.fmap.dal.DataStoreNotification;
37
import org.gvsig.fmap.dal.FileHelper;
38
import org.gvsig.fmap.dal.exception.CloseException;
39
import org.gvsig.fmap.dal.exception.DataException;
40
import org.gvsig.fmap.dal.exception.InitializeException;
41
import org.gvsig.fmap.dal.exception.OpenException;
42
import org.gvsig.fmap.dal.exception.ReadException;
43
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
44
import org.gvsig.fmap.dal.raster.api.BandAttributeDescriptor;
45
import org.gvsig.fmap.dal.raster.api.BandDescriptor;
46
import org.gvsig.fmap.dal.raster.api.BandQuery;
47
import org.gvsig.fmap.dal.raster.api.RasterQuery;
48
import org.gvsig.fmap.dal.raster.api.RasterStore;
49
import org.gvsig.fmap.dal.raster.spi.AbstractRasterStoreProvider;
50
import org.gvsig.fmap.dal.raster.spi.RasterCacheStoreProvider;
51
import org.gvsig.fmap.dal.raster.spi.RasterStoreProvider;
52
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
53
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
54
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
55
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
56
import org.gvsig.fmap.geom.primitive.Envelope;
57
import org.gvsig.metadata.MetadataLocator;
58
import org.gvsig.metadata.MetadataManager;
59
import org.gvsig.metadata.exceptions.MetadataException;
60
import org.gvsig.raster.lib.buffer.api.BandInfo;
61
import org.gvsig.raster.lib.buffer.api.Buffer;
62
import org.gvsig.raster.lib.buffer.api.BufferLocator;
63
import org.gvsig.raster.lib.buffer.api.BufferManager;
64
import org.gvsig.raster.lib.buffer.api.NoData;
65
import org.gvsig.raster.lib.buffer.api.PageManager;
66
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException;
67
import org.gvsig.tools.ToolsLocator;
68
import org.gvsig.tools.dispose.DisposeUtils;
69
import org.gvsig.tools.dispose.impl.AbstractDisposable;
70
import org.gvsig.tools.dynobject.DynObject;
71
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
72
import org.gvsig.tools.exception.BaseException;
73
import org.gvsig.tools.i18n.I18nManager;
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 MemoryTileCacheStoreProvider extends AbstractRasterStoreProvider implements RasterCacheStoreProvider,
84
    ResourceConsumer {
85

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

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

    
92
    private final SimpleTaskStatus taskStatus;
93

    
94
    private TileStructImage tileStructImage = null;
95

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

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

    
101
    private RasterStoreProvider innerProvider;
102
    private int bandsNumber;
103

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

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

    
126
    protected MemoryTileCacheStoreProvider(MemoryTileCacheStoreProviderParameters params, DataStoreProviderServices storeServices,
127
        DynObject metadata) throws InitializeException {
128
        super(params, storeServices, metadata);
129
        TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
130
        this.taskStatus = manager.createDefaultSimpleTaskStatus("MemoryTileCache");
131
        this.init(params, storeServices);
132
    }
133

    
134
    protected void init(MemoryTileCacheStoreProviderParameters params,
135
        DataStoreProviderServices storeServices) throws InitializeException {
136
        bandsNumber = ((RasterStore)storeServices).getBands();
137

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

    
143
        this.projection=params.getCRS();
144

    
145
    }
146

    
147
    private MemoryTileCacheStoreProviderParameters getMemoryTileCacheParameters() {
148
        return (MemoryTileCacheStoreProviderParameters) this.getParameters();
149
    }
150

    
151
    @Override
152
    public BandDescriptor getBandDescriptor(int band) {
153
        if (band > this.getBands()) {
154
            throw new IllegalArgumentException("Invalid band");
155
        }
156
        return getStoreServices().createBandDescriptor(band, new ArrayList<BandAttributeDescriptor>());
157
    }
158

    
159
    @Override
160
    public int getBands() {
161
        return bandsNumber;
162
    }
163

    
164
    @Override
165
    public Buffer createBuffer(RasterQuery rasterQuery) throws BufferException {
166
        BufferManager bufferManager = BufferLocator.getBufferManager();
167
        int[] bandDataTypes;
168
        List<PageManager> pageManagers = new ArrayList<PageManager>();
169
        NoData[] bandNoData;
170
        //FIXME: Ver qu? deber?amos hacer aqu? con la rasterQuery
171
//        if (rasterQuery != null) {
172
//            List<BandQuery> bands;
173
//            bands = rasterQuery.getBands();
174
//        }
175
        bandDataTypes = new int[bandsNumber];
176
        bandNoData = new NoData[bandsNumber];
177

    
178
        int zoomLevel = tileStructImage.getZoomLvlForPixelSize(rasterQuery.getPixelSize());
179
        List<PageManager> pageManagersInZoom;
180
        int[] tileStructDataTypes;
181
        try {
182
            pageManagersInZoom = getPageManagersInZoom(zoomLevel);
183
            tileStructDataTypes = tileStructImage.getDataTypes();
184
        } catch (ValidateDataParametersException | CreateEnvelopeException | DataException | CloneNotSupportedException e) {
185
            throw new BufferException(e);
186
        }
187
        try {
188
            for(int i = 0; i<tileStructImage.getBandNumber(); i++){
189
                bandDataTypes[i] = tileStructDataTypes[i];
190
                bandNoData[i] = null;
191
                pageManagers.add(pageManagersInZoom.get(i));
192
            }
193
        } catch (ValidateDataParametersException | CreateEnvelopeException | DataException | CloneNotSupportedException e) {
194
            throw new BufferException(e);
195
        }
196

    
197
        envelope = tileStructImage.getEnvelope();
198
        Buffer buffer =
199
            bufferManager.createBuffer(tileStructImage.getRows(zoomLevel), tileStructImage.getColumns(zoomLevel),
200
                bandDataTypes, bandNoData, projection, envelope, pageManagers);
201

    
202
        return buffer;
203
    }
204

    
205
    private List<PageManager> getPageManagersInZoom(int zoomLevel) throws ValidateDataParametersException, CreateEnvelopeException, BufferException, DataException, CloneNotSupportedException {
206
        List<PageManager> pageManagersInZoom = this.pageManagersPerZoomLevel.get(zoomLevel);
207
        if (pageManagersInZoom == null) {
208
            pageManagersInZoom = new ArrayList<PageManager>();
209
            for (int i = 0; i < tileStructImage.getBandNumber(); i++) {
210
                pageManagersInZoom.add(new TileCacheBandPageManager(tileStructImage, zoomLevel, i));
211
            }
212
            this.pageManagersPerZoomLevel.put(zoomLevel, pageManagersInZoom);
213
        }
214
        return pageManagersInZoom;
215
    }
216

    
217
    @Override
218
    public BandInfo getBandInfo(int band) {
219
        return innerProvider.getBandInfo(band);
220
    }
221

    
222
    @Override
223
    public DataServerExplorer getExplorer() throws ReadException, ValidateDataParametersException {
224
        return null;
225
    }
226

    
227
    public void open() throws OpenException {
228
        if (this.tileStructImage != null) {
229
            return;
230
        }
231
    }
232

    
233
    @Override
234
    public Object getDynValue(String name) throws DynFieldNotFoundException {
235
        if (DataStore.METADATA_ENVELOPE.equalsIgnoreCase(name)) {
236
            return this.envelope;
237
        } else if (DataStore.METADATA_CRS.equalsIgnoreCase(name)) {
238
            IProjection pro = this.getMemoryTileCacheParameters().getCRS();
239
            if (pro != null) {
240
                return pro;
241
            }
242
        }
243
        return super.getDynValue(name);
244
    }
245

    
246
    @Override
247
    public void close() throws CloseException {
248
        this.tileStructImage = null;
249
    }
250

    
251
    @Override
252
    public ResourceProvider getResource() {
253
        return null;
254
    }
255

    
256
    @Override
257
    public Object getSourceId() {
258
        return this.innerProvider.getSourceId()+"_MemoryTileCache";
259
    }
260

    
261
    @Override
262
    public String getProviderName() {
263
        return NAME;
264
    }
265

    
266
    @Override
267
    public String getName() {
268
        return NAME;
269

    
270
    }
271

    
272
    @Override
273
    public String getFullName() {
274
        return this.innerProvider.getFullName();
275
    }
276

    
277
    @Override
278
    public boolean closeResourceRequested(ResourceProvider resource) {
279
        return true;
280
    }
281

    
282
    @Override
283
    /*
284
     * (non-Javadoc)
285
     *
286
     * @see
287
     * org.gvsig.fmap.dal.resource.spi.ResourceConsumer#resourceChanged(org.
288
     * gvsig.fmap.dal.resource.spi.ResourceProvider)
289
     */
290
    public void resourceChanged(ResourceProvider resource) {
291
        this.getStoreServices().notifyChange(DataStoreNotification.RESOURCE_CHANGED, resource);
292
    }
293

    
294
    @Override
295
    /*
296
     * (non-Javadoc)
297
     *
298
     * @see
299
     * org.gvsig.fmap.dal.feature.spi.memory.AbstractMemoryStoreProvider#doDispose
300
     * ()
301
     */
302
    protected void doDispose() throws BaseException {
303
        super.doDispose();
304
        if(this.tileStructImage!=null){
305
            DisposeUtils.dispose((AbstractDisposable)tileStructImage);
306
            this.tileStructImage = null;
307
        }
308
    }
309

    
310
    /**
311
     * @return TileStructImage
312
     */
313
    public TileStructImage getTileStructImage() {
314
        return tileStructImage;
315
    }
316

    
317
    @Override
318
    public void apply(RasterStoreProvider provider, IProjection crs, RasterQuery query) throws DataException {
319

    
320
        this.innerProvider = provider;
321
        pageManagersPerZoomLevel = new HashMap<Integer, List<PageManager>>();
322

    
323
        this.tileStructImage =
324
            new MemoryTileStructImage(provider, query);
325
    }
326

    
327
    @Override
328
    public RasterStoreProvider getInnerProvider() {
329
        return innerProvider;
330
    }
331
}