org.geogig.geoserver.web.repository.ConfigListPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.geogig.geoserver.web.repository.ConfigListPanel.java

Source

/* (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);
        }
    }

}