Statistics
| Revision:

svn-gvsig-desktop / branches / org.gvsig.desktop-2018a / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.tilecache / org.gvsig.fmap.dal.tilecache.raster / src / main / java / org / gvsig / raster / tilecache / provider / AbstractTileCacheStoreProvider.java @ 43876

History | View | Annotate | Download (8.71 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.Iterator;
28
import java.util.List;
29
import java.util.Map;
30
import java.util.Map.Entry;
31
import java.util.Set;
32

    
33
import org.cresques.cts.IProjection;
34

    
35
import org.gvsig.fmap.dal.DataServerExplorer;
36
import org.gvsig.fmap.dal.DataStore;
37
import org.gvsig.fmap.dal.DataStoreParameters;
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.RasterQuery;
45
import org.gvsig.fmap.dal.raster.spi.AbstractRasterStoreProvider;
46
import org.gvsig.fmap.dal.raster.spi.RasterCacheStoreProvider;
47
import org.gvsig.fmap.dal.raster.spi.RasterStoreProvider;
48
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
49
import org.gvsig.fmap.geom.primitive.Envelope;
50
import org.gvsig.raster.lib.buffer.api.BandPageManager;
51
import org.gvsig.raster.lib.buffer.api.Buffer;
52
import org.gvsig.raster.lib.buffer.api.BufferDimensions;
53
import org.gvsig.raster.lib.buffer.api.BufferLocator;
54
import org.gvsig.raster.lib.buffer.api.BufferManager;
55
import org.gvsig.raster.lib.buffer.api.NoData;
56
import org.gvsig.raster.lib.buffer.api.PageManager;
57
import org.gvsig.raster.lib.buffer.api.TileStruct;
58
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException;
59
import org.gvsig.tools.dispose.DisposeUtils;
60
import org.gvsig.tools.dispose.impl.AbstractDisposable;
61
import org.gvsig.tools.dynobject.DynObject;
62
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
63
import org.gvsig.tools.exception.BaseException;
64

    
65

    
66
/**
67
 * @author fdiaz
68
 *
69
 */
70
public abstract class AbstractTileCacheStoreProvider extends AbstractRasterStoreProvider implements
71
    RasterCacheStoreProvider {
72

    
73
    private TileCacheStructImage tileStructImage = null;
74

    
75
    protected Envelope envelope = null;
76

    
77
    protected Map<Integer, List<PageManager>> pageManagersPerZoomLevel = null;
78

    
79
    protected RasterStoreProvider innerProvider;
80
    protected int bandsNumber;
81

    
82
    /**
83
     * @param params
84
     * @param storeServices
85
     * @param metadata
86
     */
87
    public AbstractTileCacheStoreProvider(DataStoreParameters params, DataStoreProviderServices storeServices,
88
        DynObject metadata) {
89
        super(params, storeServices, metadata);
90
    }
91

    
92
    @Override
93
    public Buffer createBuffer(RasterQuery rasterQuery) throws BufferException {
94
        BufferManager bufferManager = BufferLocator.getBufferManager();
95
        int[] bandDataTypes;
96
        List<PageManager> pageManagers = new ArrayList<PageManager>();
97
        NoData[] bandNoData;
98
        // FIXME: Ver qu? deber?amos hacer aqu? con la rasterQuery
99
        // if (rasterQuery != null) {
100
        // List<BandQuery> bands;
101
        // bands = rasterQuery.getBands();
102
        // }
103

    
104
        bandDataTypes = new int[bandsNumber];
105
        bandNoData = new NoData[bandsNumber];
106

    
107
        double pixelSize = rasterQuery.getPixelSize();
108
        int zoomLevel = 0;
109
        if (pixelSize != 0.0) {
110
            zoomLevel = tileStructImage.getZoomLvlForPixelSize(pixelSize);
111
        }
112
        List<PageManager> pageManagersInZoom;
113
        pageManagersInZoom = getPageManagersInZoom(zoomLevel);
114
        for (int i = 0; i < tileStructImage.getBandNumber(); i++) {
115
            bandDataTypes[i] = this.getBandDescriptor(i).getDataType();
116
            bandNoData[i] = this.getNoData(rasterQuery, i);
117
            pageManagers.add(pageManagersInZoom.get(i));
118
        }
119

    
120
        envelope = tileStructImage.getEnvelope();
121
        Buffer buffer =
122
            bufferManager.createBuffer(tileStructImage.getRows(zoomLevel), tileStructImage.getColumns(zoomLevel),
123
                bandDataTypes, bandNoData, (IProjection) innerProvider.getDynValue(DataStore.METADATA_CRS), envelope,
124
                pageManagers);
125

    
126
        return buffer;
127
    }
128

    
129
    // @Override
130
    // public BandInfo getBandInfo(int band) {
131
    // return innerProvider.getBandInfo(band);
132
    // }
133

    
134
    @Override
135
    public int getBands() {
136
        return bandsNumber;
137
    }
138

    
139
    @Override
140
    public DataServerExplorer getExplorer() throws ReadException, ValidateDataParametersException {
141
        return null;
142
    }
143

    
144
    @Override
145
    public void open() throws OpenException {
146
        if (this.tileStructImage != null) {
147
            return;
148
        }
149
    }
150

    
151
    protected List<PageManager> getPageManagersInZoom(int zoomLevel) {
152
        List<PageManager> pageManagersInZoom = this.pageManagersPerZoomLevel.get(zoomLevel);
153
        if (pageManagersInZoom == null) {
154
            pageManagersInZoom = new ArrayList<PageManager>();
155
            for (int i = 0; i < tileStructImage.getBandNumber(); i++) {
156
                pageManagersInZoom.add(new TileCacheBandPageManager(tileStructImage, zoomLevel, i));
157
            }
158
            this.pageManagersPerZoomLevel.put(zoomLevel, pageManagersInZoom);
159
        }
160
        return pageManagersInZoom;
161
    }
162

    
163
    @Override
164
    public Object getDynValue(String name) throws DynFieldNotFoundException {
165
        if (DataStore.METADATA_ENVELOPE.equalsIgnoreCase(name)) {
166
            return this.envelope;
167
        }
168
        if (DataStore.METADATA_CRS.equalsIgnoreCase(name)) {
169
            return this.innerProvider.getDynValue(name);
170
        }
171
        return super.getDynValue(name);
172
    }
173

    
174
    @Override
175
    public TileStruct getTileStruct() {
176
        return innerProvider.getTileStruct();
177
    }
178

    
179
    protected void setTileStructImage(TileCacheStructImage tileStructImage) {
180
        this.tileStructImage = tileStructImage;
181
        for (int i = 0; i < this.tileStructImage.getBandNumber(); i++) {
182
            this.getBandDescriptor(i).setDataType(this.tileStructImage.getDataTypes()[i]);
183
        }
184
    }
185

    
186
    /**
187
     * @return TileStructImage
188
     */
189
    public TileStructImage getTileStructImage() {
190
        return tileStructImage;
191
    }
192

    
193
    @Override
194
    public void deleteAll() {
195
        tileStructImage.forgetCache();
196
    }
197

    
198
    @Override
199
    public void close() throws CloseException {
200
        this.tileStructImage = null;
201
    }
202

    
203
    @Override
204
    public String getName() {
205
        return this.innerProvider.getName();
206
    }
207

    
208
    @Override
209
    public String getFullName() {
210
        return this.innerProvider.getFullName();
211
    }
212

    
213
    @Override
214
    protected void doDispose() throws BaseException {
215
        super.doDispose();
216
        if (this.tileStructImage != null) {
217
            DisposeUtils.dispose((AbstractDisposable) tileStructImage);
218
            this.tileStructImage = null;
219
        }
220

    
221
        Set<Entry<Integer, List<PageManager>>> entrySet = pageManagersPerZoomLevel.entrySet();
222
        for (Iterator<Entry<Integer, List<PageManager>>> iterator = entrySet.iterator(); iterator.hasNext();) {
223
            Entry<Integer, List<PageManager>> entry = (Entry<Integer, List<PageManager>>) iterator.next();
224
            List<PageManager> pageManagers = entry.getValue();
225
            for (Iterator<PageManager> iterator2 = pageManagers.iterator(); iterator2.hasNext();) {
226
                PageManager pageManager = (PageManager) iterator2.next();
227
                DisposeUtils.dispose(pageManager);
228
                iterator2.remove();
229
            }
230
            iterator.remove();
231
        }
232
    }
233

    
234
    @Override
235
    public void apply(RasterStoreProvider provider, IProjection crs, RasterQuery query) throws DataException {
236
        this.innerProvider = provider;
237
        pageManagersPerZoomLevel = new HashMap<Integer, List<PageManager>>();
238
    }
239

    
240
    @Override
241
    public RasterStoreProvider getInnerProvider() {
242
        return innerProvider;
243
    }
244

    
245
    @Override
246
    public BufferDimensions getDimensions() throws InitializeException {
247
        return innerProvider.getDimensions();
248
    }
249

    
250
    @Override
251
    public boolean isTiled() {
252
        return true;
253
    }
254
}