/* Copyright (c) 2001 - 2013 OpenPlans - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wps.web;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox;
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.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.validation.validator.MinimumValidator;
import org.geoserver.web.services.BaseServiceAdminPage;
import org.geoserver.web.wicket.GeoServerDataProvider.Property;
import org.geoserver.web.wicket.GeoServerTablePanel;
import org.geoserver.wps.ProcessGroupInfo;
import org.geoserver.wps.WPSInfo;
/**
* Configure the WPS service global informations
*
* @author Andrea Aime - GeoSolutions
*
*/
public class WPSAdminPage extends BaseServiceAdminPage<WPSInfo> {
private List<ProcessGroupInfo> processFactories;
public WPSAdminPage() {
super();
}
public WPSAdminPage(WPSInfo service) {
super(service);
}
public WPSAdminPage(PageParameters pageParams) {
super(pageParams);
}
protected Class<WPSInfo> getServiceClass() {
return WPSInfo.class;
}
protected String getServiceName() {
return "WPS";
}
@Override
protected void build(IModel info, final Form form) {
TextField connectionTimeout = new TextField("connectionTimeout", Integer.class);
connectionTimeout.add(new MinimumValidator<Integer>(-1));
form.add(connectionTimeout);
TextField maxSynchProcesses = new TextField("maxSynchronousProcesses", Integer.class);
maxSynchProcesses.add(new MinimumValidator<Integer>(1));
form.add(maxSynchProcesses);
TextField maxAsynchProcesses = new TextField("maxAsynchronousProcesses", Integer.class);
maxAsynchProcesses.add(new MinimumValidator<Integer>(1));
form.add(maxAsynchProcesses);
TextField resourceExpirationTimeout = new TextField("resourceExpirationTimeout", Integer.class);
resourceExpirationTimeout.add(new MinimumValidator<Integer>(1));
form.add(resourceExpirationTimeout);
WPSInfo wpsInfo = (WPSInfo) info.getObject();
processFactories = cloneFactoryInfos(wpsInfo.getProcessGroups());
ProcessFactoryInfoProvider provider = new ProcessFactoryInfoProvider(processFactories, getLocale());
GeoServerTablePanel<ProcessGroupInfo> processFilterEditor = new GeoServerTablePanel<ProcessGroupInfo>("processFilterTable", provider) {
@Override
protected Component getComponentForProperty(String id, final IModel itemModel,
Property<ProcessGroupInfo> property) {
if(property.getName().equals("enabled")) {
Fragment fragment = new Fragment(id, "enabledFragment", WPSAdminPage.this);
CheckBox enabled = new CheckBox("enabled", property.getModel(itemModel));
enabled.setOutputMarkupId(true);
fragment.add(enabled);
return fragment;
} else if(property.getName().equals("prefix")) {
return new Label(id, property.getModel(itemModel));
} else if(property.getName().equals("title")) {
return new Label(id, property.getModel(itemModel));
} else if(property.getName().equals("summary")) {
return new Label(id, property.getModel(itemModel));
} else if(property.getName().equals("edit")) {
Fragment fragment = new Fragment(id, "linkFragment", WPSAdminPage.this);
// we use a submit link to avoid losing the other edits in the form
SubmitLink link = new SubmitLink("link") {
@Override
public void onSubmit() {
ProcessGroupInfo pfi = (ProcessGroupInfo) itemModel.getObject();
setResponsePage(new ProcessSelectionPage(WPSAdminPage.this, pfi));
}
};
fragment.add(link);
return fragment;
}
return null;
}
};
processFilterEditor.setFilterable(false);
processFilterEditor.setPageable(false);
processFilterEditor.setOutputMarkupId( true );
form.add(processFilterEditor);
}
private List<ProcessGroupInfo> cloneFactoryInfos(List<ProcessGroupInfo> processFactories) {
List<ProcessGroupInfo> result = new ArrayList<ProcessGroupInfo>();
for (ProcessGroupInfo pfi : processFactories) {
result.add(pfi.clone());
}
return result;
}
@Override
protected void handleSubmit(WPSInfo info) {
// overwrite the process factories that we did clone to achieve isolation
List<ProcessGroupInfo> factories = info.getProcessGroups();
factories.clear();
factories.addAll(processFactories);
super.handleSubmit(info);
}
}