/* 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.Collection;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.IModel;
import org.geoserver.web.GeoServerSecuredPage;
import org.geoserver.web.wicket.GeoServerDataProvider.Property;
import org.geoserver.web.wicket.GeoServerTablePanel;
import org.geoserver.web.wicket.ParamResourceModel;
import org.geoserver.wps.ProcessGroupInfo;
import org.geoserver.wps.process.GeoServerProcessors;
import org.geoserver.wps.web.FilteredProcessesProvider.FilteredProcess;
import org.geotools.process.ProcessFactory;
import org.opengis.feature.type.Name;
public class ProcessSelectionPage extends GeoServerSecuredPage {
private String title;
private GeoServerTablePanel<FilteredProcess> processSelector;
private ProcessGroupInfo pfi;
public ProcessSelectionPage(final WPSAdminPage origin, final ProcessGroupInfo pfi) {
this.pfi = pfi;
// prepare the process factory title
Class<? extends ProcessFactory> factoryClass = pfi.getFactoryClass();
ProcessFactory pf = GeoServerProcessors.getProcessFactory(factoryClass, false);
if(pf == null) {
throw new IllegalArgumentException("Failed to locate the process factory " + factoryClass);
}
this.title = pf.getTitle().toString(getLocale());
Form form = new Form("form");
add(form);
final FilteredProcessesProvider provider = new FilteredProcessesProvider(pfi, getLocale());
processSelector = new GeoServerTablePanel<FilteredProcess>("selectionTable", provider, true) {
@Override
protected Component getComponentForProperty(String id, final IModel itemModel,
Property<FilteredProcess> property) {
if(property.getName().equals("title")) {
return new Label(id, property.getModel(itemModel));
} else if(property.getName().equals("description")) {
return new Label(id, property.getModel(itemModel));
}
return null;
}
};
processSelector.setFilterable(false);
processSelector.setPageable(false);
processSelector.setOutputMarkupId( true );
List<FilteredProcess> processes = provider.getItems();
boolean allSelected = true;
for (int i = 0; i < processes.size(); i++) {
FilteredProcess process = processes.get(i);
if(!pfi.getFilteredProcesses().contains(process.getName())) {
processSelector.selectIndex(i);
} else {
allSelected = false;
}
}
if(allSelected) {
processSelector.selectAll();
}
form.add(processSelector);
SubmitLink apply = new SubmitLink("apply") {
@Override
public void onSubmit() {
super.onSubmit();
pfi.getFilteredProcesses().clear();
pfi.getFilteredProcesses().addAll(getFilteredProcesses());
setResponsePage(origin);
}
};
form.add(apply);
Link cancel = new Link("cancel") {
@Override
public void onClick() {
setResponsePage(origin);
}
};
form.add(cancel);
}
protected Collection<? extends Name> getFilteredProcesses() {
ProcessFactory pf = GeoServerProcessors.getProcessFactory(pfi.getFactoryClass(), false);
List<Name> disabled = new ArrayList<Name>(pf.getNames());
for(FilteredProcess fp : processSelector.getSelection()) {
disabled.remove(fp.getName());
}
return disabled;
}
@Override
protected String getDescription() {
return new ParamResourceModel("description", this, title).getString();
}
}