gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.raster / org.gvsig.fmap.dal.raster / org.gvsig.fmap.dal.raster.impl / src / main / java / org / gvsig / fmap / dal / raster / impl / DefaultRasterStore.java @ 8691
History | View | Annotate | Download (34 KB)
1 | 5907 | dmartinezizquierdo | /* 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.fmap.dal.raster.impl; |
||
24 | |||
25 | 6557 | fdiaz | import java.util.ArrayList; |
26 | 5907 | dmartinezizquierdo | import java.util.Collection; |
27 | 6557 | fdiaz | import java.util.HashMap; |
28 | 5907 | dmartinezizquierdo | import java.util.Iterator; |
29 | 6302 | llmarques | import java.util.List; |
30 | 6557 | fdiaz | import java.util.Map; |
31 | import java.util.Map.Entry; |
||
32 | 5907 | dmartinezizquierdo | import java.util.Set; |
33 | |||
34 | 6488 | fdiaz | import org.cresques.cts.IProjection; |
35 | import org.slf4j.Logger; |
||
36 | import org.slf4j.LoggerFactory; |
||
37 | |||
38 | 5907 | dmartinezizquierdo | import org.gvsig.fmap.dal.DALLocator; |
39 | import org.gvsig.fmap.dal.DataManager; |
||
40 | 6488 | fdiaz | import org.gvsig.fmap.dal.DataParameters; |
41 | 5907 | dmartinezizquierdo | import org.gvsig.fmap.dal.DataQuery; |
42 | import org.gvsig.fmap.dal.DataServerExplorer; |
||
43 | import org.gvsig.fmap.dal.DataSet; |
||
44 | import org.gvsig.fmap.dal.DataStore; |
||
45 | import org.gvsig.fmap.dal.DataStoreNotification; |
||
46 | import org.gvsig.fmap.dal.DataStoreParameters; |
||
47 | 6668 | fdiaz | import org.gvsig.fmap.dal.DataStoreProviderFactory; |
48 | 5907 | dmartinezizquierdo | import org.gvsig.fmap.dal.exception.CloneException; |
49 | import org.gvsig.fmap.dal.exception.DataException; |
||
50 | import org.gvsig.fmap.dal.exception.InitializeException; |
||
51 | 6488 | fdiaz | import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException; |
52 | 5907 | dmartinezizquierdo | import org.gvsig.fmap.dal.exception.ValidateDataParametersException; |
53 | import org.gvsig.fmap.dal.feature.exception.PersistenceStoreAlreadyLoadedException; |
||
54 | import org.gvsig.fmap.dal.impl.DefaultDataManager; |
||
55 | 6488 | fdiaz | import org.gvsig.fmap.dal.raster.RasterStoreProviderFactory; |
56 | 6302 | llmarques | import org.gvsig.fmap.dal.raster.api.BandAttributeDescriptor; |
57 | import org.gvsig.fmap.dal.raster.api.BandDescriptor; |
||
58 | import org.gvsig.fmap.dal.raster.api.BandQuery; |
||
59 | 6488 | fdiaz | import org.gvsig.fmap.dal.raster.api.RasterCache; |
60 | 5907 | dmartinezizquierdo | import org.gvsig.fmap.dal.raster.api.RasterQuery; |
61 | import org.gvsig.fmap.dal.raster.api.RasterSet; |
||
62 | import org.gvsig.fmap.dal.raster.api.RasterStore; |
||
63 | import org.gvsig.fmap.dal.raster.api.RasterStoreNotification; |
||
64 | 6557 | fdiaz | import org.gvsig.fmap.dal.raster.api.exceptions.RasterQueryCloneException; |
65 | 6558 | fdiaz | import org.gvsig.fmap.dal.raster.impl.exceptions.AddingBandsException; |
66 | 6488 | fdiaz | import org.gvsig.fmap.dal.raster.spi.RasterCacheStoreProvider; |
67 | 5907 | dmartinezizquierdo | import org.gvsig.fmap.dal.raster.spi.RasterStoreProvider; |
68 | import org.gvsig.fmap.dal.raster.spi.RasterStoreProviderServices; |
||
69 | 6298 | dmartinezizquierdo | import org.gvsig.fmap.dal.resource.Resource; |
70 | 5907 | dmartinezizquierdo | import org.gvsig.fmap.dal.resource.spi.ResourceProvider; |
71 | 6488 | fdiaz | import org.gvsig.fmap.dal.spi.DALSPILocator; |
72 | import org.gvsig.fmap.dal.spi.DataManagerProviderServices; |
||
73 | 6527 | fdiaz | import org.gvsig.fmap.dal.spi.DataStoreInitializer2; |
74 | 6547 | fdiaz | import org.gvsig.fmap.geom.exception.CreateEnvelopeException; |
75 | 5907 | dmartinezizquierdo | import org.gvsig.fmap.geom.primitive.Envelope; |
76 | import org.gvsig.metadata.MetadataLocator; |
||
77 | import org.gvsig.metadata.MetadataManager; |
||
78 | import org.gvsig.metadata.exceptions.MetadataException; |
||
79 | 6557 | fdiaz | import org.gvsig.raster.lib.buffer.api.Band; |
80 | import org.gvsig.raster.lib.buffer.api.Buffer; |
||
81 | 6677 | fdiaz | import org.gvsig.raster.lib.buffer.api.BufferDimensions; |
82 | 6557 | fdiaz | import org.gvsig.raster.lib.buffer.api.exceptions.BufferException; |
83 | 5907 | dmartinezizquierdo | import org.gvsig.timesupport.Interval; |
84 | import org.gvsig.tools.ToolsLocator; |
||
85 | 6500 | fdiaz | import org.gvsig.tools.dispose.DisposeUtils; |
86 | 5907 | dmartinezizquierdo | import org.gvsig.tools.dispose.impl.AbstractDisposable; |
87 | import org.gvsig.tools.dynobject.DelegatedDynObject; |
||
88 | import org.gvsig.tools.dynobject.DynClass; |
||
89 | import org.gvsig.tools.dynobject.DynObject; |
||
90 | import org.gvsig.tools.dynobject.DynObjectManager; |
||
91 | 8425 | fdiaz | import org.gvsig.tools.dynobject.DynObject_v2; |
92 | 5907 | dmartinezizquierdo | import org.gvsig.tools.dynobject.DynStruct; |
93 | import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException; |
||
94 | import org.gvsig.tools.dynobject.exception.DynMethodException; |
||
95 | import org.gvsig.tools.exception.BaseException; |
||
96 | 6547 | fdiaz | import org.gvsig.tools.locator.LocatorException; |
97 | 5907 | dmartinezizquierdo | import org.gvsig.tools.observer.Observable; |
98 | import org.gvsig.tools.observer.Observer; |
||
99 | import org.gvsig.tools.observer.impl.DelegateWeakReferencingObservable; |
||
100 | import org.gvsig.tools.persistence.PersistenceManager; |
||
101 | import org.gvsig.tools.persistence.PersistentState; |
||
102 | import org.gvsig.tools.persistence.exception.PersistenceException; |
||
103 | import org.gvsig.tools.visitor.Visitor; |
||
104 | 6334 | fdiaz | |
105 | 5907 | dmartinezizquierdo | /**
|
106 | * Implements RasterStore
|
||
107 | 6527 | fdiaz | *
|
108 | 5907 | dmartinezizquierdo | * @author dmartinezizquierdo
|
109 | *
|
||
110 | */
|
||
111 | 6527 | fdiaz | public class DefaultRasterStore extends AbstractDisposable implements DataStoreInitializer2, |
112 | RasterStoreProviderServices, RasterStore, Observer {
|
||
113 | 5907 | dmartinezizquierdo | |
114 | 6527 | fdiaz | private static final Logger LOG = LoggerFactory.getLogger(DefaultRasterStore.class); |
115 | 5907 | dmartinezizquierdo | |
116 | private static final String PERSISTENCE_DEFINITION_NAME = "RasterStore"; |
||
117 | 6527 | fdiaz | private static final String METADATA_DEFINITION_NAME = "RasterStore"; |
118 | 5907 | dmartinezizquierdo | |
119 | private DataStoreParameters parameters = null; |
||
120 | private RasterStoreProvider provider = null; |
||
121 | private DelegatedDynObject metadata;
|
||
122 | private DefaultDataManager dataManager = null; |
||
123 | 6557 | fdiaz | private List<BandsFromStore> additionalBands = null; |
124 | 5907 | dmartinezizquierdo | |
125 | 6527 | fdiaz | private DelegateWeakReferencingObservable delegateObservable = new DelegateWeakReferencingObservable(this); |
126 | 5907 | dmartinezizquierdo | |
127 | /**
|
||
128 | * Registers persistence
|
||
129 | */
|
||
130 | public static void registerPersistenceDefinition() { |
||
131 | PersistenceManager manager = ToolsLocator.getPersistenceManager(); |
||
132 | if (manager.getDefinition(PERSISTENCE_DEFINITION_NAME) == null) { |
||
133 | DynStruct definition = |
||
134 | 6527 | fdiaz | manager.addDefinition(DefaultRasterStore.class, PERSISTENCE_DEFINITION_NAME, |
135 | PERSISTENCE_DEFINITION_NAME + " Persistent definition", null, null); |
||
136 | definition.addDynFieldString("dataStoreName").setMandatory(true).setPersistent(true); |
||
137 | 5907 | dmartinezizquierdo | |
138 | 6527 | fdiaz | definition.addDynFieldObject("parameters").setClassOfValue(DynObject.class).setMandatory(true) |
139 | 5907 | dmartinezizquierdo | .setPersistent(true);
|
140 | } |
||
141 | } |
||
142 | |||
143 | /**
|
||
144 | * Registers metadata
|
||
145 | 6527 | fdiaz | *
|
146 | 5907 | dmartinezizquierdo | * @throws MetadataException
|
147 | */
|
||
148 | public static void registerMetadataDefinition() throws MetadataException { |
||
149 | MetadataManager manager = MetadataLocator.getMetadataManager(); |
||
150 | if (manager.getDefinition(METADATA_DEFINITION_NAME) == null) { |
||
151 | 6527 | fdiaz | DynStruct metadataDefinition = manager.addDefinition(METADATA_DEFINITION_NAME, null);
|
152 | metadataDefinition.extend(manager.getDefinition(DataStore.METADATA_DEFINITION_NAME)); |
||
153 | 5907 | dmartinezizquierdo | } |
154 | } |
||
155 | |||
156 | /**
|
||
157 | * @return dataManager
|
||
158 | */
|
||
159 | public DataManager getManager() {
|
||
160 | return this.dataManager; |
||
161 | } |
||
162 | |||
163 | @Override
|
||
164 | public String getName() { |
||
165 | return this.provider.getName(); |
||
166 | } |
||
167 | |||
168 | @Override
|
||
169 | public String getFullName() { |
||
170 | 6302 | llmarques | return this.provider.getFullName(); |
171 | 5907 | dmartinezizquierdo | } |
172 | |||
173 | @Override
|
||
174 | public DataStoreParameters getParameters() {
|
||
175 | return parameters;
|
||
176 | } |
||
177 | |||
178 | @Override
|
||
179 | public String getProviderName() { |
||
180 | return this.provider.getProviderName(); |
||
181 | } |
||
182 | |||
183 | @Override
|
||
184 | public void refresh() throws DataException { |
||
185 | this.notifyChange(RasterStoreNotification.BEFORE_REFRESH);
|
||
186 | this.provider.refresh();
|
||
187 | this.notifyChange(RasterStoreNotification.AFTER_REFRESH);
|
||
188 | } |
||
189 | |||
190 | @Override
|
||
191 | public DataSet getDataSet() throws DataException { |
||
192 | return this.getRasterSet(); |
||
193 | } |
||
194 | |||
195 | @Override
|
||
196 | public DataSet getDataSet(DataQuery dataQuery) throws DataException { |
||
197 | return this.getRasterSet((RasterQuery) dataQuery); |
||
198 | } |
||
199 | |||
200 | @Override
|
||
201 | public void getDataSet(Observer observer) throws DataException { |
||
202 | 6527 | fdiaz | this.getRasterSet(null, observer); |
203 | 5907 | dmartinezizquierdo | } |
204 | |||
205 | @Override
|
||
206 | 6527 | fdiaz | public void getDataSet(DataQuery dataQuery, Observer observer) throws DataException { |
207 | this.getRasterSet((RasterQuery) dataQuery, observer);
|
||
208 | 5907 | dmartinezizquierdo | } |
209 | |||
210 | @Override
|
||
211 | public RasterSet getRasterSet(RasterQuery rasterQuery) throws DataException { |
||
212 | 6557 | fdiaz | |
213 | try {
|
||
214 | if (rasterQuery != null) { |
||
215 | List<BandQuery> queryBands = rasterQuery.getBands();
|
||
216 | if (!queryBands.isEmpty()) {
|
||
217 | RasterQuery mainRasterQuery = (RasterQuery) rasterQuery.clone(); |
||
218 | mainRasterQuery.clearBands(); |
||
219 | Map<RasterStore, RasterQuery> rasterQueries = new HashMap<RasterStore, RasterQuery>(); |
||
220 | |||
221 | for (BandQuery bandQuery : queryBands) {
|
||
222 | int band = bandQuery.getBand();
|
||
223 | if(band<getProvider().getBands()){
|
||
224 | mainRasterQuery.addBand(bandQuery); |
||
225 | } else {
|
||
226 | int bandCounter = getProvider().getBands();
|
||
227 | boolean bandFound = false; |
||
228 | if(additionalBands!=null){ |
||
229 | for (BandsFromStore bandsFromStore : additionalBands) {
|
||
230 | RasterStore store = bandsFromStore.getStore(); |
||
231 | |||
232 | if (band < bandCounter + bandsFromStore.size()) {
|
||
233 | BandQuery storeBandQuery = |
||
234 | store.createBandQuery(bandsFromStore.get(band - bandCounter)); |
||
235 | if (rasterQueries.containsKey(store)) {
|
||
236 | rasterQueries.get(store).addBand(storeBandQuery); |
||
237 | } else {
|
||
238 | RasterQuery storeRasterQuery = (RasterQuery) rasterQuery.clone(); |
||
239 | storeRasterQuery.clearBands(); |
||
240 | storeRasterQuery.addBand(storeBandQuery); |
||
241 | rasterQueries.put(store, storeRasterQuery); |
||
242 | bandFound = true;
|
||
243 | } |
||
244 | } |
||
245 | bandCounter += bandsFromStore.size(); |
||
246 | if (bandFound) {
|
||
247 | break;
|
||
248 | } |
||
249 | } |
||
250 | } |
||
251 | } |
||
252 | } |
||
253 | |||
254 | RasterSet mainRasterSet = new DefaultRasterSet(this, mainRasterQuery); |
||
255 | for (Entry<RasterStore, RasterQuery> entry : rasterQueries.entrySet()) {
|
||
256 | RasterStore store = entry.getKey(); |
||
257 | RasterQuery query = entry.getValue(); |
||
258 | RasterSet subRasterSet = store.getRasterSet(query); |
||
259 | for (Band band : subRasterSet) {
|
||
260 | mainRasterSet.addBand(band); |
||
261 | } |
||
262 | } |
||
263 | return mainRasterSet;
|
||
264 | } |
||
265 | } |
||
266 | RasterSet mainRasterSet = new DefaultRasterSet(this, rasterQuery); |
||
267 | if (additionalBands != null) { |
||
268 | for (BandsFromStore bandsFromStore : additionalBands) {
|
||
269 | RasterStore store = bandsFromStore.getStore(); |
||
270 | RasterQuery subRasterQuery = store.createRasterQuery(); |
||
271 | subRasterQuery.setClip(rasterQuery.getClip()); |
||
272 | subRasterQuery.setPixelSize(mainRasterSet.getPixelSizeX()); //rasterQuery.getPixelSize()); //
|
||
273 | subRasterQuery.setScale(rasterQuery.getScale()); |
||
274 | for (int i = 0; i < bandsFromStore.size(); i++) { |
||
275 | BandQuery bandQuery = store.createBandQuery(bandsFromStore.get(i)); |
||
276 | subRasterQuery.addBand(bandQuery); |
||
277 | } |
||
278 | DefaultRasterSet subRasterSet = new DefaultRasterSet(store, subRasterQuery);
|
||
279 | if(subRasterSet.getColumns()!=mainRasterSet.getColumns() || subRasterSet.getRows()!=mainRasterSet.getRows()){
|
||
280 | Buffer subBuffer = subRasterSet.createInterpolated(mainRasterSet.getRows(), mainRasterSet.getColumns(), Buffer.INTERPOLATION_NearestNeighbour, null); |
||
281 | for (Band band : subBuffer) {
|
||
282 | mainRasterSet.addBand(band); |
||
283 | } |
||
284 | } else {
|
||
285 | for (Band band : subRasterSet) {
|
||
286 | mainRasterSet.addBand(band); |
||
287 | } |
||
288 | } |
||
289 | } |
||
290 | } |
||
291 | return mainRasterSet;
|
||
292 | } catch (CloneNotSupportedException | LocatorException | BufferException e) { |
||
293 | throw new RasterQueryCloneException(e); |
||
294 | } |
||
295 | 5907 | dmartinezizquierdo | } |
296 | |||
297 | @Override
|
||
298 | public RasterSet getRasterSet() throws DataException { |
||
299 | 6651 | fdiaz | return getRasterSet(createRasterQuery());
|
300 | 5907 | dmartinezizquierdo | } |
301 | |||
302 | /**
|
||
303 | * Adds an observer to the DataSet
|
||
304 | 6527 | fdiaz | *
|
305 | 5907 | dmartinezizquierdo | * @param observer
|
306 | * @throws DataException
|
||
307 | */
|
||
308 | public void getRasterSet(Observer observer) throws DataException { |
||
309 | 6527 | fdiaz | RasterSet set = this.getRasterSet();
|
310 | 5907 | dmartinezizquierdo | set.addObserver(observer); |
311 | } |
||
312 | |||
313 | /**
|
||
314 | * Adds an observer to the queried DataSet
|
||
315 | 6527 | fdiaz | *
|
316 | 5907 | dmartinezizquierdo | * @param rasterQuery
|
317 | * @param observer
|
||
318 | * @throws DataException
|
||
319 | */
|
||
320 | 6527 | fdiaz | public void getRasterSet(RasterQuery rasterQuery, Observer observer) throws DataException { |
321 | RasterSet set = this.getRasterSet(rasterQuery);
|
||
322 | 5907 | dmartinezizquierdo | set.addObserver(observer); |
323 | } |
||
324 | |||
325 | @Override
|
||
326 | public void accept(Visitor visitor) throws BaseException { |
||
327 | RasterSet set = getRasterSet(); |
||
328 | try {
|
||
329 | set.accept(visitor); |
||
330 | } finally {
|
||
331 | set.dispose(); |
||
332 | } |
||
333 | } |
||
334 | |||
335 | @Override
|
||
336 | 6527 | fdiaz | public void accept(Visitor visitor, DataQuery dataQuery) throws BaseException { |
337 | RasterSet set = getRasterSet((RasterQuery) dataQuery); |
||
338 | 5907 | dmartinezizquierdo | try {
|
339 | set.accept(visitor); |
||
340 | } finally {
|
||
341 | set.dispose(); |
||
342 | } |
||
343 | |||
344 | } |
||
345 | |||
346 | @Override
|
||
347 | public DataSet getSelection() throws DataException { |
||
348 | // TODO Auto-generated method stub
|
||
349 | return null; |
||
350 | } |
||
351 | |||
352 | @Override
|
||
353 | public void setSelection(DataSet selection) throws DataException { |
||
354 | // TODO Auto-generated method stub
|
||
355 | |||
356 | } |
||
357 | |||
358 | @Override
|
||
359 | public DataSet createSelection() throws DataException { |
||
360 | // TODO Auto-generated method stub
|
||
361 | return null; |
||
362 | } |
||
363 | |||
364 | @Override
|
||
365 | public Iterator<?> getChildren() { |
||
366 | return this.provider.getChilds(); |
||
367 | } |
||
368 | |||
369 | @Override
|
||
370 | 6527 | fdiaz | public DataServerExplorer getExplorer() throws DataException, ValidateDataParametersException { |
371 | 5907 | dmartinezizquierdo | return this.provider.getExplorer(); |
372 | } |
||
373 | |||
374 | @Override
|
||
375 | public DataQuery createQuery() {
|
||
376 | return createRasterQuery();
|
||
377 | } |
||
378 | |||
379 | @Override
|
||
380 | public Interval getInterval() {
|
||
381 | return this.provider.getInterval(); |
||
382 | } |
||
383 | |||
384 | @Override
|
||
385 | public Collection<?> getTimes() { |
||
386 | return this.provider.getTimes(); |
||
387 | } |
||
388 | |||
389 | @Override
|
||
390 | public Collection<?> getTimes(Interval interval) { |
||
391 | return this.provider.getTimes(interval); |
||
392 | } |
||
393 | |||
394 | @Override
|
||
395 | public void disableNotifications() { |
||
396 | this.delegateObservable.disableNotifications();
|
||
397 | } |
||
398 | |||
399 | @Override
|
||
400 | public void enableNotifications() { |
||
401 | this.delegateObservable.enableNotifications();
|
||
402 | |||
403 | } |
||
404 | |||
405 | @Override
|
||
406 | public void beginComplexNotification() { |
||
407 | this.delegateObservable.beginComplexNotification();
|
||
408 | |||
409 | } |
||
410 | |||
411 | @Override
|
||
412 | public void endComplexNotification() { |
||
413 | this.delegateObservable.endComplexNotification();
|
||
414 | } |
||
415 | |||
416 | @Override
|
||
417 | public void addObserver(Observer observer) { |
||
418 | if (delegateObservable != null) { |
||
419 | this.delegateObservable.addObserver(observer);
|
||
420 | } |
||
421 | } |
||
422 | |||
423 | @Override
|
||
424 | public void deleteObserver(Observer observer) { |
||
425 | if (delegateObservable != null) { |
||
426 | this.delegateObservable.deleteObserver(observer);
|
||
427 | } |
||
428 | |||
429 | } |
||
430 | |||
431 | @Override
|
||
432 | public void deleteObservers() { |
||
433 | this.delegateObservable.deleteObservers();
|
||
434 | } |
||
435 | |||
436 | @Override
|
||
437 | public void saveToState(PersistentState state) throws PersistenceException { |
||
438 | |||
439 | state.set("dataStoreName", this.getName()); |
||
440 | state.set("parameters", this.parameters); |
||
441 | } |
||
442 | |||
443 | @Override
|
||
444 | 6527 | fdiaz | public void loadFromState(PersistentState state) throws PersistenceException { |
445 | 5907 | dmartinezizquierdo | if (this.provider != null) { |
446 | throw new PersistenceStoreAlreadyLoadedException(this.getName()); |
||
447 | } |
||
448 | if (this.getManager() == null) { |
||
449 | this.dataManager = (DefaultDataManager) DALLocator.getDataManager();
|
||
450 | } |
||
451 | |||
452 | 6527 | fdiaz | DataStoreParameters params = (DataStoreParameters) state.get("parameters");
|
453 | 5907 | dmartinezizquierdo | |
454 | try {
|
||
455 | |||
456 | 6527 | fdiaz | this.intialize(this.dataManager, params); |
457 | this.setProvider(this.provider); |
||
458 | 5907 | dmartinezizquierdo | |
459 | } catch (InitializeException e) {
|
||
460 | throw new PersistenceException(e); |
||
461 | } catch (DataException e) {
|
||
462 | throw new PersistenceException(e); |
||
463 | } |
||
464 | |||
465 | } |
||
466 | |||
467 | //
|
||
468 | // ====================================================================
|
||
469 | // Metadata related methods
|
||
470 | //
|
||
471 | |||
472 | @Override
|
||
473 | public Set<?> getMetadataChildren() throws MetadataException { |
||
474 | // TODO Auto-generated method stub
|
||
475 | return null; |
||
476 | } |
||
477 | |||
478 | @Override
|
||
479 | public Object getMetadataID() throws MetadataException { |
||
480 | return this.provider.getSourceId(); |
||
481 | } |
||
482 | |||
483 | @Override
|
||
484 | public String getMetadataName() throws MetadataException { |
||
485 | return this.provider.getProviderName(); |
||
486 | } |
||
487 | |||
488 | @Override
|
||
489 | public DynClass getDynClass() {
|
||
490 | return this.metadata.getDynClass(); |
||
491 | } |
||
492 | |||
493 | @Override
|
||
494 | public void implement(DynClass dynClass) { |
||
495 | this.metadata.implement(dynClass);
|
||
496 | } |
||
497 | |||
498 | @Override
|
||
499 | public void delegate(DynObject dynObject) { |
||
500 | this.metadata.delegate(dynObject);
|
||
501 | } |
||
502 | |||
503 | @Override
|
||
504 | public Object getDynValue(String name) throws DynFieldNotFoundException { |
||
505 | if (this.metadata.hasDynValue(name)) { |
||
506 | return this.metadata.getDynValue(name); |
||
507 | } |
||
508 | if (METADATA_PROVIDER.equalsIgnoreCase(name)) {
|
||
509 | return this.provider.getProviderName(); |
||
510 | } else if (METADATA_CONTAINERNAME.equalsIgnoreCase(name)) { |
||
511 | return this.provider.getSourceId(); |
||
512 | } |
||
513 | return this.metadata.getDynValue(name); |
||
514 | } |
||
515 | |||
516 | @Override
|
||
517 | 6527 | fdiaz | public void setDynValue(String name, Object value) throws DynFieldNotFoundException { |
518 | 5907 | dmartinezizquierdo | |
519 | this.metadata.setDynValue(name, value);
|
||
520 | |||
521 | } |
||
522 | |||
523 | @Override
|
||
524 | public boolean hasDynValue(String name) { |
||
525 | return this.metadata.hasDynValue(name); |
||
526 | } |
||
527 | |||
528 | @Override
|
||
529 | 6527 | fdiaz | public Object invokeDynMethod(String name, Object[] args) throws DynMethodException { |
530 | 5907 | dmartinezizquierdo | return this.metadata.invokeDynMethod(this, name, args); |
531 | } |
||
532 | |||
533 | @Override
|
||
534 | 6527 | fdiaz | public Object invokeDynMethod(int code, Object[] args) throws DynMethodException { |
535 | 5907 | dmartinezizquierdo | return this.metadata.invokeDynMethod(this, code, args); |
536 | } |
||
537 | |||
538 | @Override
|
||
539 | public void clear() { |
||
540 | if (metadata != null) { |
||
541 | metadata.clear(); |
||
542 | } |
||
543 | } |
||
544 | |||
545 | @Override
|
||
546 | public RasterQuery createRasterQuery() {
|
||
547 | return new DefaultRasterQuery(); |
||
548 | } |
||
549 | |||
550 | @Override
|
||
551 | public DataStore getStore() {
|
||
552 | return this; |
||
553 | } |
||
554 | |||
555 | @Override
|
||
556 | public void update(Observable observable, Object notification) { |
||
557 | if (observable instanceof DataSet) { |
||
558 | this.notifyChange(RasterStoreNotification.DATASET_CHANGED);
|
||
559 | |||
560 | 6527 | fdiaz | } else {
|
561 | 5907 | dmartinezizquierdo | if (observable instanceof RasterStoreProvider) { |
562 | if (observable == this.provider) { |
||
563 | this.notifyChange(RasterStoreNotification.STORE_PROVIDER_CHANGED);
|
||
564 | } |
||
565 | } |
||
566 | } |
||
567 | } |
||
568 | |||
569 | @Override
|
||
570 | protected void doDispose() throws BaseException { |
||
571 | |||
572 | this.notifyChange(DataStoreNotification.BEFORE_DISPOSE);
|
||
573 | this.provider.dispose();
|
||
574 | this.parameters = null; |
||
575 | 6557 | fdiaz | if(additionalBands!=null){ |
576 | for (Iterator iterator = additionalBands.iterator(); iterator.hasNext();) { |
||
577 | BandsFromStore bandsFromStore = (BandsFromStore) iterator.next(); |
||
578 | bandsFromStore.getStore().dispose(); |
||
579 | } |
||
580 | this.additionalBands = null; |
||
581 | } |
||
582 | |||
583 | 5907 | dmartinezizquierdo | this.notifyChange(DataStoreNotification.AFTER_DISPOSE);
|
584 | if (delegateObservable != null) { |
||
585 | this.delegateObservable.deleteObservers();
|
||
586 | this.delegateObservable = null; |
||
587 | } |
||
588 | } |
||
589 | |||
590 | @Override
|
||
591 | 6527 | fdiaz | public Object clone() throws CloneNotSupportedException { |
592 | 5907 | dmartinezizquierdo | DataStoreParameters dsp = getParameters(); |
593 | |||
594 | DefaultRasterStore cloned_store = null;
|
||
595 | |||
596 | try {
|
||
597 | 6527 | fdiaz | cloned_store = (DefaultRasterStore) DALLocator.getDataManager().openStore(this.getProviderName(), dsp);
|
598 | 6557 | fdiaz | cloned_store.additionalBands = new ArrayList<DefaultRasterStore.BandsFromStore>(additionalBands); |
599 | 5907 | dmartinezizquierdo | } catch (Exception e) { |
600 | throw new CloneException(e); |
||
601 | } |
||
602 | return cloned_store;
|
||
603 | |||
604 | } |
||
605 | |||
606 | /**
|
||
607 | * Notifies change
|
||
608 | 6527 | fdiaz | *
|
609 | 5907 | dmartinezizquierdo | * @param notification
|
610 | */
|
||
611 | public void notifyChange(String notification) { |
||
612 | if (delegateObservable != null) { |
||
613 | notifyChange(new DefaultRasterStoreNotification(this, notification)); |
||
614 | } |
||
615 | |||
616 | } |
||
617 | |||
618 | @Override
|
||
619 | public void notifyChange(String notification, ResourceProvider data) { |
||
620 | 6527 | fdiaz | notifyChange(new DefaultRasterStoreNotification(this, DataStoreNotification.RESOURCE_CHANGED)); |
621 | 5907 | dmartinezizquierdo | } |
622 | |||
623 | /**
|
||
624 | * Notifies change
|
||
625 | 6527 | fdiaz | *
|
626 | 5907 | dmartinezizquierdo | * @param storeNotification
|
627 | */
|
||
628 | public void notifyChange(DefaultRasterStoreNotification storeNotification) { |
||
629 | 6557 | fdiaz | try {
|
630 | delegateObservable.notifyObservers(storeNotification); |
||
631 | } catch (Exception e) { |
||
632 | LOG.warn("Problems notifying changes in store '"+getName()+"'.", e); |
||
633 | } |
||
634 | 5907 | dmartinezizquierdo | } |
635 | |||
636 | /**
|
||
637 | * Gets this provider
|
||
638 | 6527 | fdiaz | *
|
639 | 5907 | dmartinezizquierdo | * @return RasterStoreProvider
|
640 | */
|
||
641 | 6527 | fdiaz | public RasterStoreProvider getProvider() {
|
642 | 5907 | dmartinezizquierdo | return this.provider; |
643 | } |
||
644 | |||
645 | @Override
|
||
646 | 6547 | fdiaz | public Envelope getEnvelope() throws DataException, LocatorException, CreateEnvelopeException { |
647 | 6693 | fdiaz | return getDimensions().getEnvelope();
|
648 | 5907 | dmartinezizquierdo | } |
649 | 6334 | fdiaz | |
650 | 6654 | fdiaz | // @Override
|
651 | // public BandInfo getBandInfo(int band) {
|
||
652 | // int bands = this.provider.getBands();
|
||
653 | // if(band<bands){
|
||
654 | // return this.provider.getBandInfo(band);
|
||
655 | // }
|
||
656 | //
|
||
657 | // if(additionalBands!=null){
|
||
658 | // for (BandsFromStore bandsFromStore : additionalBands) {
|
||
659 | // if((band-bands)<bandsFromStore.bands.size()){
|
||
660 | // RasterStore store = bandsFromStore.getStore();
|
||
661 | // int storeBand = bandsFromStore.get(band-bands);
|
||
662 | // return store.getBandInfo(storeBand);
|
||
663 | // }
|
||
664 | // bands+=bandsFromStore.size();
|
||
665 | 6557 | fdiaz | // }
|
666 | 6654 | fdiaz | // }
|
667 | // return null;
|
||
668 | // }
|
||
669 | 6298 | dmartinezizquierdo | |
670 | 6302 | llmarques | @Override
|
671 | public BandDescriptor getBandDescriptor(int band) { |
||
672 | 6557 | fdiaz | int bandsCounter = this.provider.getBands(); |
673 | if(band<bandsCounter){
|
||
674 | return this.provider.getBandDescriptor(band); |
||
675 | } |
||
676 | |||
677 | if(additionalBands!=null){ |
||
678 | for (BandsFromStore bandsFromStore : additionalBands) {
|
||
679 | if((band-bandsCounter)<bandsFromStore.bands.size()){
|
||
680 | return bandsFromStore.getBandDescriptor(band-bandsCounter);
|
||
681 | } |
||
682 | bandsCounter+=bandsFromStore.size(); |
||
683 | } |
||
684 | } |
||
685 | return null; |
||
686 | 6302 | llmarques | } |
687 | 6298 | dmartinezizquierdo | |
688 | @Override
|
||
689 | 6302 | llmarques | public BandQuery createBandQuery(int band) { |
690 | return new DefaultBandQuery(band, getBandDescriptor(band)); |
||
691 | } |
||
692 | |||
693 | @Override
|
||
694 | public int getBands() { |
||
695 | 6557 | fdiaz | int bands = this.provider.getBands(); |
696 | if(additionalBands!=null){ |
||
697 | for (BandsFromStore bandsFromStore : additionalBands) {
|
||
698 | bands+=bandsFromStore.size(); |
||
699 | } |
||
700 | } |
||
701 | return bands;
|
||
702 | 6302 | llmarques | } |
703 | |||
704 | @Override
|
||
705 | public BandDescriptor createBandDescriptor(int band, List<BandAttributeDescriptor> attributes) { |
||
706 | 6654 | fdiaz | return new DefaultBandDescriptor(this, band, attributes); |
707 | 6302 | llmarques | } |
708 | |||
709 | @Override
|
||
710 | 6527 | fdiaz | public BandAttributeDescriptor createBandAttributeDescriptor(int band, String name, String description, |
711 | List<Object> values, String units) { |
||
712 | 6334 | fdiaz | return new DefaultBandAttributeDescriptor(band, name, description, values, units); |
713 | } |
||
714 | |||
715 | @Override
|
||
716 | 6654 | fdiaz | public BandAttributeDescriptor createBandAttributeDescriptor(int band, String name, Object value, String description, |
717 | List<Object> values, String units) { |
||
718 | return new DefaultBandAttributeDescriptor(band, name, value, description, values, units); |
||
719 | } |
||
720 | |||
721 | @Override
|
||
722 | 6334 | fdiaz | public BandAttributeDescriptor createBandAttributeDescriptor(int band, String name, String description, |
723 | List<Object> values) { |
||
724 | 6302 | llmarques | return new DefaultBandAttributeDescriptor(band, name, description, values); |
725 | } |
||
726 | |||
727 | @Override
|
||
728 | 6298 | dmartinezizquierdo | public void notifyChange(String notification, Resource resource) { |
729 | 6527 | fdiaz | notifyChange(new DefaultRasterStoreNotification(this, DataStoreNotification.RESOURCE_CHANGED)); |
730 | 6298 | dmartinezizquierdo | } |
731 | |||
732 | @Override
|
||
733 | public RasterStore getRasterStore() {
|
||
734 | return this; |
||
735 | } |
||
736 | 6334 | fdiaz | |
737 | 6488 | fdiaz | @Override
|
738 | public void useCache(String providerName, DynObject parameters) throws DataException { |
||
739 | |||
740 | if (providerName == null) { |
||
741 | 6527 | fdiaz | throw new InitializeException("It is necessary to provide a cache name", null); |
742 | 6488 | fdiaz | } |
743 | if (parameters == null) { |
||
744 | 6527 | fdiaz | throw new InitializeException("It is necessary to provide parameters to create the explorer", null); |
745 | 6488 | fdiaz | } |
746 | |||
747 | DataManagerProviderServices manager = DALSPILocator.getDataManagerProviderServices(); |
||
748 | 6527 | fdiaz | RasterStoreProviderFactory providerFactory = |
749 | (RasterStoreProviderFactory) manager.getStoreProviderFactory(providerName); |
||
750 | 6488 | fdiaz | |
751 | if (providerFactory == null) { |
||
752 | throw new ProviderNotRegisteredException(providerName); |
||
753 | } |
||
754 | |||
755 | 6527 | fdiaz | RasterCacheStoreProvider cache = |
756 | (RasterCacheStoreProvider) providerFactory.createProvider((DataParameters) parameters, this);
|
||
757 | 6488 | fdiaz | |
758 | RasterQuery rasterQuery = this.createRasterQuery();
|
||
759 | 6527 | fdiaz | cache.apply(provider, |
760 | (IProjection) this.getParameters().getDynValue(DataStore.METADATA_CRS), rasterQuery);
|
||
761 | 6488 | fdiaz | this.provider = cache;
|
762 | } |
||
763 | |||
764 | @Override
|
||
765 | public RasterCache getCache() {
|
||
766 | 8691 | fdiaz | if(this.provider instanceof RasterCache){ |
767 | return (RasterCache) this.provider; |
||
768 | } |
||
769 | return null; |
||
770 | 6488 | fdiaz | } |
771 | |||
772 | 6527 | fdiaz | @Override
|
773 | public void intialize(DataManager dataManager, DataStoreParameters parameters) throws InitializeException { |
||
774 | |||
775 | DynObjectManager dynManager = ToolsLocator.getDynObjectManager(); |
||
776 | |||
777 | this.metadata =
|
||
778 | (DelegatedDynObject) dynManager.createDynObject(METADATA_DEFINITION_NAME, |
||
779 | MetadataManager.METADATA_NAMESPACE); |
||
780 | |||
781 | this.dataManager = (DefaultDataManager) dataManager;
|
||
782 | |||
783 | this.parameters = parameters;
|
||
784 | |||
785 | } |
||
786 | |||
787 | @Override
|
||
788 | public void setProvider(org.gvsig.fmap.dal.DataStoreProvider provider) { |
||
789 | this.provider = (RasterStoreProvider) provider;
|
||
790 | this.delegate(this.provider); |
||
791 | } |
||
792 | |||
793 | 6557 | fdiaz | @Override
|
794 | 6558 | fdiaz | public void addBand(RasterStore store, int band) throws DataException { |
795 | 6557 | fdiaz | if(store.equals(this)){ |
796 | 6558 | fdiaz | LOG.warn("Can't add bands that belong to this same store.");
|
797 | 6557 | fdiaz | throw new IllegalArgumentException("Can't add bands that belong to this same store."); |
798 | } |
||
799 | 6558 | fdiaz | |
800 | try {
|
||
801 | if(!store.getEnvelope().equals(this.getEnvelope())){ |
||
802 | LOG.warn("The envelopes are differents.");
|
||
803 | throw new AddingBandsException(store.getName(), this.getName(), "The envelopes are differents.", null); |
||
804 | } |
||
805 | } catch (LocatorException | DataException | CreateEnvelopeException e) {
|
||
806 | LOG.warn("Can't compare the envelopes.",e);
|
||
807 | throw new AddingBandsException(store.getName(), this.getName(), "Can't compare the envelopes.", e); |
||
808 | } |
||
809 | |||
810 | if(!store.getParameters().getDynValue(METADATA_CRS).equals(this.getParameters().getDynValue(METADATA_CRS))){ |
||
811 | throw new AddingBandsException(store.getName(), this.getName(), "The projections are differents.", null); |
||
812 | } |
||
813 | |||
814 | 6557 | fdiaz | if(additionalBands==null){ |
815 | this.additionalBands = new ArrayList<BandsFromStore>(); |
||
816 | } |
||
817 | |||
818 | boolean found = false; |
||
819 | for (Iterator iterator = additionalBands.iterator(); iterator.hasNext();) { |
||
820 | BandsFromStore bandsFromStore = (BandsFromStore) iterator.next(); |
||
821 | if(bandsFromStore.getStore().equals(store)){
|
||
822 | found = true;
|
||
823 | 6654 | fdiaz | if(bandsFromStore.contains(band)){
|
824 | LOG.warn("The band '"+band+"' of the store '"+store.getName()+"' is already added to the additional bands."); |
||
825 | } else {
|
||
826 | bandsFromStore.add(band); |
||
827 | } |
||
828 | break;
|
||
829 | 6557 | fdiaz | } |
830 | } |
||
831 | if(!found){
|
||
832 | BandsFromStore bandsFromStore = new BandsFromStore(store);
|
||
833 | bandsFromStore.add(band); |
||
834 | this.additionalBands.add(bandsFromStore);
|
||
835 | } |
||
836 | } |
||
837 | |||
838 | @Override
|
||
839 | 6558 | fdiaz | public void addBands(RasterStore store, List<Integer> bands) throws DataException { |
840 | 6557 | fdiaz | if(store.equals(this)){ |
841 | 6558 | fdiaz | LOG.warn("Can't add bands that belong to this same store.");
|
842 | 6557 | fdiaz | throw new IllegalArgumentException("Can't add bands that belong to this same store."); |
843 | } |
||
844 | 6558 | fdiaz | |
845 | try {
|
||
846 | if(!store.getEnvelope().equals(this.getEnvelope())){ |
||
847 | LOG.warn("The envelopes are differents.");
|
||
848 | throw new AddingBandsException(store.getName(), this.getName(), "The envelopes are differents.", null); |
||
849 | } |
||
850 | } catch (LocatorException | DataException | CreateEnvelopeException e) {
|
||
851 | LOG.warn("Can't compare the envelopes.",e);
|
||
852 | throw new AddingBandsException(store.getName(), this.getName(), "Can't compare the envelopes.", e); |
||
853 | } |
||
854 | |||
855 | if(!store.getParameters().getDynValue(METADATA_CRS).equals(this.getParameters().getDynValue(METADATA_CRS))){ |
||
856 | throw new AddingBandsException(store.getName(), this.getName(), "The projections are differents.", null); |
||
857 | } |
||
858 | |||
859 | 6557 | fdiaz | if(additionalBands==null){ |
860 | this.additionalBands = new ArrayList<BandsFromStore>(); |
||
861 | } |
||
862 | 6558 | fdiaz | |
863 | 6557 | fdiaz | boolean found = false; |
864 | for (BandsFromStore bandsFromStore : additionalBands) {
|
||
865 | if(bandsFromStore.getStore().equals(store)){
|
||
866 | found = true;
|
||
867 | for (Iterator<Integer> bandIterator = bands.iterator(); bandIterator.hasNext();) { |
||
868 | Integer band = (Integer) bandIterator.next(); |
||
869 | bandsFromStore.add(band); |
||
870 | } |
||
871 | } |
||
872 | } |
||
873 | if(!found){
|
||
874 | BandsFromStore bandsFromStore = new BandsFromStore(store, bands);
|
||
875 | this.additionalBands.add(bandsFromStore);
|
||
876 | } |
||
877 | } |
||
878 | |||
879 | 6654 | fdiaz | public void clearAdditionalBands(){ |
880 | //FIXME: recorrer todos y dispose de los stores
|
||
881 | this.additionalBands = null; |
||
882 | } |
||
883 | |||
884 | 6557 | fdiaz | @Override
|
885 | public void removeBand(int band) { |
||
886 | if(band<getProvider().getBands()){
|
||
887 | throw new IllegalArgumentException("Can't remove bands of main store."); |
||
888 | } |
||
889 | int bandCounter = getProvider().getBands();
|
||
890 | int storeCounter = 0; |
||
891 | while(bandCounter < band){
|
||
892 | BandsFromStore additionalStore = this.additionalBands.get(storeCounter);
|
||
893 | if( (band-bandCounter) < additionalStore.size()){
|
||
894 | additionalStore.remove(band-bandCounter); |
||
895 | 6654 | fdiaz | if(additionalStore.size()==0){ |
896 | DisposeUtils.disposeQuietly(additionalStore.getStore()); |
||
897 | this.additionalBands.remove(additionalStore);
|
||
898 | } |
||
899 | 6557 | fdiaz | return;
|
900 | } |
||
901 | bandCounter += additionalStore.size(); |
||
902 | } |
||
903 | } |
||
904 | |||
905 | private static class BandsFromStore{ |
||
906 | RasterStore store; |
||
907 | List<Integer> bands; |
||
908 | |||
909 | public BandsFromStore(RasterStore store){
|
||
910 | this.store = store;
|
||
911 | ToolsLocator.getDisposableManager().bind(store); |
||
912 | this.bands = new ArrayList<Integer>(); |
||
913 | } |
||
914 | |||
915 | public BandsFromStore(RasterStore store, List<Integer> bands){ |
||
916 | this.store = store;
|
||
917 | ToolsLocator.getDisposableManager().bind(store); |
||
918 | this.bands = bands;
|
||
919 | } |
||
920 | |||
921 | /**
|
||
922 | * Add the band to the list
|
||
923 | *
|
||
924 | * @param band
|
||
925 | */
|
||
926 | public void add(int band){ |
||
927 | if(bands.contains(band)){
|
||
928 | throw new IllegalArgumentException("The band "+band+" is already added."); |
||
929 | } |
||
930 | this.bands.add(band);
|
||
931 | } |
||
932 | |||
933 | /**
|
||
934 | * Remove the band from the list
|
||
935 | * @param band
|
||
936 | */
|
||
937 | public void remove(int band){ |
||
938 | if(!bands.contains(band)){
|
||
939 | throw new IllegalArgumentException("The band "+band+" isn't previously added."); |
||
940 | } |
||
941 | this.bands.remove(band);
|
||
942 | } |
||
943 | |||
944 | 6654 | fdiaz | public boolean contains(int band){ |
945 | return (bands.contains(band));
|
||
946 | } |
||
947 | |||
948 | 6557 | fdiaz | /**
|
949 | * Return the band from the store in the index position
|
||
950 | *
|
||
951 | * @param index
|
||
952 | * @return
|
||
953 | */
|
||
954 | public int get(int index){ |
||
955 | return this.bands.get(index).intValue(); |
||
956 | } |
||
957 | |||
958 | public RasterStore getStore() {
|
||
959 | return store;
|
||
960 | } |
||
961 | |||
962 | public int size() { |
||
963 | return bands.size();
|
||
964 | } |
||
965 | |||
966 | /**
|
||
967 | * Return the BandDescriptor of the band in the index position.
|
||
968 | * @param index
|
||
969 | * @return
|
||
970 | */
|
||
971 | public BandDescriptor getBandDescriptor(int index) { |
||
972 | return store.getBandDescriptor(bands.get(index));
|
||
973 | } |
||
974 | |||
975 | } |
||
976 | |||
977 | 6654 | fdiaz | @Override
|
978 | public boolean isOwnBand(int band) { |
||
979 | if(band < this.getProvider().getBands()){ |
||
980 | return true; |
||
981 | } |
||
982 | return false; |
||
983 | } |
||
984 | 6668 | fdiaz | |
985 | 6785 | fdiaz | public DataStoreProviderFactory getProviderFactory() {
|
986 | 6668 | fdiaz | DataStoreProviderFactory factory = dataManager.getStoreProviderFactory(parameters.getDataStoreName()); |
987 | return factory;
|
||
988 | } |
||
989 | 6677 | fdiaz | |
990 | @Override
|
||
991 | public BufferDimensions getDimensions() throws InitializeException { |
||
992 | return this.getProvider().getDimensions(); |
||
993 | } |
||
994 | 6701 | fdiaz | |
995 | @Override
|
||
996 | public boolean isTiled() { |
||
997 | return this.provider.isTiled(); |
||
998 | } |
||
999 | 8425 | fdiaz | |
1000 | @Override
|
||
1001 | public boolean hasDynMethod(String name) { |
||
1002 | return ((DynObject_v2)this.metadata).hasDynMethod(name); |
||
1003 | } |
||
1004 | 5907 | dmartinezizquierdo | } |