/* (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.gwc.web.layer; import static org.geoserver.gwc.web.layer.UnconfiguredCachedLayersProvider.ENABLED; import static org.geoserver.gwc.web.layer.UnconfiguredCachedLayersProvider.NAME; import static org.geoserver.gwc.web.layer.UnconfiguredCachedLayersProvider.TYPE; import java.util.ArrayList; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.request.resource.PackageResourceReference; 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.image.Image; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.IModel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.StringResourceModel; import org.geoserver.catalog.LayerGroupInfo; import org.geoserver.catalog.LayerInfo; import org.geoserver.gwc.GWC; import org.geoserver.gwc.config.GWCConfig; import org.geoserver.gwc.layer.GeoServerTileLayer; import org.geoserver.gwc.web.GWCIconFactory; 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.ParamResourceModel; import org.geowebcache.layer.TileLayer; /** * A page that lists all {@link LayerInfo} and {@link LayerGroupInfo} that don't already have an * associated {@link GeoServerTileLayer} and allows to create a tile layer for each of one or in * bulk using the default settings. * * @author groldan */ public class NewCachedLayerPage extends GeoServerSecuredPage { private static final long serialVersionUID = 6458510742445385219L; private UnconfiguredCachedLayersProvider provider = new UnconfiguredCachedLayersProvider(); private GeoServerTablePanel<TileLayer> table; private GeoServerDialog dialog; private BulkCachedLayerConfigurationLink bulkConfig; private Label insaneDefaultsMessage; public NewCachedLayerPage() { table = new GeoServerTablePanel<TileLayer>("table", provider, true) { private static final long serialVersionUID = -5260899839139961722L; @Override protected Component getComponentForProperty(String id, IModel<TileLayer> itemModel, Property<TileLayer> property) { if (property == TYPE) { Fragment f = new Fragment(id, "iconFragment", NewCachedLayerPage.this); TileLayer layer = (TileLayer) itemModel.getObject(); PackageResourceReference layerIcon = (PackageResourceReference) property .getPropertyValue(layer); f.add(new Image("layerIcon", layerIcon)); return f; } else if (property == NAME) { return nameLink(id, itemModel); } else if (property == ENABLED) { TileLayer layerInfo = (TileLayer) itemModel.getObject(); boolean enabled = layerInfo.isEnabled(); PackageResourceReference icon; if (enabled) { icon = GWCIconFactory.getEnabledIcon(); } else { icon = GWCIconFactory.getDisabledIcon(); } Fragment f = new Fragment(id, "iconFragment", NewCachedLayerPage.this); f.add(new Image("layerIcon", icon)); return f; } throw new IllegalArgumentException("Don't know a property named " + property.getName()); } @Override protected void onSelectionUpdate(AjaxRequestTarget target) { updateBulkConfigLink(); target.add(bulkConfig); } }; table.setOutputMarkupId(true); add(table); // the confirm dialog add(dialog = new GeoServerDialog("dialog")); dialog.setInitialWidth(360); dialog.setInitialHeight(180); setHeaderPanel(headerPanel()); } private void updateBulkConfigLink() { int numSelected = table.getNumSelected(); GWCConfig defaults = GWC.get().getConfig(); boolean defaultsSane = defaults.isSane(); bulkConfig.setEnabled(defaultsSane && numSelected > 0); insaneDefaultsMessage.setVisible(!defaultsSane); } private Component nameLink(String id, IModel<TileLayer> itemModel) { Component link; link = new ConfigureCachedLayerAjaxLink(id, itemModel, NewCachedLayerPage.class); return link; } protected Component headerPanel() { Fragment header = new Fragment(HEADER_PANEL, "header", this); // the add button header.add(bulkConfig = new BulkCachedLayerConfigurationLink("bulkConfig")); bulkConfig.setOutputMarkupId(true); header.add(insaneDefaultsMessage = new Label("insaneDefaultsMessage", new ResourceModel( "bulkConfig.insaneDefaults"))); insaneDefaultsMessage.setOutputMarkupId(true); updateBulkConfigLink(); return header; } /** * A simple ajax link that asks for confirmation and configures all the selected layers and * layer groups using the {@link GWC#getConfig() default settings}. * */ private class BulkCachedLayerConfigurationLink extends AjaxLink<String> { private static final long serialVersionUID = 1L; public BulkCachedLayerConfigurationLink(String string) { super(string, new ResourceModel("NewCachedLayerPage.bulkConfig")); } @Override public void onClick(final AjaxRequestTarget target) { List<TileLayer> selection = NewCachedLayerPage.this.table.getSelection(); if (selection.isEmpty()) { return; } // use a list of name instead of selection so its serializable, to be used in // showOkCancel, and so we don't fetch the selection again final List<String> selectedNames = new ArrayList<String>(); for (TileLayer layer : selection) { selectedNames.add(layer.getName()); } dialog.setTitle(new ParamResourceModel("confirmBulkConfig.title", NewCachedLayerPage.this)); // if there is something to cancel, let's warn the user about what // could go wrong, and if the user accepts, let's delete what's needed dialog.showOkCancel(target, new GeoServerDialog.DialogDelegate() { private static final long serialVersionUID = 1L; @Override protected Component getContents(final String id) { // show a confirmation panel for all the objects we have to remove final Integer selectedLayerCount = selectedNames.size(); IModel<String> model = new StringResourceModel( "NewCachedLayerPage.confirmBulkConfig.message", BulkCachedLayerConfigurationLink.this).setParameters( new Object[] { selectedLayerCount.toString() }); Label confirmLabel = new Label(id, model); confirmLabel.setEscapeModelStrings(false);// allow some html inside, like // <b></b>, etc return confirmLabel; } @Override protected boolean onSubmit(final AjaxRequestTarget target, final Component contents) { GWC facade = GWC.get(); GWCConfig saneConfig = facade.getConfig().saneConfig(); saneConfig.setCacheLayersByDefault(true); facade.autoConfigureLayers(selectedNames, saneConfig); table.clearSelection(); return true; } @Override public void onClose(final AjaxRequestTarget target) { // if the selection has been cleared out it's sign a deletion // occurred, so refresh the table List<TileLayer> selection = table.getSelection(); if (selection.isEmpty()) { updateBulkConfigLink(); target.add(BulkCachedLayerConfigurationLink.this); target.add(table); } } }); } }; }