/* (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.web.admin;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.ListChoice;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.validation.validator.RangeValidator;
import org.apache.wicket.validation.validator.UrlValidator;
import org.geoserver.config.GeoServer;
import org.geoserver.config.GeoServerInfo;
import org.geoserver.config.LoggingInfo;
import org.geoserver.config.ResourceErrorHandling;
import org.geoserver.config.SettingsInfo;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.platform.resource.LockProvider;
import org.geoserver.platform.resource.Resource;
import org.geoserver.platform.resource.Resource.Type;
import org.geoserver.platform.resource.Resources;
import org.geoserver.util.Filter;
import org.geoserver.web.GeoServerApplication;
import org.geoserver.web.data.settings.SettingsPluginPanelInfo;
import org.geoserver.web.wicket.LocalizedChoiceRenderer;
import org.geoserver.web.wicket.ParamResourceModel;
import org.springframework.context.ApplicationContext;
public class GlobalSettingsPage extends ServerAdminPage {
private static final long serialVersionUID = 4716657682337915996L;
static final List<String> DEFAULT_LOG_PROFILES = Arrays.asList("DEFAULT_LOGGING.properties",
"VERBOSE_LOGGING.properties", "PRODUCTION_LOGGING.properties",
"GEOTOOLS_DEVELOPER_LOGGING.properties", "GEOSERVER_DEVELOPER_LOGGING.properties");
public static final ArrayList<String> AVAILABLE_CHARSETS = new ArrayList<String>(Charset.availableCharsets().keySet());
public GlobalSettingsPage() {
final IModel<GeoServerInfo> globalInfoModel = getGlobalInfoModel();
final IModel<LoggingInfo> loggingInfoModel = getLoggingInfoModel();
CompoundPropertyModel<GeoServerInfo> compoundPropertyModel = new CompoundPropertyModel<GeoServerInfo>(globalInfoModel);
Form<GeoServerInfo> form = new Form<GeoServerInfo>("form", compoundPropertyModel);
add(form);
form.add(new CheckBox("verbose"));
form.add(new CheckBox("verboseExceptions"));
form.add(new CheckBox("globalServices"));
form.add(new TextField<Integer>("numDecimals").add(RangeValidator.minimum(0)));
form.add(new DropDownChoice<String>("charset", AVAILABLE_CHARSETS));
form.add(new DropDownChoice<ResourceErrorHandling>("resourceErrorHandling", Arrays.asList(ResourceErrorHandling.values()),
new ResourceErrorHandlingRenderer()));
form.add(new TextField<String>("proxyBaseUrl").add(new UrlValidator()));
logLevelsAppend(form, loggingInfoModel);
form.add(new CheckBox("stdOutLogging", new PropertyModel<Boolean>( loggingInfoModel, "stdOutLogging")));
form.add(new TextField<String>("loggingLocation", new PropertyModel<String>( loggingInfoModel, "location")) );
TextField<String> xmlPostRequestLogBufferSize = new TextField<String>("xmlPostRequestLogBufferSize", new PropertyModel<String>(
globalInfoModel, "xmlPostRequestLogBufferSize"));
xmlPostRequestLogBufferSize.add(RangeValidator.minimum(0));
form.add(xmlPostRequestLogBufferSize);
form.add(new CheckBox("xmlExternalEntitiesEnabled"));
form.add(new TextField<Integer>("featureTypeCacheSize").add(RangeValidator.minimum(0)));
IModel<String> lockProviderModel = new PropertyModel<String>(globalInfoModel, "lockProviderName");
ApplicationContext applicationContext = GeoServerApplication.get().getApplicationContext();
List<String> providers = new ArrayList<String>( Arrays.asList(applicationContext.getBeanNamesForType( LockProvider.class )));
providers.remove("lockProvider"); // remove the global lock provider
Collections.sort(providers);;
DropDownChoice<String> lockProviderChoice = new DropDownChoice<String>("lockProvider", lockProviderModel, providers, new LocalizedChoiceRenderer(this));
form.add( lockProviderChoice );
IModel<GeoServerInfo.WebUIMode> webUIModeModel = new PropertyModel<GeoServerInfo.WebUIMode>(globalInfoModel, "webUIMode");
if (webUIModeModel.getObject() == null) {
webUIModeModel.setObject(GeoServerInfo.WebUIMode.DEFAULT);
}
DropDownChoice<GeoServerInfo.WebUIMode> webUIModeChoice = new DropDownChoice<GeoServerInfo.WebUIMode>("webUIMode",
webUIModeModel, Arrays.asList(GeoServerInfo.WebUIMode.values()));
form.add(webUIModeChoice);
// Extension plugin for Global Settings
// Loading of the settings from the Global Info
IModel<SettingsInfo> settingsModel = new PropertyModel<SettingsInfo>(globalInfoModel, "settings");
ListView extensions = SettingsPluginPanelInfo.createExtensions("extensions", settingsModel, getGeoServerApplication());
form.add(extensions);
Button submit = new Button("submit") {
@Override
public void onSubmit() {
GeoServer gs = getGeoServer();
gs.save( (GeoServerInfo) globalInfoModel.getObject() );
gs.save( (LoggingInfo) loggingInfoModel.getObject() );
doReturn();
}
};
form.add(submit);
Button cancel = new Button("cancel") {
@Override
public void onSubmit() {
doReturn();
}
};
form.add(cancel);
}
private void logLevelsAppend(Form<GeoServerInfo> form, IModel<LoggingInfo> loggingInfoModel) {
// search for *LOGGING.properties files in the data directory
GeoServerResourceLoader loader = GeoServerApplication.get().getBeanOfType(
GeoServerResourceLoader.class);
List<String> logProfiles = null;
try {
Resource logsDirectory = loader.get("logs");
if(logsDirectory.getType() == Type.DIRECTORY) {
List<Resource> propFiles = Resources.list(logsDirectory, new Filter<Resource>() {
@Override
public boolean accept(Resource obj) {
return obj.name().toLowerCase().endsWith("logging.properties");
}
});
logProfiles = new ArrayList<String>();
for (Resource res : propFiles) {
logProfiles.add(res.name());
}
Collections.sort(logProfiles, String.CASE_INSENSITIVE_ORDER);
}
} catch (Exception e) {
LOGGER.log(Level.WARNING,
"Could not load the list of log configurations from the data directory", e);
}
// if none is found use the default set
if(logProfiles == null || logProfiles.size() == 0)
logProfiles = DEFAULT_LOG_PROFILES;
form.add(new ListChoice<String>("log4jConfigFile",
new PropertyModel<String>(loggingInfoModel, "level"), logProfiles));
}
class ResourceErrorHandlingRenderer extends ChoiceRenderer<ResourceErrorHandling> {
private static final long serialVersionUID = 4183327535180465575L;
@Override
public Object getDisplayValue(ResourceErrorHandling object) {
return new ParamResourceModel(object.name(), GlobalSettingsPage.this).getString();
}
@Override
public String getIdValue(ResourceErrorHandling object, int index) {
return object.name();
}
@Override
public ResourceErrorHandling getObject(String id,
IModel<? extends List<? extends ResourceErrorHandling>> choices) {
return id == null || "".equals(id) ? null : ResourceErrorHandling.valueOf(id);
}
}
}