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

net.ripe.db.whois.common.rpsl.attrs.SetObject Maven / Gradle / Ivy

package net.ripe.db.whois.common.rpsl.attrs;

import com.google.common.base.Splitter;
import net.ripe.db.whois.common.domain.CIString;
import net.ripe.db.whois.common.rpsl.ObjectType;

import javax.annotation.concurrent.Immutable;
import java.text.MessageFormat;
import java.util.regex.Pattern;

@Immutable
public class SetObject {
    public enum Type {
        ASSET("as", ObjectType.AS_SET),
        ROUTESET("rs", ObjectType.ROUTE_SET),
        FILTERSET("fltr", ObjectType.FILTER_SET),
        PEERINGSET("prng", ObjectType.PEERING_SET),
        RTRSET("rtrs", ObjectType.RTR_SET);

        private final Pattern pattern;
        private final ObjectType objectType;
        private final String prefix;

        Type(final String prefix, final ObjectType objectType) {
            this.prefix = prefix;
            this.objectType = objectType;
            pattern =  Pattern.compile("(?i)^" + prefix + "-[A-Z0-9_-]*[A-Z0-9]$");
        }

        public Pattern getPattern() {
            return pattern;
        }

        @Override
        public String toString() {
            return objectType.getName();
        }

        public String getPrefix() {
            return prefix;
        }
    }

    private static final Splitter SPLITTER = Splitter.on(':');

    private Type type;
    private String value;

    public SetObject(final Type type, final String value) {
        this.type = type;
        this.value = value;
    }

    @Override
    public int hashCode() {
    	return toString().hashCode();
    }
    
    @Override
    public String toString() {
    	return type + " " + value;
    }
    
    @Override
    public boolean equals(final Object o) {
    	if(o==this)
    		return true;
    	if(o==null || !(o instanceof SetObject))
    		return false;
    	else {
    		final SetObject that = (SetObject) o;
    		return type.equals(that.type) && value.equals(that.value);
    	}
    }
    
    public static SetObject parse(final Type type, final CIString value) {
        return parse(type, value.toString());
    }

    public static SetObject parse(final Type type, final String value) {
        if (value.length() > 254) {
            throw new AttributeParseException("Too long", value);
        }

        boolean hasSetName = false;
        int elementCount = 0;
        for (String element: SPLITTER.split(value)) {
            elementCount++;
            final int prefixLength = type.getPrefix().length();

            if (element.length() <= prefixLength) {
                throw new AttributeParseException(MessageFormat.format("Element '{0}' too short", element), value);
            }

            if (element.charAt(prefixLength) == '-') {
                if (!type.getPattern().matcher(element).matches()) {
                    throw new AttributeParseException(String.format("Invalid {0} element name '{1}'", type, element), value);
                }
                hasSetName = true;

            } else {
                AutNum.parse(element);
            }
        }

        if (!hasSetName) {
            if (elementCount == 1) {
                throw new AttributeParseException(MessageFormat.format("Invalid {0} name", type), value);
            } else {
                throw new AttributeParseException(MessageFormat.format("Hierarchical {0} name must include an {0} element", type), value);
            }
        }

        return new SetObject(type, value);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy