All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.fireflysource.net.websocket.common.model.ExtensionConfig Maven / Gradle / Ivy

There is a newer version: 5.0.2
Show newest version
package com.fireflysource.net.websocket.common.model;

import com.fireflysource.net.websocket.common.utils.QuoteUtil;

import java.util.*;

/**
 * Represents an Extension Configuration, as seen during the connection Handshake process.
 */
public class ExtensionConfig {
    /**
     * Parse a single parameterized name.
     *
     * @param parameterizedName the parameterized name
     * @return the ExtensionConfig
     */
    public static ExtensionConfig parse(String parameterizedName) {
        return new ExtensionConfig(parameterizedName);
    }

    /**
     * Parse enumeration of Sec-WebSocket-Extensions header values into a {@link ExtensionConfig} list
     *
     * @param valuesEnum the raw header values enum
     * @return the list of extension configs
     */
    public static List parseEnum(Enumeration valuesEnum) {
        List configs = new ArrayList<>();

        if (valuesEnum != null) {
            while (valuesEnum.hasMoreElements()) {
                Iterator extTokenIter = QuoteUtil.splitAt(valuesEnum.nextElement(), ",");
                while (extTokenIter.hasNext()) {
                    String extToken = extTokenIter.next();
                    configs.add(ExtensionConfig.parse(extToken));
                }
            }
        }

        return configs;
    }

    /**
     * Parse 1 or more raw Sec-WebSocket-Extensions header values into a {@link ExtensionConfig} list
     *
     * @param rawSecWebSocketExtensions the raw header values
     * @return the list of extension configs
     */
    public static List parseList(List rawSecWebSocketExtensions) {
        List configs = new ArrayList<>();

        for (String rawValue : rawSecWebSocketExtensions) {
            Iterator extTokenIter = QuoteUtil.splitAt(rawValue, ",");
            while (extTokenIter.hasNext()) {
                String extToken = extTokenIter.next();
                configs.add(ExtensionConfig.parse(extToken));
            }
        }

        return configs;
    }

    /**
     * Convert a list of {@link ExtensionConfig} to a header value
     *
     * @param configs the list of extension configs
     * @return the header value (null if no configs present)
     */
    public static String toHeaderValue(List configs) {
        if ((configs == null) || (configs.isEmpty())) {
            return null;
        }
        StringBuilder parameters = new StringBuilder();
        boolean needsDelim = false;
        for (ExtensionConfig ext : configs) {
            if (needsDelim) {
                parameters.append(", ");
            }
            parameters.append(ext.getParameterizedName());
            needsDelim = true;
        }
        return parameters.toString();
    }

    private final String name;
    private final Map parameters;

    /**
     * Copy constructor
     *
     * @param copy the extension config to copy
     */
    public ExtensionConfig(ExtensionConfig copy) {
        this.name = copy.name;
        this.parameters = new HashMap<>();
        this.parameters.putAll(copy.parameters);
    }

    public ExtensionConfig(String parameterizedName) {
        Iterator extListIter = QuoteUtil.splitAt(parameterizedName, ";");
        this.name = extListIter.next();
        this.parameters = new HashMap<>();

        // now for parameters
        while (extListIter.hasNext()) {
            String extParam = extListIter.next();
            Iterator extParamIter = QuoteUtil.splitAt(extParam, "=");
            String key = extParamIter.next().trim();
            String value = null;
            if (extParamIter.hasNext()) {
                value = extParamIter.next();
            }
            parameters.put(key, value);
        }
    }

    public String getName() {
        return name;
    }

    public final int getParameter(String key, int defValue) {
        String val = parameters.get(key);
        if (val == null) {
            return defValue;
        }
        return Integer.parseInt(val);
    }

    public final String getParameter(String key, String defValue) {
        String val = parameters.get(key);
        if (val == null) {
            return defValue;
        }
        return val;
    }

    public final String getParameterizedName() {
        StringBuilder str = new StringBuilder();
        str.append(name);
        for (String param : parameters.keySet()) {
            str.append(';');
            str.append(param);
            String value = parameters.get(param);
            if (value != null) {
                str.append('=');
                QuoteUtil.quoteIfNeeded(str, value, ";=");
            }
        }
        return str.toString();
    }

    public final Set getParameterKeys() {
        return parameters.keySet();
    }

    /**
     * Return parameters found in request URI.
     *
     * @return the parameter map
     */
    public final Map getParameters() {
        return parameters;
    }

    /**
     * Initialize the parameters on this config from the other configuration.
     *
     * @param other the other configuration.
     */
    public final void init(ExtensionConfig other) {
        this.parameters.clear();
        this.parameters.putAll(other.parameters);
    }

    public final void setParameter(String key) {
        parameters.put(key, null);
    }

    public final void setParameter(String key, int value) {
        parameters.put(key, Integer.toString(value));
    }

    public final void setParameter(String key, String value) {
        parameters.put(key, value);
    }

    @Override
    public String toString() {
        return getParameterizedName();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy