/* (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.wps.web;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.geoserver.web.wicket.GeoServerDataProvider;
import org.geoserver.wps.ProcessGroupInfo;
import org.geoserver.wps.ProcessInfo;
import org.geoserver.wps.ProcessInfoImpl;
import org.geoserver.wps.process.GeoServerProcessors;
import org.geoserver.wps.validator.WPSInputValidator;
import org.geotools.process.ProcessFactory;
import org.opengis.feature.type.Name;
import org.opengis.util.InternationalString;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
/**
* Provides entries for the process filtering table in the {@link ProcessSelectionPage}
*
* @author Andrea Aime - GeoSolutions
*/
@SuppressWarnings("serial")
public class FilteredProcessesProvider extends
GeoServerDataProvider<FilteredProcessesProvider.FilteredProcess> {
/**
* Represents a selectable process in the GUI
*
* @author Andrea Aime - GeoSolutions
*/
static class FilteredProcess implements Serializable, Comparable<FilteredProcess>{
private boolean enabled;
private Name name;
private String description;
private List<String> roles;
private Multimap<String, WPSInputValidator> validators = ArrayListMultimap.create();
public FilteredProcess(Name name, String description) {
this.name = name;
this.description = description;
}
public Name getName() {
return name;
}
public String getDescription() {
return description;
}
public List<String> getRoles() {
return roles;
}
public void setRoles(List<String> roles) {
this.roles = roles;
}
public boolean getEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
@Override
public int compareTo(FilteredProcess other) {
if(name == null) {
return other.getName() == null ? 0 : -1;
} else if(other.getName() == null) {
return 1;
} else {
return name.getURI().compareTo(other.getName().getURI());
}
}
public ProcessInfo toProcessInfo() {
ProcessInfo pai = new ProcessInfoImpl();
pai.setName(getName());
pai.setEnabled(getEnabled());
if (getRoles() != null && getRoles().size() > 0) {
pai.getRoles().addAll(getRoles());
}
if (validators != null && validators.size() > 0) {
pai.getValidators().putAll(validators);
}
return pai;
}
public Multimap<String, WPSInputValidator> getValidators() {
return validators;
}
public void setValidators(Multimap<String, WPSInputValidator> validators) {
this.validators = validators;
}
public boolean isValidated() {
return validators != null && validators.size() > 0;
}
}
private ProcessGroupInfo pfi;
private Locale locale;
private List<FilteredProcess> selectableProcesses;
public FilteredProcessesProvider(ProcessGroupInfo pfi, Locale locale) {
this.pfi = pfi;
this.locale = locale;
ProcessFactory pf = GeoServerProcessors.getProcessFactory(pfi.getFactoryClass(), false);
Set<Name> names = pf.getNames();
selectableProcesses = new ArrayList<FilteredProcess>();
List<ProcessInfo> filteredProcesses = pfi.getFilteredProcesses();
for (Name name : names) {
InternationalString description = GeoServerProcessors.getProcessFactory(pfi.getFactoryClass(), false).getDescription(name);
String des = "";
if(description != null){
des = description.toString(locale);
}
FilteredProcess sp = new FilteredProcess(name, des);
sp.setEnabled(true);
for (ProcessInfo fp: filteredProcesses) {
if(sp.getName().equals(fp.getName())){
sp.setEnabled(fp.isEnabled());
sp.setRoles(fp.getRoles());
sp.setValidators(fp.getValidators());
}
}
selectableProcesses.add(sp);
}
Collections.sort(selectableProcesses);
}
@Override
protected List<Property<FilteredProcess>> getProperties() {
List<Property<FilteredProcess>> props = new ArrayList<GeoServerDataProvider.Property<FilteredProcess>>();
props.add(new BeanProperty<FilteredProcess>("enabled", "enabled"));
props.add(new BeanProperty<FilteredProcess>("name", "name"));
props.add(new BeanProperty<FilteredProcess>("description", "description"));
props.add(new AbstractProperty<FilteredProcess>("roles") {
@Override
public Object getPropertyValue(FilteredProcess item) {
return item.getRoles();
}
@Override
public IModel getModel(IModel itemModel) {
return new PropertyModel(itemModel, "roles");
}
});
props.add(new PropertyPlaceholder("edit"));
props.add(new BeanProperty("validated", "validated"));
return props;
}
@Override
protected List<FilteredProcess> getItems() {
return selectableProcesses;
}
}