001 /*
002 * Copyright 2009-2015 UnboundID Corp.
003 * All Rights Reserved.
004 */
005 /*
006 * Copyright (C) 2015 UnboundID Corp.
007 *
008 * This program is free software; you can redistribute it and/or modify
009 * it under the terms of the GNU General Public License (GPLv2 only)
010 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
011 * as published by the Free Software Foundation.
012 *
013 * This program is distributed in the hope that it will be useful,
014 * but WITHOUT ANY WARRANTY; without even the implied warranty of
015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016 * GNU General Public License for more details.
017 *
018 * You should have received a copy of the GNU General Public License
019 * along with this program; if not, see <http://www.gnu.org/licenses>.
020 */
021 package com.unboundid.ldap.sdk.unboundidds.monitors;
022
023
024
025 import java.io.Serializable;
026 import java.text.SimpleDateFormat;
027 import java.util.Date;
028
029 import com.unboundid.util.NotMutable;
030 import com.unboundid.util.ThreadSafety;
031 import com.unboundid.util.ThreadSafetyLevel;
032
033 import static com.unboundid.util.Debug.*;
034
035
036
037 /**
038 * <BLOCKQUOTE>
039 * <B>NOTE:</B> This class is part of the Commercial Edition of the UnboundID
040 * LDAP SDK for Java. It is not available for use in applications that
041 * include only the Standard Edition of the LDAP SDK, and is not supported for
042 * use in conjunction with non-UnboundID products.
043 * </BLOCKQUOTE>
044 * This class provides a data structure that contains information about a
045 * replication server contained in a replication summary monitor entry.
046 */
047 @NotMutable()
048 @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
049 public final class ReplicationSummaryReplicationServer
050 implements Serializable
051 {
052 /**
053 * The serial version UID for this serializable class.
054 */
055 private static final long serialVersionUID = -3021672478708746554L;
056
057
058
059 // The date of the last successful connection to this replication server.
060 private final Date replicationServerLastConnected;
061
062 // The date of the last failed connection to this replication server.
063 private final Date replicationServerLastFailed;
064
065 // The number of times connection attempts to this replication server have
066 // failed. The counter is reset after a successful connection.
067 private final Long replicationServerFailedAttempts;
068
069 // The port number for this replication server.
070 private final Long replicationServerPort;
071
072 // The generation ID for this replication server.
073 private final String generationID;
074
075 // The address for this replication server.
076 private final String replicationServerAddress;
077
078 // The replication server ID for this replication server.
079 private final String replicationServerID;
080
081 // The status for this replication server.
082 private final String replicationServerStatus;
083
084 // The value used to create this replication summary replica object.
085 private final String stringRepresentation;
086
087
088
089 /**
090 * Creates a new replication summary replication server object from the
091 * provided string representation.
092 *
093 * @param value The value string to be parsed as a replication summary
094 * replication server object.
095 */
096 public ReplicationSummaryReplicationServer(final String value)
097 {
098 stringRepresentation = value;
099
100 generationID = getElementValue(value, "generation-id");
101 replicationServerID = getElementValue(value, "server-id");
102
103 final String hostPort = getElementValue(value, "server");
104 if (hostPort == null)
105 {
106 replicationServerAddress = null;
107 replicationServerPort = null;
108 }
109 else
110 {
111 Long p;
112 String a;
113
114 try
115 {
116 final int colonPos = hostPort.indexOf(':');
117 a = hostPort.substring(0, colonPos);
118 p = Long.parseLong(hostPort.substring(colonPos+1));
119 }
120 catch (Exception e)
121 {
122 debugException(e);
123 a = null;
124 p = null;
125 }
126
127 replicationServerAddress = a;
128 replicationServerPort = p;
129 }
130
131 replicationServerStatus = getElementValue(value, "status");
132 replicationServerLastConnected =
133 getElementDateValue(value, "last-connected");
134 replicationServerLastFailed = getElementDateValue(value, "last-failed");
135 replicationServerFailedAttempts =
136 getElementLongValue(value, "failed-attempts");
137 }
138
139
140
141 /**
142 * Retrieves the value for the specified element in the replica string.
143 *
144 * @param s The string to be parsed.
145 * @param n The name of the element for which to retrieve the value.
146 *
147 * @return The value for the specified element in the replica string, or
148 * {@code null} if it was not present or could not be determined.
149 */
150 private static String getElementValue(final String s, final String n)
151 {
152 final String nPlusEQ = n + "=\"";
153
154 int pos = s.indexOf(nPlusEQ);
155 if (pos < 0)
156 {
157 return null;
158 }
159 pos += nPlusEQ.length();
160
161 final int closePos = s.indexOf('"', pos);
162 if (closePos <= pos)
163 {
164 return null;
165 }
166
167 return s.substring(pos, closePos);
168 }
169
170
171
172 /**
173 * Retrieves the value for the specified element in the replica string as a
174 * {@code Date} object.
175 *
176 * @param s The string to be parsed.
177 * @param n The name of the element for which to retrieve the value.
178 *
179 * @return The value for the specified element in the replica string as a
180 * {@code Date}, or {@code null} if it was not present or could not
181 * be determined or parsed as a {@code Date}.
182 */
183 private static Date getElementDateValue(final String s, final String n)
184 {
185 final String stringValue = getElementValue(s, n);
186 if (stringValue == null)
187 {
188 return null;
189 }
190
191 try
192 {
193 final SimpleDateFormat f =
194 new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
195 return f.parse(stringValue);
196 }
197 catch (final Exception e)
198 {
199 debugException(e);
200 return null;
201 }
202 }
203
204
205
206 /**
207 * Retrieves the value for the specified element in the replica string as a
208 * {@code Long} object.
209 *
210 * @param s The string to be parsed.
211 * @param n The name of the element for which to retrieve the value.
212 *
213 * @return The value for the specified element in the replica string as a
214 * {@code Long}, or {@code null} if it was not present or could not
215 * be determined or parsed as a {@code Long}.
216 */
217 private static Long getElementLongValue(final String s, final String n)
218 {
219 final String stringValue = getElementValue(s, n);
220 if (stringValue == null)
221 {
222 return null;
223 }
224
225 try
226 {
227 return Long.valueOf(stringValue);
228 }
229 catch (final Exception e)
230 {
231 debugException(e);
232 return null;
233 }
234 }
235
236
237
238 /**
239 * Retrieves the replication server ID for this replication server.
240 *
241 * @return The replication server ID for this replication server, or
242 * {@code null} if that information is not available.
243 */
244 public String getReplicationServerID()
245 {
246 return replicationServerID;
247 }
248
249
250
251 /**
252 * Retrieves the address used to communicate with this replication server.
253 *
254 * @return The address used to communicate with this replication server, or
255 * {@code null} if that information is not available.
256 */
257 public String getReplicationServerAddress()
258 {
259 return replicationServerAddress;
260 }
261
262
263
264 /**
265 * Retrieves the port number used to communicate with this replication server.
266 *
267 * @return The port number used to communicate with this replication server,
268 * or {@code null} if that information is not available.
269 */
270 public Long getReplicationServerPort()
271 {
272 return replicationServerPort;
273 }
274
275
276
277 /**
278 * Retrieves the generation ID for this replication server.
279 *
280 * @return The generation ID for this replication server, or {@code null} if
281 * that information is not available.
282 */
283 public String getGenerationID()
284 {
285 return generationID;
286 }
287
288
289
290 /**
291 * Retrieves the status for this replication server.
292 *
293 * @return The status for this replication server, or {@code null} if
294 * that information is not available.
295 */
296 public String getReplicationServerStatus()
297 {
298 return replicationServerStatus;
299 }
300
301
302
303 /**
304 * Retrieves the date of the last successful connection to this replication
305 * server.
306 *
307 * @return The the date of the last successful connection to this replication
308 * server, or {@code null} if that information is not available.
309 */
310 public Date getReplicationServerLastConnected()
311 {
312 return replicationServerLastConnected;
313 }
314
315
316
317 /**
318 * Retrieves the date of the last failed connection to this replication
319 * server.
320 *
321 * @return The the date of the last failed connection to this replication
322 * server, or {@code null} if that information is not available.
323 */
324 public Date getReplicationServerLastFailed()
325 {
326 return replicationServerLastFailed;
327 }
328
329
330
331 /**
332 * Retrieves the number of failed connection attempts since the last
333 * successful connection to this replication server.
334 *
335 * @return The number of failed connection attempts since the last successful
336 * connection to this replication server, or {@code null} if that
337 * information is not available.
338 */
339 public Long getReplicationServerFailedAttempts()
340 {
341 return replicationServerFailedAttempts;
342 }
343
344
345
346 /**
347 * Retrieves a string representation of this replication summary replica.
348 *
349 * @return A string representation of this replication summary replica.
350 */
351 @Override()
352 public String toString()
353 {
354 return stringRepresentation;
355 }
356 }