/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.web.data.store;
import java.io.IOException;
import java.util.logging.Level;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.form.Form;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.DataStoreInfo;
import org.geoserver.catalog.NamespaceInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.web.data.layer.NewLayerPage;
import org.geotools.data.DataAccess;
import org.geotools.util.NullProgressListener;
import org.opengis.feature.Feature;
import org.opengis.feature.type.FeatureType;
/**
* Provides a form to configure a new geotools {@link DataAccess}
*
* @author Gabriel Roldan
*/
public class DataAccessNewPage extends AbstractDataAccessPage {
private static final long serialVersionUID = 1L;
/**
* Creates a new datastore configuration page to create a new datastore of the given type
*
* @param the
* workspace to attach the new datastore to, like in {@link WorkspaceInfo#getId()}
*
* @param dataStoreFactDisplayName
* the type of datastore to create, given by its factory display name
*/
public DataAccessNewPage(final String dataStoreFactDisplayName) {
super();
final WorkspaceInfo defaultWs = getCatalog().getDefaultWorkspace();
if (defaultWs == null) {
throw new IllegalStateException("No default Workspace configured");
}
final NamespaceInfo defaultNs = getCatalog().getDefaultNamespace();
if (defaultNs == null) {
throw new IllegalStateException("No default Namespace configured");
}
// Param[] parametersInfo = dsFact.getParametersInfo();
// for (int i = 0; i < parametersInfo.length; i++) {
// Serializable value;
// final Param param = parametersInfo[i];
// if (param.sample == null || param.sample instanceof Serializable) {
// value = (Serializable) param.sample;
// } else {
// value = String.valueOf(param.sample);
// }
// }
DataStoreInfo info = getCatalog().getFactory().createDataStore();
info.setWorkspace(defaultWs);
info.setEnabled(true);
info.setType(dataStoreFactDisplayName);
initUI(info);
}
/**
* Callback method called when the submit button have been pressed and the parameters validation
* has succeed.
*
* @param paramsForm
* the form to report any error to
* @see AbstractDataAccessPage#onSaveDataStore(Form)
*/
@Override
protected final void onSaveDataStore(final DataStoreInfo info, AjaxRequestTarget target)
throws IllegalArgumentException {
if(!storeEditPanel.onSave()) {
return;
}
final Catalog catalog = getCatalog();
// Cloning into "expandedStore" through the super class "clone" method
DataStoreInfo expandedStore = catalog.getResourcePool().clone(info, true);
DataAccess<? extends FeatureType, ? extends Feature> dataStore;
try {
// REVISIT: this may need to be done after saving the DataStoreInfo
dataStore = expandedStore.getDataStore(new NullProgressListener());
dataStore.dispose();
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Error obtaining new data store", e);
String message = e.getMessage();
if (message == null && e.getCause() != null) {
message = e.getCause().getMessage();
}
throw new IllegalArgumentException(
"Error creating data store, check the parameters. Error message: " + message);
}
DataStoreInfo savedStore = catalog.getResourcePool().clone(info, true);
try {
// GeoServer Env substitution; validate first
catalog.validate(savedStore, true).throwIfInvalid();
// save a copy, so if NewLayerPage fails we can keep on editing this one without being
// proxied
// GeoServer Env substitution; force to *AVOID* resolving env placeholders...
savedStore = catalog.getResourcePool().clone(info, false);
// ...and save
catalog.add(savedStore);
} catch (Exception e) {
LOGGER.log(Level.WARNING, "Error adding data store to catalog", e);
String message = e.getMessage();
if (message == null && e.getCause() != null) {
message = e.getCause().getMessage();
}
throw new IllegalArgumentException(
"Error creating data store with the provided parameters: " + message);
}
final NewLayerPage newLayerPage;
try {
// The ID is assigned by the catalog and therefore cannot be cloned
newLayerPage = new NewLayerPage(savedStore.getId());
} catch (RuntimeException e) {
try {
catalog.remove(expandedStore);
catalog.remove(savedStore);
} catch (Exception removeEx) {
LOGGER.log(Level.WARNING, "Error removing just added datastore!", e);
}
throw new IllegalArgumentException(e.getMessage(), e);
}
setResponsePage(newLayerPage);
}
}