/* (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; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponentPanel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.apache.wicket.util.string.Strings; import org.geoserver.gwc.GWC; import org.geoserver.gwc.config.GWCConfig; import org.geoserver.gwc.web.gridset.GridSetListTablePanel; import org.geoserver.gwc.web.gridset.GridSetTableProvider; import org.geoserver.web.wicket.GeoServerAjaxFormLink; import org.geoserver.web.wicket.GeoServerDataProvider.Property; import org.geoserver.web.wicket.Icon; import org.geoserver.web.wicket.ImageAjaxLink; import org.geowebcache.grid.GridSet; import org.geowebcache.grid.GridSetBroker; /** * Form component that edits the default {@link GWCConfig#getDefaultCachingGridSetIds() cached * gridsets} for {@link CachingOptionsPanel}. * * @author groldan * */ class DefaultGridsetsEditor extends FormComponentPanel<Set<String>> { private static final long serialVersionUID = 5098470663723800345L; private final IModel<? extends List<String>> selection; private DefaultGridSetsTable defaultGridsetsTable; private final DropDownChoice<String> availableGridSets; private class DefaultGridSetsTable extends GridSetListTablePanel { private static final long serialVersionUID = -3301795024743630393L; public DefaultGridSetsTable(String id, GridSetTableProvider provider) { super(id, provider, false); setOutputMarkupId(true); setPageable(false); setFilterable(false); } @Override protected Component nameLink(final String id, final GridSet gridSet) { Label label = new Label(id, gridSet.getName()); label.add(new AttributeModifier("title", new Model<String>(gridSet .getDescription()))); return label; } @Override protected Component actionLink(final String id, String gridSetName) { @SuppressWarnings("rawtypes") Component removeLink = new ImageAjaxLink(id, GWCIconFactory.DELETE_ICON) { private static final long serialVersionUID = 1L; /** * Removes the selected item from the provider's model */ @Override protected void onClick(AjaxRequestTarget target) { final String gridsetName = getDefaultModelObjectAsString(); List<String> selection = DefaultGridsetsEditor.this.selection.getObject(); selection.remove(gridsetName); List<String> choices = new ArrayList<String>(availableGridSets.getChoices()); choices.add(gridsetName); Collections.sort(choices); availableGridSets.setChoices(choices); target.add(defaultGridsetsTable); target.add(availableGridSets); } }; removeLink.setDefaultModel(new Model<String>(gridSetName)); return removeLink; } @Override protected Component getComponentForProperty(String id, IModel<GridSet> itemModel, Property<GridSet> property) { // Property objects are package access, so we can't statically reference them here // see org.geoserver.gwc.web.gridset.ACTION_LINK final String propertyName = property.getName(); // the Remove link property name is the empty string. If that is the property name, // return the actionLink here. if (Strings.isEmpty(propertyName)) { return actionLink(id, itemModel.getObject().getName()); } return null; } } public DefaultGridsetsEditor(final String id, final IModel<Set<String>> model) { super(id, model); selection = new Model<ArrayList<String>>(new ArrayList<String>(model.getObject())); GridSetTableProvider provider = new GridSetTableProvider() { private static final long serialVersionUID = 1L; @Override public List<GridSet> getItems() { GridSetBroker gridSetBroker = GWC.get().getGridSetBroker(); List<String> list = selection.getObject(); List<GridSet> gridsets = new ArrayList<GridSet>(list.size()); for (String id : list) { GridSet gridSet = gridSetBroker.get(id); if (gridSet != null) { gridsets.add(gridSet); } } return gridsets; } }; defaultGridsetsTable = new DefaultGridSetsTable("table", provider); add(defaultGridsetsTable); IModel<List<String>> availableModel = new LoadableDetachableModel<List<String>>() { private static final long serialVersionUID = 1L; @Override protected List<String> load() { List<String> gridSetNames = new ArrayList<String>(GWC.get().getGridSetBroker() .getNames()); for (String gsId : selection.getObject()) { gridSetNames.remove(gsId); } Collections.sort(gridSetNames); return gridSetNames; } }; availableGridSets = new DropDownChoice<String>("availableGridsets", new Model<String>(), availableModel); availableGridSets.setOutputMarkupId(true); add(availableGridSets); GeoServerAjaxFormLink addGridsubsetLink = new GeoServerAjaxFormLink("addGridset") { private static final long serialVersionUID = 1L; @Override protected void onClick(AjaxRequestTarget target, Form<?> form) { availableGridSets.processInput(); final String selectedGridset = availableGridSets.getModelObject(); if (null == selectedGridset) { return; } List<String> choices = new ArrayList<String>(availableGridSets.getChoices()); choices.remove(selectedGridset); availableGridSets.setChoices(choices); availableGridSets.setEnabled(!choices.isEmpty()); List<String> selectedIds = selection.getObject(); selectedIds.add(selectedGridset); // Execute setPageable() in order to re-create the inner record list updated. defaultGridsetsTable.setPageable(false); target.add(defaultGridsetsTable); target.add(availableGridSets); } }; addGridsubsetLink.add(new Icon("addIcon", GWCIconFactory.ADD_ICON)); add(addGridsubsetLink); } @Override public void convertInput() { List<String> defaultGridsetIds = selection.getObject(); Set<String> convertedInput = new HashSet<String>(); convertedInput.addAll(defaultGridsetIds); setConvertedInput(convertedInput); } /** */ @Override protected void onBeforeRender() { super.onBeforeRender(); } }