001package org.kuali.common.httplib.api.model;
002
003import static java.lang.String.format;
004import static org.kuali.common.jute.base.Precondition.checkMin;
005import static org.kuali.common.jute.base.Precondition.checkNotBlank;
006
007import org.apache.http.ProtocolVersion;
008
009import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
010
011@JsonDeserialize(builder = Protocol.Builder.class)
012public final class Protocol {
013
014    private final String name;
015    private final int majorVersion;
016    private final int minorVersion;
017
018    private Protocol(Builder builder) {
019        this.name = builder.name;
020        this.majorVersion = builder.majorVersion;
021        this.minorVersion = builder.minorVersion;
022    }
023
024    public static Protocol build(ProtocolVersion mutable) {
025        Builder builder = builder();
026        builder.withName(mutable.getProtocol());
027        builder.withMajorVersion(mutable.getMajor());
028        builder.withMinorVersion(mutable.getMinor());
029        return builder.build();
030    }
031
032    public static Builder builder() {
033        return new Builder();
034    }
035
036    public static class Builder implements org.apache.commons.lang3.builder.Builder<Protocol> {
037
038        private String name;
039        private int majorVersion;
040        private int minorVersion;
041
042        public Builder withName(String name) {
043            this.name = name;
044            return this;
045        }
046
047        public Builder withMajorVersion(int majorVersion) {
048            this.majorVersion = majorVersion;
049            return this;
050        }
051
052        public Builder withMinorVersion(int minorVersion) {
053            this.minorVersion = minorVersion;
054            return this;
055        }
056
057        @Override
058        public Protocol build() {
059            return validate(new Protocol(this));
060        }
061
062        private static Protocol validate(Protocol instance) {
063            checkNotBlank(instance.name, "name");
064            checkMin(instance.majorVersion, 0, "majorVersion");
065            checkMin(instance.minorVersion, 0, "minorVersion");
066            return instance;
067        }
068
069    }
070
071    public String getName() {
072        return name;
073    }
074
075    public int getMajorVersion() {
076        return majorVersion;
077    }
078
079    public int getMinorVersion() {
080        return minorVersion;
081    }
082
083    @Override
084    public String toString() {
085        return format("%s/%s.%s", name, majorVersion, minorVersion);
086    }
087
088}