/* (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.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Check;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.CheckGroup;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidator;
import org.apache.wicket.validation.ValidationError;
import org.geoserver.catalog.PublishedType;
import org.geoserver.gwc.GWC;
import org.geoserver.gwc.config.GWCConfig;
import org.geoserver.web.GeoServerApplication;
import org.geoserver.web.wicket.LocalizedChoiceRenderer;
import org.geowebcache.locks.LockProvider;
import org.springframework.context.ApplicationContext;
public class CachingOptionsPanel extends Panel {
private static final long serialVersionUID = 1L;
private CheckGroup<String> otherFormatsGroup;
private CheckGroup<String> rasterFormatsGroup;
private CheckGroup<String> vectorFormatsGroup;
public CachingOptionsPanel(final String id, final IModel<GWCConfig> gwcConfigModel) {
super(id, gwcConfigModel);
final IModel<Boolean> autoCacheLayersModel;
autoCacheLayersModel = new PropertyModel<Boolean>(gwcConfigModel, "cacheLayersByDefault");
final CheckBox autoCacheLayers = new CheckBox("cacheLayersByDefault", autoCacheLayersModel);
add(autoCacheLayers);
final WebMarkupContainer container = new WebMarkupContainer("container");
container.setOutputMarkupId(true);
add(container);
final WebMarkupContainer configs = new WebMarkupContainer("configs");
configs.setOutputMarkupId(true);
configs.setVisible(autoCacheLayersModel.getObject().booleanValue());
container.add(configs);
autoCacheLayers.add(new OnChangeAjaxBehavior() {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
final boolean visibleConfigs = autoCacheLayers.getModelObject().booleanValue();
configs.setVisible(visibleConfigs);
target.add(container);
}
});
IModel<String> lockProviderModel = new PropertyModel<String>(gwcConfigModel, "lockProviderName");
ApplicationContext applicationContext = GeoServerApplication.get().getApplicationContext();
String[] lockProviders = applicationContext.getBeanNamesForType(LockProvider.class);
List<String> lockProviderChoices = new ArrayList<String>(Arrays.asList(lockProviders));
Collections.sort(lockProviderChoices); // make sure we get a stable listing order
DropDownChoice<String> lockProviderChoice = new DropDownChoice<String>("lockProvider", lockProviderModel,
lockProviderChoices, new LocalizedChoiceRenderer(this));
configs.add(lockProviderChoice);
IModel<Boolean> nonDefaultStylesModel;
nonDefaultStylesModel = new PropertyModel<Boolean>(gwcConfigModel, "cacheNonDefaultStyles");
CheckBox cacheNonDefaultStyles = new CheckBox("cacheNonDefaultStyles",
nonDefaultStylesModel);
configs.add(cacheNonDefaultStyles);
List<Integer> metaTilingChoices = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, 15, 16, 17, 18, 19, 20);
IModel<Integer> metaTilingXModel = new PropertyModel<Integer>(gwcConfigModel, "metaTilingX");
DropDownChoice<Integer> metaTilingX = new DropDownChoice<Integer>("metaTilingX",
metaTilingXModel, metaTilingChoices);
metaTilingX.setRequired(true);
configs.add(metaTilingX);
IModel<Integer> metaTilingYModel = new PropertyModel<Integer>(gwcConfigModel, "metaTilingY");
DropDownChoice<Integer> metaTilingY = new DropDownChoice<Integer>("metaTilingY",
metaTilingYModel, metaTilingChoices);
metaTilingY.setRequired(true);
configs.add(metaTilingY);
IModel<Integer> gutterModel = new PropertyModel<Integer>(gwcConfigModel, "gutter");
List<Integer> gutterChoices = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 50,
100);
DropDownChoice<Integer> gutterChoice = new DropDownChoice<Integer>("gutter", gutterModel,
gutterChoices);
configs.add(gutterChoice);
{
List<String> formats;
formats = new ArrayList<>(GWC.getAdvertisedCachedFormats(PublishedType.VECTOR));
IModel<List<String>> vectorFormatsModel = new PropertyModel<List<String>>(
gwcConfigModel, "defaultVectorCacheFormats");
vectorFormatsGroup = new CheckGroup<String>("vectorFormatsGroup", vectorFormatsModel);
configs.add(vectorFormatsGroup);
ListView<String> formatsList = new ListView<String>("vectorFromats", formats) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<String> item) {
item.add(new Check<String>("vectorFormatsOption", item.getModel()));
item.add(new Label("name", item.getModel()));
}
};
formatsList.setReuseItems(true);// otherwise it looses state on invalid form submits
vectorFormatsGroup.add(formatsList);
}
{
List<String> formats;
formats = new ArrayList<>(GWC.getAdvertisedCachedFormats(PublishedType.RASTER));
IModel<List<String>> rasterFormatsModel = new PropertyModel<List<String>>(
gwcConfigModel, "defaultCoverageCacheFormats");
rasterFormatsGroup = new CheckGroup<String>("rasterFormatsGroup", rasterFormatsModel);
configs.add(rasterFormatsGroup);
ListView<String> formatsList = new ListView<String>("rasterFromats", formats) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<String> item) {
item.add(new Check<String>("rasterFormatsOption", item.getModel()));
item.add(new Label("name", item.getModel()));
}
};
formatsList.setReuseItems(true);// otherwise it looses state on invalid form submits
rasterFormatsGroup.add(formatsList);
}
{
List<String> formats;
formats = new ArrayList<>(GWC.getAdvertisedCachedFormats(PublishedType.GROUP));
IModel<List<String>> otherFormatsModel = new PropertyModel<List<String>>(
gwcConfigModel, "defaultOtherCacheFormats");
otherFormatsGroup = new CheckGroup<String>("otherFormatsGroup", otherFormatsModel);
configs.add(otherFormatsGroup);
ListView<String> formatsList = new ListView<String>("otherFromats", formats) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<String> item) {
item.add(new Check<String>("otherFormatsOption", item.getModel()));
item.add(new Label("name", item.getModel()));
}
};
formatsList.setReuseItems(true);// otherwise it looses state on invalid form submits
otherFormatsGroup.add(formatsList);
}
// Add a new Panel for configuring In Memory caching
InMemoryBlobStorePanel storePanel = new InMemoryBlobStorePanel("blobstores", gwcConfigModel);
configs.add(storePanel.setOutputMarkupId(true));
IModel<Set<String>> cachedGridsetsModel = new PropertyModel<Set<String>>(gwcConfigModel,
"defaultCachingGridSetIds");
DefaultGridsetsEditor cachedGridsets = new DefaultGridsetsEditor("cachedGridsets",
cachedGridsetsModel);
configs.add(cachedGridsets);
cachedGridsets.add(new IValidator<Set<String>>() {
private static final long serialVersionUID = 1L;
@Override
public void validate(IValidatable<Set<String>> validatable) {
boolean validate = autoCacheLayersModel.getObject().booleanValue();
if (validate && validatable.getValue().isEmpty()) {
ValidationError error = new ValidationError();
error.setMessage(new ResourceModel(
"CachingOptionsPanel.validation.emptyGridsets").getObject());
validatable.error(error);
}
}
});
class FormatsValidator implements IValidator<Collection<String>> {
private static final long serialVersionUID = 1L;
@Override
public void validate(IValidatable<Collection<String>> validatable) {
boolean validate = autoCacheLayersModel.getObject().booleanValue();
Collection<String> value = validatable.getValue();
if (validate && value.isEmpty()) {
ValidationError error = new ValidationError();
error.setMessage(new ResourceModel(
"CachingOptionsPanel.validation.emptyCacheFormatList").getObject());
validatable.error(error);
}
}
}
;
FormatsValidator validator = new FormatsValidator();
vectorFormatsGroup.add(validator);
rasterFormatsGroup.add(validator);
otherFormatsGroup.add(validator);
}
}