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.logs;
022
023
024
025 import java.io.BufferedReader;
026 import java.io.File;
027 import java.io.FileReader;
028 import java.io.IOException;
029 import java.io.Reader;
030
031 import com.unboundid.util.NotMutable;
032 import com.unboundid.util.ThreadSafety;
033 import com.unboundid.util.ThreadSafetyLevel;
034
035 import static com.unboundid.ldap.sdk.unboundidds.logs.LogMessages.*;
036
037
038
039 /**
040 * <BLOCKQUOTE>
041 * <B>NOTE:</B> This class is part of the Commercial Edition of the UnboundID
042 * LDAP SDK for Java. It is not available for use in applications that
043 * include only the Standard Edition of the LDAP SDK, and is not supported for
044 * use in conjunction with non-UnboundID products.
045 * </BLOCKQUOTE>
046 * This class provides a mechanism for reading message from a Directory Server
047 * access log.
048 */
049 @NotMutable()
050 @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
051 public final class AccessLogReader
052 {
053 // The reader used to read the contents of the log file.
054 private final BufferedReader reader;
055
056
057
058 /**
059 * Creates a new access log reader that will read messages from the specified
060 * log file.
061 *
062 * @param path The path of the log file to read.
063 *
064 * @throws IOException If a problem occurs while opening the file for
065 * reading.
066 */
067 public AccessLogReader(final String path)
068 throws IOException
069 {
070 reader = new BufferedReader(new FileReader(path));
071 }
072
073
074
075 /**
076 * Creates a new access log reader that will read messages from the specified
077 * log file.
078 *
079 * @param file The log file to read.
080 *
081 * @throws IOException If a problem occurs while opening the file for
082 * reading.
083 */
084 public AccessLogReader(final File file)
085 throws IOException
086 {
087 reader = new BufferedReader(new FileReader(file));
088 }
089
090
091
092 /**
093 * Creates a new access log reader that will read messages using the provided
094 * {@code Reader} object.
095 *
096 * @param reader The reader to use to read log messages.
097 */
098 public AccessLogReader(final Reader reader)
099 {
100 if (reader instanceof BufferedReader)
101 {
102 this.reader = (BufferedReader) reader;
103 }
104 else
105 {
106 this.reader = new BufferedReader(reader);
107 }
108 }
109
110
111
112 /**
113 * Reads the next access log message from the log file.
114 *
115 * @return The access log message read from the log file, or {@code null} if
116 * there are no more messages to be read.
117 *
118 * @throws IOException If an error occurs while trying to read from the
119 * file.
120 *
121 * @throws LogException If an error occurs while trying to parse the log
122 * message.
123 */
124 public AccessLogMessage read()
125 throws IOException, LogException
126 {
127 while (true)
128 {
129 final String line = reader.readLine();
130 if (line == null)
131 {
132 return null;
133 }
134
135 if ((line.length() == 0) || (line.charAt(0) == '#'))
136 {
137 continue;
138 }
139
140 return parse(line);
141 }
142 }
143
144
145
146 /**
147 * Parses the provided string as an access log message.
148 *
149 * @param s The string to parse as an access log message.
150 *
151 * @return The parsed access log message.
152 *
153 * @throws LogException If an error occurs while trying to parse the log
154 * message.
155 */
156 public static AccessLogMessage parse(final String s)
157 throws LogException
158 {
159 final LogMessage m = new LogMessage(s);
160 if (m.hasUnnamedValue(AccessLogMessageType.CONNECT.getLogIdentifier()))
161 {
162 return new ConnectAccessLogMessage(m);
163 }
164 else if (m.hasUnnamedValue(AccessLogMessageType.DISCONNECT.
165 getLogIdentifier()))
166 {
167 return new DisconnectAccessLogMessage(m);
168 }
169 else if (m.hasUnnamedValue(AccessLogMessageType.CLIENT_CERTIFICATE.
170 getLogIdentifier()))
171 {
172 return new ClientCertificateAccessLogMessage(m);
173 }
174 else if (m.hasUnnamedValue(AccessLogMessageType.SECURITY_NEGOTIATION.
175 getLogIdentifier()))
176 {
177 return new SecurityNegotiationAccessLogMessage(m);
178 }
179 else if (m.hasUnnamedValue(AccessLogMessageType.ENTRY_REBALANCING_REQUEST.
180 getLogIdentifier()))
181 {
182 return new EntryRebalancingRequestAccessLogMessage(m);
183 }
184 else if (m.hasUnnamedValue(AccessLogMessageType.ENTRY_REBALANCING_RESULT.
185 getLogIdentifier()))
186 {
187 return new EntryRebalancingResultAccessLogMessage(m);
188 }
189 else if (m.hasUnnamedValue(AccessLogMessageType.REQUEST.
190 getLogIdentifier()))
191 {
192 if (m.hasUnnamedValue(AccessLogOperationType.ABANDON.
193 getLogIdentifier()))
194 {
195 return new AbandonRequestAccessLogMessage(m);
196 }
197 else if (m.hasUnnamedValue(AccessLogOperationType.ADD.
198 getLogIdentifier()))
199 {
200 return new AddRequestAccessLogMessage(m);
201 }
202 else if (m.hasUnnamedValue(AccessLogOperationType.BIND.
203 getLogIdentifier()))
204 {
205 return new BindRequestAccessLogMessage(m);
206 }
207 else if (m.hasUnnamedValue(AccessLogOperationType.COMPARE.
208 getLogIdentifier()))
209 {
210 return new CompareRequestAccessLogMessage(m);
211 }
212 else if (m.hasUnnamedValue(AccessLogOperationType.DELETE.
213 getLogIdentifier()))
214 {
215 return new DeleteRequestAccessLogMessage(m);
216 }
217 else if (m.hasUnnamedValue(AccessLogOperationType.EXTENDED.
218 getLogIdentifier()))
219 {
220 return new ExtendedRequestAccessLogMessage(m);
221 }
222 else if (m.hasUnnamedValue(AccessLogOperationType.MODIFY.
223 getLogIdentifier()))
224 {
225 return new ModifyRequestAccessLogMessage(m);
226 }
227 else if (m.hasUnnamedValue(AccessLogOperationType.MODDN.
228 getLogIdentifier()))
229 {
230 return new ModifyDNRequestAccessLogMessage(m);
231 }
232 else if (m.hasUnnamedValue(AccessLogOperationType.SEARCH.
233 getLogIdentifier()))
234 {
235 return new SearchRequestAccessLogMessage(m);
236 }
237 else if (m.hasUnnamedValue(AccessLogOperationType.UNBIND.
238 getLogIdentifier()))
239 {
240 return new UnbindRequestAccessLogMessage(m);
241 }
242 else
243 {
244 throw new LogException(s,
245 ERR_LOG_MESSAGE_INVALID_REQUEST_OPERATION_TYPE.get());
246 }
247 }
248 else if (m.hasUnnamedValue(AccessLogMessageType.RESULT.
249 getLogIdentifier()))
250 {
251 if (m.hasUnnamedValue(AccessLogOperationType.ABANDON.
252 getLogIdentifier()))
253 {
254 return new AbandonResultAccessLogMessage(m);
255 }
256 else if (m.hasUnnamedValue(AccessLogOperationType.ADD.
257 getLogIdentifier()))
258 {
259 return new AddResultAccessLogMessage(m);
260 }
261 else if (m.hasUnnamedValue(AccessLogOperationType.BIND.
262 getLogIdentifier()))
263 {
264 return new BindResultAccessLogMessage(m);
265 }
266 else if (m.hasUnnamedValue(AccessLogOperationType.COMPARE.
267 getLogIdentifier()))
268 {
269 return new CompareResultAccessLogMessage(m);
270 }
271 else if (m.hasUnnamedValue(AccessLogOperationType.DELETE.
272 getLogIdentifier()))
273 {
274 return new DeleteResultAccessLogMessage(m);
275 }
276 else if (m.hasUnnamedValue(AccessLogOperationType.EXTENDED.
277 getLogIdentifier()))
278 {
279 return new ExtendedResultAccessLogMessage(m);
280 }
281 else if (m.hasUnnamedValue(AccessLogOperationType.MODIFY.
282 getLogIdentifier()))
283 {
284 return new ModifyResultAccessLogMessage(m);
285 }
286 else if (m.hasUnnamedValue(AccessLogOperationType.MODDN.
287 getLogIdentifier()))
288 {
289 return new ModifyDNResultAccessLogMessage(m);
290 }
291 else if (m.hasUnnamedValue(AccessLogOperationType.SEARCH.
292 getLogIdentifier()))
293 {
294 return new SearchResultAccessLogMessage(m);
295 }
296 else
297 {
298 throw new LogException(s,
299 ERR_LOG_MESSAGE_INVALID_RESULT_OPERATION_TYPE.get());
300 }
301 }
302 else if (m.hasUnnamedValue(AccessLogMessageType.FORWARD.
303 getLogIdentifier()))
304 {
305 if (m.hasUnnamedValue(AccessLogOperationType.ABANDON.
306 getLogIdentifier()))
307 {
308 return new AbandonForwardAccessLogMessage(m);
309 }
310 else if (m.hasUnnamedValue(AccessLogOperationType.ADD.
311 getLogIdentifier()))
312 {
313 return new AddForwardAccessLogMessage(m);
314 }
315 else if (m.hasUnnamedValue(AccessLogOperationType.BIND.
316 getLogIdentifier()))
317 {
318 return new BindForwardAccessLogMessage(m);
319 }
320 else if (m.hasUnnamedValue(AccessLogOperationType.COMPARE.
321 getLogIdentifier()))
322 {
323 return new CompareForwardAccessLogMessage(m);
324 }
325 else if (m.hasUnnamedValue(AccessLogOperationType.DELETE.
326 getLogIdentifier()))
327 {
328 return new DeleteForwardAccessLogMessage(m);
329 }
330 else if (m.hasUnnamedValue(AccessLogOperationType.EXTENDED.
331 getLogIdentifier()))
332 {
333 return new ExtendedForwardAccessLogMessage(m);
334 }
335 else if (m.hasUnnamedValue(AccessLogOperationType.MODIFY.
336 getLogIdentifier()))
337 {
338 return new ModifyForwardAccessLogMessage(m);
339 }
340 else if (m.hasUnnamedValue(AccessLogOperationType.MODDN.
341 getLogIdentifier()))
342 {
343 return new ModifyDNForwardAccessLogMessage(m);
344 }
345 else if (m.hasUnnamedValue(AccessLogOperationType.SEARCH.
346 getLogIdentifier()))
347 {
348 return new SearchForwardAccessLogMessage(m);
349 }
350 else
351 {
352 throw new LogException(s,
353 ERR_LOG_MESSAGE_INVALID_FORWARD_OPERATION_TYPE.get());
354 }
355 }
356 else if (m.hasUnnamedValue(AccessLogMessageType.FORWARD_FAILED.
357 getLogIdentifier()))
358 {
359 if (m.hasUnnamedValue(AccessLogOperationType.ADD.getLogIdentifier()))
360 {
361 return new AddForwardFailedAccessLogMessage(m);
362 }
363 else if (m.hasUnnamedValue(AccessLogOperationType.BIND.
364 getLogIdentifier()))
365 {
366 return new BindForwardFailedAccessLogMessage(m);
367 }
368 else if (m.hasUnnamedValue(AccessLogOperationType.COMPARE.
369 getLogIdentifier()))
370 {
371 return new CompareForwardFailedAccessLogMessage(m);
372 }
373 else if (m.hasUnnamedValue(AccessLogOperationType.DELETE.
374 getLogIdentifier()))
375 {
376 return new DeleteForwardFailedAccessLogMessage(m);
377 }
378 else if (m.hasUnnamedValue(AccessLogOperationType.EXTENDED.
379 getLogIdentifier()))
380 {
381 return new ExtendedForwardFailedAccessLogMessage(m);
382 }
383 else if (m.hasUnnamedValue(AccessLogOperationType.MODIFY.
384 getLogIdentifier()))
385 {
386 return new ModifyForwardFailedAccessLogMessage(m);
387 }
388 else if (m.hasUnnamedValue(AccessLogOperationType.MODDN.
389 getLogIdentifier()))
390 {
391 return new ModifyDNForwardFailedAccessLogMessage(m);
392 }
393 else if (m.hasUnnamedValue(AccessLogOperationType.SEARCH.
394 getLogIdentifier()))
395 {
396 return new SearchForwardFailedAccessLogMessage(m);
397 }
398 else
399 {
400 throw new LogException(s,
401 ERR_LOG_MESSAGE_INVALID_FORWARD_FAILED_OPERATION_TYPE.get());
402 }
403 }
404 else if (m.hasUnnamedValue(AccessLogMessageType.ASSURANCE_COMPLETE.
405 getLogIdentifier()))
406 {
407 if (m.hasUnnamedValue(AccessLogOperationType.ADD.getLogIdentifier()))
408 {
409 return new AddAssuranceCompletedAccessLogMessage(m);
410 }
411 else if (m.hasUnnamedValue(AccessLogOperationType.DELETE.
412 getLogIdentifier()))
413 {
414 return new DeleteAssuranceCompletedAccessLogMessage(m);
415 }
416 else if (m.hasUnnamedValue(AccessLogOperationType.MODIFY.
417 getLogIdentifier()))
418 {
419 return new ModifyAssuranceCompletedAccessLogMessage(m);
420 }
421 else if (m.hasUnnamedValue(AccessLogOperationType.MODDN.
422 getLogIdentifier()))
423 {
424 return new ModifyDNAssuranceCompletedAccessLogMessage(m);
425 }
426 else
427 {
428 throw new LogException(s,
429 ERR_LOG_MESSAGE_INVALID_ASSURANCE_COMPLETE_OPERATION_TYPE.get());
430 }
431 }
432 else if (m.hasUnnamedValue(AccessLogMessageType.ENTRY.getLogIdentifier()))
433 {
434 return new SearchEntryAccessLogMessage(m);
435 }
436 else if (m.hasUnnamedValue(AccessLogMessageType.REFERENCE.
437 getLogIdentifier()))
438 {
439 return new SearchReferenceAccessLogMessage(m);
440 }
441 else if (m.hasUnnamedValue(AccessLogMessageType.INTERMEDIATE_RESPONSE.
442 getLogIdentifier()))
443 {
444 return new IntermediateResponseAccessLogMessage(m);
445 }
446 else
447 {
448 throw new LogException(s,
449 ERR_LOG_MESSAGE_INVALID_ACCESS_MESSAGE_TYPE.get());
450 }
451 }
452
453
454
455 /**
456 * Closes this error log reader.
457 *
458 * @throws IOException If a problem occurs while closing the reader.
459 */
460 public void close()
461 throws IOException
462 {
463 reader.close();
464 }
465 }