/* (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.wms.web.data; import java.util.Arrays; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.IModel; import org.geoserver.catalog.LayerInfo; import org.geoserver.catalog.StyleInfo; import org.geoserver.web.wicket.GeoServerDataProvider; import org.geoserver.web.wicket.GeoServerDataProvider.Property; import org.geoserver.web.wicket.GeoServerTablePanel; /** * Style page tab for configuring style-layer associations. * Lists all layers, and allows setting the current style as the default style for each layer, or * as an associated style. */ public class LayerAssociationPanel extends StyleEditTabPanel { private static final long serialVersionUID = -59522993086560769L; private class LayerProvider extends GeoServerDataProvider<LayerInfo> { private static final long serialVersionUID = -1800971869092748431L; @Override public List<LayerInfo> getItems() { return getStylePage().getCatalog().getLayers(); } Property<LayerInfo> workspace = new AbstractProperty<LayerInfo>("Workspace") { private static final long serialVersionUID = -1851109132536014276L; @Override public Object getPropertyValue(LayerInfo x) { return x.getResource().getStore().getWorkspace().getName(); } }; Property<LayerInfo> layer = new AbstractProperty<LayerInfo>("Layer") { private static final long serialVersionUID = -1041914399204405146L; @Override public Object getPropertyValue(LayerInfo x) { return x.getName(); } }; Property<LayerInfo> defaultStyle = new AbstractProperty<LayerInfo>("Default") { @Override public Object getPropertyValue(LayerInfo x) { return defaultEditedStyle(x); } }; Property<LayerInfo> associatedStyle = new AbstractProperty<LayerInfo>("Associated") { private static final long serialVersionUID = 890930107903888545L; @Override public Object getPropertyValue(LayerInfo x) { return usesEditedStyle(x); } }; @Override public List<Property<LayerInfo>> getProperties() { return Arrays.asList(workspace, layer, defaultStyle, associatedStyle); } } protected Boolean usesEditedStyle(LayerInfo l) { for (StyleInfo s : l.getStyles()) { if (s.getName().equals(getStylePage().getStyleInfo().getName())) return true; } return false; } protected Boolean defaultEditedStyle(LayerInfo l) { StyleInfo s = l.getDefaultStyle(); if (s != null) { return s.getName().equals(getStylePage().getStyleInfo().getName()); } return false; } public LayerAssociationPanel(String id, AbstractStylePage parent) { super(id, parent); final LayerProvider layerProvider = new LayerProvider(); GeoServerTablePanel<LayerInfo> layerTable = new GeoServerTablePanel<LayerInfo>("layer.table", layerProvider) { private static final long serialVersionUID = 6100831799966767858L; @Override public Component getComponentForProperty( String id, IModel<LayerInfo> value, Property<LayerInfo> property ) { final LayerInfo layer = (LayerInfo)value.getObject(); String text = property.getPropertyValue(layer).toString(); if (property == layerProvider.defaultStyle) { IModel<Boolean> model = new IModel<java.lang.Boolean>() { private static final long serialVersionUID = -5895600269146950033L; public Boolean getObject() { return defaultEditedStyle(layer); } public void setObject(java.lang.Boolean b) { if (b) { layer.setDefaultStyle(parent.getStyleInfo()); } else { if (layer.getStyles().size() == 0) { layer.setDefaultStyle(parent.getCatalog().getStyleByName("generic")); } else { StyleInfo s = layer.getStyles().iterator().next(); layer.setDefaultStyle(s); } } parent.getCatalog().save(layer); } public void detach() {} }; Fragment fragment = new Fragment( id, "layer.default.checkbox", LayerAssociationPanel.this); fragment.add(new AjaxCheckBox("default.selected", model) { private static final long serialVersionUID = 3572882767660629935L; public void onUpdate(AjaxRequestTarget target) {} }); return fragment; } else if (property == layerProvider.associatedStyle) { IModel<Boolean> model = new IModel<java.lang.Boolean>() { private static final long serialVersionUID = -5895600269146950033L; public Boolean getObject() { return usesEditedStyle(layer); } public void setObject(java.lang.Boolean b) { if (b) { layer.getStyles().add(parent.getStyleInfo()); } else { StyleInfo s = null; for (StyleInfo candidate : layer.getStyles()) { if (candidate.getName().equals(parent.getStyleInfo().getName())) { s = candidate; break; } } if (s != null) layer.getStyles().remove(s); } parent.getCatalog().save(layer); } public void detach() {} }; Fragment fragment = new Fragment( id, "layer.association.checkbox", LayerAssociationPanel.this); fragment.add(new AjaxCheckBox("association.selected", model) { private static final long serialVersionUID = 3572882767660629935L; public void onUpdate(AjaxRequestTarget target) {} }); return fragment; } else { return new Label(id, text); } }; }; add(layerTable); } }