749e85640d318a1db697043346fd3a3307da45a6
[idea/community.git] / platform / util / src / com / intellij / util / text / SemVer.java
1 /*
2  * Copyright 2000-2013 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.util.text;
17
18 import org.jetbrains.annotations.NotNull;
19 import org.jetbrains.annotations.Nullable;
20
21 import java.util.regex.Pattern;
22
23 /**
24  * See http://semver.org
25  *
26  * @author Sergey Simonchik
27  */
28 public class SemVer {
29   private final int myMajor;
30   private final int myMinor;
31   private final int myPatch;
32   private final String myRawVersion;
33
34   public SemVer(@NotNull String rawVersion, int major, int minor, int patch) {
35     myRawVersion = rawVersion;
36     myMajor = major;
37     myMinor = minor;
38     myPatch = patch;
39   }
40
41   @NotNull
42   public String getRawVersion() {
43     return myRawVersion;
44   }
45
46   public int getMajor() {
47     return myMajor;
48   }
49
50   public int getMinor() {
51     return myMinor;
52   }
53
54   public int getPatch() {
55     return myPatch;
56   }
57
58   @NotNull
59   public String getParsedVersion() {
60     return myMajor + "." + myMinor + "." + myPatch;
61   }
62
63   @Override
64   public boolean equals(Object o) {
65     if (this == o) return true;
66     if (o == null || getClass() != o.getClass()) return false;
67
68     SemVer semVer = (SemVer)o;
69
70     if (myMajor != semVer.myMajor) return false;
71     if (myMinor != semVer.myMinor) return false;
72     if (myPatch != semVer.myPatch) return false;
73
74     return true;
75   }
76
77   @Override
78   public int hashCode() {
79     int result = myMajor;
80     result = 31 * result + myMinor;
81     result = 31 * result + myPatch;
82     return result;
83   }
84
85   @Override
86   public String toString() {
87     return myRawVersion;
88   }
89
90   @Nullable
91   public static SemVer parseFromText(@NotNull String text) {
92     String[] comps = text.split(Pattern.quote("."), 3);
93     if (comps.length != 3) {
94       return null;
95     }
96     Integer major = toInteger(comps[0]);
97     Integer minor = toInteger(comps[1]);
98     String patchStr = comps[2];
99     int dashInd = patchStr.indexOf('-');
100     if (dashInd >= 0) {
101       patchStr = patchStr.substring(0, dashInd);
102     }
103     Integer patch = toInteger(patchStr);
104     if (major != null && minor != null && patch != null) {
105       return new SemVer(text, major, minor, patch);
106     }
107     return null;
108   }
109
110   private static Integer toInteger(@NotNull String str) {
111     try {
112       return Integer.parseInt(str);
113     }
114     catch (NumberFormatException e) {
115       return null;
116     }
117   }
118
119 }