/* (c) 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.geogig.geoserver.web.repository; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Map; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.extensions.markup.html.repeater.util.SortParam; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.DefaultItemReuseStrategy; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.request.resource.PackageResourceReference; import org.geoserver.web.GeoServerBasePage; import org.geoserver.web.wicket.GeoServerDataProvider; import org.geoserver.web.wicket.GeoServerDataProvider.Property; import org.geoserver.web.wicket.GeoServerDialog; import org.geoserver.web.wicket.GeoServerTablePanel; import org.geoserver.web.wicket.ImageAjaxLink; import org.geoserver.web.wicket.ParamResourceModel; import org.geoserver.web.wicket.SimpleAjaxLink; public class ConfigListPanel extends GeoServerTablePanel<ConfigEntry> { private static final long serialVersionUID = 4583765525525250302L; private static final PackageResourceReference REMOVE_ICON = new PackageResourceReference( GeoServerBasePage.class, "img/icons/silk/delete.png"); private final ModalWindow popupWindow; private final GeoServerDialog dialog; private final ConfigProvider provider; private final FeedbackPanel pingFeedbackPanel; public ConfigListPanel(final String id, final Map<String, String> config) { super(id, new ConfigProvider(config), false); super.setFilterable(false); this.provider = (ConfigProvider) super.getDataProvider(); this.setOutputMarkupId(true); // set the reuse strategy, otherwise the list does not get updated when the popup window // closes this.setItemReuseStrategy(DefaultItemReuseStrategy.getInstance()); // the popup window for messages popupWindow = new ModalWindow("popupWindow"); add(popupWindow); add(dialog = new GeoServerDialog("dialog")); add(pingFeedbackPanel = new FeedbackPanel("feedback")); pingFeedbackPanel.setOutputMarkupId(true); } public void add(ConfigEntry config) { this.provider.getItems().add(config); } public Iterable<ConfigEntry> getConfigs() { return provider.getItems(); } @Override protected Component getComponentForProperty(String id, IModel<ConfigEntry> itemModel, Property<ConfigEntry> property) { if (property == ConfigProvider.NAME) { String key = (String) ConfigProvider.NAME.getModel(itemModel).getObject(); if (ConfigEntry.isRestricted(key)) { return new Label(id, key); } return nameLink(id, itemModel); } else if (property == ConfigProvider.VALUE) { String value = (String) ConfigProvider.VALUE.getModel(itemModel).getObject(); Label label = new Label(id, value); return label; } else if (property == ConfigProvider.REMOVELINK) { String key = (String) ConfigProvider.NAME.getModel(itemModel).getObject(); if (ConfigEntry.isRestricted(key)) { return new Label(id, "-"); } return removeLink(id, itemModel); } return null; } private Component nameLink(String id, IModel<ConfigEntry> itemModel) { IModel<?> nameModel = ConfigProvider.NAME.getModel(itemModel); SimpleAjaxLink<ConfigEntry> link = new SimpleAjaxLink<ConfigEntry>(id, itemModel, nameModel) { private static final long serialVersionUID = 3999079486003240692L; @Override public void onClick(AjaxRequestTarget target) { IModel<ConfigEntry> model = this.getModel(); ConfigListPanel table = ConfigListPanel.this; ConfigEditPanel editPanel = new ConfigEditPanel(popupWindow.getContentId(), model, popupWindow, table); popupWindow.setContent(editPanel); popupWindow.setTitle(new ResourceModel("ConfigEditPanel.title")); popupWindow.show(target); } }; return link; } protected Component removeLink(final String id, final IModel<ConfigEntry> itemModel) { return new ImageAjaxLink(id, REMOVE_ICON) { private static final long serialVersionUID = 4251171731728162708L; private final IModel<ConfigEntry> model = itemModel; @Override public void onClick(AjaxRequestTarget target) { GeoServerDialog dialog = ConfigListPanel.this.dialog; dialog.setTitle(new ParamResourceModel("ConfigListPanel.confirmRemoval.title", this)); dialog.showOkCancel(target, new GeoServerDialog.DialogDelegate() { private static final long serialVersionUID = -450822090965263894L; @Override protected Component getContents(String id) { return new ConfirmRemovePanel(id, model); } @Override protected boolean onSubmit(AjaxRequestTarget target, Component contents) { boolean closeConfirmDialog = true; final ConfigEntry config = model.getObject(); List<ConfigEntry> items = ConfigListPanel.this.provider.getItems(); items.remove(config); target.add(ConfigListPanel.this); return closeConfirmDialog; } @Override public void onClose(AjaxRequestTarget target) { target.add(ConfigListPanel.this); } }); } }; } static class ConfirmRemovePanel extends Panel { private static final long serialVersionUID = 653769682579422516L; public ConfirmRemovePanel(String id, IModel<ConfigEntry> config) { super(id); add(new Label("aboutRemoveMsg", new ParamResourceModel( "ConfigListPanel$ConfirmRemovePanel.aboutRemove", this, config.getObject() .getName()))); } } static class ConfigProvider extends GeoServerDataProvider<ConfigEntry> { private static final long serialVersionUID = 4883560661021761394L; static final Property<ConfigEntry> NAME = new BeanProperty<>("name", "name"); static final Property<ConfigEntry> VALUE = new BeanProperty<>("value", "value"); static final Property<ConfigEntry> REMOVELINK = new AbstractProperty<ConfigEntry>("remove") { private static final long serialVersionUID = 1L; @Override public Boolean getPropertyValue(ConfigEntry item) { return Boolean.TRUE; } @Override public boolean isSearchable() { return false; } }; final List<Property<ConfigEntry>> PROPERTIES = Arrays .asList(NAME, VALUE, REMOVELINK); private final List<ConfigEntry> config; public ConfigProvider(final Map<String, String> config) { this.config = ConfigEntry.fromConfig(config); } @Override protected List<ConfigEntry> getItems() { return config; } @Override protected List<Property<ConfigEntry>> getProperties() { return PROPERTIES; } @Override protected Comparator<ConfigEntry> getComparator(SortParam sort) { return super.getComparator(sort); } @Override public IModel<ConfigEntry> newModel(ConfigEntry object) { return new Model<>(object); } } }