com.ok2c.lightmtp.util.InetAddressRangeParser.java Source code

Java tutorial

Introduction

Here is the source code for com.ok2c.lightmtp.util.InetAddressRangeParser.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 com.ok2c.lightmtp.util;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.message.ParserCursor;
import org.apache.http.util.Args;
import org.apache.http.util.CharArrayBuffer;

public final class InetAddressRangeParser {

    private static final char[] COMMA = new char[] { ',' };

    private static boolean isOneOf(char c, char[] delimiters) {
        if (delimiters != null) {
            for (char delimiter : delimiters) {
                if (c == delimiter) {
                    return true;
                }
            }
        }
        return false;
    }

    public InetAddressRange parse(final CharArrayBuffer buffer, final ParserCursor cursor, final char[] delimiters)
            throws ParseException, UnknownHostException {

        Args.notNull(buffer, "Char array buffer");
        Args.notNull(cursor, "Parser cursor");

        int pos = cursor.getPos();
        int indexFrom = cursor.getPos();
        int indexTo = cursor.getUpperBound();

        while (pos < indexTo) {
            char ch = buffer.charAt(pos);
            if (ch == '/') {
                break;
            }
            if (isOneOf(ch, delimiters)) {
                break;
            }
            pos++;
        }

        InetAddress address = InetAddress.getByName(buffer.substringTrimmed(indexFrom, pos));
        int mask = 0;

        if (pos < indexTo && buffer.charAt(pos) == '/') {
            pos++;
            indexFrom = pos;
            while (pos < indexTo) {
                char ch = buffer.charAt(pos);
                if (isOneOf(ch, delimiters)) {
                    break;
                }
                pos++;
            }
            try {
                mask = Integer.parseInt(buffer.substringTrimmed(indexFrom, pos));
                if (mask < 0) {
                    throw new ParseException("Negative range mask", indexFrom);
                }
            } catch (NumberFormatException ex) {
                throw new ParseException("Invalid range mask", indexFrom);
            }
        }
        cursor.updatePos(pos);
        return new InetAddressRange(address, mask);
    }

    public InetAddressRange parse(final String s) throws ParseException, UnknownHostException {
        CharArrayBuffer buffer = new CharArrayBuffer(s.length());
        buffer.append(s);
        ParserCursor cursor = new ParserCursor(0, s.length());
        return parse(buffer, cursor, COMMA);
    }

    public List<InetAddressRange> parseAll(final CharArrayBuffer buffer, final ParserCursor cursor,
            final char[] delimiters) throws ParseException, UnknownHostException {

        Args.notNull(buffer, "Char array buffer");
        Args.notNull(cursor, "Parser cursor");

        char[] delims = delimiters != null ? delimiters : COMMA;

        List<InetAddressRange> ranges = new ArrayList<InetAddressRange>();
        while (!cursor.atEnd()) {
            ranges.add(parse(buffer, cursor, delims));
            int pos = cursor.getPos();
            if (pos < cursor.getUpperBound() && isOneOf(buffer.charAt(pos), delims)) {
                cursor.updatePos(pos + 1);
            }
        }
        return ranges;
    }

    public List<InetAddressRange> parseAll(final String s) throws ParseException, UnknownHostException {
        CharArrayBuffer buffer = new CharArrayBuffer(s.length());
        buffer.append(s);
        ParserCursor cursor = new ParserCursor(0, s.length());
        return parseAll(buffer, cursor, null);
    }

}