1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.xnap.plugin.opennap.util;
21
22 import java.util.StringTokenizer;
23
24 /***
25 * This class provides means to parse the version string that is submitted
26 * by most servers on login. This class is used by {@link MessageSender}
27 * to send messages that are only supported by specific server
28 * software version.
29 */
30 public class OpenNapServerVersion {
31
32
33
34 public static final OpenNapServerVersion OPENNAP044
35 = new OpenNapServerVersion("opennap 0.44.0", null);
36
37 public static final OpenNapServerVersion SLAVANAP1
38 = new OpenNapServerVersion("slavanap 1.0.0", null);
39
40 public static final OpenNapServerVersion SLAVANAP2
41 = new OpenNapServerVersion("slavanap 2.0.0", SLAVANAP1);
42
43 public static final OpenNapServerVersion UNKNOWN
44 = new OpenNapServerVersion("", null);
45
46 public static final OpenNapServerVersion[] TOP_VERSIONS = {
47 OPENNAP044, SLAVANAP2
48 };
49
50
51
52 public String software;
53 public int[] versions;
54 public OpenNapServerVersion nextVersion;
55
56
57
58 public OpenNapServerVersion(String version, OpenNapServerVersion nextVersion)
59 {
60 parse(version);
61
62 this.nextVersion = nextVersion;
63 }
64
65 public OpenNapServerVersion(String version)
66 {
67 parse(version);
68
69 this.nextVersion = getClosestVersion();
70 if (this.nextVersion == null) {
71
72 this.nextVersion = OPENNAP044;
73 }
74 }
75
76
77
78 /***
79 * Find a known version that is smaller than ours. That should be
80 * compatible for sure.
81 */
82 public OpenNapServerVersion getClosestVersion()
83 {
84 for (int i = 0; i < TOP_VERSIONS.length; i++) {
85 OpenNapServerVersion next = TOP_VERSIONS[i];
86 if (software.equalsIgnoreCase(next.software)) {
87 while (next != null) {
88 if (this.isCompatibleTo(next)) {
89 return next;
90 }
91 next = next.getNextVersion();
92 }
93 }
94 }
95
96 return null;
97 }
98
99 public OpenNapServerVersion getNextVersion()
100 {
101 return nextVersion;
102 }
103
104 public boolean isOpenNap()
105 {
106 return software.equalsIgnoreCase("opennap");
107 }
108
109 public boolean isSlavaNap()
110 {
111 return software.equalsIgnoreCase("slavanap");
112 }
113
114 public String toString()
115 {
116 StringBuffer sb = new StringBuffer();
117 sb.append(software);
118 if (versions.length > 0) {
119 sb.append(" ");
120 }
121 for (int i = 0; i < versions.length; i++) {
122 sb.append(versions[i]);
123 if (i < versions.length - 1) {
124 sb.append(".");
125 }
126 }
127 return sb.toString();
128 }
129
130 /***
131 * Returns true, if this version is greater or equal than
132 * <code>v</code>.
133 */
134 public boolean isCompatibleTo(OpenNapServerVersion v)
135 {
136 for (int i = 0; i < versions.length && i < v.versions.length; i++) {
137 if (this.versions[i] > v.versions[i]) {
138 return true;
139 }
140 else if (this.versions[i] < v.versions[i]) {
141 return false;
142 }
143 }
144
145 return this.versions.length >= v.versions.length;
146 }
147
148 protected void parse(String version)
149 {
150
151 StringTokenizer t = new StringTokenizer(version, " .");
152 if (t.hasMoreTokens()) {
153 software = t.nextToken();
154 }
155 else {
156 software = "";
157 }
158
159
160 versions = new int[t.countTokens()];
161 if (t.hasMoreTokens()) {
162 for (int i = 0; i < versions.length; i++) {
163 try {
164 versions[i] = Integer.parseInt(t.nextToken());
165 }
166 catch (NumberFormatException e) {
167 versions[i] = 0;
168 }
169 }
170 }
171 }
172
173 }