/*
* Geotoolkit.org - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2015, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotoolkit.coverage.amended;
import org.apache.sis.storage.DataStoreException;
import org.geotoolkit.storage.DataNode;
import org.geotoolkit.storage.DataStoreFactory;
import org.geotoolkit.storage.coverage.AbstractCoverageStore;
import org.geotoolkit.storage.coverage.CoverageReference;
import org.geotoolkit.storage.coverage.CoverageStore;
import org.geotoolkit.storage.coverage.CoverageStoreContentEvent;
import org.geotoolkit.storage.coverage.CoverageStoreListener;
import org.geotoolkit.storage.coverage.CoverageStoreManagementEvent;
import org.geotoolkit.storage.coverage.CoverageType;
import org.geotoolkit.storage.coverage.PyramidalCoverageReference;
import org.geotoolkit.version.Version;
import org.geotoolkit.version.VersionControl;
import org.geotoolkit.version.VersioningException;
import org.opengis.metadata.Metadata;
import org.opengis.parameter.ParameterValueGroup;
import org.opengis.util.GenericName;
/**
* Decorates a coverage store adding possibility to override properties of each coverage reference.
* <br>
* <br>
* List of properties which can be override : <br>
* <ul>
* <li>CRS</li>
* <li>GridToCRS</li>
* <li>PixelInCell</li>
* <li>Sample dimensions</li>
* </ul>
*
*
* @author Johann Sorel (Geomatys)
*/
public class AmendedCoverageStore extends AbstractCoverageStore{
protected final CoverageStore store;
protected AmendedDataNode root;
/**
*
* @param store wrapped store
*/
public AmendedCoverageStore(CoverageStore store) {
super(store.getConfiguration());
this.store = store;
store.addStorageListener(new CoverageStoreListener() {
@Override
public void structureChanged(CoverageStoreManagementEvent event) {
sendStructureEvent(event.copy(this));
}
@Override
public void contentChanged(CoverageStoreContentEvent event) {
sendContentEvent(event.copy(this));
}
});
}
/**
* {@inheritDoc }
*/
@Override
public ParameterValueGroup getConfiguration() {
return store.getConfiguration();
}
/**
* {@inheritDoc }
*/
@Override
public DataStoreFactory getFactory() {
return store.getFactory();
}
/**
* {@inheritDoc }
*/
@Override
public synchronized DataNode getRootNode() throws DataStoreException {
if(root==null){
root = new AmendedDataNode(store.getRootNode(), this);
}
return root;
}
/**
* {@inheritDoc }
*/
@Override
public boolean handleVersioning() {
return store.handleVersioning();
}
/**
* {@inheritDoc }
*/
@Override
public VersionControl getVersioning(GenericName typeName) throws VersioningException {
return store.getVersioning(typeName);
}
/**
* {@inheritDoc }
*/
@Override
public CoverageReference getCoverageReference(GenericName name, Version version) throws DataStoreException {
final CoverageReference cr = (version==null) ? store.getCoverageReference(name) :store.getCoverageReference(name, version);
if(cr instanceof PyramidalCoverageReference){
return new AmendedCoverageReference(cr, store);
}else{
return new AmendedCoverageReference(cr, store);
}
}
/**
* {@inheritDoc }
*/
@Override
public CoverageReference create(GenericName name) throws DataStoreException {
final CoverageReference cr = store.create(name);
if(cr instanceof PyramidalCoverageReference){
return new AmendedCoverageReference(cr, store);
}else{
return new AmendedCoverageReference(cr, store);
}
}
/**
* {@inheritDoc }
*/
@Override
public CoverageType getType() {
return store.getType();
}
/**
* {@inheritDoc }
*/
@Override
public void delete(GenericName name) throws DataStoreException {
store.delete(name);
}
/**
* {@inheritDoc }
*/
@Override
public Metadata getMetadata() throws DataStoreException {
return store.getMetadata();
}
/**
* {@inheritDoc }
*/
@Override
public void close() throws DataStoreException {
store.close();
}
}