/*
* Constellation - An open source and standard compliant SDI
* http://www.constellation-sdi.org
*
* Copyright 2014 Geomatys.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.constellation.provider.serverstore;
import org.apache.sis.storage.DataStore;
import org.apache.sis.storage.DataStoreException;
import org.constellation.api.DataType;
import org.constellation.provider.AbstractDataProvider;
import org.constellation.provider.Data;
import org.constellation.provider.DefaultCoverageData;
import org.constellation.provider.DefaultFeatureData;
import org.constellation.provider.ProviderFactory;
import org.geotoolkit.client.Client;
import org.geotoolkit.client.ClientFinder;
import org.geotoolkit.data.FeatureStore;
import org.geotoolkit.version.VersionControl;
import org.geotoolkit.version.VersioningException;
import org.opengis.parameter.GeneralParameterValue;
import org.opengis.parameter.ParameterValueGroup;
import java.util.Collections;
import java.util.Date;
import java.util.Set;
import java.util.logging.Level;
import org.geotoolkit.storage.coverage.CoverageReference;
import org.geotoolkit.storage.coverage.CoverageStore;
import org.opengis.util.GenericName;
/**
*
* @author Johann Sorel (Geomatys)
*/
public class ServerStoreProvider extends AbstractDataProvider{
private Client server;
private Set<GenericName> names;
public ServerStoreProvider(String providerId,ProviderFactory service, ParameterValueGroup param){
super(providerId,service,param);
}
@Override
public DataStore getMainStore() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public synchronized void reload() {
super.reload();
dispose();
//pameter is a choice of different types
//extract the first one
ParameterValueGroup param = getSource();
param = param.groups("choice").get(0);
ParameterValueGroup factoryconfig = null;
for(GeneralParameterValue val : param.values()){
if(val instanceof ParameterValueGroup){
factoryconfig = (ParameterValueGroup) val;
break;
}
}
if(factoryconfig == null){
getLogger().log(Level.WARNING, "No configuration for server store source.");
names = Collections.EMPTY_SET;
return;
}
try {
//create the store
server = ClientFinder.open(factoryconfig);
if(server == null){
throw new DataStoreException("Could not create server store for parameters : "+factoryconfig);
}
if(server instanceof FeatureStore){
names = ((FeatureStore)server).getNames();
}else if(server instanceof CoverageStore){
names = ((CoverageStore)server).getNames();
}else{
names = Collections.EMPTY_SET;
}
} catch (DataStoreException ex) {
names = Collections.EMPTY_SET;
getLogger().log(Level.WARNING, ex.getMessage(), ex);
}
}
@Override
public synchronized void dispose() {
super.dispose();
if(server != null){
server = null;
names = null;
}
}
@Override
public Set<GenericName> getKeys() {
if(names == null){
reload();
}
return names;
}
/**
* {@inheritDoc }
*/
@Override
public Data get(final GenericName key) {
return get(key, null);
}
/**
* {@inheritDoc }
*/
@Override
public Data get(GenericName key, Date version) {
key = fullyQualified(key);
if(!contains(key)){
return null;
}
if(server instanceof FeatureStore){
final FeatureStore store = (FeatureStore) server;
return new DefaultFeatureData(key, store, null, version);
}else if(server instanceof CoverageStore){
final CoverageStore store = (CoverageStore) server;
try {
if (store != null) {
CoverageReference coverageReference = null;
if (store.handleVersioning()) {
VersionControl control = store.getVersioning(key);
if (control.isVersioned() && version != null) {
coverageReference = store.getCoverageReference(key,control.getVersion(version));
}
}
if (coverageReference == null) {
coverageReference = store.getCoverageReference(key);
}
return new DefaultCoverageData(key, coverageReference);
}
} catch (DataStoreException ex) {
getLogger().log(Level.WARNING, ex.getMessage(), ex);
} catch (VersioningException ex) {
getLogger().log(Level.WARNING, ex.getMessage(), ex);
}
}
return null;
}
@Override
public DataType getDataType() {
if (server instanceof FeatureStore) {
return DataType.VECTOR;
} else if (server instanceof CoverageStore) {
return DataType.COVERAGE;
} else {
return null;
}
}
}