package org.geoserver.web.admin; import java.io.File; import java.io.FilenameFilter; 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.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.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.MinimumValidator; 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.platform.GeoServerResourceLoader; import org.geoserver.web.GeoServerApplication; import org.geoserver.web.GeoServerHomePage; 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"); private static final ArrayList<String> AVAILABLE_CHARSETS = new ArrayList<String>(Charset.availableCharsets().keySet()); public GlobalSettingsPage() { final IModel globalInfoModel = getGlobalInfoModel(); final IModel loggingInfoModel = getLoggingInfoModel(); Form form = new Form("form", new CompoundPropertyModel(globalInfoModel)); add(form); form.add(new CheckBox("verbose")); form.add(new CheckBox("verboseExceptions")); form.add(new CheckBox("globalServices")); form.add(new TextField<Integer>("numDecimals").add(new MinimumValidator<Integer>(0))); form.add(new DropDownChoice("charset", AVAILABLE_CHARSETS)); form.add(new TextField("proxyBaseUrl").add(new UrlValidator())); logLevelsAppend(form, loggingInfoModel); form.add(new CheckBox("stdOutLogging", new PropertyModel( loggingInfoModel, "stdOutLogging"))); form.add(new TextField("loggingLocation", new PropertyModel( loggingInfoModel, "location")) ); TextField xmlPostRequestLogBufferSize = new TextField("xmlPostRequestLogBufferSize", new PropertyModel( globalInfoModel, "xmlPostRequestLogBufferSize")); xmlPostRequestLogBufferSize.add(new MinimumValidator<Integer>(0)); form.add(xmlPostRequestLogBufferSize); form.add(new TextField<Integer>("featureTypeCacheSize").add(new MinimumValidator<Integer>(0))); Button submit = new Button("submit", new StringResourceModel("submit", this, null)) { @Override public void onSubmit() { GeoServer gs = getGeoServer(); gs.save( (GeoServerInfo) globalInfoModel.getObject() ); gs.save( (LoggingInfo) loggingInfoModel.getObject() ); setResponsePage(GeoServerHomePage.class); } }; form.add(submit); Button cancel = new Button("cancel") { @Override public void onSubmit() { setResponsePage(GeoServerHomePage.class); } }; form.add(cancel); } private void logLevelsAppend(Form form, IModel loggingInfoModel) { // search for *LOGGING.properties files in the data directory GeoServerResourceLoader loader = GeoServerApplication.get().getBeanOfType( GeoServerResourceLoader.class); List<String> logProfiles = null; try { File logsDirectory = loader.find("logs"); if(logsDirectory.exists() && logsDirectory.isDirectory()) { String[] propFiles = logsDirectory.list(new FilenameFilter() { public boolean accept(File dir, String name) { return name.toLowerCase().endsWith("logging.properties"); } }); logProfiles = Arrays.asList(propFiles); 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("log4jConfigFile", new PropertyModel(loggingInfoModel, "level"), logProfiles)); } };