/* (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.web.data.store; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.validation.validator.RangeValidator; import org.geoserver.catalog.WMSStoreInfo; import org.geoserver.platform.GeoServerEnvironment; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.web.ComponentAuthorizer; import org.geoserver.web.GeoServerSecuredPage; import org.geoserver.web.data.store.panel.CheckBoxParamPanel; import org.geoserver.web.data.store.panel.PasswordParamPanel; import org.geoserver.web.data.store.panel.TextParamPanel; import org.geoserver.web.data.store.panel.WorkspacePanel; import org.geoserver.web.wicket.GeoServerDialog; import org.geoserver.web.wicket.ParamResourceModel; /** * Supports coverage store configuration * * @author Andrea Aime * @see StoreEditPanel */ @SuppressWarnings("serial") abstract class AbstractWMSStorePage extends GeoServerSecuredPage { protected WorkspacePanel workspacePanel; private Form form; GeoServerDialog dialog; TextParamPanel capabilitiesURL; protected TextParamPanel usernamePanel; protected PasswordParamPanel password; void initUI(final WMSStoreInfo store) { IModel model = new Model(store); add(dialog = new GeoServerDialog("dialog")); // build the form form = new Form("form", model); add(form); // name PropertyModel nameModel = new PropertyModel(model, "name"); final TextParamPanel namePanel = new TextParamPanel("namePanel", nameModel, new ResourceModel("AbstractWMSStorePage.dataSrcName", "Data Source Name"), true); form.add(namePanel); // description and enabled form.add(new TextParamPanel("descriptionPanel", new PropertyModel(model, "description"), new ResourceModel("AbstractWMSStorePage.description", "Description"), false)); form.add(new CheckBoxParamPanel("enabledPanel", new PropertyModel(model, "enabled"), new ResourceModel("enabled", "Enabled"))); // a custom converter will turn this into a namespace url workspacePanel = new WorkspacePanel("workspacePanel", new PropertyModel(model, "workspace"), new ResourceModel("workspace", "Workspace"), true); form.add(workspacePanel); capabilitiesURL = new TextParamPanel("capabilitiesURL", new PropertyModel(model, "capabilitiesURL"), new ParamResourceModel("capabilitiesURL", AbstractWMSStorePage.this), true); form.add(capabilitiesURL); // user name PropertyModel userModel = new PropertyModel(model, "username"); usernamePanel = new TextParamPanel("userNamePanel", userModel, new ResourceModel( "AbstractWMSStorePage.userName"), false); form.add(usernamePanel); // password PropertyModel passwordModel = new PropertyModel(model, "password"); form.add(password = new PasswordParamPanel("passwordPanel", passwordModel, new ResourceModel( "AbstractWMSStorePage.password"), false)); // max concurrent connections final PropertyModel<Boolean> useHttpConnectionPoolModel = new PropertyModel<Boolean>(model, "useConnectionPooling"); CheckBoxParamPanel useConnectionPooling = new CheckBoxParamPanel( "useConnectionPoolingPanel", useHttpConnectionPoolModel, new ResourceModel( "AbstractWMSStorePage.useHttpConnectionPooling")); form.add(useConnectionPooling); PropertyModel<String> connectionsModel = new PropertyModel<String>(model, "maxConnections"); final TextParamPanel maxConnections = new TextParamPanel("maxConnectionsPanel", connectionsModel, new ResourceModel("AbstractWMSStorePage.maxConnections"), true, new RangeValidator<Integer>(1, 128)); maxConnections.setOutputMarkupId(true); maxConnections.setEnabled(useHttpConnectionPoolModel.getObject()); form.add(maxConnections); useConnectionPooling.getFormComponent().add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { boolean enabled = useHttpConnectionPoolModel.getObject(); maxConnections.setEnabled(enabled); target.add(maxConnections); } }); // connect timeout PropertyModel<Integer> connectTimeoutModel = new PropertyModel<Integer>(model, "connectTimeout"); form.add(new TextParamPanel("connectTimeoutPanel", connectTimeoutModel, new ResourceModel( "AbstractWMSStorePage.connectTimeout"), true, new RangeValidator<Integer>(1, 240))); // read timeout PropertyModel<Integer> readTimeoutModel = new PropertyModel<Integer>(model, "readTimeout"); form.add(new TextParamPanel("readTimeoutPanel", readTimeoutModel, new ResourceModel( "AbstractWMSStorePage.readTimeout"), true, new RangeValidator<Integer>(1, 360))); // cancel/submit buttons form.add(new BookmarkablePageLink("cancel", StorePage.class)); form.add(saveLink()); form.setDefaultButton(saveLink()); // feedback panel for error messages form.add(new FeedbackPanel("feedback")); StoreNameValidator storeNameValidator = new StoreNameValidator(workspacePanel .getFormComponent(), namePanel.getFormComponent(), store.getId()); form.add(storeNameValidator); } private AjaxSubmitLink saveLink() { return new AjaxSubmitLink("save", form) { @Override protected void onError(AjaxRequestTarget target, Form form) { super.onError(target, form); target.add(form); } @Override protected void onSubmit(AjaxRequestTarget target, Form form) { form.process(this); WMSStoreInfo info = (WMSStoreInfo) form.getModelObject(); try { onSave(info, target); } catch (IllegalArgumentException e) { form.error(e.getMessage()); target.add(form); } } }; } /** * Template method for subclasses to take the appropriate action when the coverage store page * "save" button is pressed. * * @param info * the StoreInfo to save * @throws IllegalArgumentException * with an appropriate error message if the save action can't be successfully * performed */ protected abstract void onSave(WMSStoreInfo info, AjaxRequestTarget target) throws IllegalArgumentException; @Override protected ComponentAuthorizer getPageAuthorizer() { return ComponentAuthorizer.WORKSPACE_ADMIN; } }