net.handle.servlet.Settings.java Source code

Java tutorial

Introduction

Here is the source code for net.handle.servlet.Settings.java

Source

/*
 * Created by: christopher
 * Date: 2 Mar 2008
 * Time: 12:12:06
 *
 * <p>Copyright (C) 2008 Nature Publishing Group, Inc.</p>
 *
 * <p><a rel="license" href="http://creativecommons.org/licenses/GPL/2.0/">
 * <img alt="Creative Commons License" style="border-width:0"
 * src="http://i.creativecommons.org/l/GPL/2.0/88x62.png" /></a><br />
 * This work is licensed under a <a rel="license"
 * href="http://creativecommons.org/licenses/GPL/2.0/">Creative Commons GNU
 * General Public License License</a>.</p>
 */

package net.handle.servlet;

import static org.apache.commons.lang.StringUtils.isNotBlank;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConversionException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * <p>
 * Encapsulation of the various configuration settings that can be made for this
 * application (basically, to separate them from the servlet for testability).
 * </p>
 *
 * @author <a href="mailto:christopher.townson@googlemail.com">Christopher Townson</a>
 */
public class Settings {

    private static final String DATATYPES_KEY = "servlet.parameterNames.datatypes";

    private static final String ERROR_TEMPLATE_MIMETYPE_KEY = "servlet.templates.errorResponse.template.mimetype";

    private static final String ERROR_TEMPLATE_NAME_KEY = "servlet.templates.errorResponse.template.name";

    private static final String FORMAT_KEY = "servlet.parameterNames.format";

    private static final String HANDLE_ID_KEY = "servlet.parameterNames.handleId";

    private static final String INDEX_KEY = "servlet.parameterNames.index";

    private static final Log LOG = LogFactory.getLog(Settings.class);

    private static final String PREFERRED_PROTOCOLS_KEY = "preferredProtocols";

    private static final String RESPONSE_TEMPLATE_MIMETYPE_KEY = "servlet.templates.handleResponse.template.mimetype";

    private static final String RESPONSE_TEMPLATE_NAME_KEY = "servlet.templates.handleResponse.template.name";

    private static final String TRACE_MESSAGES_KEY = "traceMessages";

    private static final String TYPE_KEY = "servlet.parameterNames.type";

    // TODO make all private members final in Settings
    private String datatypesRequestParameterName;

    private Template defaultErrorResponseTemplate;

    private Template defaultHandleResponseTemplate;

    private Map<Mimetype, Template> errorResponseTemplates;

    private String formatRequestParameterName;

    private String handleIdRequestParameterName;

    private Map<Mimetype, Template> handleResponseTemplates;

    private String indexRequestParameterName;

    private int[] preferredProtocols;

    private String typeRequestParameterName;

    private boolean traceMessages;

    public Settings(Configuration configuration) throws SettingsException {
        if (configuration != null) {
            initRequestParameters(configuration);
            initErrorResponseTemplates(configuration);
            initHandleResponseTemplates(configuration);
            initHandleClientOptions(configuration);
        } else {
            throw new SettingsException("Configuration is null");
        }
    }

    public String getDatatypesRequestParameterName() {
        return datatypesRequestParameterName;
    }

    public Template getDefaultErrorResponseTemplate() {
        return defaultErrorResponseTemplate;
    }

    public Template getDefaultHandleResponseTemplate() {
        return defaultHandleResponseTemplate;
    }

    public Map<Mimetype, Template> getErrorResponseTemplates() {
        return errorResponseTemplates;
    }

    public String getFormatRequestParameterName() {
        return formatRequestParameterName;
    }

    public String getHandleIdRequestParameterName() {
        return handleIdRequestParameterName;
    }

    public Map<Mimetype, Template> getHandleResponseTemplates() {
        return handleResponseTemplates;
    }

    public String getIndexRequestParameterName() {
        return indexRequestParameterName;
    }

    public int[] getPreferredProtocols() {
        return preferredProtocols;
    }

    public String getTypeRequestParameterName() {
        return typeRequestParameterName;
    }

    public boolean isTraceMessages() {
        return traceMessages;
    }

    private void initRequestParameters(Configuration configuration) throws SettingsException {
        try {
            handleIdRequestParameterName = configuration.getString(HANDLE_ID_KEY);
            if (isNotBlank(handleIdRequestParameterName)) {
                LOG.info("Setting " + HANDLE_ID_KEY + " to '" + handleIdRequestParameterName + "'");
            } else {
                throw new SettingsException(HANDLE_ID_KEY + " is blank");
            }

            datatypesRequestParameterName = configuration.getString(DATATYPES_KEY);
            if (isNotBlank(datatypesRequestParameterName)) {
                LOG.info("Setting " + DATATYPES_KEY + " to '" + datatypesRequestParameterName + "'");
            } else {
                throw new SettingsException(DATATYPES_KEY + " is blank");
            }

            formatRequestParameterName = configuration.getString(FORMAT_KEY);
            if (isNotBlank(formatRequestParameterName)) {
                LOG.info("Setting " + FORMAT_KEY + " to '" + formatRequestParameterName + "'");
            } else {
                throw new SettingsException(FORMAT_KEY + " is blank");
            }

            indexRequestParameterName = configuration.getString(INDEX_KEY);
            if (isNotBlank(indexRequestParameterName)) {
                LOG.info("Setting " + INDEX_KEY + " to '" + indexRequestParameterName + "'");
            } else {
                throw new SettingsException(INDEX_KEY + " is blank");
            }

            typeRequestParameterName = configuration.getString(TYPE_KEY);
            if (isNotBlank(typeRequestParameterName)) {
                LOG.info("Setting " + TYPE_KEY + " to '" + typeRequestParameterName + "'");
            } else {
                throw new SettingsException(TYPE_KEY + " is blank");
            }
        } catch (ConversionException e) {
            throw new SettingsException(e);
        }
    }

    @SuppressWarnings("unchecked")
    private void initErrorResponseTemplates(Configuration configuration) throws SettingsException {
        try {
            List<String> errorTemplateNames = configuration.getList(ERROR_TEMPLATE_NAME_KEY);
            List<String> errorTemplateMimetypes = configuration.getList(ERROR_TEMPLATE_MIMETYPE_KEY);

            if (!(isValidTemplateConfiguration(errorTemplateNames, errorTemplateMimetypes))) {
                throw new SettingsException(
                        "Missing error template configuration. " + "Please check that you have specified a name "
                                + "and a mimetype for each configured template");
            }

            errorResponseTemplates = new HashMap<Mimetype, Template>();
            for (int i = 0; i < errorTemplateNames.size(); i++) {
                String configuredMimetype = errorTemplateMimetypes.get(i);
                Mimetype mimetype = Mimetype.forName(configuredMimetype);
                if (mimetype == null) {
                    throw new SettingsException("Unsupported or invalid mimetype: " + configuredMimetype);
                }

                String name = errorTemplateNames.get(i);
                Template template = new Template(mimetype, name, Template.Type.ERROR_RESPONSE);
                errorResponseTemplates.put(mimetype, template);

                if (i == 0) {
                    defaultErrorResponseTemplate = template;
                }
            }
        } catch (ConversionException e) {
            throw new SettingsException(e);
        }
    }

    @SuppressWarnings("unchecked")
    private void initHandleResponseTemplates(Configuration configuration) throws SettingsException {
        try {
            List<String> handleTemplateNames = configuration.getList(RESPONSE_TEMPLATE_NAME_KEY);
            List<String> handleTemplateMimetypes = configuration.getList(RESPONSE_TEMPLATE_MIMETYPE_KEY);

            if (!(isValidTemplateConfiguration(handleTemplateNames, handleTemplateMimetypes))) {
                throw new SettingsException(
                        "Missing response template configuration. " + "Please check that you have specified a name "
                                + "and a mimetype for each configured template");
            }

            handleResponseTemplates = new HashMap<Mimetype, Template>();
            for (int i = 0; i < handleTemplateNames.size(); i++) {
                String configuredMimetype = handleTemplateMimetypes.get(i);
                Mimetype mimetype = Mimetype.forName(configuredMimetype);
                if (mimetype == null) {
                    throw new SettingsException("Unsupported or invalid mimetype: " + configuredMimetype);
                }

                String name = handleTemplateNames.get(i);
                Template template = new Template(mimetype, name, Template.Type.HANDLE_RESPONSE);
                handleResponseTemplates.put(mimetype, template);

                if (i == 0) {
                    defaultHandleResponseTemplate = template;
                }
            }
        } catch (ConversionException e) {
            throw new SettingsException(e);
        }
    }

    @SuppressWarnings("unchecked")
    private void initHandleClientOptions(Configuration configuration) throws SettingsException {
        try {
            preferredProtocols = Protocol.toIntArrayFromList(configuration.getList(PREFERRED_PROTOCOLS_KEY));
            if (preferredProtocols != null && preferredProtocols.length > 0) {
                for (int i : preferredProtocols) {
                    LOG.info("Adding preferred protocol '" + Protocol.forInt(i).toString() + "'");
                }
            } else {
                throw new SettingsException(PREFERRED_PROTOCOLS_KEY + " is blank");
            }

            traceMessages = configuration.getBoolean(TRACE_MESSAGES_KEY);
            LOG.info("Setting traceMessages '" + traceMessages + "'");
        } catch (ConversionException e) {
            throw new SettingsException(e);
        }
    }

    private boolean isValidTemplateConfiguration(List<String> templateNames, List<String> templateMimetypes) {
        // [sum of list sizes] >= 2
        // [sum of list sizes] % 2 == 0
        // all sizes are equal
        // if not, we're missing a value somewhere
        int a = templateNames.size();
        int b = templateMimetypes.size();
        int sum = (a + b);
        if (!((sum >= 2) && (sum % 2 == 0)) || !(a == b)) {
            return false;
        } else {
            return true;
        }
    }

}