Statistics
| Revision:

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

History | View | Annotate | Download (33.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.fmap.dal.raster.impl;
24

    
25
import java.util.ArrayList;
26
import java.util.Collection;
27
import java.util.HashMap;
28
import java.util.Iterator;
29
import java.util.List;
30
import java.util.Map;
31
import java.util.Map.Entry;
32
import java.util.Set;
33

    
34
import org.cresques.cts.IProjection;
35
import org.slf4j.Logger;
36
import org.slf4j.LoggerFactory;
37

    
38
import org.gvsig.fmap.dal.DALLocator;
39
import org.gvsig.fmap.dal.DataManager;
40
import org.gvsig.fmap.dal.DataParameters;
41
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
import org.gvsig.fmap.dal.DataStoreProviderFactory;
48
import org.gvsig.fmap.dal.exception.CloneException;
49
import org.gvsig.fmap.dal.exception.DataException;
50
import org.gvsig.fmap.dal.exception.InitializeException;
51
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
52
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
import org.gvsig.fmap.dal.raster.RasterStoreProviderFactory;
56
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
import org.gvsig.fmap.dal.raster.api.RasterCache;
60
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
import org.gvsig.fmap.dal.raster.api.exceptions.RasterQueryCloneException;
65
import org.gvsig.fmap.dal.raster.impl.exceptions.AddingBandsException;
66
import org.gvsig.fmap.dal.raster.spi.RasterCacheStoreProvider;
67
import org.gvsig.fmap.dal.raster.spi.RasterStoreProvider;
68
import org.gvsig.fmap.dal.raster.spi.RasterStoreProviderServices;
69
import org.gvsig.fmap.dal.resource.Resource;
70
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
71
import org.gvsig.fmap.dal.spi.DALSPILocator;
72
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
73
import org.gvsig.fmap.dal.spi.DataStoreInitializer2;
74
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
75
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
import org.gvsig.raster.lib.buffer.api.Band;
80
import org.gvsig.raster.lib.buffer.api.Buffer;
81
import org.gvsig.raster.lib.buffer.api.BufferDimensions;
82
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException;
83
import org.gvsig.timesupport.Interval;
84
import org.gvsig.tools.ToolsLocator;
85
import org.gvsig.tools.dispose.DisposeUtils;
86
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
import org.gvsig.tools.dynobject.DynStruct;
92
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
93
import org.gvsig.tools.dynobject.exception.DynMethodException;
94
import org.gvsig.tools.exception.BaseException;
95
import org.gvsig.tools.locator.LocatorException;
96
import org.gvsig.tools.observer.Observable;
97
import org.gvsig.tools.observer.Observer;
98
import org.gvsig.tools.observer.impl.DelegateWeakReferencingObservable;
99
import org.gvsig.tools.persistence.PersistenceManager;
100
import org.gvsig.tools.persistence.PersistentState;
101
import org.gvsig.tools.persistence.exception.PersistenceException;
102
import org.gvsig.tools.visitor.Visitor;
103

    
104
/**
105
 * Implements RasterStore
106
 *
107
 * @author dmartinezizquierdo
108
 *
109
 */
110
public class DefaultRasterStore extends AbstractDisposable implements DataStoreInitializer2,
111
    RasterStoreProviderServices, RasterStore, Observer {
112

    
113
    private static final Logger LOG = LoggerFactory.getLogger(DefaultRasterStore.class);
114

    
115
    private static final String PERSISTENCE_DEFINITION_NAME = "RasterStore";
116
    private static final String METADATA_DEFINITION_NAME = "RasterStore";
117

    
118
    private DataStoreParameters parameters = null;
119
    private RasterStoreProvider provider = null;
120
    private DelegatedDynObject metadata;
121
    private DefaultDataManager dataManager = null;
122
    private List<BandsFromStore> additionalBands = null;
123

    
124
    private DelegateWeakReferencingObservable delegateObservable = new DelegateWeakReferencingObservable(this);
125

    
126
    /**
127
     * Registers persistence
128
     */
129
    public static void registerPersistenceDefinition() {
130
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
131
        if (manager.getDefinition(PERSISTENCE_DEFINITION_NAME) == null) {
132
            DynStruct definition =
133
                manager.addDefinition(DefaultRasterStore.class, PERSISTENCE_DEFINITION_NAME,
134
                    PERSISTENCE_DEFINITION_NAME + " Persistent definition", null, null);
135
            definition.addDynFieldString("dataStoreName").setMandatory(true).setPersistent(true);
136

    
137
            definition.addDynFieldObject("parameters").setClassOfValue(DynObject.class).setMandatory(true)
138
                .setPersistent(true);
139
        }
140
    }
141

    
142
    /**
143
     * Registers metadata
144
     *
145
     * @throws MetadataException
146
     */
147
    public static void registerMetadataDefinition() throws MetadataException {
148
        MetadataManager manager = MetadataLocator.getMetadataManager();
149
        if (manager.getDefinition(METADATA_DEFINITION_NAME) == null) {
150
            DynStruct metadataDefinition = manager.addDefinition(METADATA_DEFINITION_NAME, null);
151
            metadataDefinition.extend(manager.getDefinition(DataStore.METADATA_DEFINITION_NAME));
152
        }
153
    }
154

    
155
    /**
156
     * @return dataManager
157
     */
158
    public DataManager getManager() {
159
        return this.dataManager;
160
    }
161

    
162
    @Override
163
    public String getName() {
164
        return this.provider.getName();
165
    }
166

    
167
    @Override
168
    public String getFullName() {
169
        return this.provider.getFullName();
170
    }
171

    
172
    @Override
173
    public DataStoreParameters getParameters() {
174
        return parameters;
175
    }
176

    
177
    @Override
178
    public String getProviderName() {
179
        return this.provider.getProviderName();
180
    }
181

    
182
    @Override
183
    public void refresh() throws DataException {
184
        this.notifyChange(RasterStoreNotification.BEFORE_REFRESH);
185
        this.provider.refresh();
186
        this.notifyChange(RasterStoreNotification.AFTER_REFRESH);
187
    }
188

    
189
    @Override
190
    public DataSet getDataSet() throws DataException {
191
        return this.getRasterSet();
192
    }
193

    
194
    @Override
195
    public DataSet getDataSet(DataQuery dataQuery) throws DataException {
196
        return this.getRasterSet((RasterQuery) dataQuery);
197
    }
198

    
199
    @Override
200
    public void getDataSet(Observer observer) throws DataException {
201
        this.getRasterSet(null, observer);
202
    }
203

    
204
    @Override
205
    public void getDataSet(DataQuery dataQuery, Observer observer) throws DataException {
206
        this.getRasterSet((RasterQuery) dataQuery, observer);
207
    }
208

    
209
    @Override
210
    public RasterSet getRasterSet(RasterQuery rasterQuery) throws DataException {
211

    
212
        try {
213
            if (rasterQuery != null) {
214
                List<BandQuery> queryBands = rasterQuery.getBands();
215
                if (!queryBands.isEmpty()) {
216
                    RasterQuery mainRasterQuery = (RasterQuery) rasterQuery.clone();
217
                    mainRasterQuery.clearBands();
218
                    Map<RasterStore, RasterQuery> rasterQueries = new HashMap<RasterStore, RasterQuery>();
219

    
220
                    for (BandQuery bandQuery : queryBands) {
221
                        int band = bandQuery.getBand();
222
                        if(band<getProvider().getBands()){
223
                            mainRasterQuery.addBand(bandQuery);
224
                        } else {
225
                            int bandCounter = getProvider().getBands();
226
                            boolean bandFound = false;
227
                            if(additionalBands!=null){
228
                                for (BandsFromStore bandsFromStore : additionalBands) {
229
                                    RasterStore store = bandsFromStore.getStore();
230

    
231
                                    if (band < bandCounter + bandsFromStore.size()) {
232
                                        BandQuery storeBandQuery =
233
                                            store.createBandQuery(bandsFromStore.get(band - bandCounter));
234
                                        if (rasterQueries.containsKey(store)) {
235
                                            rasterQueries.get(store).addBand(storeBandQuery);
236
                                        } else {
237
                                            RasterQuery storeRasterQuery = (RasterQuery) rasterQuery.clone();
238
                                            storeRasterQuery.clearBands();
239
                                            storeRasterQuery.addBand(storeBandQuery);
240
                                            rasterQueries.put(store, storeRasterQuery);
241
                                            bandFound = true;
242
                                        }
243
                                    }
244
                                    bandCounter += bandsFromStore.size();
245
                                    if (bandFound) {
246
                                        break;
247
                                    }
248
                                }
249
                            }
250
                        }
251
                    }
252

    
253
                    RasterSet mainRasterSet = new DefaultRasterSet(this, mainRasterQuery);
254
                    for (Entry<RasterStore, RasterQuery> entry : rasterQueries.entrySet()) {
255
                        RasterStore store = entry.getKey();
256
                        RasterQuery query = entry.getValue();
257
                        RasterSet subRasterSet = store.getRasterSet(query);
258
                        for (Band band : subRasterSet) {
259
                            mainRasterSet.addBand(band);
260
                        }
261
                    }
262
                    return mainRasterSet;
263
                }
264
            }
265
            RasterSet mainRasterSet = new DefaultRasterSet(this, rasterQuery);
266
            if (additionalBands != null) {
267
                for (BandsFromStore bandsFromStore : additionalBands) {
268
                    RasterStore store = bandsFromStore.getStore();
269
                    RasterQuery subRasterQuery = store.createRasterQuery();
270
                    subRasterQuery.setClip(rasterQuery.getClip());
271
                    subRasterQuery.setPixelSize(mainRasterSet.getPixelSizeX()); //rasterQuery.getPixelSize()); //
272
                    subRasterQuery.setScale(rasterQuery.getScale());
273
                    for (int i = 0; i < bandsFromStore.size(); i++) {
274
                        BandQuery bandQuery = store.createBandQuery(bandsFromStore.get(i));
275
                        subRasterQuery.addBand(bandQuery);
276
                    }
277
                    DefaultRasterSet subRasterSet = new DefaultRasterSet(store, subRasterQuery);
278
                    if(subRasterSet.getColumns()!=mainRasterSet.getColumns() || subRasterSet.getRows()!=mainRasterSet.getRows()){
279
                        Buffer subBuffer = subRasterSet.createInterpolated(mainRasterSet.getRows(), mainRasterSet.getColumns(), Buffer.INTERPOLATION_NearestNeighbour, null);
280
                        for (Band band : subBuffer) {
281
                            mainRasterSet.addBand(band);
282
                        }
283
                    } else {
284
                        for (Band band : subRasterSet) {
285
                            mainRasterSet.addBand(band);
286
                        }
287
                    }
288
                }
289
            }
290
            return mainRasterSet;
291
        } catch (CloneNotSupportedException | LocatorException | BufferException e) {
292
            throw new RasterQueryCloneException(e);
293
        }
294
    }
295

    
296
    @Override
297
    public RasterSet getRasterSet() throws DataException {
298
        return getRasterSet(createRasterQuery());
299
    }
300

    
301
    /**
302
     * Adds an observer to the DataSet
303
     *
304
     * @param observer
305
     * @throws DataException
306
     */
307
    public void getRasterSet(Observer observer) throws DataException {
308
        RasterSet set = this.getRasterSet();
309
        set.addObserver(observer);
310
    }
311

    
312
    /**
313
     * Adds an observer to the queried DataSet
314
     *
315
     * @param rasterQuery
316
     * @param observer
317
     * @throws DataException
318
     */
319
    public void getRasterSet(RasterQuery rasterQuery, Observer observer) throws DataException {
320
        RasterSet set = this.getRasterSet(rasterQuery);
321
        set.addObserver(observer);
322
    }
323

    
324
    @Override
325
    public void accept(Visitor visitor) throws BaseException {
326
        RasterSet set = getRasterSet();
327
        try {
328
            set.accept(visitor);
329
        } finally {
330
            set.dispose();
331
        }
332
    }
333

    
334
    @Override
335
    public void accept(Visitor visitor, DataQuery dataQuery) throws BaseException {
336
        RasterSet set = getRasterSet((RasterQuery) dataQuery);
337
        try {
338
            set.accept(visitor);
339
        } finally {
340
            set.dispose();
341
        }
342

    
343
    }
344

    
345
    @Override
346
    public DataSet getSelection() throws DataException {
347
        // TODO Auto-generated method stub
348
        return null;
349
    }
350

    
351
    @Override
352
    public void setSelection(DataSet selection) throws DataException {
353
        // TODO Auto-generated method stub
354

    
355
    }
356

    
357
    @Override
358
    public DataSet createSelection() throws DataException {
359
        // TODO Auto-generated method stub
360
        return null;
361
    }
362

    
363
    @Override
364
    public Iterator<?> getChildren() {
365
        return this.provider.getChilds();
366
    }
367

    
368
    @Override
369
    public DataServerExplorer getExplorer() throws DataException, ValidateDataParametersException {
370
        return this.provider.getExplorer();
371
    }
372

    
373
    @Override
374
    public DataQuery createQuery() {
375
        return createRasterQuery();
376
    }
377

    
378
    @Override
379
    public Interval getInterval() {
380
        return this.provider.getInterval();
381
    }
382

    
383
    @Override
384
    public Collection<?> getTimes() {
385
        return this.provider.getTimes();
386
    }
387

    
388
    @Override
389
    public Collection<?> getTimes(Interval interval) {
390
        return this.provider.getTimes(interval);
391
    }
392

    
393
    @Override
394
    public void disableNotifications() {
395
        this.delegateObservable.disableNotifications();
396
    }
397

    
398
    @Override
399
    public void enableNotifications() {
400
        this.delegateObservable.enableNotifications();
401

    
402
    }
403

    
404
    @Override
405
    public void beginComplexNotification() {
406
        this.delegateObservable.beginComplexNotification();
407

    
408
    }
409

    
410
    @Override
411
    public void endComplexNotification() {
412
        this.delegateObservable.endComplexNotification();
413
    }
414

    
415
    @Override
416
    public void addObserver(Observer observer) {
417
        if (delegateObservable != null) {
418
            this.delegateObservable.addObserver(observer);
419
        }
420
    }
421

    
422
    @Override
423
    public void deleteObserver(Observer observer) {
424
        if (delegateObservable != null) {
425
            this.delegateObservable.deleteObserver(observer);
426
        }
427

    
428
    }
429

    
430
    @Override
431
    public void deleteObservers() {
432
        this.delegateObservable.deleteObservers();
433
    }
434

    
435
    @Override
436
    public void saveToState(PersistentState state) throws PersistenceException {
437

    
438
        state.set("dataStoreName", this.getName());
439
        state.set("parameters", this.parameters);
440
    }
441

    
442
    @Override
443
    public void loadFromState(PersistentState state) throws PersistenceException {
444
        if (this.provider != null) {
445
            throw new PersistenceStoreAlreadyLoadedException(this.getName());
446
        }
447
        if (this.getManager() == null) {
448
            this.dataManager = (DefaultDataManager) DALLocator.getDataManager();
449
        }
450

    
451
        DataStoreParameters params = (DataStoreParameters) state.get("parameters");
452

    
453
        try {
454

    
455
            this.intialize(this.dataManager, params);
456
            this.setProvider(this.provider);
457

    
458
        } catch (InitializeException e) {
459
            throw new PersistenceException(e);
460
        } catch (DataException e) {
461
            throw new PersistenceException(e);
462
        }
463

    
464
    }
465

    
466
    //
467
    // ====================================================================
468
    // Metadata related methods
469
    //
470

    
471
    @Override
472
    public Set<?> getMetadataChildren() throws MetadataException {
473
        // TODO Auto-generated method stub
474
        return null;
475
    }
476

    
477
    @Override
478
    public Object getMetadataID() throws MetadataException {
479
        return this.provider.getSourceId();
480
    }
481

    
482
    @Override
483
    public String getMetadataName() throws MetadataException {
484
        return this.provider.getProviderName();
485
    }
486

    
487
    @Override
488
    public DynClass getDynClass() {
489
        return this.metadata.getDynClass();
490
    }
491

    
492
    @Override
493
    public void implement(DynClass dynClass) {
494
        this.metadata.implement(dynClass);
495
    }
496

    
497
    @Override
498
    public void delegate(DynObject dynObject) {
499
        this.metadata.delegate(dynObject);
500
    }
501

    
502
    @Override
503
    public Object getDynValue(String name) throws DynFieldNotFoundException {
504
        if (this.metadata.hasDynValue(name)) {
505
            return this.metadata.getDynValue(name);
506
        }
507
        if (METADATA_PROVIDER.equalsIgnoreCase(name)) {
508
            return this.provider.getProviderName();
509
        } else if (METADATA_CONTAINERNAME.equalsIgnoreCase(name)) {
510
            return this.provider.getSourceId();
511
        }
512
        return this.metadata.getDynValue(name);
513
    }
514

    
515
    @Override
516
    public void setDynValue(String name, Object value) throws DynFieldNotFoundException {
517

    
518
        this.metadata.setDynValue(name, value);
519

    
520
    }
521

    
522
    @Override
523
    public boolean hasDynValue(String name) {
524
        return this.metadata.hasDynValue(name);
525
    }
526

    
527
    @Override
528
    public Object invokeDynMethod(String name, Object[] args) throws DynMethodException {
529
        return this.metadata.invokeDynMethod(this, name, args);
530
    }
531

    
532
    @Override
533
    public Object invokeDynMethod(int code, Object[] args) throws DynMethodException {
534
        return this.metadata.invokeDynMethod(this, code, args);
535
    }
536

    
537
    @Override
538
    public void clear() {
539
        if (metadata != null) {
540
            metadata.clear();
541
        }
542
    }
543

    
544
    @Override
545
    public RasterQuery createRasterQuery() {
546
        return new DefaultRasterQuery();
547
    }
548

    
549
    @Override
550
    public DataStore getStore() {
551
        return this;
552
    }
553

    
554
    @Override
555
    public void update(Observable observable, Object notification) {
556
        if (observable instanceof DataSet) {
557
            this.notifyChange(RasterStoreNotification.DATASET_CHANGED);
558

    
559
        } else {
560
            if (observable instanceof RasterStoreProvider) {
561
                if (observable == this.provider) {
562
                    this.notifyChange(RasterStoreNotification.STORE_PROVIDER_CHANGED);
563
                }
564
            }
565
        }
566
    }
567

    
568
    @Override
569
    protected void doDispose() throws BaseException {
570

    
571
        this.notifyChange(DataStoreNotification.BEFORE_DISPOSE);
572
        this.provider.dispose();
573
        this.parameters = null;
574
        if(additionalBands!=null){
575
            for (Iterator iterator = additionalBands.iterator(); iterator.hasNext();) {
576
                BandsFromStore bandsFromStore = (BandsFromStore) iterator.next();
577
                bandsFromStore.getStore().dispose();
578
            }
579
            this.additionalBands = null;
580
        }
581

    
582
        this.notifyChange(DataStoreNotification.AFTER_DISPOSE);
583
        if (delegateObservable != null) {
584
            this.delegateObservable.deleteObservers();
585
            this.delegateObservable = null;
586
        }
587
    }
588

    
589
    @Override
590
    public Object clone() throws CloneNotSupportedException {
591
        DataStoreParameters dsp = getParameters();
592

    
593
        DefaultRasterStore cloned_store = null;
594

    
595
        try {
596
            cloned_store = (DefaultRasterStore) DALLocator.getDataManager().openStore(this.getProviderName(), dsp);
597
            cloned_store.additionalBands = new ArrayList<DefaultRasterStore.BandsFromStore>(additionalBands);
598
        } catch (Exception e) {
599
            throw new CloneException(e);
600
        }
601
        return cloned_store;
602

    
603
    }
604

    
605
    /**
606
     * Notifies change
607
     *
608
     * @param notification
609
     */
610
    public void notifyChange(String notification) {
611
        if (delegateObservable != null) {
612
            notifyChange(new DefaultRasterStoreNotification(this, notification));
613
        }
614

    
615
    }
616

    
617
    @Override
618
    public void notifyChange(String notification, ResourceProvider data) {
619
        notifyChange(new DefaultRasterStoreNotification(this, DataStoreNotification.RESOURCE_CHANGED));
620
    }
621

    
622
    /**
623
     * Notifies change
624
     *
625
     * @param storeNotification
626
     */
627
    public void notifyChange(DefaultRasterStoreNotification storeNotification) {
628
        try {
629
            delegateObservable.notifyObservers(storeNotification);
630
        } catch (Exception e) {
631
            LOG.warn("Problems notifying changes in store '"+getName()+"'.", e);
632
        }
633
    }
634

    
635
    /**
636
     * Gets this provider
637
     *
638
     * @return RasterStoreProvider
639
     */
640
    public RasterStoreProvider getProvider() {
641
        return this.provider;
642
    }
643

    
644
    @Override
645
    public Envelope getEnvelope() throws DataException, LocatorException, CreateEnvelopeException {
646
        return getDimensions().getEnvelope();
647
    }
648

    
649
//    @Override
650
//    public BandInfo getBandInfo(int band) {
651
//        int bands = this.provider.getBands();
652
//        if(band<bands){
653
//            return this.provider.getBandInfo(band);
654
//        }
655
//
656
//        if(additionalBands!=null){
657
//            for (BandsFromStore bandsFromStore : additionalBands) {
658
//                if((band-bands)<bandsFromStore.bands.size()){
659
//                    RasterStore store = bandsFromStore.getStore();
660
//                    int storeBand = bandsFromStore.get(band-bands);
661
//                    return store.getBandInfo(storeBand);
662
//                }
663
//                bands+=bandsFromStore.size();
664
//            }
665
//        }
666
//        return null;
667
//    }
668

    
669
    @Override
670
    public BandDescriptor getBandDescriptor(int band) {
671
        int bandsCounter = this.provider.getBands();
672
        if(band<bandsCounter){
673
            return this.provider.getBandDescriptor(band);
674
        }
675

    
676
        if(additionalBands!=null){
677
            for (BandsFromStore bandsFromStore : additionalBands) {
678
                if((band-bandsCounter)<bandsFromStore.bands.size()){
679
                    return bandsFromStore.getBandDescriptor(band-bandsCounter);
680
                }
681
                bandsCounter+=bandsFromStore.size();
682
            }
683
        }
684
        return null;
685
    }
686

    
687
    @Override
688
    public BandQuery createBandQuery(int band) {
689
        return new DefaultBandQuery(band, getBandDescriptor(band));
690
    }
691

    
692
    @Override
693
    public int getBands() {
694
        int bands = this.provider.getBands();
695
        if(additionalBands!=null){
696
            for (BandsFromStore bandsFromStore : additionalBands) {
697
                bands+=bandsFromStore.size();
698
            }
699
        }
700
        return bands;
701
    }
702

    
703
    @Override
704
    public BandDescriptor createBandDescriptor(int band, List<BandAttributeDescriptor> attributes) {
705
        return new DefaultBandDescriptor(this, band, attributes);
706
    }
707

    
708
    @Override
709
    public BandAttributeDescriptor createBandAttributeDescriptor(int band, String name, String description,
710
        List<Object> values, String units) {
711
        return new DefaultBandAttributeDescriptor(band, name, description, values, units);
712
    }
713

    
714
    @Override
715
    public BandAttributeDescriptor createBandAttributeDescriptor(int band, String name, Object value, String description,
716
        List<Object> values, String units) {
717
        return new DefaultBandAttributeDescriptor(band, name, value, description, values, units);
718
    }
719

    
720
    @Override
721
    public BandAttributeDescriptor createBandAttributeDescriptor(int band, String name, String description,
722
        List<Object> values) {
723
        return new DefaultBandAttributeDescriptor(band, name, description, values);
724
    }
725

    
726
    @Override
727
    public void notifyChange(String notification, Resource resource) {
728
        notifyChange(new DefaultRasterStoreNotification(this, DataStoreNotification.RESOURCE_CHANGED));
729
    }
730

    
731
    @Override
732
    public RasterStore getRasterStore() {
733
        return this;
734
    }
735

    
736
    @Override
737
    public void useCache(String providerName, DynObject parameters) throws DataException {
738

    
739
        if (providerName == null) {
740
            throw new InitializeException("It is necessary to provide a cache name", null);
741
        }
742
        if (parameters == null) {
743
            throw new InitializeException("It is necessary to provide parameters to create the explorer", null);
744
        }
745

    
746
        DataManagerProviderServices manager = DALSPILocator.getDataManagerProviderServices();
747
        RasterStoreProviderFactory providerFactory =
748
            (RasterStoreProviderFactory) manager.getStoreProviderFactory(providerName);
749

    
750
        if (providerFactory == null) {
751
            throw new ProviderNotRegisteredException(providerName);
752
        }
753

    
754
        RasterCacheStoreProvider cache =
755
            (RasterCacheStoreProvider) providerFactory.createProvider((DataParameters) parameters, this);
756

    
757
        RasterQuery rasterQuery = this.createRasterQuery();
758
        cache.apply(provider,
759
            (IProjection) this.getParameters().getDynValue(DataStore.METADATA_CRS), rasterQuery);
760
        this.provider = cache;
761
    }
762

    
763
    @Override
764
    public RasterCache getCache() {
765
        return (RasterCache) this.provider;
766
    }
767

    
768
    @Override
769
    public void intialize(DataManager dataManager, DataStoreParameters parameters) throws InitializeException {
770

    
771
        DynObjectManager dynManager = ToolsLocator.getDynObjectManager();
772

    
773
        this.metadata =
774
            (DelegatedDynObject) dynManager.createDynObject(METADATA_DEFINITION_NAME,
775
                MetadataManager.METADATA_NAMESPACE);
776

    
777
        this.dataManager = (DefaultDataManager) dataManager;
778

    
779
        this.parameters = parameters;
780

    
781
    }
782

    
783
    @Override
784
    public void setProvider(org.gvsig.fmap.dal.DataStoreProvider provider) {
785
        this.provider = (RasterStoreProvider) provider;
786
        this.delegate(this.provider);
787
    }
788

    
789
    @Override
790
    public void addBand(RasterStore store, int band) throws DataException {
791
        if(store.equals(this)){
792
            LOG.warn("Can't add bands that belong to this same store.");
793
            throw new IllegalArgumentException("Can't add bands that belong to this same store.");
794
        }
795

    
796
        try {
797
            if(!store.getEnvelope().equals(this.getEnvelope())){
798
                LOG.warn("The envelopes are differents.");
799
                throw new AddingBandsException(store.getName(), this.getName(), "The envelopes are differents.", null);
800
            }
801
        } catch (LocatorException | DataException | CreateEnvelopeException e) {
802
            LOG.warn("Can't compare the envelopes.",e);
803
            throw new AddingBandsException(store.getName(), this.getName(), "Can't compare the envelopes.", e);
804
        }
805

    
806
        if(!store.getParameters().getDynValue(METADATA_CRS).equals(this.getParameters().getDynValue(METADATA_CRS))){
807
            throw new AddingBandsException(store.getName(), this.getName(), "The projections are differents.", null);
808
        }
809

    
810
        if(additionalBands==null){
811
            this.additionalBands = new ArrayList<BandsFromStore>();
812
        }
813

    
814
        boolean found = false;
815
        for (Iterator iterator = additionalBands.iterator(); iterator.hasNext();) {
816
            BandsFromStore bandsFromStore = (BandsFromStore) iterator.next();
817
            if(bandsFromStore.getStore().equals(store)){
818
                found = true;
819
                if(bandsFromStore.contains(band)){
820
                    LOG.warn("The band '"+band+"' of the store '"+store.getName()+"' is already added to the additional bands.");
821
                } else {
822
                    bandsFromStore.add(band);
823
                }
824
                break;
825
            }
826
        }
827
        if(!found){
828
            BandsFromStore bandsFromStore = new BandsFromStore(store);
829
            bandsFromStore.add(band);
830
            this.additionalBands.add(bandsFromStore);
831
        }
832
    }
833

    
834
    @Override
835
    public void addBands(RasterStore store, List<Integer> bands) throws DataException {
836
        if(store.equals(this)){
837
            LOG.warn("Can't add bands that belong to this same store.");
838
            throw new IllegalArgumentException("Can't add bands that belong to this same store.");
839
        }
840

    
841
        try {
842
            if(!store.getEnvelope().equals(this.getEnvelope())){
843
                LOG.warn("The envelopes are differents.");
844
                throw new AddingBandsException(store.getName(), this.getName(), "The envelopes are differents.", null);
845
            }
846
        } catch (LocatorException | DataException | CreateEnvelopeException e) {
847
            LOG.warn("Can't compare the envelopes.",e);
848
            throw new AddingBandsException(store.getName(), this.getName(), "Can't compare the envelopes.", e);
849
        }
850

    
851
        if(!store.getParameters().getDynValue(METADATA_CRS).equals(this.getParameters().getDynValue(METADATA_CRS))){
852
            throw new AddingBandsException(store.getName(), this.getName(), "The projections are differents.", null);
853
        }
854

    
855
        if(additionalBands==null){
856
            this.additionalBands = new ArrayList<BandsFromStore>();
857
        }
858

    
859
        boolean found = false;
860
        for (BandsFromStore bandsFromStore : additionalBands) {
861
            if(bandsFromStore.getStore().equals(store)){
862
                found = true;
863
                for (Iterator<Integer> bandIterator = bands.iterator(); bandIterator.hasNext();) {
864
                    Integer band = (Integer) bandIterator.next();
865
                    bandsFromStore.add(band);
866
                }
867
            }
868
        }
869
        if(!found){
870
            BandsFromStore bandsFromStore = new BandsFromStore(store, bands);
871
            this.additionalBands.add(bandsFromStore);
872
        }
873
    }
874

    
875
    public void clearAdditionalBands(){
876
        //FIXME: recorrer todos y dispose de los stores
877
        this.additionalBands = null;
878
    }
879

    
880
    @Override
881
    public void removeBand(int band) {
882
        if(band<getProvider().getBands()){
883
            throw new IllegalArgumentException("Can't remove bands of main store.");
884
        }
885
        int bandCounter = getProvider().getBands();
886
        int storeCounter = 0;
887
        while(bandCounter < band){
888
            BandsFromStore additionalStore = this.additionalBands.get(storeCounter);
889
            if( (band-bandCounter) < additionalStore.size()){
890
                additionalStore.remove(band-bandCounter);
891
                if(additionalStore.size()==0){
892
                    DisposeUtils.disposeQuietly(additionalStore.getStore());
893
                    this.additionalBands.remove(additionalStore);
894
                }
895
                return;
896
            }
897
            bandCounter += additionalStore.size();
898
        }
899
    }
900

    
901
    private static class BandsFromStore{
902
        RasterStore store;
903
        List<Integer> bands;
904

    
905
        public BandsFromStore(RasterStore store){
906
            this.store = store;
907
            ToolsLocator.getDisposableManager().bind(store);
908
            this.bands = new ArrayList<Integer>();
909
        }
910

    
911
        public BandsFromStore(RasterStore store, List<Integer> bands){
912
            this.store = store;
913
            ToolsLocator.getDisposableManager().bind(store);
914
            this.bands = bands;
915
        }
916

    
917
        /**
918
         * Add the band to the list
919
         *
920
         * @param band
921
         */
922
        public void add(int band){
923
            if(bands.contains(band)){
924
                throw new IllegalArgumentException("The band "+band+" is already added.");
925
            }
926
            this.bands.add(band);
927
        }
928

    
929
        /**
930
         * Remove the band from the list
931
         * @param band
932
         */
933
        public void remove(int band){
934
            if(!bands.contains(band)){
935
                throw new IllegalArgumentException("The band "+band+" isn't previously added.");
936
            }
937
            this.bands.remove(band);
938
        }
939

    
940
        public boolean contains(int band){
941
            return (bands.contains(band));
942
        }
943

    
944
        /**
945
         * Return the band from the store in the index position
946
         *
947
         * @param index
948
         * @return
949
         */
950
        public int get(int index){
951
            return this.bands.get(index).intValue();
952
        }
953

    
954
        public RasterStore getStore() {
955
            return store;
956
        }
957

    
958
        public int size() {
959
            return bands.size();
960
        }
961

    
962
        /**
963
         * Return the BandDescriptor of the band in the index position.
964
         * @param index
965
         * @return
966
         */
967
        public BandDescriptor getBandDescriptor(int index) {
968
            return store.getBandDescriptor(bands.get(index));
969
        }
970

    
971
    }
972

    
973
    @Override
974
    public boolean isOwnBand(int band) {
975
        if(band < this.getProvider().getBands()){
976
            return true;
977
        }
978
        return false;
979
    }
980

    
981
    public DataStoreProviderFactory getFactory() {
982
        DataStoreProviderFactory factory = dataManager.getStoreProviderFactory(parameters.getDataStoreName());
983
        return factory;
984
    }
985

    
986
    @Override
987
    public BufferDimensions getDimensions() throws InitializeException {
988
        return this.getProvider().getDimensions();
989
    }
990

    
991
    @Override
992
    public boolean isTiled() {
993
        return this.provider.isTiled();
994
    }
995
}