/* (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.diskquota; import java.io.Serializable; import java.util.Map; import java.util.logging.Level; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.StringResourceModel; import org.geoserver.gwc.ConfigurableQuotaStoreProvider; import org.geoserver.gwc.GWC; import org.geoserver.web.GeoServerApplication; import org.geoserver.web.GeoServerSecuredPage; import org.geoserver.web.wicket.GeoServerAjaxFormLink; import org.geoserver.web.wicket.ParamResourceModel; import org.geotools.image.io.ImageIOExt; import org.geowebcache.diskquota.DiskQuotaConfig; import org.geowebcache.diskquota.jdbc.JDBCConfiguration; import org.geowebcache.diskquota.storage.StorageUnit; public class DiskQuotaSettingsPage extends GeoServerSecuredPage { private static final long serialVersionUID = 75816375328629448L; public DiskQuotaSettingsPage() throws Exception { GWC gwc = getGWC(); final boolean diskQuotaModuleDisabled = gwc.getDiskQuotaConfig() == null; // get the quota store config, show an error message in case the quota // store loading failed ConfigurableQuotaStoreProvider provider = GeoServerApplication.get().getBeanOfType(ConfigurableQuotaStoreProvider.class); if(provider.getException() != null) { ParamResourceModel rm = new ParamResourceModel("GWC.diskQuotaLoadFailed", null, provider.getException().getMessage()); error(rm.getString()); } // use a dettached copy of dq config to support the tabbed pane final DiskQuotaConfig diskQuotaConfig; if (diskQuotaModuleDisabled) { diskQuotaConfig = new DiskQuotaConfig(); // fake diskQuotaConfig.setDefaults(); } else { diskQuotaConfig = gwc.getDiskQuotaConfig().clone(); } // same as above, but we don't need to create a copy of the JDBC quota config since // that config is just used to instantiate the quota store, and then gets promptly discarted final JDBCConfiguration jdbcQuotaConfiguration; if(gwc.getJDBCDiskQuotaConfig() == null) { jdbcQuotaConfiguration = new JDBCConfiguration(); JDBCConfiguration.ConnectionPoolConfiguration configuration = new JDBCConfiguration.ConnectionPoolConfiguration(); configuration.setMinConnections(1); configuration.setMaxConnections(10); configuration.setConnectionTimeout(10000); configuration.setMaxOpenPreparedStatements(50); jdbcQuotaConfiguration.setConnectionPool(configuration); } else { jdbcQuotaConfiguration = gwc.getJDBCDiskQuotaConfig(); } final Form<Map<String, Serializable>> form; form = new Form<Map<String, Serializable>>("form"); add(form); final IModel<DiskQuotaConfig> diskQuotaModel = new Model<DiskQuotaConfig>(diskQuotaConfig); final IModel<JDBCConfiguration> jdbcQuotaModel = new Model<JDBCConfiguration>(jdbcQuotaConfiguration); final DiskQuotaConfigPanel diskQuotaConfigPanel = new DiskQuotaConfigPanel( "diskQuotaPanel", diskQuotaModel, jdbcQuotaModel); if (diskQuotaModuleDisabled) { diskQuotaConfigPanel.setEnabled(false); super.warn(new ResourceModel("DiskQuotaSettingsPage.disabledWarning").getObject()); } form.add(diskQuotaConfigPanel); form.add(new Button("submit") { private static final long serialVersionUID = 1L; @Override public void onSubmit() { GWC gwc = getGWC(); if (!diskQuotaModuleDisabled) { StorageUnit chosenUnit = diskQuotaConfigPanel.getStorageUnit(); // REVISIT: it seems Wicket is sending back a plain string instead of a String chosenQuotaStr = String.valueOf(diskQuotaConfigPanel.getQuotaValue()); Double chosenQuota; try { chosenQuota = Double.valueOf(chosenQuotaStr); } catch (NumberFormatException e) { form.error(chosenQuotaStr + " is not a valid floating point number");// TODO: // localize return; } if (chosenQuota.doubleValue() <= 0D) { form.error("Quota has to be > 0"); return; } DiskQuotaConfig dqConfig = diskQuotaModel.getObject(); JDBCConfiguration jdbcConfig = jdbcQuotaModel.getObject(); if(dqConfig.getQuotaStore() != null && dqConfig.getQuotaStore().equals("JDBC")) { try { gwc.testQuotaConfiguration(jdbcConfig); } catch(Exception e) { LOGGER.log(Level.SEVERE, "Error instantiating the JDBC configuration", e); error("Failure occurred while saving the JDBC configuration" + e.getMessage() + " (see the logs for a full stack trace)"); return; } } dqConfig.getGlobalQuota().setValue(chosenQuota.doubleValue(), chosenUnit); try { gwc.saveDiskQuotaConfig(dqConfig, jdbcConfig.clone(false)); } catch(Exception e) { LOGGER.log(Level.SEVERE, "Failed to save the JDBC configuration", e); error("Failure occurred while saving the JDBC configuration" + e.getMessage() + " (see the logs for a full stack trace)"); return; } } doReturn(); } }); form.add(new GeoServerAjaxFormLink("cancel") { private static final long serialVersionUID = 1L; @Override protected void onClick(AjaxRequestTarget target, Form<?> form) { doReturn(); } }); checkWarnings(); } private void checkWarnings() { Long imageIOFileCachingThreshold = ImageIOExt.getFilesystemThreshold(); if (null == imageIOFileCachingThreshold || 0L >= imageIOFileCachingThreshold.longValue()) { String warningMsg = new ResourceModel("GWC.ImageIOFileCachingThresholdUnsetWarning") .getObject(); super.warn(warningMsg); } } private GWC getGWC() { final GWC gwc = (GWC) getGeoServerApplication().getBean("gwcFacade"); gwc.syncEnv(); return gwc; } static CheckBox checkbox(String id, IModel<Boolean> model, String titleKey) { CheckBox checkBox = new CheckBox(id, model); if (null != titleKey) { AttributeModifier attributeModifier = new AttributeModifier("title", new StringResourceModel(titleKey, (Component) null, null)); checkBox.add(attributeModifier); } return checkBox; } }