/* (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.script.web; import java.io.IOException; import java.io.OutputStream; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.IOUtils; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.HiddenField; import org.apache.wicket.markup.html.form.SubmitLink; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.platform.resource.Resource; import org.geoserver.platform.resource.Resources; import org.geoserver.script.ScriptManager; import org.geoserver.web.GeoServerSecuredPage; import org.geoserver.web.wicket.CodeMirrorEditor; import org.geoserver.web.wicket.GeoServerDialog; import org.geoserver.web.wicket.ParamResourceModel; import org.geotools.util.logging.Logging; /** * Allows editing a specific Script */ @SuppressWarnings("serial") public class ScriptEditPage extends GeoServerSecuredPage { private static final Logger LOGGER = Logging.getLogger("org.geoserver.script.web"); IModel<?> scriptModel; GeoServerDialog dialog; public ScriptEditPage(PageParameters parameters) { String fileName = parameters.get("file").toString(); Resource file = Resources.fromPath(fileName); Script script = new Script(file); if (!Resources.exists(file)) { error(new ParamResourceModel("ScriptEditPage.notFound", this, script).getString()); doReturn(ScriptPage.class); return; } init(script); } public ScriptEditPage(Script script) { init(script); } private void init(Script script) { scriptModel = new ScriptDetachableModel(script); Form<?> form = new Form<Object>("form", new CompoundPropertyModel<Object>(scriptModel)) { protected void onSubmit() { try { saveScript(); doReturn(ScriptPage.class); } catch (RuntimeException e) { LOGGER.log(Level.WARNING, "Failed to save script", e); error(e.getMessage() == null ? "Failed to save script, no error message available, see logs for details" : e.getMessage()); } } }; add(form); // Name Label nameLabel = new Label("nameLabel", new PropertyModel<Object>(scriptModel, "name")); form.add(nameLabel); HiddenField<?> name = new HiddenField<Object>("name", new PropertyModel<Object>(scriptModel, "name")); form.add(name); // Type Label typeLabel = new Label("typeLabel", new PropertyModel<Object>(scriptModel, "type")); form.add(typeLabel); HiddenField<?> type = new HiddenField<Object>("type", new PropertyModel<Object>(scriptModel, "type")); form.add(type); // Extension Label extensionLabel = new Label("extensionLabel", new PropertyModel<Object>(scriptModel, "extension")); form.add(extensionLabel); HiddenField<?> extension = new HiddenField<Object>("extension", new PropertyModel<Object>(scriptModel, "extension")); form.add(extension); // Content ScriptManager scriptManager = (ScriptManager) GeoServerExtensions.bean("scriptMgr"); String mode = scriptManager.lookupPluginEditorMode(script.getResource()); CodeMirrorEditor content = new CodeMirrorEditor("contents", mode, new PropertyModel<String>(scriptModel, "contents")); content.setRequired(true); form.add(content); // Dialog add(dialog = new GeoServerDialog("dialog")); // Submit and Cancel SubmitLink submit = new SubmitLink("submit"); form.add(submit); form.setDefaultButton(submit); form.add(new BookmarkablePageLink<Object>("cancel", ScriptPage.class)); } private void saveScript() { Script script = (Script) scriptModel.getObject(); OutputStream out = script.getResource().out(); try { IOUtils.write(script.getContents(), out); } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(out); } } }