65d55f2776d7f9f6ae580756c31063e65f09a66b
[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 s) {
48         final int minorIdx = s.indexOf('.');
49         if (minorIdx == -1) {
50             return create(Integer.parseInt(s));
51         }
52
53         final String minorStr;
54         final int patchIdx = s.indexOf('.', minorIdx + 1);
55         if (patchIdx == -1) {
56             minorStr = s.substring(minorIdx + 1);
57         } else {
58             minorStr = s.substring(minorIdx + 1, patchIdx);
59         }
60
61         return create(Integer.parseInt(s.substring(0, minorIdx), 10), Integer.parseInt(minorStr, 10),
62             Integer.parseInt(s.substring(patchIdx + 1), 10));
63     }
64
65     /**
66      * @return the major
67      */
68     public int getMajor() {
69         return major;
70     }
71
72     /**
73      * @return the minor
74      */
75     public int getMinor() {
76         return minor;
77     }
78
79     /**
80      * @return the patch
81      */
82     public int getPatch() {
83         return patch;
84     }
85
86     @Override
87     public int compareTo(final SemVer o) {
88         int i = Integer.compare(major, o.major);
89         if (i == 0) {
90             i = Integer.compare(minor, o.minor);
91             if (i == 0) {
92                 return Integer.compare(patch, patch);
93             }
94         }
95
96         return i;
97     }
98
99     @Override
100     public int hashCode() {
101         return Objects.hash(major, minor, patch);
102     }
103
104     @Override
105     public boolean equals(final Object obj) {
106         if (this == obj) {
107             return true;
108         }
109         if (!(obj instanceof SemVer)) {
110             return false;
111         }
112
113         final SemVer o = (SemVer) obj;
114         return major == o.major && minor == o.minor && patch == o.patch;
115     }
116
117     @Override
118     public String toString() {
119         return major + "." + minor + "." + patch;
120     }
121 }