/* (c) 2015 - 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.geoserver.gwc.web.blob; import static org.apache.commons.lang.StringEscapeUtils.escapeHtml; import java.util.ArrayList; import java.util.List; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.MultiLineLabel; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.form.validation.AbstractFormValidator; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.geoserver.gwc.GWC; import org.geoserver.gwc.web.blob.BlobStoreType; import org.geoserver.web.GeoServerSecuredPage; import org.geoserver.web.wicket.GeoServerDialog; import org.geoserver.web.wicket.ParamResourceModel; import org.geowebcache.config.BlobStoreConfig; import org.geowebcache.config.ConfigurationException; import org.geowebcache.layer.TileLayer; /** * * Page to configure a BlobStore * * @author Niels Charlier * */ public class BlobStorePage extends GeoServerSecuredPage { private static final long serialVersionUID = -59024268194792891L; @SuppressWarnings("rawtypes") private DropDownChoice<BlobStoreType> typeOfBlobStore; private WebMarkupContainer blobConfigContainer; private Form<BlobStoreConfig> blobStoreForm; private TextField<String> tfId; private CheckBox cbDefault, cbEnabled; private GeoServerDialog dialog; public BlobStorePage() { this(null); } @SuppressWarnings({ "rawtypes", "unchecked" }) public BlobStorePage(final BlobStoreConfig originalStore) { final List<String> assignedLayers = new ArrayList<String>(); add(dialog = new GeoServerDialog("confirmDisableDialog")); dialog.setTitle(new ParamResourceModel("confirmDisableDialog.title", getPage())); dialog.setInitialHeight(200); typeOfBlobStore = new DropDownChoice<BlobStoreType>("typeOfBlobStore", new Model<BlobStoreType>(), BlobStoreTypes.getAll()); typeOfBlobStore.setOutputMarkupId(true); typeOfBlobStore.add(new AjaxFormComponentUpdatingBehavior("change") { private static final long serialVersionUID = 359589121400814043L; @Override protected void onUpdate(AjaxRequestTarget target) { blobStoreForm.setVisible(typeOfBlobStore.getModelObject() != null); if (typeOfBlobStore.getModelObject() != null) { blobStoreForm.getModel().setObject( typeOfBlobStore.getModelObject().newConfigObject()); blobStoreForm.addOrReplace(typeOfBlobStore.getModelObject().createPanel( "blobSpecificPanel", blobStoreForm.getModel())); } target.add(blobConfigContainer); } }); typeOfBlobStore.add(new AttributeModifier("title", new ResourceModel( "typeOfBlobStore.title"))); Form<BlobStoreType<?>> selector = new Form<BlobStoreType<?>>("selector"); selector.add(typeOfBlobStore); add(selector); blobConfigContainer = new WebMarkupContainer("blobConfigContainer"); blobConfigContainer.setOutputMarkupId(true); add(blobConfigContainer); blobStoreForm = new Form<BlobStoreConfig>("blobStoreForm", new CompoundPropertyModel<BlobStoreConfig>(originalStore == null ? null : (BlobStoreConfig) originalStore.clone())); blobConfigContainer.add(blobStoreForm); blobStoreForm.setVisible(originalStore != null); blobStoreForm.add((tfId = new TextField<String>("id")).setRequired(true)); tfId.add(new AttributeModifier("title", new ResourceModel("id.title"))); blobStoreForm.add(cbEnabled = new CheckBox("enabled")); cbEnabled.add(new AttributeModifier("title", new ResourceModel("enabled.title"))); blobStoreForm.add(cbDefault = new CheckBox("default")); cbDefault.add(new AttributeModifier("title", new ResourceModel("default.title"))); if (originalStore != null) { typeOfBlobStore.getModel().setObject( BlobStoreTypes.getFromClass(originalStore.getClass())); blobStoreForm.addOrReplace(typeOfBlobStore.getModelObject().createPanel( "blobSpecificPanel", blobStoreForm.getModel())); typeOfBlobStore.setEnabled(false); for (TileLayer layer : GWC.get().getTileLayers()) { if (originalStore.getId().equals(layer.getBlobStoreId())) { assignedLayers.add(layer.getName()); } } } blobStoreForm.add(new AbstractFormValidator() { private static final long serialVersionUID = 5240602030478856537L; @Override public FormComponent<?>[] getDependentFormComponents() { return new FormComponent<?>[] { cbDefault, cbEnabled }; } @Override public void validate(Form<?> form) { BlobStoreConfig blobStore = (BlobStoreConfig) form.getModelObject(); if (blobStore.isDefault() && !cbDefault.getConvertedInput()) { form.error(new ParamResourceModel("defaultError", getPage()).getString()); } else if (cbDefault.getConvertedInput() && !cbEnabled.getConvertedInput()) { form.error(new ParamResourceModel("enabledError", getPage()).getString()); } } }); blobStoreForm.add(new AbstractFormValidator() { private static final long serialVersionUID = 5240602030478856537L; @Override public FormComponent<?>[] getDependentFormComponents() { return new FormComponent<?>[] { tfId }; } @Override public void validate(Form<?> form) { for (BlobStoreConfig otherBlobStore : GWC.get().getBlobStores()) { if (otherBlobStore != originalStore && otherBlobStore.getId().equals(tfId.getConvertedInput())) { form.error(new ParamResourceModel("duplicateIdError", getPage()) .getString()); } } } }); // build the submit/cancel blobStoreForm.add(new AjaxSubmitLink("save") { private static final long serialVersionUID = 3735176778941168701L; @Override public void onSubmit(AjaxRequestTarget target, Form<?> form) { final BlobStoreConfig blobStore = (BlobStoreConfig) getForm().getModelObject(); if (originalStore != null && originalStore.isEnabled() && !blobStore.isEnabled() && assignedLayers.size() > 0) { dialog.showOkCancel(target, new GeoServerDialog.DialogDelegate() { private static final long serialVersionUID = 5257987095800108993L; private boolean success; private String error = null; @Override protected Component getContents(String id) { StringBuilder sb = new StringBuilder(); sb.append(new ParamResourceModel("confirmDisableDialog.content", getPage()).getString()); for (String layer : assignedLayers) { sb.append("\n  "); sb.append(escapeHtml(layer)); } return new MultiLineLabel("userPanel", sb.toString()) .setEscapeModelStrings(false); } @Override protected boolean onSubmit(AjaxRequestTarget target, Component contents) { try { save(originalStore, blobStore, assignedLayers); success = true; } catch (ConfigurationException e) { error = e.getMessage(); } return true; } @Override public void onClose(AjaxRequestTarget target) { if (success) { doReturn(BlobStoresPage.class); } else if (error != null) { error(error); target.add(feedbackPanel); } } }); } else { try { save(originalStore, blobStore, assignedLayers); doReturn(BlobStoresPage.class); } catch (ConfigurationException e) { error(e.getMessage()); target.add(feedbackPanel); } } } protected void onError(AjaxRequestTarget target, Form<?> form) { target.add(feedbackPanel); } }); blobStoreForm .add(new BookmarkablePageLink<BlobStoreConfig>("cancel", BlobStoresPage.class)); } protected void save(BlobStoreConfig originalStore, BlobStoreConfig blobStore, List<String> assignedLayers) throws ConfigurationException { // remove default if necessary BlobStoreConfig defaultStore = null; if (blobStore.isDefault() && (originalStore == null || !originalStore.isDefault())) { defaultStore = GWC.get().getDefaultBlobStore(); if (defaultStore != null) { defaultStore.setDefault(false); GWC.get().modifyBlobStore(defaultStore.getId(), defaultStore); } } // save try { if (originalStore == null) { GWC.get().addBlobStore(blobStore); } else { GWC.get().modifyBlobStore(originalStore.getId(), blobStore); } } catch (ConfigurationException e) { // reverse default if (defaultStore != null) { defaultStore.setDefault(true); GWC.get().modifyBlobStore(defaultStore.getId(), defaultStore); } throw e; } // update layers if necessary if (originalStore != null) { boolean updateId = !blobStore.getId().equals(originalStore.getId()); boolean disable = originalStore.isEnabled() && !blobStore.isEnabled(); if (updateId || disable) { for (String layerName : assignedLayers) { TileLayer layer = GWC.get().getTileLayerByName(layerName); if (updateId) { layer.setBlobStoreId(blobStore.getId()); } if (disable) { layer.setEnabled(false); } GWC.get().save(layer); } } } } }