blob: 9396e3b1b7e12ba07fab637d19d5007228e3e4fb [file] [log] [blame]
Shuyi Chend7955ce2013-05-22 14:51:55 -07001/*
2 * Copyright 2009 Mike Cumings
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
17package com.kenai.jbosh;
18
19/**
20 * Data type representing the getValue of the {@code ver} attribute of the
21 * {@code bosh} element.
22 */
23final class AttrVersion extends AbstractAttr<String> implements Comparable {
24
25 /**
26 * Default value if none is provided.
27 */
28 private static final AttrVersion DEFAULT;
29 static {
30 try {
31 DEFAULT = createFromString("1.8");
32 } catch (BOSHException boshx) {
33 throw(new IllegalStateException(boshx));
34 }
35 }
36
37 /**
38 * Major portion of the version.
39 */
40 private final int major;
41
42 /**
43 * Minor portion of the version.
44 */
45 private final int minor;
46
47 /**
48 * Creates a new attribute object.
49 *
50 * @param val attribute getValue
51 * @throws BOSHException on parse or validation failure
52 */
53 private AttrVersion(final String val) throws BOSHException {
54 super(val);
55
56 int idx = val.indexOf('.');
57 if (idx <= 0) {
58 throw(new BOSHException(
59 "Illegal ver attribute value (not in major.minor form): "
60 + val));
61 }
62
63 String majorStr = val.substring(0, idx);
64 try {
65 major = Integer.parseInt(majorStr);
66 } catch (NumberFormatException nfx) {
67 throw(new BOSHException(
68 "Could not parse ver attribute value (major ver): "
69 + majorStr,
70 nfx));
71 }
72 if (major < 0) {
73 throw(new BOSHException(
74 "Major version may not be < 0"));
75 }
76
77 String minorStr = val.substring(idx + 1);
78 try {
79 minor = Integer.parseInt(minorStr);
80 } catch (NumberFormatException nfx) {
81 throw(new BOSHException(
82 "Could not parse ver attribute value (minor ver): "
83 + minorStr,
84 nfx));
85 }
86 if (minor < 0) {
87 throw(new BOSHException(
88 "Minor version may not be < 0"));
89 }
90 }
91
92 /**
93 * Get the version of specifcation that we support.
94 *
95 * @return max spec version the code supports
96 */
97 static AttrVersion getSupportedVersion() {
98 return DEFAULT;
99 }
100
101 /**
102 * Creates a new attribute instance from the provided String.
103 *
104 * @param str string representation of the attribute
105 * @return attribute instance or {@code null} if provided string is
106 * {@code null}
107 * @throws BOSHException on parse or validation failure
108 */
109 static AttrVersion createFromString(final String str)
110 throws BOSHException {
111 if (str == null) {
112 return null;
113 } else {
114 return new AttrVersion(str);
115 }
116 }
117
118 /**
119 * Returns the 'major' portion of the version number.
120 *
121 * @return major digits only
122 */
123 int getMajor() {
124 return major;
125 }
126
127 /**
128 * Returns the 'minor' portion of the version number.
129 *
130 * @return minor digits only
131 */
132 int getMinor() {
133 return minor;
134 }
135
136 ///////////////////////////////////////////////////////////////////////////
137 // Comparable interface:
138
139 /**
140 * {@inheritDoc}
141 *
142 * @param otherObj object to compare to
143 * @return -1, 0, or 1
144 */
145 @Override
146 public int compareTo(final Object otherObj) {
147 if (otherObj instanceof AttrVersion) {
148 AttrVersion other = (AttrVersion) otherObj;
149 if (major < other.major) {
150 return -1;
151 } else if (major > other.major) {
152 return 1;
153 } else if (minor < other.minor) {
154 return -1;
155 } else if (minor > other.minor) {
156 return 1;
157 } else {
158 return 0;
159 }
160 } else {
161 return 0;
162 }
163 }
164
165}