/* (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.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.form.DropDownChoice;
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.model.CompoundPropertyModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.PropertyModel;
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.rest.util.IOUtils;
import org.geoserver.script.ScriptManager;
import org.geoserver.script.ScriptPlugin;
import org.geoserver.script.ScriptType;
import org.geoserver.web.GeoServerSecuredPage;
import org.geoserver.web.wicket.CodeMirrorEditor;
import org.geotools.util.logging.Logging;
import com.google.common.collect.Lists;
public class ScriptNewPage extends GeoServerSecuredPage {
private static final Logger LOGGER = Logging.getLogger("org.geoserver.script.web");
Form form;
public ScriptNewPage() {
super();
Script script = new Script();
form = new Form("form", new CompoundPropertyModel(script)) {
@Override
protected void onSubmit() {
save();
doReturn(ScriptPage.class);
}
};
add(form);
// Get List of script extensions from installed plugins
final List<String> extensions = getExtensions();
// Content
String mode = extensions.size() > 0 ? getModeFromExtension(extensions.get(0)) : "py";
final CodeMirrorEditor content = new CodeMirrorEditor("contents", mode, new PropertyModel(script, "contents"));
content.setRequired(true);
form.add(content);
// Name
TextField name = new TextField("name", new PropertyModel(script, "name"));
name.setRequired(true);
form.add(name);
// Type
DropDownChoice<String> typeDropDownChoice = new DropDownChoice<String>("type",
new PropertyModel(script, "type"), new LoadableDetachableModel<List<String>>() {
@Override
protected List<String> load() {
List<String> values = Lists.newArrayList();
for (ScriptType type : ScriptType.values()) {
values.add(type.getLabel());
}
return values;
}
});
typeDropDownChoice.setRequired(true);
form.add(typeDropDownChoice);
// Extension
final DropDownChoice<String> extensionDropDownChoice = new DropDownChoice<String>("extension",
new PropertyModel(script, "extension"),
new LoadableDetachableModel<List<String>>() {
@Override
protected List<String> load() {
return extensions;
}
}
);
extensionDropDownChoice.setRequired(true);
extensionDropDownChoice.add(new AjaxFormComponentUpdatingBehavior("change") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
int i = Integer.parseInt(extensionDropDownChoice.getValue());
String ext = extensions.get(i);
String mode = getModeFromExtension(ext);
content.setMode(mode);
}
});
form.add(extensionDropDownChoice);
SubmitLink submitLink = new SubmitLink("submit", form);
form.add(submitLink);
form.setDefaultButton(submitLink);
AjaxLink cancelLink = new AjaxLink("cancel") {
@Override
public void onClick(AjaxRequestTarget target) {
doReturn(ScriptPage.class);
}
};
form.add(cancelLink);
}
private List<String> getExtensions() {
List<String> extensions = Lists.newArrayList();
ScriptManager scriptManager = (ScriptManager) GeoServerExtensions.bean("scriptMgr");
for (ScriptPlugin plugin : scriptManager.getPlugins()) {
extensions.add(plugin.getExtension());
}
return extensions;
}
private String getModeFromExtension(String ext) {
ScriptManager scriptManager = (ScriptManager) GeoServerExtensions.bean("scriptMgr");
String mode = scriptManager.lookupEditorModeByExtension(ext);
return mode;
}
private void save() {
Script s = (Script) form.getModelObject();
OutputStream out = s.getResource().out();
try {
IOUtils.write(s.getContents(), out);
} catch (IOException e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
} finally {
IOUtils.closeQuietly(out);
}
}
}