001    /*
002     * CDDL HEADER START
003     *
004     * The contents of this file are subject to the terms of the
005     * Common Development and Distribution License, Version 1.0 only
006     * (the "License").  You may not use this file except in compliance
007     * with the License.
008     *
009     * You can obtain a copy of the license at
010     * docs/licenses/cddl.txt
011     * or http://www.opensource.org/licenses/cddl1.php.
012     * See the License for the specific language governing permissions
013     * and limitations under the License.
014     *
015     * When distributing Covered Code, include this CDDL HEADER in each
016     * file and include the License file at
017     * docs/licenses/cddl.txt.  If applicable,
018     * add the following below this CDDL HEADER, with the fields enclosed
019     * by brackets "[]" replaced with your own identifying information:
020     *      Portions Copyright [yyyy] [name of copyright owner]
021     *
022     * CDDL HEADER END
023     *
024     *
025     *      Copyright 2011-2013 UnboundID Corp.
026     */
027    package com.unboundid.directory.sdk.common.api;
028    
029    
030    
031    import java.security.cert.Certificate;
032    import java.util.Collections;
033    import java.util.List;
034    import java.util.Map;
035    
036    import com.unboundid.directory.sdk.common.config.FileBasedAccessLoggerConfig;
037    import com.unboundid.directory.sdk.common.internal.ExampleUsageProvider;
038    import com.unboundid.directory.sdk.common.internal.Reconfigurable;
039    import com.unboundid.directory.sdk.common.internal.UnboundIDExtension;
040    import com.unboundid.directory.sdk.common.operation.AbandonRequest;
041    import com.unboundid.directory.sdk.common.operation.AddRequest;
042    import com.unboundid.directory.sdk.common.operation.AddResult;
043    import com.unboundid.directory.sdk.common.operation.BindResult;
044    import com.unboundid.directory.sdk.common.operation.CompareRequest;
045    import com.unboundid.directory.sdk.common.operation.CompareResult;
046    import com.unboundid.directory.sdk.common.operation.DeleteRequest;
047    import com.unboundid.directory.sdk.common.operation.DeleteResult;
048    import com.unboundid.directory.sdk.common.operation.ExtendedRequest;
049    import com.unboundid.directory.sdk.common.operation.ExtendedResult;
050    import com.unboundid.directory.sdk.common.operation.GenericResult;
051    import com.unboundid.directory.sdk.common.operation.ModifyRequest;
052    import com.unboundid.directory.sdk.common.operation.ModifyResult;
053    import com.unboundid.directory.sdk.common.operation.ModifyDNRequest;
054    import com.unboundid.directory.sdk.common.operation.ModifyDNResult;
055    import com.unboundid.directory.sdk.common.operation.SASLBindRequest;
056    import com.unboundid.directory.sdk.common.operation.SearchRequest;
057    import com.unboundid.directory.sdk.common.operation.SearchResult;
058    import com.unboundid.directory.sdk.common.operation.SimpleBindRequest;
059    import com.unboundid.directory.sdk.common.operation.UnbindRequest;
060    import com.unboundid.directory.sdk.common.types.ClientContext;
061    import com.unboundid.directory.sdk.common.types.CompletedOperationContext;
062    import com.unboundid.directory.sdk.common.types.CompletedSearchOperationContext;
063    import com.unboundid.directory.sdk.common.types.DisconnectReason;
064    import com.unboundid.directory.sdk.common.types.Entry;
065    import com.unboundid.directory.sdk.common.types.ForwardTarget;
066    import com.unboundid.directory.sdk.common.types.OperationContext;
067    import com.unboundid.directory.sdk.common.types.ServerContext;
068    import com.unboundid.directory.sdk.ds.internal.DirectoryServerExtension;
069    import com.unboundid.directory.sdk.metrics.internal.MetricsEngineExtension;
070    import com.unboundid.directory.sdk.proxy.internal.DirectoryProxyServerExtension;
071    import com.unboundid.directory.sdk.sync.internal.SynchronizationServerExtension;
072    import com.unboundid.ldap.sdk.Control;
073    import com.unboundid.ldap.sdk.IntermediateResponse;
074    import com.unboundid.ldap.sdk.LDAPException;
075    import com.unboundid.ldap.sdk.ResultCode;
076    import com.unboundid.ldap.sdk.unboundidds.MoveSubtreeResult;
077    import com.unboundid.util.Extensible;
078    import com.unboundid.util.ThreadSafety;
079    import com.unboundid.util.ThreadSafetyLevel;
080    import com.unboundid.util.args.ArgumentException;
081    import com.unboundid.util.args.ArgumentParser;
082    
083    
084    
085    /**
086     * This class defines an API that may be used to create a specific type of
087     * access logger which is intended to write log messages to text files.  This is
088     * a convenience for developers which wish to create custom access loggers that
089     * write to text files and provides support for a wide range of functionality
090     * including high-performance and highly-concurrent logging.  All of the options
091     * available to {@link AccessLogger} implementations are available for
092     * file-based access loggers, as well as options for indicating the log file
093     * path, the rotation and retention policies, whether to buffer the output, etc.
094     * <BR><BR>
095     * Note that file-based access loggers will automatically be registered within
096     * the server as disk space consumers, so there is no need to implement the
097     * {@link DiskSpaceConsumer} interface.  Also note that configuration change
098     * related to the log file (e.g., the log file path, buffer size, queue size,
099     * etc.) will also automatically be handled by the server, so subclasses only
100     * need to be concerned about changes to the custom arguments they define.
101     * <BR>
102     * <H2>Configuring File-Based Access Loggers</H2>
103     * In order to configure a file-based access logger created using this API, use
104     * a command like:
105     * <PRE>
106     *      dsconfig create-log-publisher \
107     *           --publisher-name "<I>{logger-name}</I>" \
108     *           --type third-party-file-based-access \
109     *           --set enabled:true \
110     *           --set "log-file:<I>{path}</I>" \
111     *           --set "rotation-policy:<I>{rotation-policy-name}</I>" \
112     *           --set "retention-policy:<I>{retention-policy-name}</I>" \
113     *           --set "extension-class:<I>{class-name}</I>" \
114     *           --set "extension-argument:<I>{name=value}</I>"
115     * </PRE>
116     * where "<I>{logger-name}</I>" is the name to use for the access logger
117     * instance, "<I>{path}</I>" is the path to the log file to be written,
118     * "<I>{rotation-policy-name}</I>" is the name of the log rotation policy to use
119     * for the log file, "<I>{retention-policy-name}</I>" is the name of the log
120     * retention policy to use for the log file, "<I>{class-name}</I>" is the
121     * fully-qualified name of the Java class that extends
122     * {@code com.unboundid.directory.sdk.common.api.FileBasedAccessLogger}, and
123     * "<I>{name=value}</I>" represents name-value pairs for any arguments to
124     * provide to the logger.  If multiple arguments should be provided to the
125     * logger, then the "<CODE>--set extension-argument:<I>{name=value}</I></CODE>"
126     * option should be provided multiple times.  It is also possible to specify
127     * multiple log rotation and/or retention policies if desired.
128     *
129     * @see  AccessLogger
130     * @see  com.unboundid.directory.sdk.common.scripting.ScriptedAccessLogger
131     * @see
132     *    com.unboundid.directory.sdk.common.scripting.ScriptedFileBasedAccessLogger
133     */
134    @Extensible()
135    @DirectoryServerExtension()
136    @DirectoryProxyServerExtension(appliesToLocalContent=true,
137         appliesToRemoteContent=true)
138    @SynchronizationServerExtension(appliesToLocalContent=true,
139         appliesToSynchronizedContent=false)
140    @MetricsEngineExtension()
141    @ThreadSafety(level=ThreadSafetyLevel.INTERFACE_THREADSAFE)
142    public abstract class FileBasedAccessLogger
143           implements UnboundIDExtension,
144                      Reconfigurable<FileBasedAccessLoggerConfig>,
145                      ExampleUsageProvider
146    {
147      /**
148       * Creates a new instance of this file-based access logger.  All file-based
149       * access logger implementations must include a default constructor, but any
150       * initialization should generally be done in the
151       * {@code initializeAccessLogger} method.
152       */
153      public FileBasedAccessLogger()
154      {
155        // No implementation is required.
156      }
157    
158    
159    
160      /**
161       * {@inheritDoc}
162       */
163      public abstract String getExtensionName();
164    
165    
166    
167      /**
168       * {@inheritDoc}
169       */
170      public abstract String[] getExtensionDescription();
171    
172    
173    
174      /**
175       * {@inheritDoc}
176       */
177      public void defineConfigArguments(final ArgumentParser parser)
178             throws ArgumentException
179      {
180        // No arguments will be allowed by default.
181      }
182    
183    
184    
185      /**
186       * Initializes this file-based access logger.  Note that the work of
187       * initializing the log file writer will automatically be handled by the
188       * server, so the only initialization that needs to be performed is that
189       * required for custom arguments.
190       *
191       * @param  serverContext  A handle to the server context for the server in
192       *                        which this extension is running.
193       * @param  config         The general configuration for this file-based access
194       *                        logger.
195       * @param  parser         The argument parser which has been initialized from
196       *                        the configuration for this file-based access logger.
197       *
198       * @throws  LDAPException  If a problem occurs while initializing this
199       *                         file-based access logger.
200       */
201      public void initializeAccessLogger(final ServerContext serverContext,
202                                         final FileBasedAccessLoggerConfig config,
203                                         final ArgumentParser parser)
204             throws LDAPException
205      {
206        // No initialization will be performed by default.
207      }
208    
209    
210    
211      /**
212       * {@inheritDoc}  Note that the server will automatically handle the work of
213       * validating any changes to properties related to the log file, so only
214       * changes to custom arguments need to be examined here.
215       */
216      public boolean isConfigurationAcceptable(
217                          final FileBasedAccessLoggerConfig config,
218                          final ArgumentParser parser,
219                          final List<String> unacceptableReasons)
220      {
221        // No extended validation will be performed by default.
222        return true;
223      }
224    
225    
226    
227      /**
228       * {@inheritDoc}  Note that the server will automatically handle the work of
229       * applying any changes to properties related to the log file, so only changes
230       * to custom arguments need to be examined here.
231       */
232      public ResultCode applyConfiguration(final FileBasedAccessLoggerConfig config,
233                                           final ArgumentParser parser,
234                                           final List<String> adminActionsRequired,
235                                           final List<String> messages)
236      {
237        // If there are any custom arguments, then add an admin action message
238        // indicating that the extension needs to be restarted for any changes to
239        // take effect.
240        if (! parser.getNamedArguments().isEmpty())
241        {
242          adminActionsRequired.add(
243               "If any extension-argument values have been altered, then " +
244                    "those new values have not actually been applied.  The new " +
245                    "configuration for those arguments will not take effect " +
246                    "until this file-based access logger is disabled and " +
247                    "re-enabled, or until the server is restarted.");
248        }
249    
250        return ResultCode.SUCCESS;
251      }
252    
253    
254    
255      /**
256       * Performs any cleanup which may be necessary when this file-based access
257       * logger is to be taken out of service.  Any processing required for shutting
258       * down the log file writer will be automatically handled by the server.
259       */
260      public void finalizeAccessLogger()
261      {
262        // No implementation is required.
263      }
264    
265    
266    
267      /**
268       * Logs a message indicating that a new connection has been established.
269       *
270       * @param  clientContext  Information about the client connection that has
271       *                        been accepted.
272       *
273       * @return  The content of the log message that should be written.  It may be
274       *          {@code null} or empty if no message should be written.  It may
275       *          optionally include line breaks if the log message should span
276       *          multiple lines.
277       */
278      public CharSequence logConnect(final ClientContext clientContext)
279      {
280        // No log message will be generated by default.
281        return null;
282      }
283    
284    
285    
286      /**
287       * Logs a message indicating that a connection has been closed.
288       *
289       * @param  clientContext     Information about the client connection that has
290       *                           been closed.
291       * @param  disconnectReason  A general reason that the connection has been
292       *                           closed.
293       * @param  message           A message with additional information about the
294       *                           closure.  It may be {@code null} if none is
295       *                           available.
296       *
297       * @return  The content of the log message that should be written.  It may be
298       *          {@code null} or empty if no message should be written.  It may
299       *          optionally include line breaks if the log message should span
300       *          multiple lines.
301       */
302      public CharSequence logDisconnect(final ClientContext clientContext,
303                                        final DisconnectReason disconnectReason,
304                                        final String message)
305      {
306        // No log message will be generated by default.
307        return null;
308      }
309    
310    
311    
312      /**
313       * Logs a message about security negotiation performed by a client.
314       *
315       * @param  clientContext  Information about the client connection on which
316       *                        the negotiation was completed.
317       * @param  protocol       The security protocol selected by the negotiation.
318       *                        It may be {@code null} if no protocol is available.
319       * @param  cipher         The cipher suite selected by the negotiation.  It
320       *                        may be {@code null} if no cipher is available.
321       * @param  properties     A set of additional properties that may be included
322       *                        in the log message.  It may be {@code null} or empty
323       *                        if no additional properties are needed.
324       *
325       * @return  The content of the log message that should be written.  It may be
326       *          {@code null} or empty if no message should be written.  It may
327       *          optionally include line breaks if the log message should span
328       *          multiple lines.
329       */
330      public CharSequence logSecurityNegotiation(final ClientContext clientContext,
331                               final String protocol, final String cipher,
332                               final Map<String,String> properties)
333      {
334        // No log message will be generated by default.
335        return null;
336      }
337    
338    
339    
340      /**
341       * Logs a message about a certificate chain presented by a client.
342       *
343       * @param  clientContext  Information about the client that presented the
344       *                        certificate chain.
345       * @param  certChain      The certificate chain presented by the client.
346       * @param  authDN         The DN of the user as whom the client was
347       *                        automatically authenticated, or {@code null} if the
348       *                        client was not automatically authenticated.
349       *
350       * @return  The content of the log message that should be written.  It may be
351       *          {@code null} or empty if no message should be written.  It may
352       *          optionally include line breaks if the log message should span
353       *          multiple lines.
354       */
355      public CharSequence logClientCertificateChain(
356                               final ClientContext clientContext,
357                               final Certificate[] certChain, final String authDN)
358      {
359        // No log message will be generated by default.
360        return null;
361      }
362    
363    
364    
365      /**
366       * Logs a message about an abandon request received from a client.
367       *
368       * @param  opContext  The operation context for the abandon operation.
369       * @param  request    The abandon request that was received.
370       *
371       * @return  The content of the log message that should be written.  It may be
372       *          {@code null} or empty if no message should be written.  It may
373       *          optionally include line breaks if the log message should span
374       *          multiple lines.
375       */
376      public CharSequence logAbandonRequest(final OperationContext opContext,
377                                            final AbandonRequest request)
378      {
379        // No log message will be generated by default.
380        return null;
381      }
382    
383    
384    
385      /**
386       * Logs a message about an abandon request that will be forwarded to another
387       * server.
388       *
389       * @param  opContext  The operation context for the abandon operation.
390       * @param  request    The abandon request that was received.
391       * @param  target     Information about the server to which the request will
392       *                    be forwarded.
393       *
394       * @return  The content of the log message that should be written.  It may be
395       *          {@code null} or empty if no message should be written.  It may
396       *          optionally include line breaks if the log message should span
397       *          multiple lines.
398       */
399      public CharSequence logAbandonForward(final OperationContext opContext,
400                                            final AbandonRequest request,
401                                            final ForwardTarget target)
402      {
403        // No log message will be generated by default.
404        return null;
405      }
406    
407    
408    
409      /**
410       * Logs a message about the result of processing an abandon request.
411       *
412       * @param  opContext  The operation context for the abandon operation.
413       * @param  request    The abandon request that was received.
414       * @param  result     The result of processing the abandon request.
415       *
416       * @return  The content of the log message that should be written.  It may be
417       *          {@code null} or empty if no message should be written.  It may
418       *          optionally include line breaks if the log message should span
419       *          multiple lines.
420       */
421      public CharSequence logAbandonResult(
422                               final CompletedOperationContext opContext,
423                               final AbandonRequest request,
424                               final GenericResult result)
425      {
426        // No log message will be generated by default.
427        return null;
428      }
429    
430    
431    
432      /**
433       * Logs a message about an add request received from a client.
434       *
435       * @param  opContext  The operation context for the add operation.
436       * @param  request    The add request that was received.
437       *
438       * @return  The content of the log message that should be written.  It may be
439       *          {@code null} or empty if no message should be written.  It may
440       *          optionally include line breaks if the log message should span
441       *          multiple lines.
442       */
443      public CharSequence logAddRequest(final OperationContext opContext,
444                                        final AddRequest request)
445      {
446        // No log message will be generated by default.
447        return null;
448      }
449    
450    
451    
452      /**
453       * Logs a message about an add request that will be forwarded to another
454       * server.
455       *
456       * @param  opContext  The operation context for the add operation.
457       * @param  request    The add request that was received.
458       * @param  target     Information about the server to which the request will
459       *                    be forwarded.
460       *
461       * @return  The content of the log message that should be written.  It may be
462       *          {@code null} or empty if no message should be written.  It may
463       *          optionally include line breaks if the log message should span
464       *          multiple lines.
465       */
466      public CharSequence logAddForward(final OperationContext opContext,
467                                        final AddRequest request,
468                                        final ForwardTarget target)
469      {
470        // No log message will be generated by default.
471        return null;
472      }
473    
474    
475    
476      /**
477       * Logs a message about a failure encountered while attempting to forward an
478       * add request to another server.
479       *
480       * @param  opContext  The operation context for the add operation.
481       * @param  request    The add request that was received.
482       * @param  target     Information about the server to which the request was
483       *                    forwarded.
484       * @param  failure    The exception that was received when attempting to
485       *                    forward the request.
486       *
487       * @return  The content of the log message that should be written.  It may be
488       *          {@code null} or empty if no message should be written.  It may
489       *          optionally include line breaks if the log message should span
490       *          multiple lines.
491       */
492      public CharSequence logAddForwardFailure(final OperationContext opContext,
493                                               final AddRequest request,
494                                               final ForwardTarget target,
495                                               final LDAPException failure)
496      {
497        // No log message will be generated by default.
498        return null;
499      }
500    
501    
502    
503      /**
504       * Logs a message about the result of processing an add request.
505       *
506       * @param  opContext  The operation context for the add operation.
507       * @param  request    The add request that was received.
508       * @param  result     The result of processing the add request.
509       *
510       * @return  The content of the log message that should be written.  It may be
511       *          {@code null} or empty if no message should be written.  It may
512       *          optionally include line breaks if the log message should span
513       *          multiple lines.
514       */
515      public CharSequence logAddResponse(final CompletedOperationContext opContext,
516                                         final AddRequest request,
517                                         final AddResult result)
518      {
519        // No log message will be generated by default.
520        return null;
521      }
522    
523    
524    
525      /**
526       * Logs a message about a simple bind request received from a client.
527       *
528       * @param  opContext  The operation context for the bind operation.
529       * @param  request    The bind request that was received.
530       *
531       * @return  The content of the log message that should be written.  It may be
532       *          {@code null} or empty if no message should be written.  It may
533       *          optionally include line breaks if the log message should span
534       *          multiple lines.
535       */
536      public CharSequence logBindRequest(final OperationContext opContext,
537                                         final SimpleBindRequest request)
538      {
539        // No log message will be generated by default.
540        return null;
541      }
542    
543    
544    
545      /**
546       * Logs a message about a simple bind request that will be forwarded to
547       * another server.
548       *
549       * @param  opContext  The operation context for the bind operation.
550       * @param  request    The bind request that was received.
551       * @param  target     Information about the server to which the request will
552       *                    be forwarded.
553       *
554       * @return  The content of the log message that should be written.  It may be
555       *          {@code null} or empty if no message should be written.  It may
556       *          optionally include line breaks if the log message should span
557       *          multiple lines.
558       */
559      public CharSequence logBindForward(final OperationContext opContext,
560                                         final SimpleBindRequest request,
561                                         final ForwardTarget target)
562      {
563        // No log message will be generated by default.
564        return null;
565      }
566    
567    
568    
569      /**
570       * Logs a message about a failure encountered while attempting to forward a
571       * simple bind request to another server.
572       *
573       * @param  opContext  The operation context for the bind operation.
574       * @param  request    The bind request that was received.
575       * @param  target     Information about the server to which the request was
576       *                    forwarded.
577       * @param  failure    The exception that was received when attempting to
578       *                    forward the request.
579       *
580       * @return  The content of the log message that should be written.  It may be
581       *          {@code null} or empty if no message should be written.  It may
582       *          optionally include line breaks if the log message should span
583       *          multiple lines.
584       */
585      public CharSequence logBindForwardFailure(final OperationContext opContext,
586                                                final SimpleBindRequest request,
587                                                final ForwardTarget target,
588                                                final LDAPException failure)
589      {
590        // No log message will be generated by default.
591        return null;
592      }
593    
594    
595    
596      /**
597       * Logs a message about the result of processing a simple bind request.
598       *
599       * @param  opContext  The operation context for the bind operation.
600       * @param  request    The bind request that was received.
601       * @param  result     The result of processing the bind request.
602       *
603       * @return  The content of the log message that should be written.  It may be
604       *          {@code null} or empty if no message should be written.  It may
605       *          optionally include line breaks if the log message should span
606       *          multiple lines.
607       */
608      public CharSequence logBindResponse(final CompletedOperationContext opContext,
609                                          final SimpleBindRequest request,
610                                          final BindResult result)
611      {
612        // No log message will be generated by default.
613        return null;
614      }
615    
616    
617    
618      /**
619       * Logs a message about a SASL bind request received from a client.
620       *
621       * @param  opContext  The operation context for the bind operation.
622       * @param  request    The bind request that was received.
623       *
624       * @return  The content of the log message that should be written.  It may be
625       *          {@code null} or empty if no message should be written.  It may
626       *          optionally include line breaks if the log message should span
627       *          multiple lines.
628       */
629      public CharSequence logBindRequest(final OperationContext opContext,
630                                         final SASLBindRequest request)
631      {
632        // No log message will be generated by default.
633        return null;
634      }
635    
636    
637    
638      /**
639       * Logs a message about a SASL bind request that will be forwarded to
640       * another server.
641       *
642       * @param  opContext  The operation context for the bind operation.
643       * @param  request    The bind request that was received.
644       * @param  target     Information about the server to which the request will
645       *                    be forwarded.
646       *
647       * @return  The content of the log message that should be written.  It may be
648       *          {@code null} or empty if no message should be written.  It may
649       *          optionally include line breaks if the log message should span
650       *          multiple lines.
651       */
652      public CharSequence logBindForward(final OperationContext opContext,
653                                         final SASLBindRequest request,
654                                         final ForwardTarget target)
655      {
656        // No log message will be generated by default.
657        return null;
658      }
659    
660    
661    
662      /**
663       * Logs a message about a failure encountered while attempting to forward a
664       * SASL bind request to another server.
665       *
666       * @param  opContext  The operation context for the bind operation.
667       * @param  request    The bind request that was received.
668       * @param  target     Information about the server to which the request was
669       *                    forwarded.
670       * @param  failure    The exception that was received when attempting to
671       *                    forward the request.
672       *
673       * @return  The content of the log message that should be written.  It may be
674       *          {@code null} or empty if no message should be written.  It may
675       *          optionally include line breaks if the log message should span
676       *          multiple lines.
677       */
678      public CharSequence logBindForwardFailure(final OperationContext opContext,
679                                                final SASLBindRequest request,
680                                                final ForwardTarget target,
681                                                final LDAPException failure)
682      {
683        // No log message will be generated by default.
684        return null;
685      }
686    
687    
688    
689      /**
690       * Logs a message about the result of processing a SASL bind request.
691       *
692       * @param  opContext  The operation context for the bind operation.
693       * @param  request    The bind request that was received.
694       * @param  result     The result of processing the bind request.
695       *
696       * @return  The content of the log message that should be written.  It may be
697       *          {@code null} or empty if no message should be written.  It may
698       *          optionally include line breaks if the log message should span
699       *          multiple lines.
700       */
701      public CharSequence logBindResponse(final CompletedOperationContext opContext,
702                                          final SASLBindRequest request,
703                                          final BindResult result)
704      {
705        // No log message will be generated by default.
706        return null;
707      }
708    
709    
710    
711      /**
712       * Logs a message about a compare request received from a client.
713       *
714       * @param  opContext  The operation context for the compare operation.
715       * @param  request    The compare request that was received.
716       *
717       * @return  The content of the log message that should be written.  It may be
718       *          {@code null} or empty if no message should be written.  It may
719       *          optionally include line breaks if the log message should span
720       *          multiple lines.
721       */
722      public CharSequence logCompareRequest(final OperationContext opContext,
723                                            final CompareRequest request)
724      {
725        // No log message will be generated by default.
726        return null;
727      }
728    
729    
730    
731      /**
732       * Logs a message about a compare request that will be forwarded to another
733       * server.
734       *
735       * @param  opContext  The operation context for the compare operation.
736       * @param  request    The compare request that was received.
737       * @param  target     Information about the server to which the request will
738       *                    be forwarded.
739       *
740       * @return  The content of the log message that should be written.  It may be
741       *          {@code null} or empty if no message should be written.  It may
742       *          optionally include line breaks if the log message should span
743       *          multiple lines.
744       */
745      public CharSequence logCompareForward(final OperationContext opContext,
746                                            final CompareRequest request,
747                                            final ForwardTarget target)
748      {
749        // No log message will be generated by default.
750        return null;
751      }
752    
753    
754    
755      /**
756       * Logs a message about a failure encountered while attempting to forward a
757       * compare request to another server.
758       *
759       * @param  opContext  The operation context for the compare operation.
760       * @param  request    The compare request that was received.
761       * @param  target     Information about the server to which the request was
762       *                    forwarded.
763       * @param  failure    The exception that was received when attempting to
764       *                    forward the request.
765       *
766       * @return  The content of the log message that should be written.  It may be
767       *          {@code null} or empty if no message should be written.  It may
768       *          optionally include line breaks if the log message should span
769       *          multiple lines.
770       */
771      public CharSequence logCompareForwardFailure(final OperationContext opContext,
772                                                   final CompareRequest request,
773                                                   final ForwardTarget target,
774                                                   final LDAPException failure)
775      {
776        // No log message will be generated by default.
777        return null;
778      }
779    
780    
781    
782      /**
783       * Logs a message about the result of processing a compare request.
784       *
785       * @param  opContext  The operation context for the compare operation.
786       * @param  request    The compare request that was received.
787       * @param  result     The result of processing the compare request.
788       *
789       * @return  The content of the log message that should be written.  It may be
790       *          {@code null} or empty if no message should be written.  It may
791       *          optionally include line breaks if the log message should span
792       *          multiple lines.
793       */
794      public CharSequence logCompareResponse(
795                               final CompletedOperationContext opContext,
796                               final CompareRequest request,
797                               final CompareResult result)
798      {
799        // No log message will be generated by default.
800        return null;
801      }
802    
803    
804    
805      /**
806       * Logs a message about a delete request received from a client.
807       *
808       * @param  opContext  The operation context for the delete operation.
809       * @param  request    The delete request that was received.
810       *
811       * @return  The content of the log message that should be written.  It may be
812       *          {@code null} or empty if no message should be written.  It may
813       *          optionally include line breaks if the log message should span
814       *          multiple lines.
815       */
816      public CharSequence logDeleteRequest(final OperationContext opContext,
817                                           final DeleteRequest request)
818      {
819        // No log message will be generated by default.
820        return null;
821      }
822    
823    
824    
825      /**
826       * Logs a message about a delete request that will be forwarded to another
827       * server.
828       *
829       * @param  opContext  The operation context for the delete operation.
830       * @param  request    The delete request that was received.
831       * @param  target     Information about the server to which the request will
832       *                    be forwarded.
833       *
834       * @return  The content of the log message that should be written.  It may be
835       *          {@code null} or empty if no message should be written.  It may
836       *          optionally include line breaks if the log message should span
837       *          multiple lines.
838       */
839      public CharSequence logDeleteForward(final OperationContext opContext,
840                                           final DeleteRequest request,
841                                           final ForwardTarget target)
842      {
843        // No log message will be generated by default.
844        return null;
845      }
846    
847    
848    
849      /**
850       * Logs a message about a failure encountered while attempting to forward a
851       * delete request to another server.
852       *
853       * @param  opContext  The operation context for the delete operation.
854       * @param  request    The delete request that was received.
855       * @param  target     Information about the server to which the request was
856       *                    forwarded.
857       * @param  failure    The exception that was received when attempting to
858       *                    forward the request.
859       *
860       * @return  The content of the log message that should be written.  It may be
861       *          {@code null} or empty if no message should be written.  It may
862       *          optionally include line breaks if the log message should span
863       *          multiple lines.
864       */
865      public CharSequence logDeleteForwardFailure(final OperationContext opContext,
866                                                  final DeleteRequest request,
867                                                  final ForwardTarget target,
868                                                  final LDAPException failure)
869      {
870        // No log message will be generated by default.
871        return null;
872      }
873    
874    
875    
876      /**
877       * Logs a message about the result of processing a delete request.
878       *
879       * @param  opContext  The operation context for the delete operation.
880       * @param  request    The delete request that was received.
881       * @param  result     The result of processing the delete request.
882       *
883       * @return  The content of the log message that should be written.  It may be
884       *          {@code null} or empty if no message should be written.  It may
885       *          optionally include line breaks if the log message should span
886       *          multiple lines.
887       */
888      public CharSequence logDeleteResponse(
889                               final CompletedOperationContext opContext,
890                               final DeleteRequest request,
891                               final DeleteResult result)
892      {
893        // No log message will be generated by default.
894        return null;
895      }
896    
897    
898    
899      /**
900       * Logs a message about an extended request received from a client.
901       *
902       * @param  opContext  The operation context for the extended operation.
903       * @param  request    The extended request that was received.
904       *
905       * @return  The content of the log message that should be written.  It may be
906       *          {@code null} or empty if no message should be written.  It may
907       *          optionally include line breaks if the log message should span
908       *          multiple lines.
909       */
910      public CharSequence logExtendedRequest(final OperationContext opContext,
911                                             final ExtendedRequest request)
912      {
913        // No log message will be generated by default.
914        return null;
915      }
916    
917    
918    
919      /**
920       * Logs a message about an extended request that will be forwarded to another
921       * server.
922       *
923       * @param  opContext  The operation context for the extended operation.
924       * @param  request    The extended request that was received.
925       * @param  target     Information about the server to which the request will
926       *                    be forwarded.
927       *
928       * @return  The content of the log message that should be written.  It may be
929       *          {@code null} or empty if no message should be written.  It may
930       *          optionally include line breaks if the log message should span
931       *          multiple lines.
932       */
933      public CharSequence logExtendedForward(final OperationContext opContext,
934                                             final ExtendedRequest request,
935                                             final ForwardTarget target)
936      {
937        // No log message will be generated by default.
938        return null;
939      }
940    
941    
942    
943      /**
944       * Logs a message about a failure encountered while attempting to forward an
945       * extended request to another server.
946       *
947       * @param  opContext  The operation context for the extended operation.
948       * @param  request    The extended request that was received.
949       * @param  target     Information about the server to which the request was
950       *                    forwarded.
951       * @param  failure    The exception that was received when attempting to
952       *                    forward the request.
953       *
954       * @return  The content of the log message that should be written.  It may be
955       *          {@code null} or empty if no message should be written.  It may
956       *          optionally include line breaks if the log message should span
957       *          multiple lines.
958       */
959      public CharSequence logExtendedForwardFailure(
960                               final OperationContext opContext,
961                               final ExtendedRequest request,
962                               final ForwardTarget target,
963                               final LDAPException failure)
964      {
965        // No log message will be generated by default.
966        return null;
967      }
968    
969    
970    
971      /**
972       * Logs a message about the result of processing an extended request.
973       *
974       * @param  opContext  The operation context for the extended operation.
975       * @param  request    The extended request that was received.
976       * @param  result     The result of processing the extended request.
977       *
978       * @return  The content of the log message that should be written.  It may be
979       *          {@code null} or empty if no message should be written.  It may
980       *          optionally include line breaks if the log message should span
981       *          multiple lines.
982       */
983      public CharSequence logExtendedResponse(
984                               final CompletedOperationContext opContext,
985                               final ExtendedRequest request,
986                               final ExtendedResult result)
987      {
988        // No log message will be generated by default.
989        return null;
990      }
991    
992    
993    
994      /**
995       * Logs a message about a modify request received from a client.
996       *
997       * @param  opContext  The operation context for the modify operation.
998       * @param  request    The modify request that was received.
999       *
1000       * @return  The content of the log message that should be written.  It may be
1001       *          {@code null} or empty if no message should be written.  It may
1002       *          optionally include line breaks if the log message should span
1003       *          multiple lines.
1004       */
1005      public CharSequence logModifyRequest(final OperationContext opContext,
1006                                           final ModifyRequest request)
1007      {
1008        // No log message will be generated by default.
1009        return null;
1010      }
1011    
1012    
1013    
1014      /**
1015       * Logs a message about a modify request that will be forwarded to another
1016       * server.
1017       *
1018       * @param  opContext  The operation context for the modify operation.
1019       * @param  request    The modify request that was received.
1020       * @param  target     Information about the server to which the request will
1021       *                    be forwarded.
1022       *
1023       * @return  The content of the log message that should be written.  It may be
1024       *          {@code null} or empty if no message should be written.  It may
1025       *          optionally include line breaks if the log message should span
1026       *          multiple lines.
1027       */
1028      public CharSequence logModifyForward(final OperationContext opContext,
1029                                           final ModifyRequest request,
1030                                           final ForwardTarget target)
1031      {
1032        // No log message will be generated by default.
1033        return null;
1034      }
1035    
1036    
1037    
1038      /**
1039       * Logs a message about a failure encountered while attempting to forward a
1040       * modify request to another server.
1041       *
1042       * @param  opContext  The operation context for the modify operation.
1043       * @param  request    The modify request that was received.
1044       * @param  target     Information about the server to which the request was
1045       *                    forwarded.
1046       * @param  failure    The exception that was received when attempting to
1047       *                    forward the request.
1048       *
1049       * @return  The content of the log message that should be written.  It may be
1050       *          {@code null} or empty if no message should be written.  It may
1051       *          optionally include line breaks if the log message should span
1052       *          multiple lines.
1053       */
1054      public CharSequence logModifyForwardFailure(final OperationContext opContext,
1055                                                  final ModifyRequest request,
1056                                                  final ForwardTarget target,
1057                                                  final LDAPException failure)
1058      {
1059        // No log message will be generated by default.
1060        return null;
1061      }
1062    
1063    
1064    
1065      /**
1066       * Logs a message about the result of processing a modify request.
1067       *
1068       * @param  opContext  The operation context for the modify operation.
1069       * @param  request    The modify request that was received.
1070       * @param  result     The result of processing the modify request.
1071       *
1072       * @return  The content of the log message that should be written.  It may be
1073       *          {@code null} or empty if no message should be written.  It may
1074       *          optionally include line breaks if the log message should span
1075       *          multiple lines.
1076       */
1077      public CharSequence logModifyResponse(
1078                               final CompletedOperationContext opContext,
1079                               final ModifyRequest request,
1080                               final ModifyResult result)
1081      {
1082        // No log message will be generated by default.
1083        return null;
1084      }
1085    
1086    
1087    
1088      /**
1089       * Logs a message about a modify DN request received from a client.
1090       *
1091       * @param  opContext  The operation context for the modify DN operation.
1092       * @param  request    The modify DN request that was received.
1093       *
1094       * @return  The content of the log message that should be written.  It may be
1095       *          {@code null} or empty if no message should be written.  It may
1096       *          optionally include line breaks if the log message should span
1097       *          multiple lines.
1098       */
1099      public CharSequence logModifyDNRequest(final OperationContext opContext,
1100                                             final ModifyDNRequest request)
1101      {
1102        // No log message will be generated by default.
1103        return null;
1104      }
1105    
1106    
1107    
1108      /**
1109       * Logs a message about a modify DN request that will be forwarded to another
1110       * server.
1111       *
1112       * @param  opContext  The operation context for the modify DN operation.
1113       * @param  request    The modify DN request that was received.
1114       * @param  target     Information about the server to which the request will
1115       *                    be forwarded.
1116       *
1117       * @return  The content of the log message that should be written.  It may be
1118       *          {@code null} or empty if no message should be written.  It may
1119       *          optionally include line breaks if the log message should span
1120       *          multiple lines.
1121       */
1122      public CharSequence logModifyDNForward(final OperationContext opContext,
1123                                             final ModifyDNRequest request,
1124                                             final ForwardTarget target)
1125      {
1126        // No log message will be generated by default.
1127        return null;
1128      }
1129    
1130    
1131    
1132      /**
1133       * Logs a message about a failure encountered while attempting to forward a
1134       * modify DN request to another server.
1135       *
1136       * @param  opContext  The operation context for the modify DN operation.
1137       * @param  request    The modify DN request that was received.
1138       * @param  target     Information about the server to which the request was
1139       *                    forwarded.
1140       * @param  failure    The exception that was received when attempting to
1141       *                    forward the request.
1142       *
1143       * @return  The content of the log message that should be written.  It may be
1144       *          {@code null} or empty if no message should be written.  It may
1145       *          optionally include line breaks if the log message should span
1146       *          multiple lines.
1147       */
1148      public CharSequence logModifyDNForwardFailure(
1149                               final OperationContext opContext,
1150                               final ModifyDNRequest request,
1151                               final ForwardTarget target,
1152                               final LDAPException failure)
1153      {
1154        // No log message will be generated by default.
1155        return null;
1156      }
1157    
1158    
1159    
1160      /**
1161       * Logs a message about the result of processing a modify DN request.
1162       *
1163       * @param  opContext  The operation context for the modify DN operation.
1164       * @param  request    The modify DN request that was received.
1165       * @param  result     The result of processing the modify DN request.
1166       *
1167       * @return  The content of the log message that should be written.  It may be
1168       *          {@code null} or empty if no message should be written.  It may
1169       *          optionally include line breaks if the log message should span
1170       *          multiple lines.
1171       */
1172      public CharSequence logModifyDNResponse(
1173                               final CompletedOperationContext opContext,
1174                               final ModifyDNRequest request,
1175                               final ModifyDNResult result)
1176      {
1177        // No log message will be generated by default.
1178        return null;
1179      }
1180    
1181    
1182    
1183      /**
1184       * Logs a message about a search request received from a client.
1185       *
1186       * @param  opContext  The operation context for the search operation.
1187       * @param  request    The search request that was received.
1188       *
1189       * @return  The content of the log message that should be written.  It may be
1190       *          {@code null} or empty if no message should be written.  It may
1191       *          optionally include line breaks if the log message should span
1192       *          multiple lines.
1193       */
1194      public CharSequence logSearchRequest(final OperationContext opContext,
1195                                           final SearchRequest request)
1196      {
1197        // No log message will be generated by default.
1198        return null;
1199      }
1200    
1201    
1202    
1203      /**
1204       * Logs a message about a search request that will be forwarded to another
1205       * server.
1206       *
1207       * @param  opContext  The operation context for the search operation.
1208       * @param  request    The search request that was received.
1209       * @param  target     Information about the server to which the request will
1210       *                    be forwarded.
1211       *
1212       * @return  The content of the log message that should be written.  It may be
1213       *          {@code null} or empty if no message should be written.  It may
1214       *          optionally include line breaks if the log message should span
1215       *          multiple lines.
1216       */
1217      public CharSequence logSearchForward(final OperationContext opContext,
1218                                           final SearchRequest request,
1219                                           final ForwardTarget target)
1220      {
1221        // No log message will be generated by default.
1222        return null;
1223      }
1224    
1225    
1226    
1227      /**
1228       * Logs a message about a failure encountered while attempting to forward a
1229       * search request to another server.
1230       *
1231       * @param  opContext  The operation context for the search operation.
1232       * @param  request    The search request that was received.
1233       * @param  target     Information about the server to which the request was
1234       *                    forwarded.
1235       * @param  failure    The exception that was received when attempting to
1236       *                    forward the request.
1237       *
1238       * @return  The content of the log message that should be written.  It may be
1239       *          {@code null} or empty if no message should be written.  It may
1240       *          optionally include line breaks if the log message should span
1241       *          multiple lines.
1242       */
1243      public CharSequence logSearchForwardFailure(final OperationContext opContext,
1244                                                  final SearchRequest request,
1245                                                  final ForwardTarget target,
1246                                                  final LDAPException failure)
1247      {
1248        // No log message will be generated by default.
1249        return null;
1250      }
1251    
1252    
1253    
1254      /**
1255       * Logs a message about a search result entry that was returned to the client.
1256       *
1257       * @param  opContext  The operation context for the search operation.
1258       * @param  request    The search request that was received.
1259       * @param  entry      The entry that was returned.
1260       * @param  controls   The set of controls included with the entry, or an empty
1261       *                    list if there were none.
1262       *
1263       * @return  The content of the log message that should be written.  It may be
1264       *          {@code null} or empty if no message should be written.  It may
1265       *          optionally include line breaks if the log message should span
1266       *          multiple lines.
1267       */
1268      public CharSequence logSearchResultEntry(final OperationContext opContext,
1269                                               final SearchRequest request,
1270                                               final Entry entry,
1271                                               final List<Control> controls)
1272      {
1273        // No log message will be generated by default.
1274        return null;
1275      }
1276    
1277    
1278    
1279      /**
1280       * Logs a message about a search result reference that was returned to the
1281       * client.
1282       *
1283       * @param  opContext     The operation context for the search operation.
1284       * @param  request       The search request that was received.
1285       * @param  referralURLs  The referral URLs for the reference that was
1286       *                       returned.
1287       * @param  controls      The set of controls included with the reference, or
1288       *                       an empty list if there were none.
1289       *
1290       * @return  The content of the log message that should be written.  It may be
1291       *          {@code null} or empty if no message should be written.  It may
1292       *          optionally include line breaks if the log message should span
1293       *          multiple lines.
1294       */
1295      public CharSequence logSearchResultReference(final OperationContext opContext,
1296                                                   final SearchRequest request,
1297                                                   final List<String> referralURLs,
1298                                                   final List<Control> controls)
1299      {
1300        // No log message will be generated by default.
1301        return null;
1302      }
1303    
1304    
1305    
1306      /**
1307       * Logs a message about the result of processing a search request.
1308       *
1309       * @param  opContext  The operation context for the search operation.
1310       * @param  request    The search request that was received.
1311       * @param  result     The result of processing the search request.
1312       *
1313       * @return  The content of the log message that should be written.  It may be
1314       *          {@code null} or empty if no message should be written.  It may
1315       *          optionally include line breaks if the log message should span
1316       *          multiple lines.
1317       */
1318      public CharSequence logSearchResultDone(
1319                               final CompletedSearchOperationContext opContext,
1320                               final SearchRequest request,
1321                               final SearchResult result)
1322      {
1323        // No log message will be generated by default.
1324        return null;
1325      }
1326    
1327    
1328    
1329      /**
1330       * Logs a message about an unbind request received from a client.
1331       *
1332       * @param  opContext  The operation context for the unbind operation.
1333       * @param  request    The unbind request that was received.
1334       *
1335       * @return  The content of the log message that should be written.  It may be
1336       *          {@code null} or empty if no message should be written.  It may
1337       *          optionally include line breaks if the log message should span
1338       *          multiple lines.
1339       */
1340      public CharSequence logUnbindRequest(final OperationContext opContext,
1341                                           final UnbindRequest request)
1342      {
1343        // No log message will be generated by default.
1344        return null;
1345      }
1346    
1347    
1348    
1349      /**
1350       * Logs a message about an intermediate response that was returned to the
1351       * client.
1352       *
1353       * @param  opContext             The operation context for the associated
1354       *                               operation.
1355       * @param  intermediateResponse  The intermediate response that was returned.
1356       *
1357       * @return  The content of the log message that should be written.  It may be
1358       *          {@code null} or empty if no message should be written.  It may
1359       *          optionally include line breaks if the log message should span
1360       *          multiple lines.
1361       */
1362      public CharSequence logIntermediateResponse(final OperationContext opContext,
1363                               final IntermediateResponse intermediateResponse)
1364      {
1365        // No log message will be generated by default.
1366        return null;
1367      }
1368    
1369    
1370    
1371      /**
1372       * Writes a message to the access logger to indicate that the Directory Proxy
1373       * Server will attempt to perform entry rebalancing by migrating a subtree
1374       * from one backend set to another.
1375       *
1376       * @param  rebalancingOperationID  The unique ID assigned to the entry
1377       *                                 balancing operation.
1378       * @param  triggerOperation        The operation that triggered the entry
1379       *                                 rebalancing.  It may be {@code null} if the
1380       *                                 rebalancing operation wasn't triggered by a
1381       *                                 client request.
1382       * @param  baseDN                  The base DN of the subtree to migrate.
1383       * @param  sizeLimit               The maximum number of entries to migrate.
1384       * @param  sourceBackendSetName    The name of the backend set containing the
1385       *                                 subtree to migrate.
1386       * @param  sourceAddress           The address of the server from which the
1387       *                                 source entries will be read.
1388       * @param  sourcePort              The port of the server from which the
1389       *                                 source entries will be read.
1390       * @param  targetBackendSetName    The name of the backend set to which the
1391       *                                 subtree will be migrated.
1392       * @param  targetAddress           The address of the server to which the
1393       *                                 subtree will be migrated.
1394       * @param  targetPort              The port of the server to which the subtree
1395       *                                 will be migrated.
1396       *
1397       * @return  The content of the log message that should be written.  It may be
1398       *          {@code null} or empty if no message should be written.  It may
1399       *          optionally include line breaks if the log message should span
1400       *          multiple lines.
1401       */
1402      public CharSequence logEntryRebalancingRequest(
1403                               final long rebalancingOperationID,
1404                               final OperationContext triggerOperation,
1405                               final String baseDN, final int sizeLimit,
1406                               final String sourceBackendSetName,
1407                               final String sourceAddress, final int sourcePort,
1408                               final String targetBackendSetName,
1409                               final String targetAddress, final int targetPort)
1410      {
1411        // No log message will be generated by default.
1412        return null;
1413      }
1414    
1415    
1416    
1417      /**
1418       * Writes a message to the access logger to indicate that the Directory Proxy
1419       * Server will attempt to perform entry rebalancing by migrating a subtree
1420       * from one backend set to another.
1421       *
1422       * @param  rebalancingOperationID  The unique ID assigned to the entry
1423       *                                 balancing operation.
1424       * @param  triggerOperation        The operation that triggered the entry
1425       *                                 rebalancing.  It may be {@code null} if the
1426       *                                 rebalancing operation wasn't triggered by a
1427       *                                 client request.
1428       * @param  baseDN                  The base DN of the subtree to migrate.
1429       * @param  sizeLimit               The maximum number of entries to migrate.
1430       * @param  sourceBackendSetName    The name of the backend set containing the
1431       *                                 subtree to migrate.
1432       * @param  sourceAddress           The address of the server from which the
1433       *                                 source entries will be read.
1434       * @param  sourcePort              The port of the server from which the
1435       *                                 source entries will be read.
1436       * @param  targetBackendSetName    The name of the backend set to which the
1437       *                                 subtree will be migrated.
1438       * @param  targetAddress           The address of the server to which the
1439       *                                 subtree will be migrated.
1440       * @param  targetPort              The port of the server to which the subtree
1441       *                                 will be migrated.
1442       * @param  moveSubtreeResult       An object with information about the result
1443       *                                 of the subtree move processing.
1444       *
1445       * @return  The content of the log message that should be written.  It may be
1446       *          {@code null} or empty if no message should be written.  It may
1447       *          optionally include line breaks if the log message should span
1448       *          multiple lines.
1449       */
1450      public CharSequence logEntryRebalancingResult(
1451                               final long rebalancingOperationID,
1452                               final OperationContext triggerOperation,
1453                               final String baseDN, final int sizeLimit,
1454                               final String sourceBackendSetName,
1455                               final String sourceAddress, final int sourcePort,
1456                               final String targetBackendSetName,
1457                               final String targetAddress, final int targetPort,
1458                               final MoveSubtreeResult moveSubtreeResult)
1459      {
1460        // No log message will be generated by default.
1461        return null;
1462      }
1463    
1464    
1465    
1466      /**
1467       * {@inheritDoc}
1468       */
1469      public Map<List<String>,String> getExamplesArgumentSets()
1470      {
1471        return Collections.emptyMap();
1472      }
1473    }