net.logstash.logback.appender.DestinationParser.java Source code

Java tutorial

Introduction

Here is the source code for net.logstash.logback.appender.DestinationParser.java

Source

/**
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.logstash.logback.appender;

import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

import ch.qos.logback.core.CoreConstants;

/**
 * Constructs {@link InetSocketAddress}es by parsing {@link String} values.
 */
public class DestinationParser {

    private static final Pattern DESTINATION_PATTERN = Pattern.compile("^\\s*(\\S+?)\\s*(:\\s*(\\S+)\\s*)?$");
    private static final int HOSTNAME_GROUP = 1;
    private static final int PORT_GROUP = 3;

    /**
     * Constructs {@link InetSocketAddress}es by parsing the given {@link String} value.
     * <p>
     * The string is a comma separated list of destinations in the form of hostName[:portNumber].
     * <p>
     * 
     * For example, "host1.domain.com,host2.domain.com:5560"
     * <p>
     * 
     * If portNumber is not provided, then the given defaultPort will be used.
     */
    public static List<InetSocketAddress> parse(String destinations, int defaultPort) {

        /*
         * Multiple destinations can be specified on one single line, separated by comma
         */
        String[] destinationStrings = StringUtils.split(StringUtils.trimToEmpty(destinations), ',');

        List<InetSocketAddress> destinationList = new ArrayList<InetSocketAddress>(destinationStrings.length);

        for (String entry : destinationStrings) {

            /*
             * For #134, check to ensure properties are defined when destinations
             * are set using properties. 
             */
            if (entry.contains(CoreConstants.UNDEFINED_PROPERTY_SUFFIX)) {
                throw new IllegalArgumentException(
                        "Invalid destination '" + entry + "': unparseable value (expected format 'host[:port]').");
            }

            Matcher matcher = DESTINATION_PATTERN.matcher(entry);
            if (!matcher.matches()) {
                throw new IllegalArgumentException(
                        "Invalid destination '" + entry + "': unparseable value (expected format 'host[:port]').");
            }
            String host = matcher.group(HOSTNAME_GROUP);
            String portString = matcher.group(PORT_GROUP);

            int port;
            try {
                port = (portString != null) ? Integer.parseInt(portString) : defaultPort;

            } catch (NumberFormatException e) {
                throw new IllegalArgumentException(
                        "Invalid destination '" + entry + "': unparseable port (was '" + portString + "').");
            }

            destinationList.add(InetSocketAddress.createUnresolved(host, port));
        }

        return destinationList;
    }

}