/* (c) 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.backuprestore.web; import java.io.File; import org.apache.wicket.Component; 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.form.SubmitLink; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.Model; import org.geoserver.platform.resource.Files; import org.geoserver.platform.resource.Resource; import org.geoserver.web.wicket.GeoServerDialog; import org.geoserver.web.wicket.ParamResourceModel; import org.geoserver.web.wicket.browser.ExtensionFileFilter; import org.geoserver.web.wicket.browser.GeoServerFileChooser; @SuppressWarnings("serial") public class ResourceFilePanel extends Panel { private static final String[] FILE_EXTENSIONS = new String[] {".zip", ".gz", ".tar", ".tgz", ".bz"}; String file; TextField fileField; GeoServerDialog dialog; public ResourceFilePanel(String id) { super(id); add(dialog = new GeoServerDialog("dialog")); Form form = new Form("form", new CompoundPropertyModel(this)); add(form); fileField = new TextField("file"); fileField.setRequired(true); fileField.setOutputMarkupId(true); fileField.add(new OnChangeAjaxBehavior(){ @Override protected void onUpdate(final AjaxRequestTarget target){ // Access the updated model value: final String valueAsString = ((TextField<String>) getComponent()).getModelObject(); // use what the user currently typed File file = null; if (!valueAsString.trim().equals("")) { file = new File(valueAsString); if (!file.exists()) file = null; } } }); form.add(fileField); form.add(chooserButton(form)); } public Resource getResource() { return Files.asResource(new File(this.file)); }; Component chooserButton(Form form) { AjaxSubmitLink link = new AjaxSubmitLink("chooser") { @Override protected void onSubmit(AjaxRequestTarget target, Form form) { dialog.setTitle(new ParamResourceModel("chooseFile", this)); dialog.showOkCancel(target, new GeoServerDialog.DialogDelegate() { @Override protected Component getContents(String id) { // use what the user currently typed File file = null; if (!fileField.getInput().trim().equals("")) { file = new File(fileField.getInput()); if (!file.exists()) file = null; } GeoServerFileChooser chooser = new GeoServerFileChooser(id, new Model(file)) { @Override protected void fileClicked(File file, AjaxRequestTarget target) { ResourceFilePanel.this.file = file.getAbsolutePath(); fileField.clearInput(); fileField.setModelObject(file.getAbsolutePath()); target.add(fileField); dialog.close(target); } }; initFileChooser(chooser); return chooser; } @Override protected boolean onSubmit(AjaxRequestTarget target, Component contents) { GeoServerFileChooser chooser = (GeoServerFileChooser) contents; file = ((File) chooser.getDefaultModelObject()).getAbsolutePath(); // clear the raw input of the field won't show the new model value fileField.clearInput(); //fileField.setModelObject(file); target.add(fileField); return true; } @Override public void onClose(AjaxRequestTarget target) { // update the field with the user chosen value target.add(fileField); } }); } }; // otherwise the link won't trigger when the form contents are not valid link.setDefaultFormProcessing(false); return link; } SubmitLink submitLink() { return new SubmitLink("submit") { @Override public void onSubmit() { } }; } protected void initFileChooser(GeoServerFileChooser fileChooser) { fileChooser.setFilter(new Model(new ExtensionFileFilter(FILE_EXTENSIONS))); // fileChooser.setFilter(new Model((Serializable)FileFileFilter.FILE)); } }