/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2012, 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.sql;
import java.awt.Image;
import java.util.HashSet;
import java.util.Set;
import org.apache.sis.storage.DataStoreException;
import org.geotoolkit.storage.coverage.AbstractCoverageReference;
import org.geotoolkit.storage.coverage.AbstractCoverageStore;
import org.geotoolkit.storage.coverage.CoverageReference;
import org.geotoolkit.storage.coverage.CoverageStoreContentEvent;
import org.geotoolkit.storage.coverage.CoverageStoreFactory;
import org.geotoolkit.storage.coverage.CoverageStoreManagementEvent;
import org.geotoolkit.storage.coverage.CoverageType;
import org.geotoolkit.coverage.io.CoverageStoreException;
import org.geotoolkit.coverage.io.GridCoverageReader;
import org.geotoolkit.coverage.io.GridCoverageWriter;
import org.geotoolkit.util.NamesExt;
import org.geotoolkit.storage.DataNode;
import org.geotoolkit.storage.DataStores;
import org.geotoolkit.storage.DefaultDataNode;
import org.geotoolkit.storage.StorageListener;
import org.geotoolkit.version.Version;
import org.geotoolkit.version.VersionControl;
import org.geotoolkit.version.VersioningException;
import org.opengis.util.GenericName;
import org.opengis.parameter.ParameterValueGroup;
/**
* Wrap a coverage-sql database as a CoverageStore.
* TODO : temporary binding waiting for CoverageStore interface to be revisited
* and integrated in geotk.
*
* @author Johann Sorel (Geomatys)
* @module
*/
public class CoverageSQLStore extends AbstractCoverageStore {
private final CoverageDatabase db;
private final Set<StorageListener> listeners = new HashSet<StorageListener>();
private static ParameterValueGroup adaptParameter(ParameterValueGroup parameters){
final ParameterValueGroup params = CoverageDatabase.PARAMETERS.createValue();
final StringBuilder url = new StringBuilder("jdbc:postgresql://");
url.append(parameters.parameter("host").getValue());
url.append(':');
url.append(parameters.parameter("port").getValue());
url.append('/');
url.append(parameters.parameter("database").getValue());
params.parameter("URL").setValue(url.toString());
if(parameters.parameter("user")!=null){
params.parameter("user").setValue(parameters.parameter("user").getValue());
}
if(parameters.parameter("password")!=null){
params.parameter("password").setValue(parameters.parameter("password").getValue());
}
if(parameters.parameter("schema")!=null){
params.parameter("schema").setValue(parameters.parameter("schema").getValue());
}
if(parameters.parameter("rootDirectory")!=null){
params.parameter("rootDirectory").setValue(parameters.parameter("rootDirectory").getValue());
}
return params;
}
public CoverageSQLStore(ParameterValueGroup parameters) {
super(adaptParameter(parameters));
this.db = new CoverageDatabase(getConfiguration());
}
@Override
public CoverageStoreFactory getFactory() {
return (CoverageStoreFactory) DataStores.getFactoryById(CoverageSQLStoreFactory.NAME);
}
@Override
public CoverageType getType() {
return CoverageType.GRID;
}
@Override
public DataNode getRootNode() throws DataStoreException {
final DataNode dn = new DefaultDataNode();
final Set<String> layers = db.getLayers().result();
for (String layer : layers) {
dn.getChildren().add(new CoverageSQLLayerReference(NamesExt.create(layer)));
}
return dn;
}
@Override
public boolean handleVersioning() {
return false;
}
@Override
public VersionControl getVersioning(GenericName typeName) throws VersioningException {
throw new VersioningException("Versioning not supported");
}
@Override
public CoverageReference getCoverageReference(GenericName name, Version version) throws DataStoreException {
throw new DataStoreException("Versioning not supported");
}
@Override
public CoverageReference create(GenericName name) throws DataStoreException {
throw new DataStoreException("Not supported.");
}
@Override
public void delete(GenericName name) throws DataStoreException {
throw new DataStoreException("Not supported.");
}
@Override
public void close() throws DataStoreException {
db.dispose();
}
////////////////////////////////////////////////////////////////////////////
// listeners methods ///////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/**
* {@inheritDoc }
*/
@Override
public void addStorageListener(final StorageListener listener) {
synchronized (listeners) {
listeners.add(listener);
}
}
/**
* {@inheritDoc }
*/
@Override
public void removeStorageListener(final StorageListener listener) {
synchronized (listeners) {
listeners.remove(listener);
}
}
/**
* Forward a structure event to all listeners.
* @param event , event to send to listeners.
*/
protected void sendEvent(final CoverageStoreManagementEvent event){
final StorageListener[] lst;
synchronized (listeners) {
lst = listeners.toArray(new StorageListener[listeners.size()]);
}
for(final StorageListener listener : lst){
listener.structureChanged(event);
}
}
/**
* Forward a data event to all listeners.
* @param event , event to send to listeners.
*/
protected void sendEvent(final CoverageStoreContentEvent event){
final StorageListener[] lst;
synchronized (listeners) {
lst = listeners.toArray(new StorageListener[listeners.size()]);
}
for(final StorageListener listener : lst){
listener.contentChanged(event);
}
}
private class CoverageSQLLayerReference extends AbstractCoverageReference {
private CoverageSQLLayerReference(GenericName name) {
super(CoverageSQLStore.this,name);
}
@Override
public int getImageIndex() {
return 0;
}
@Override
public boolean isWritable() {
return false;
}
@Override
public GridCoverageReader acquireReader() throws CoverageStoreException {
final LayerCoverageReader reader = CoverageSQLStore.this.db.createGridCoverageReader(name.tip().toString());
return reader;
}
@Override
public GridCoverageWriter acquireWriter() throws CoverageStoreException {
throw new CoverageStoreException("Coverage is not writable.");
}
@Override
public Image getLegend() throws DataStoreException {
return null;
}
}
}