/* (c) 2015 - 2016 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.gwc.web.blob;
import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.basic.MultiLineLabel;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.geoserver.gwc.GWC;
import org.geoserver.web.CatalogIconFactory;
import org.geoserver.web.GeoServerSecuredPage;
import org.geoserver.web.wicket.GeoServerDataProvider.Property;
import org.geoserver.web.wicket.GeoServerDialog;
import org.geoserver.web.wicket.GeoServerTablePanel;
import org.geoserver.web.wicket.Icon;
import org.geoserver.web.wicket.ParamResourceModel;
import org.geoserver.web.wicket.SimpleAjaxLink;
import org.geowebcache.config.BlobStoreConfig;
import org.geowebcache.config.ConfigurationException;
import org.geowebcache.layer.TileLayer;
/**
*
* Panel with table of all blobstores.
*
* @author Niels Charlier
*
*/
public class BlobStoresPage extends GeoServerSecuredPage {
private static final long serialVersionUID = 6076989713813458347L;
private AjaxLink<Object> remove;
private GeoServerTablePanel<BlobStoreConfig> blobStoresPanel;
private GeoServerDialog dialog;
public BlobStoresPage() {
add(dialog = new GeoServerDialog("confirmDeleteDialog"));
dialog.setTitle(new ParamResourceModel("confirmDeleteDialog.title", getPage()));
dialog.setInitialHeight(200);
Fragment header = new Fragment(HEADER_PANEL, "header", this);
// the add button
header.add(new AjaxLink<Object>("addNew") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
setResponsePage(new BlobStorePage());
}
});
// the removal button
header.add(remove = new AjaxLink<Object>("removeSelected") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
final Set<String> ids = new HashSet<String>();
final List<String> assignedLayers = new ArrayList<String>();
for (BlobStoreConfig config : blobStoresPanel.getSelection()) {
if (config.isDefault()) {
error(new ParamResourceModel("deleteError", getPage()).getString());
target.add(feedbackPanel);
return;
}
ids.add(config.getId());
}
for (TileLayer layer : GWC.get().getTileLayers()) {
if (layer.getBlobStoreId() != null) {
if (ids.contains(layer.getBlobStoreId())) {
assignedLayers.add(layer.getName());
}
}
}
if (assignedLayers.size() > 0) {
dialog.showOkCancel(target, new GeoServerDialog.DialogDelegate() {
private static final long serialVersionUID = 5257987095800108993L;
private String error = null;
@Override
protected Component getContents(String id) {
StringBuilder sb = new StringBuilder();
sb.append(new ParamResourceModel("confirmDeleteDialog.content",
getPage()).getString());
for (String layerName : assignedLayers) {
sb.append("\n ");
sb.append(escapeHtml(layerName));
}
return new MultiLineLabel("userPanel", sb.toString())
.setEscapeModelStrings(false);
}
@Override
protected boolean onSubmit(AjaxRequestTarget target, Component contents) {
try {
GWC.get().removeBlobStores(ids);
for (String layerName : assignedLayers) {
TileLayer layer = GWC.get().getTileLayerByName(layerName);
layer.setBlobStoreId(null);
GWC.get().save(layer);
}
} catch (ConfigurationException e) {
error = e.getMessage();
}
return true;
}
@Override
public void onClose(AjaxRequestTarget target) {
if (error != null) {
error(error);
target.add(feedbackPanel);
} else {
target.add(blobStoresPanel);
}
}
});
} else {
try {
GWC.get().removeBlobStores(ids);
} catch (ConfigurationException e) {
error(e.toString());
target.add(feedbackPanel);
}
target.add(blobStoresPanel);
}
}
});
remove.setOutputMarkupId(true);
remove.setEnabled(false);
setHeaderPanel(header);
// the panel
add(blobStoresPanel = new GeoServerTablePanel<BlobStoreConfig>("storesPanel",
new BlobStoresProvider(), true) {
private static final long serialVersionUID = -5380703588873422601L;
@Override
protected Component getComponentForProperty(String id, IModel<BlobStoreConfig> itemModel,
Property<BlobStoreConfig> property) {
final BlobStoreConfig blobStore = (BlobStoreConfig) itemModel.getObject();
if (property == BlobStoresProvider.ID) {
return new SimpleAjaxLink<BlobStoreConfig>(id, itemModel, property.getModel(itemModel)) {
private static final long serialVersionUID = 1L;
@Override
protected void onClick(AjaxRequestTarget target) {
setResponsePage(new BlobStorePage(blobStore));
}
};
} else if (property == BlobStoresProvider.DEFAULT) {
if (blobStore.isDefault()) {
return new Icon(id, CatalogIconFactory.ENABLED_ICON);
} else {
return new Label(id, "");
}
} else if (property == BlobStoresProvider.ENABLED) {
if (blobStore.isEnabled()) {
return new Icon(id, CatalogIconFactory.ENABLED_ICON);
} else {
return new Label(id, "");
}
} else if (property == BlobStoresProvider.TYPE) {
return new Label(id, BlobStoreTypes.getFromClass(blobStore.getClass()).toString());
}
return null;
}
@Override
protected void onSelectionUpdate(AjaxRequestTarget target) {
remove.setEnabled(blobStoresPanel.getSelection().size() > 0);
target.add(remove);
}
});
blobStoresPanel.setOutputMarkupId(true);
}
}