/*
* 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.gui.service;
import org.apache.sis.util.logging.Logging;
import org.constellation.ServiceDef.Specification;
import org.constellation.admin.service.ConstellationServer;
import org.constellation.configuration.DataBrief;
import org.constellation.configuration.ProviderReport;
import org.constellation.configuration.ProviderServiceReport;
import org.constellation.configuration.ProvidersReport;
import org.constellation.dto.AddLayer;
import org.constellation.dto.DataInformation;
import org.constellation.dto.DataMetadata;
import org.constellation.dto.Database;
import org.constellation.dto.FileBean;
import org.constellation.dto.MetadataLists;
import org.constellation.dto.ParameterValues;
import org.constellation.gui.service.bean.LayerData;
import org.opengis.parameter.ParameterDescriptorGroup;
import org.opengis.parameter.ParameterValueGroup;
import javax.inject.Inject;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Juzu service to call constellation services server side about providers
*
* @author Benjamin Garcia (Geomatys)
* @version 0.9
* @since 0.9
*/
public class ProviderManager {
private static final Logger LOGGER = Logging.getLogger("org.constellation.gui.service");
/**
* Constellation manager used to communicate with the Constellation server.
*/
@Inject
private ConstellationService cstl;
/**
* @param type
* @param identifier
* @param path
* @param database
*/
public void createProvider(final String type, final String identifier, final String path, final String dataType, final Database database, final String subType) {
final ConstellationServer cs = cstl.openServer(true);
final ParameterDescriptorGroup serviceDesc = (ParameterDescriptorGroup) cs.providers.getServiceDescriptor(type);
final ParameterDescriptorGroup sourceDesc = (ParameterDescriptorGroup) serviceDesc.descriptor("source");
final ParameterValueGroup sources = sourceDesc.createValue();
sources.parameter("id").setValue(identifier);
sources.parameter("providerType").setValue(dataType);
String folderPath;
switch (type) {
case "sld":
folderPath = path.substring(0, path.lastIndexOf('/'));
sources.groups("sldFolder").get(0).parameter("path").setValue(folderPath);
break;
case "feature-store":
final URL url;
if (path != null) {
try {
url = new URL("file:" + path);
ParameterValueGroup shapeFileParametersFolder = sources.groups("choice").get(0).addGroup("ShapeFileParametersFolder");
shapeFileParametersFolder.parameter("url").setValue(url);
shapeFileParametersFolder.parameter("namespace").setValue("no namespace");
} catch (MalformedURLException e) {
LOGGER.log(Level.WARNING, "", e);
}
} else {
//database connection
ParameterValueGroup postGresParametersFolder = sources.groups("choice").get(0).addGroup("PostgresParameters");
int port = Integer.parseInt(database.getPort());
postGresParametersFolder.parameter("identifier").setValue("postgresql");
postGresParametersFolder.parameter("host").setValue(database.getHost());
postGresParametersFolder.parameter("port").setValue(port);
postGresParametersFolder.parameter("user").setValue(database.getLogin());
postGresParametersFolder.parameter("password").setValue(database.getPassword());
postGresParametersFolder.parameter("database").setValue(database.getName());
postGresParametersFolder.parameter("simple types").setValue(true);
}
break;
case "coverage-store":
URL fileUrl = null;
switch (subType) {
case "coverage-xml-pyramid":
try {
fileUrl = URI.create(path).toURL();
} catch (MalformedURLException e) {
LOGGER.log(Level.WARNING, "unnable to create url from path", e);
}
ParameterValueGroup xmlCoverageStoreParameters = sources.groups("choice").get(0).addGroup("XMLCoverageStoreParameters");
xmlCoverageStoreParameters.parameter("identifier").setValue("coverage-xml-pyramid");
xmlCoverageStoreParameters.parameter("path").setValue(fileUrl);
xmlCoverageStoreParameters.parameter("type").setValue("AUTO");
break;
case "coverage-file":
try {
fileUrl = URI.create("file:"+path).toURL();
} catch (MalformedURLException e) {
LOGGER.log(Level.WARNING, "unnable to create url from path", e);
}
ParameterValueGroup fileCoverageStoreParameters = sources.groups("choice").get(0).addGroup("FileCoverageStoreParameters");
fileCoverageStoreParameters.parameter("identifier").setValue("coverage-file");
fileCoverageStoreParameters.parameter("path").setValue(fileUrl);
fileCoverageStoreParameters.parameter("type").setValue("AUTO");
fileCoverageStoreParameters.parameter("namespace").setValue("no namespace");
break;
case "pgraster":
ParameterValueGroup postGresParametersFolder = sources.groups("choice").get(0).addGroup("PGRasterParameters");
int port = Integer.parseInt(database.getPort());
postGresParametersFolder.parameter("identifier").setValue("postgresql");
postGresParametersFolder.parameter("host").setValue(database.getHost());
postGresParametersFolder.parameter("port").setValue(port);
postGresParametersFolder.parameter("user").setValue(database.getLogin());
postGresParametersFolder.parameter("password").setValue(database.getPassword());
postGresParametersFolder.parameter("database").setValue(database.getName());
postGresParametersFolder.parameter("simple types").setValue(true);
break;
default:
LOGGER.log(Level.WARNING, "error on subtype definition");
}
default:
if (LOGGER.isLoggable(Level.FINER)) {
LOGGER.log(Level.FINER, "Provider type not known");
}
}
cs.providers.createProvider(type, sources);
}
/**
* @param providerTypes
* @return
*/
public List<LayerData> getDataListing(final List<String> providerTypes) {
final List<LayerData> layerDatas = new ArrayList<>(0);
final ProvidersReport report = cstl.openServer(true).providers.listProviders();
for (ProviderServiceReport providerServiceReport : report.getProviderServices()) {
for (ProviderReport providerReport : providerServiceReport.getProviders()) {
String type = providerReport.getAbstractType();
if (providerTypes!=null && providerTypes.contains(type)) {
for (DataBrief dataBrief : providerReport.getItems()) {
String name = dataBrief.getName();
LayerData layerData = new LayerData(providerReport.getId(), type, name, dataBrief.getDate(), dataBrief.getOwner(), dataBrief.getNamespace());
layerDatas.add(layerData);
}
}
}
}
return layerDatas;
}
public void addLayer(final AddLayer toAddLayer) {
try {
cstl.openClient().services.addLayer(Specification.fromShortName(toAddLayer.getServiceType()),
toAddLayer.getServiceId(), toAddLayer);
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Error when try to add layer on service", e);
}
}
/**
* ask server to a specific folder
*
* @param path folder search; if "/", it will be root from data_directory configuration.
* @return folder child list name
*/
public List<FileBean> getDataFolder(final String path) {
try {
return cstl.openClient().providers.getDataFolder(path);
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Error when try to get subfolder list", e);
}
return new ArrayList<>(0);
}
public DataInformation loadData(final String filePath, final String metadataFilePath, final String dataType) {
try {
return cstl.openClient().providers.loadData(filePath, metadataFilePath, dataType);
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Error when try to found data on file", e);
}
return new DataInformation();
}
public MetadataLists getMetadataCodeLists(final String locale) {
try {
return cstl.openClient().providers.getMetadataCodeLists(locale);
} catch (IOException e) {
LOGGER.log(Level.WARNING, "MetadataCodeList service isn't accessible", e);
}
return null;
}
public void saveISO19115Metadata(final DataMetadata metadataToSave) {
try {
cstl.openClient().providers.saveISO19115Metadata(metadataToSave);
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Unable to access to service to save metadata", e);
}
}
public void pyramidData(final String name, final String path) {
try {
cstl.openClient().providers.pyramidData(name, path);
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Error when ask pyramidal data ", e);
}
}
public ParameterValues getCoverageList(final String providerId) {
try {
return cstl.openClient().providers.getCoverageList(providerId);
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Error when call web service to find coverage list", e);
}
return null;
}
public void saveCRSModifications(final Map<String, String> dataCRSModified, final String providerId) {
dataCRSModified.put("providerId", providerId);
final ParameterValues values = new ParameterValues(dataCRSModified);
try {
cstl.openClient().providers.saveCRSModification(values);
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Error when call web service to save CRS modifications", e);
}
}
public DataBrief getDataSummary(final String name, final String namespace, final String providerId) {
try {
return cstl.openClient().providers.getDataSummary(name, namespace, providerId);
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Error when call web service to access to data summary", e);
}
return null;
}
public DataBrief getLayerSummary(final String layerAlias, final String providerId) {
try {
return cstl.openClient().providers.getLayerSummary(layerAlias, providerId);
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Error when call web service to access to data summary", e);
}
return null;
}
public DataInformation getMetadata(final String providerId, final String dataId, final String dataType) {
try {
return cstl.openClient().providers.getMetadata(providerId, dataId, dataType);
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Error when call web service to get metadata from a layer", e);
}
return null;
}
}