Fix eclipse/checkstyle warnings
[yangtools.git] / common / concepts / src / main / java / org / opendaylight / yangtools / concepts / SemVer.java
1 /*
2  * Copyright (c) 2016 Pantheon Technologies s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.concepts;
9
10 import com.google.common.annotations.Beta;
11 import com.google.common.base.Preconditions;
12 import java.io.Serializable;
13 import java.util.Objects;
14 import javax.annotation.Nonnull;
15
16 /**
17  * A single version according to <a href="http://semver.org/">Semantic Versioning</a>.
18  */
19 @Beta
20 public final class SemVer implements Comparable<SemVer>, Serializable {
21     private static final long serialVersionUID = 1L;
22     private final int major;
23     private final int minor;
24     private final int patch;
25
26     private SemVer(final int major, final int minor, final int patch) {
27         Preconditions.checkArgument(major >= 0);
28         this.major = major;
29         Preconditions.checkArgument(minor >= 0);
30         this.minor = minor;
31         Preconditions.checkArgument(patch >= 0);
32         this.patch = patch;
33     }
34
35     public static SemVer create(final int major) {
36         return create(major, 0);
37     }
38
39     public static SemVer create(final int major, final int minor) {
40         return create(major, minor, 0);
41     }
42
43     public static SemVer create(final int major, final int minor, final int patch) {
44         return new SemVer(major, minor, patch);
45     }
46
47     public static SemVer valueOf(@Nonnull final String str) {
48         final int minorIdx = str.indexOf('.');
49         if (minorIdx == -1) {
50             return create(Integer.parseInt(str));
51         }
52
53         final String minorStr;
54         final int patchIdx = str.indexOf('.', minorIdx + 1);
55         if (patchIdx == -1) {
56             minorStr = str.substring(minorIdx + 1);
57             return create(Integer.parseInt(str.substring(0, minorIdx), 10), Integer.parseInt(minorStr, 10));
58         }
59
60         minorStr = str.substring(minorIdx + 1, patchIdx);
61         return create(Integer.parseInt(str.substring(0, minorIdx), 10), Integer.parseInt(minorStr, 10),
62             Integer.parseInt(str.substring(patchIdx + 1), 10));
63     }
64
65     /**
66      * Return the major version number.
67      *
68      * @return major version number
69      */
70     public int getMajor() {
71         return major;
72     }
73
74     /**
75      * Return the minor version number.
76      *
77      * @return minor version number
78      */
79     public int getMinor() {
80         return minor;
81     }
82
83     /**
84      * Return the patch version number.
85      *
86      * @return patch version number
87      */
88     public int getPatch() {
89         return patch;
90     }
91
92     @Override
93     public int compareTo(@Nonnull final SemVer other) {
94         int cmp = Integer.compare(major, other.major);
95         if (cmp == 0) {
96             cmp = Integer.compare(minor, other.minor);
97             if (cmp == 0) {
98                 return Integer.compare(patch, other.patch);
99             }
100         }
101
102         return cmp;
103     }
104
105     @Override
106     public int hashCode() {
107         return Objects.hash(major, minor, patch);
108     }
109
110     @Override
111     public boolean equals(final Object obj) {
112         if (this == obj) {
113             return true;
114         }
115         if (!(obj instanceof SemVer)) {
116             return false;
117         }
118
119         final SemVer o = (SemVer) obj;
120         return major == o.major && minor == o.minor && patch == o.patch;
121     }
122
123     @Override
124     public String toString() {
125         return major + "." + minor + "." + patch;
126     }
127 }