/* (c) 2014 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.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.PropertyModel;
import org.geoserver.web.wicket.GeoServerDataProvider;
import org.geoserver.web.wicket.ParamResourceModel;
import org.geoserver.wps.ProcessGroupInfo;
import org.geoserver.wps.ProcessInfo;
import org.geoserver.wps.process.GeoServerProcessors;
import org.geotools.process.ProcessFactory;
import org.opengis.feature.type.Name;
/**
* Provides entries for the process filtering table in the {@link WPSAccessRulePage}
*
*/
@SuppressWarnings("serial")
public class ProcessFactoryInfoProvider extends GeoServerDataProvider<ProcessGroupInfo> {
private List<ProcessGroupInfo> processFactories;
private Locale locale;
public ProcessFactoryInfoProvider(List<ProcessGroupInfo> processFactories, Locale locale) {
this.processFactories = processFactories;
this.locale = locale;
}
@Override
protected List<Property<ProcessGroupInfo>> getProperties() {
List<Property<ProcessGroupInfo>> props = new ArrayList<GeoServerDataProvider.Property<ProcessGroupInfo>>();
props.add(new BeanProperty<ProcessGroupInfo>("enabled", "enabled"));
props.add(new AbstractProperty<ProcessGroupInfo>("prefix") {
@Override
public Object getPropertyValue(ProcessGroupInfo item) {
Class factoryClass = item.getFactoryClass();
Set<String> prefixes = new HashSet<String>();
ProcessFactory pf = GeoServerProcessors.getProcessFactory(factoryClass, false);
if(pf != null) {
Set<Name> names = pf.getNames();
for (Name name : names) {
prefixes.add(name.getNamespaceURI());
}
}
// if we cannot find a title use the class name
if(prefixes.isEmpty()) {
return "";
} else {
// build a comma separated list with the prefixes
List<String> pl = new ArrayList<String>(prefixes);
Collections.sort(pl);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pl.size(); i++) {
sb.append(pl.get(i));
if(i < pl.size() - 1) {
sb.append(", ");
}
}
return sb.toString();
}
}
});
props.add(new AbstractProperty<ProcessGroupInfo>("title") {
@Override
public Object getPropertyValue(ProcessGroupInfo item) {
Class factoryClass = item.getFactoryClass();
String title = null;
ProcessFactory pf = GeoServerProcessors.getProcessFactory(factoryClass, false);
if(pf != null) {
title = pf.getTitle().toString(locale);
}
// if we cannot find a title use the class name
if(title == null) {
title = factoryClass.getName();
}
return title;
}
});
props.add(new AbstractProperty<ProcessGroupInfo>("summary") {
@Override
public Object getPropertyValue(final ProcessGroupInfo item) {
return new LoadableDetachableModel<String>() {
@Override
protected String load() {
if(item.getFilteredProcesses().isEmpty()) {
// all processes are enabled
return new ParamResourceModel("WPSAdminPage.filter.all", null).getString();
}
Class factoryClass = item.getFactoryClass();
ProcessFactory pf = GeoServerProcessors.getProcessFactory(factoryClass, false);
if(pf != null) {
Set<Name> names = new HashSet<Name>(pf.getNames());
int total = names.size();
for(ProcessInfo toRemove : item.getFilteredProcesses()){
if(!toRemove.isEnabled()){
names.remove(toRemove.getName());
}
}
int active = names.size();
if(active != total){
return new ParamResourceModel("WPSAdminPage.filter.active", null, active, total).getString();
}else{
return new ParamResourceModel("WPSAdminPage.filter.all", null).getString();
}
}
return "?";
}
};
}
});
props.add(new AbstractProperty<ProcessGroupInfo>("roles") {
@Override
public Object getPropertyValue(ProcessGroupInfo item) {
return item.getRoles();
}
@Override
public IModel getModel(IModel itemModel) {
return new PropertyModel(itemModel, "roles");
}
});
props.add(new PropertyPlaceholder("edit"));
return props;
}
@Override
protected List<ProcessGroupInfo> getItems() {
return processFactories;
}
}