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 2010-2013 UnboundID Corp.
026     */
027    package com.unboundid.directory.sdk.ds.scripting;
028    
029    
030    
031    import java.util.List;
032    import java.util.Set;
033    
034    import com.unboundid.directory.sdk.common.internal.Reconfigurable;
035    import com.unboundid.directory.sdk.common.operation.AddRequest;
036    import com.unboundid.directory.sdk.common.operation.AddResult;
037    import com.unboundid.directory.sdk.common.operation.BindResult;
038    import com.unboundid.directory.sdk.common.operation.CompareRequest;
039    import com.unboundid.directory.sdk.common.operation.CompareResult;
040    import com.unboundid.directory.sdk.common.operation.DeleteRequest;
041    import com.unboundid.directory.sdk.common.operation.DeleteResult;
042    import com.unboundid.directory.sdk.common.operation.ExtendedRequest;
043    import com.unboundid.directory.sdk.common.operation.ExtendedResult;
044    import com.unboundid.directory.sdk.common.operation.ModifyRequest;
045    import com.unboundid.directory.sdk.common.operation.ModifyResult;
046    import com.unboundid.directory.sdk.common.operation.ModifyDNRequest;
047    import com.unboundid.directory.sdk.common.operation.ModifyDNResult;
048    import com.unboundid.directory.sdk.common.operation.SASLBindRequest;
049    import com.unboundid.directory.sdk.common.operation.SearchRequest;
050    import com.unboundid.directory.sdk.common.operation.SearchResult;
051    import com.unboundid.directory.sdk.common.operation.SimpleBindRequest;
052    import com.unboundid.directory.sdk.common.operation.UpdatableAbandonRequest;
053    import com.unboundid.directory.sdk.common.operation.UpdatableAddRequest;
054    import com.unboundid.directory.sdk.common.operation.UpdatableAddResult;
055    import com.unboundid.directory.sdk.common.operation.UpdatableBindResult;
056    import com.unboundid.directory.sdk.common.operation.UpdatableCompareRequest;
057    import com.unboundid.directory.sdk.common.operation.UpdatableCompareResult;
058    import com.unboundid.directory.sdk.common.operation.UpdatableDeleteRequest;
059    import com.unboundid.directory.sdk.common.operation.UpdatableDeleteResult;
060    import com.unboundid.directory.sdk.common.operation.UpdatableExtendedRequest;
061    import com.unboundid.directory.sdk.common.operation.UpdatableExtendedResult;
062    import com.unboundid.directory.sdk.common.operation.UpdatableGenericResult;
063    import com.unboundid.directory.sdk.common.operation.UpdatableModifyRequest;
064    import com.unboundid.directory.sdk.common.operation.UpdatableModifyResult;
065    import com.unboundid.directory.sdk.common.operation.UpdatableModifyDNRequest;
066    import com.unboundid.directory.sdk.common.operation.UpdatableModifyDNResult;
067    import com.unboundid.directory.sdk.common.operation.UpdatableSASLBindRequest;
068    import com.unboundid.directory.sdk.common.operation.UpdatableSearchRequest;
069    import com.unboundid.directory.sdk.common.operation.UpdatableSearchResult;
070    import com.unboundid.directory.sdk.common.operation.UpdatableSimpleBindRequest;
071    import com.unboundid.directory.sdk.common.operation.UpdatableUnbindRequest;
072    import com.unboundid.directory.sdk.common.types.ActiveOperationContext;
073    import com.unboundid.directory.sdk.common.types.ActiveSearchOperationContext;
074    import com.unboundid.directory.sdk.common.types.ClientContext;
075    import com.unboundid.directory.sdk.common.types.CompletedOperationContext;
076    import com.unboundid.directory.sdk.common.types.CompletedSearchOperationContext;
077    import com.unboundid.directory.sdk.common.types.DisconnectReason;
078    import com.unboundid.directory.sdk.common.types.Entry;
079    import com.unboundid.directory.sdk.common.types.UpdatableEntry;
080    import com.unboundid.directory.sdk.ds.config.PluginConfig;
081    import com.unboundid.directory.sdk.ds.types.DirectoryServerContext;
082    import com.unboundid.directory.sdk.ds.types.IntermediateResponsePluginResult;
083    import com.unboundid.directory.sdk.ds.types.LDIFPluginResult;
084    import com.unboundid.directory.sdk.ds.types.PostConnectPluginResult;
085    import com.unboundid.directory.sdk.ds.types.PostDisconnectPluginResult;
086    import com.unboundid.directory.sdk.ds.types.PostOperationPluginResult;
087    import com.unboundid.directory.sdk.ds.types.PostResponsePluginResult;
088    import com.unboundid.directory.sdk.ds.types.PreOperationPluginResult;
089    import com.unboundid.directory.sdk.ds.types.PreParsePluginResult;
090    import com.unboundid.directory.sdk.ds.types.SearchEntryPluginResult;
091    import com.unboundid.directory.sdk.ds.types.SearchReferencePluginResult;
092    import com.unboundid.directory.sdk.ds.types.StartupDependency;
093    import com.unboundid.directory.sdk.ds.types.StartupPluginResult;
094    import com.unboundid.directory.sdk.ds.types.SubordinateModifyDNPluginResult;
095    import com.unboundid.directory.sdk.proxy.internal.DirectoryProxyServerExtension;
096    import com.unboundid.directory.sdk.ds.internal.DirectoryServerExtension;
097    import com.unboundid.directory.sdk.sync.internal.SynchronizationServerExtension;
098    import com.unboundid.ldap.sdk.Control;
099    import com.unboundid.ldap.sdk.IntermediateResponse;
100    import com.unboundid.ldap.sdk.LDAPException;
101    import com.unboundid.ldap.sdk.Modification;
102    import com.unboundid.ldap.sdk.ResultCode;
103    import com.unboundid.util.Extensible;
104    import com.unboundid.util.ThreadSafety;
105    import com.unboundid.util.ThreadSafetyLevel;
106    import com.unboundid.util.args.ArgumentException;
107    import com.unboundid.util.args.ArgumentParser;
108    
109    
110    
111    /**
112     * This class defines an API that must be implemented by scripted extensions
113     * which act as server plugins.  There are several different kinds of plugins
114     * which may be invoked for different purposes, including:
115     * <UL>
116     *   <LI>startup -- Startup plugins may be used to perform custom processing
117     *       when the server is in the process of staring up.  By default, the
118     *       processing will be performed near the end of the startup phase just
119     *       before the server begins to accept connections from external clients,
120     *       but if one or more startup dependencies are defined, then the plugin
121     *       may be invoked earlier in the startup process as soon as all declared
122     *       dependencies have been satisfied.</LI>
123     *   <LI>shutdown -- Shutdown plugins may be used to perform custom processing
124     *       when the server is in the process of shutting down.  This will occur
125     *       near the beginning of the shutdown process, just after the server stops
126     *       accepting new client connections and terminates existing connections
127     *       but before shutting down any other components.  Note that shutdown
128     *       plugins may not always be invoked in some unusual shutdown scenarios
129     *       (e.g., if the server process is forcefully killed, or in the event of a
130     *       hardware, OS, or JVM failure).</LI>
131     *   <LI>LDIF import -- LDIF import plugins are invoked for each entry read from
132     *       an LDIF file to be imported into a backend.  It is possible to alter
133     *       the contents of the entry or to cause the entry to be excluded from the
134     *       import.</LI>
135     *   <LI>LDIF export -- LDIF export plugins are invoked for each entry exported
136     *       from a backend to be written to an LDIF file.  It is possible to alter
137     *       the contents of the entry or to cause the entry to be excluded from the
138     *       export.</LI>
139     *   <LI>post-connect -- Post-connect plugins are invoked during the course of
140     *       accepting a new client connection.  They may access information about
141     *       the client and may optionally terminate the client connection if it is
142     *       deemed appropriate.</LI>
143     *   <LI>post-disconnect -- Post-disconnect plugins are invoked after a client
144     *       connection has been closed, regardless of whether the closure was
145     *       initiated by the client (e.g., because of an unbind request or simply
146     *       closing the socket) or by the server (e.g., because the connection had
147     *       been idle for too long or because the client violated some server-side
148     *       constraint.</LI>
149     *   <LI>pre-parse -- Pre-parse plugins are invoked just after the server has
150     *       received an abandon, add, bind, compare, delete, extended, modify,
151     *       modify DN, search, or unbind request.  They may be used to obtain
152     *       information about the requests, alter the contents of the request or
153     *       prevent the server from processing the request.
154     *   <LI>pre-operation -- Pre-operation plugins are invoked for add, bind,
155     *       compare, delete, extended, modify, modify DN, and search operations
156     *       after some level of validation has been performed but just before the
157     *       core processing for the operation.  They may not be used to alter the
158     *       request, but they may still be used to obtain information about the
159     *       request or to prevent the operation from being processed.</LI>
160     *   <LI>post-operation -- Post-operation plugins are invoked for add, bind,
161     *       compare, delete, extended, modify, modify DN, and search operations
162     *       after most processing has completed for the operation but before the
163     *       result has been returned to the client.  They may be used to obtain
164     *       information about the result or to alter the contents of the result to
165     *       be returned.</LI>
166     *   <LI>post-response -- Post-response plugins are invoked for add, bind,
167     *       compare, delete, extended, modify, modify DN, and search operations
168     *       after the response has already been sent to the client.  They may be
169     *       used to perform processing for operations without delaying the response
170     *       to the client.</LI>
171     *   <LI>post-replication -- Post-replication plugins are invoked for add,
172     *       delete, modify, and modify DN operations that have been received and
173     *       processed via replication.  They may be used to obtain information or
174     *       perform processing for replicated changes, but may not alter those
175     *       changes.</LI>
176     *   <LI>search result entry -- Search result entry plugins are invoked for each
177     *       entry to be returned to the client during the course of processing a
178     *       search operation.  They may obtain information about the entry to be
179     *       returned, alter the entry contents, or prevent the entry from being
180     *       returned.</LI>
181     *   <LI>search result reference -- Search result reference plugins are invoked
182     *       for each reference to be returned to the client during the course of
183     *       processing a search operation.  They may obtain information about the
184     *       reference to be returned, alter the referral URLs to be returned, or
185     *       prevent the reference from being returned.</LI>
186     *   <LI>subordinate modify DN -- Subordinate modify DN plugins are invoked for
187     *       each entry below the target entry being renamed in the course of a
188     *       modify DN operation.  They may be used to obtain information about the
189     *       subordinate entry to be renamed and optionally to alter the contents
190     *       of that entry.</LI>
191     *   <LI>intermediate response -- Intermediate response plugins are invoked for
192     *       each intermediate response to be returned to the client.  They may be
193     *       used to obtain information about the response or to prevent it from
194     *       being returned to the client.</LI>
195     * </UL>
196     * <BR><BR>
197     * A single plugin instance may be configured to act in any combination of these
198     * contexts.  For example, a plugin may be configured to operate during both
199     * LDIF import and pre-parse add contexts so that it can transform the contents
200     * of entries whether regardless of the way they are inserted into the backend.
201     * <BR>
202     * <H2>Configuring Groovy-Scripted Plugins</H2>
203     * In order to configure a scripted plugin based on this API and written in the
204     * Groovy scripting language, use a command like:
205     * <PRE>
206     *      dsconfig create-plugin \
207     *           --plugin-name "<I>{plugin-name}</I>" \
208     *           --type groovy-scripted \
209     *           --set enabled:true \
210     *           --set plugin-type:{plugin-type} \
211     *           --set "script-class:<I>{class-name}</I>" \
212     *           --set "script-argument:<I>{name=value}</I>"
213     * </PRE>
214     * where "<I>{plugin-name}</I>" is the name to use for the plugin instance,
215     * "<I>{plugin-type}</I>" is the name of a plugin type for which the plugin
216     * should be invoked,  "<I>{class-name}</I>" is the fully-qualified name of the
217     * Groovy class written using this API, and "<I>{name=value}</I>" represents
218     * name-value pairs for any arguments to provide to the plugin.  If the plugin
219     * should be invoked for multiple plugin types, then the
220     * "<CODE>--set plugin-type:<I>{plugin-type}</I></CODE>" option should be
221     * provided multiple times.  Similarly, if multiple arguments should be provided
222     * to the plugin, then the
223     * "<CODE>--set script-argument:<I>{name=value}</I></CODE>" option should be
224     * provided multiple times.
225     *
226     * @see  com.unboundid.directory.sdk.ds.api.Plugin
227     */
228    @Extensible()
229    @DirectoryServerExtension()
230    @DirectoryProxyServerExtension(appliesToLocalContent=true,
231         appliesToRemoteContent=true,
232         notes="Some plugin types will not be invoked for proxied operations, " +
233              "including pre-operation, post-operation, search result entry, " +
234              "search result reference, intermediate response, and subordinate " +
235              "modify DN.  A proxy transformation may be used to achieve the " +
236              "same result in many cases.")
237    @SynchronizationServerExtension(appliesToLocalContent=true,
238         appliesToSynchronizedContent=false)
239    @ThreadSafety(level=ThreadSafetyLevel.INTERFACE_THREADSAFE)
240    public abstract class ScriptedPlugin
241           implements Reconfigurable<PluginConfig>
242    {
243      /**
244       * Creates a new instance of this plugin.  All plugin implementations must
245       * include a default constructor, but any initialization should generally be
246       * done in the {@code initializePlugin} method.
247       */
248      public ScriptedPlugin()
249      {
250        // No implementation is required.
251      }
252    
253    
254    
255      /**
256       * {@inheritDoc}
257       */
258      public void defineConfigArguments(final ArgumentParser parser)
259             throws ArgumentException
260      {
261        // No arguments will be allowed by default.
262      }
263    
264    
265    
266      /**
267       * Initializes this plugin.
268       *
269       * @param  serverContext  A handle to the server context for the server in
270       *                        which this extension is running.
271       * @param  config         The general configuration for this plugin.
272       * @param  parser         The argument parser which has been initialized from
273       *                        the configuration for this plugin.
274       *
275       * @throws  LDAPException  If a problem occurs while initializing this plugin.
276       */
277      public void initializePlugin(final DirectoryServerContext serverContext,
278                                   final PluginConfig config,
279                                   final ArgumentParser parser)
280             throws LDAPException
281      {
282        // No initialization will be performed by default.
283      }
284    
285    
286    
287      /**
288       * Performs any cleanup which may be necessary when this plugin is to be taken
289       * out of service.
290       */
291      public void finalizePlugin()
292      {
293        // No implementation is required.
294      }
295    
296    
297    
298      /**
299       * {@inheritDoc}
300       */
301      public boolean isConfigurationAcceptable(final PluginConfig config,
302                          final ArgumentParser parser,
303                          final List<String> unacceptableReasons)
304      {
305        // No extended validation will be performed.
306        return true;
307      }
308    
309    
310    
311      /**
312       * {@inheritDoc}
313       */
314      public ResultCode applyConfiguration(final PluginConfig config,
315                                           final ArgumentParser parser,
316                                           final List<String> adminActionsRequired,
317                                           final List<String> messages)
318      {
319        // By default, no configuration changes will be applied.  If there are any
320        // arguments, then add an admin action message indicating that the extension
321        // needs to be restarted for any changes to take effect.
322        if (! parser.getNamedArguments().isEmpty())
323        {
324          adminActionsRequired.add(
325               "No configuration change has actually been applied.  The new " +
326                    "configuration will not take effect until this plugin is " +
327                    "disabled and re-enabled or until the server is restarted.");
328        }
329    
330        return ResultCode.SUCCESS;
331      }
332    
333    
334    
335      /**
336       * Retrieves the set of startup dependencies which must be resolved in order
337       * for this plugin to be invoked at server startup.  This is only applicable
338       * for startup plugins, in which case it may be possible to have the plugin
339       * startup processing invoked as early as possible.  If it returns
340       * {@code null} then startup processing for this plugin will be performed at
341       * the default time during startup.
342       *
343       * @return  The set of startup dependencies for this plugin, or {@code null}
344       *          if it is not a startup plugin, or if startup processing should be
345       *          invoked at the default time during server startup.
346       */
347      public Set<StartupDependency> getStartupDependencies()
348      {
349        return null;
350      }
351    
352    
353    
354      /**
355       * Performs any processing which may be necessary when the server is starting.
356       *
357       * @return  Information about the result of the plugin processing.
358       */
359      public StartupPluginResult doStartup()
360      {
361        // No processing is performed by default.
362        return StartupPluginResult.SUCCESS;
363      }
364    
365    
366    
367      /**
368       * Performs any processing which may be necessary when the server is shutting
369       * down.
370       *
371       * @param  shutdownReason  A message which may provide information about the
372       *                         reason the server is shutting down.
373       */
374      public void doShutdown(final String shutdownReason)
375      {
376        // No processing is performed by default.
377      }
378    
379    
380    
381      /**
382       * Performs any processing which may be necessary for the provided entry to
383       * be imported into the server.
384       *
385       * @param  entry  The entry to be imported.  It may be altered if desired.
386       *
387       * @return  Information about the result of the plugin processing.
388       */
389      public LDIFPluginResult doLDIFImport(final UpdatableEntry entry)
390      {
391        // No processing is performed by default.
392        return LDIFPluginResult.SUCCESS;
393      }
394    
395    
396    
397      /**
398       * Performs any processing which may be necessary for the provided entry to
399       * be exported from the server.
400       *
401       * @param  entry  The entry to be exported.  It may be altered if desired.
402       *
403       * @return  Information about the result of the plugin processing.
404       */
405      public LDIFPluginResult doLDIFExport(final UpdatableEntry entry)
406      {
407        // No processing is performed by default.
408        return LDIFPluginResult.SUCCESS;
409      }
410    
411    
412    
413      /**
414       * Performs any processing which may be necessary when the server has accepted
415       * a new client connection.
416       *
417       * @param  clientContext  Information about the client connection that has
418       *                        been established.
419       *
420       * @return  Information about the result of the plugin processing.
421       */
422      public PostConnectPluginResult doPostConnect(
423                                          final ClientContext clientContext)
424      {
425        // No processing is performed by default.
426        return PostConnectPluginResult.SUCCESS;
427      }
428    
429    
430    
431      /**
432       * Performs any processing which may be necessary when the server has
433       * terminated a client connection.
434       *
435       * @param  clientContext     Information about the client connection that has
436       *                           been established.
437       * @param  disconnectReason  A general reason for the disconnect.
438       * @param  message           A message which may provide additional
439       *                           information about the disconnect.  It may be
440       *                           {@code null} if none is available.
441       *
442       * @return  Information about the result of the plugin processing.
443       */
444      public PostDisconnectPluginResult doPostDisconnect(
445                  final ClientContext clientContext,
446                  final DisconnectReason disconnectReason, final String message)
447      {
448        // No processing is performed by default.
449        return PostDisconnectPluginResult.SUCCESS;
450      }
451    
452    
453    
454      /**
455       * Performs any processing which may be necessary before the server starts
456       * processing for an abandon request.
457       *
458       * @param  operationContext  The context for the abandon operation.
459       * @param  request           The abandon request to be processed.  It may be
460       *                           altered if desired.
461       *
462       * @return  Information about the result of the plugin processing.
463       */
464      public PreParsePluginResult doPreParse(
465                  final ActiveOperationContext operationContext,
466                  final UpdatableAbandonRequest request)
467      {
468        // No processing is performed by default.
469        return PreParsePluginResult.SUCCESS;
470      }
471    
472    
473    
474      /**
475       * Performs any processing which may be necessary before the server starts
476       * processing for an add request.  This will be invoked only for add
477       * operations requested directly by clients, but not for add operations
478       * received from another server via replication.
479       *
480       * @param  operationContext  The context for the add operation.
481       * @param  request           The add request to be processed.  It may be
482       *                           altered if desired.
483       * @param  result            The result that will be returned to the client if
484       *                           the plugin result indicates that processing on
485       *                           the operation should be interrupted.  It may be
486       *                           altered if desired.
487       *
488       * @return  Information about the result of the plugin processing.
489       */
490      public PreParsePluginResult doPreParse(
491                  final ActiveOperationContext operationContext,
492                  final UpdatableAddRequest request,
493                  final UpdatableAddResult result)
494      {
495        // No processing is performed by default.
496        return PreParsePluginResult.SUCCESS;
497      }
498    
499    
500    
501      /**
502       * Performs any processing which may be necessary before the server actually
503       * attempts to add an entry to the appropriate backend.  This will be invoked
504       * only for add operations requested directly by clients, but not for add
505       * operations received from another server via replication.
506       *
507       * @param  operationContext  The context for the add operation.
508       * @param  request           The add request to be processed.
509       * @param  result            The result that will be returned to the client if
510       *                           the plugin result indicates that processing on
511       *                           the operation should be interrupted.  It may be
512       *                           altered if desired.
513       *
514       * @return  Information about the result of the plugin processing.
515       */
516      public PreOperationPluginResult doPreOperation(
517                  final ActiveOperationContext operationContext,
518                  final AddRequest request, final UpdatableAddResult result)
519      {
520        // No processing is performed by default.
521        return PreOperationPluginResult.SUCCESS;
522      }
523    
524    
525    
526      /**
527       * Performs any processing which may be necessary before the server sends a
528       * response for an add operation.  This will be invoked only for add
529       * operations requested directly by clients, but not for add operations
530       * received from another server via replication.
531       *
532       * @param  operationContext  The context for the add operation.
533       * @param  request           The add request that was processed.
534       * @param  result            The result to be returned to the client.  It may
535       *                           be altered if desired.
536       *
537       * @return  Information about the result of the plugin processing.
538       */
539      public PostOperationPluginResult doPostOperation(
540                  final ActiveOperationContext operationContext,
541                  final AddRequest request, final UpdatableAddResult result)
542      {
543        // No processing is performed by default.
544        return PostOperationPluginResult.SUCCESS;
545      }
546    
547    
548    
549      /**
550       * Performs any processing which may be necessary after all other processing
551       * has been completed for an add operation and the response has been sent to
552       * the client.  This will be invoked only for add operations requested
553       * directly by clients, but not for add operations received from another
554       * server via replication.
555       *
556       * @param  operationContext  The context for the add operation.
557       * @param  request           The add request that was processed.
558       * @param  result            The result that was returned to the client.
559       *
560       * @return  Information about the result of the plugin processing.
561       */
562      public PostResponsePluginResult doPostResponse(
563                  final CompletedOperationContext operationContext,
564                  final AddRequest request, final AddResult result)
565      {
566        // No processing is performed by default.
567        return PostResponsePluginResult.SUCCESS;
568      }
569    
570    
571    
572      /**
573       * Performs any processing which may be necessary after all other processing
574       * has been completed for an add operation which has been received from
575       * another server via replication.
576       *
577       * @param  operationContext  The context for the add operation.
578       * @param  request           The add request that was processed.
579       * @param  result            The result that was returned to the client.
580       */
581      public void doPostReplication(
582                       final CompletedOperationContext operationContext,
583                       final AddRequest request, final AddResult result)
584      {
585        // No processing is performed by default.
586      }
587    
588    
589    
590      /**
591       * Performs any processing which may be necessary before the server starts
592       * processing for a simple bind request.
593       *
594       * @param  operationContext  The context for the bind operation.
595       * @param  request           The bind request to be processed.  It may be
596       *                           altered if desired.
597       * @param  result            The result that will be returned to the client if
598       *                           the plugin result indicates that processing on
599       *                           the operation should be interrupted.  It may be
600       *                           altered if desired.
601       *
602       * @return  Information about the result of the plugin processing.
603       */
604      public PreParsePluginResult doPreParse(
605                  final ActiveOperationContext operationContext,
606                  final UpdatableSimpleBindRequest request,
607                  final UpdatableBindResult result)
608      {
609        // No processing is performed by default.
610        return PreParsePluginResult.SUCCESS;
611      }
612    
613    
614    
615      /**
616       * Performs any processing which may be necessary before the server actually
617       * attempts to perform the authentication for a simple bind request.
618       *
619       * @param  operationContext  The context for the bind operation.
620       * @param  request           The bind request to be processed.
621       * @param  result            The result that will be returned to the client if
622       *                           the plugin result indicates that processing on
623       *                           the operation should be interrupted.  It may be
624       *                           altered if desired.
625       *
626       * @return  Information about the result of the plugin processing.
627       */
628      public PreOperationPluginResult doPreOperation(
629                  final ActiveOperationContext operationContext,
630                  final SimpleBindRequest request,
631                  final UpdatableBindResult result)
632      {
633        // No processing is performed by default.
634        return PreOperationPluginResult.SUCCESS;
635      }
636    
637    
638    
639      /**
640       * Performs any processing which may be necessary before the server sends a
641       * response for a simple bind operation.
642       *
643       * @param  operationContext  The context for the bind operation.
644       * @param  request           The bind request that was processed.
645       * @param  result            The result to be returned to the client.  It may
646       *                           be altered if desired.
647       *
648       * @return  Information about the result of the plugin processing.
649       */
650      public PostOperationPluginResult doPostOperation(
651                  final ActiveOperationContext operationContext,
652                  final SimpleBindRequest request, final UpdatableBindResult result)
653      {
654        // No processing is performed by default.
655        return PostOperationPluginResult.SUCCESS;
656      }
657    
658    
659    
660      /**
661       * Performs any processing which may be necessary after all other processing
662       * has been completed for a simple bind operation and the response has been
663       * sent to the client.
664       *
665       * @param  operationContext  The context for the bind operation.
666       * @param  request           The bind request that was processed.
667       * @param  result            The result that was returned to the client.
668       *
669       * @return  Information about the result of the plugin processing.
670       */
671      public PostResponsePluginResult doPostResponse(
672                  final CompletedOperationContext operationContext,
673                  final SimpleBindRequest request, final BindResult result)
674      {
675        // No processing is performed by default.
676        return PostResponsePluginResult.SUCCESS;
677      }
678    
679    
680    
681      /**
682       * Performs any processing which may be necessary before the server starts
683       * processing for a SASL bind request.
684       *
685       * @param  operationContext  The context for the bind operation.
686       * @param  request           The bind request to be processed.  It may be
687       *                           altered if desired.
688       * @param  result            The result that will be returned to the client if
689       *                           the plugin result indicates that processing on
690       *                           the operation should be interrupted.  It may be
691       *                           altered if desired.
692       *
693       * @return  Information about the result of the plugin processing.
694       */
695      public PreParsePluginResult doPreParse(
696                  final ActiveOperationContext operationContext,
697                  final UpdatableSASLBindRequest request,
698                  final UpdatableBindResult result)
699      {
700        // No processing is performed by default.
701        return PreParsePluginResult.SUCCESS;
702      }
703    
704    
705    
706      /**
707       * Performs any processing which may be necessary before the server actually
708       * attempts to perform the authentication for a SASL bind request.
709       *
710       * @param  operationContext  The context for the bind operation.
711       * @param  request           The bind request to be processed.
712       * @param  result            The result that will be returned to the client if
713       *                           the plugin result indicates that processing on
714       *                           the operation should be interrupted.  It may be
715       *                           altered if desired.
716       *
717       * @return  Information about the result of the plugin processing.
718       */
719      public PreOperationPluginResult doPreOperation(
720                  final ActiveOperationContext operationContext,
721                  final SASLBindRequest request, final UpdatableBindResult result)
722      {
723        // No processing is performed by default.
724        return PreOperationPluginResult.SUCCESS;
725      }
726    
727    
728    
729      /**
730       * Performs any processing which may be necessary before the server sends a
731       * response for a SASL bind operation.
732       *
733       * @param  operationContext  The context for the bind operation.
734       * @param  request           The bind request that was processed.
735       * @param  result            The result to be returned to the client.  It may
736       *                           be altered if desired.
737       *
738       * @return  Information about the result of the plugin processing.
739       */
740      public PostOperationPluginResult doPostOperation(
741                  final ActiveOperationContext operationContext,
742                  final SASLBindRequest request, final UpdatableBindResult result)
743      {
744        // No processing is performed by default.
745        return PostOperationPluginResult.SUCCESS;
746      }
747    
748    
749    
750      /**
751       * Performs any processing which may be necessary after all other processing
752       * has been completed for a SASL bind operation and the response has been
753       * sent to the client.
754       *
755       * @param  operationContext  The context for the bind operation.
756       * @param  request           The bind request that was processed.
757       * @param  result            The result that was returned to the client.
758       *
759       * @return  Information about the result of the plugin processing.
760       */
761      public PostResponsePluginResult doPostResponse(
762                  final CompletedOperationContext operationContext,
763                  final SASLBindRequest request, final BindResult result)
764      {
765        // No processing is performed by default.
766        return PostResponsePluginResult.SUCCESS;
767      }
768    
769    
770    
771      /**
772       * Performs any processing which may be necessary before the server starts
773       * processing for a compare request.
774       *
775       * @param  operationContext  The context for the compare operation.
776       * @param  request           The compare request to be processed.  It may be
777       *                           altered if desired.
778       * @param  result            The result that will be returned to the client if
779       *                           the plugin result indicates that processing on
780       *                           the operation should be interrupted.  It may be
781       *                           altered if desired.
782       *
783       * @return  Information about the result of the plugin processing.
784       */
785      public PreParsePluginResult doPreParse(
786                  final ActiveOperationContext operationContext,
787                  final UpdatableCompareRequest request,
788                  final UpdatableCompareResult result)
789      {
790        // No processing is performed by default.
791        return PreParsePluginResult.SUCCESS;
792      }
793    
794    
795    
796      /**
797       * Performs any processing which may be necessary before the server actually
798       * attempts to perform the core processing for the compare.
799       *
800       * @param  operationContext  The context for the compare operation.
801       * @param  request           The compare request to be processed.
802       * @param  result            The result that will be returned to the client if
803       *                           the plugin result indicates that processing on
804       *                           the operation should be interrupted.  It may be
805       *                           altered if desired.
806       * @param  entry             The entry targeted by the compare operation.
807       *
808       * @return  Information about the result of the plugin processing.
809       */
810      public PreOperationPluginResult doPreOperation(
811                  final ActiveOperationContext operationContext,
812                  final CompareRequest request, final UpdatableCompareResult result,
813                  final Entry entry)
814      {
815        // No processing is performed by default.
816        return PreOperationPluginResult.SUCCESS;
817      }
818    
819    
820    
821      /**
822       * Performs any processing which may be necessary before the server sends a
823       * response for a compare operation.
824       *
825       * @param  operationContext  The context for the compare operation.
826       * @param  request           The compare request that was processed.
827       * @param  result            The result to be returned to the client.  It may
828       *                           be altered if desired.
829       * @param  entry             The entry targeted by the compare operation, if
830       *                           it exists.
831       *
832       * @return  Information about the result of the plugin processing.
833       */
834      public PostOperationPluginResult doPostOperation(
835                  final ActiveOperationContext operationContext,
836                  final CompareRequest request, final UpdatableCompareResult result,
837                  final Entry entry)
838      {
839        // No processing is performed by default.
840        return PostOperationPluginResult.SUCCESS;
841      }
842    
843    
844    
845      /**
846       * Performs any processing which may be necessary after all other processing
847       * has been completed for a compare operation and the response has been sent
848       * to the client.
849       *
850       * @param  operationContext  The context for the compare operation.
851       * @param  request           The compare request that was processed.
852       * @param  result            The result that was returned to the client.
853       *
854       * @return  Information about the result of the plugin processing.
855       */
856      public PostResponsePluginResult doPostResponse(
857                  final CompletedOperationContext operationContext,
858                  final CompareRequest request, final CompareResult result)
859      {
860        // No processing is performed by default.
861        return PostResponsePluginResult.SUCCESS;
862      }
863    
864    
865    
866      /**
867       * Performs any processing which may be necessary before the server starts
868       * processing for a delete request.  This will be invoked only for delete
869       * operations requested directly by clients, but not for delete operations
870       * received from another server via replication.
871       *
872       * @param  operationContext  The context for the delete operation.
873       * @param  request           The delete request to be processed.  It may be
874       *                           altered if desired.
875       * @param  result            The result that will be returned to the client if
876       *                           the plugin result indicates that processing on
877       *                           the operation should be interrupted.  It may be
878       *                           altered if desired.
879       *
880       * @return  Information about the result of the plugin processing.
881       */
882      public PreParsePluginResult doPreParse(
883                  final ActiveOperationContext operationContext,
884                  final UpdatableDeleteRequest request,
885                  final UpdatableDeleteResult result)
886      {
887        // No processing is performed by default.
888        return PreParsePluginResult.SUCCESS;
889      }
890    
891    
892    
893      /**
894       * Performs any processing which may be necessary before the server actually
895       * attempts to remove the entry from the server.  This will be invoked only
896       * for delete operations requested directly by clients, but not for delete
897       * operations received from another server via replication.
898    
899       *
900       * @param  operationContext  The context for the delete operation.
901       * @param  request           The delete request to be processed.
902       * @param  result            The result that will be returned to the client if
903       *                           the plugin result indicates that processing on
904       *                           the operation should be interrupted.  It may be
905       *                           altered if desired.
906       * @param  entry             The entry targeted by the delete operation.
907       *
908       * @return  Information about the result of the plugin processing.
909       */
910      public PreOperationPluginResult doPreOperation(
911                  final ActiveOperationContext operationContext,
912                  final DeleteRequest request, final UpdatableDeleteResult result,
913                  final Entry entry)
914      {
915        // No processing is performed by default.
916        return PreOperationPluginResult.SUCCESS;
917      }
918    
919    
920    
921      /**
922       * Performs any processing which may be necessary before the server sends a
923       * response for a delete operation.  This will be invoked only for delete
924       * operations requested directly by clients, but not for delete operations
925       * received from another server via replication.
926    
927       *
928       * @param  operationContext  The context for the delete operation.
929       * @param  request           The delete request that was processed.
930       * @param  result            The result to be returned to the client.  It may
931       *                           be altered if desired.
932       * @param  entry             The entry targeted by the delete operation, if
933       *                           it exists.
934       *
935       * @return  Information about the result of the plugin processing.
936       */
937      public PostOperationPluginResult doPostOperation(
938                  final ActiveOperationContext operationContext,
939                  final DeleteRequest request, final UpdatableDeleteResult result,
940                  final Entry entry)
941      {
942        // No processing is performed by default.
943        return PostOperationPluginResult.SUCCESS;
944      }
945    
946    
947    
948      /**
949       * Performs any processing which may be necessary after all other processing
950       * has been completed for a delete operation and the response has been sent
951       * to the client.  This will be invoked only for delete operations requested
952       * directly by clients, but not for delete operations received from another
953       * server via replication.
954    
955       *
956       * @param  operationContext  The context for the delete operation.
957       * @param  request           The delete request that was processed.
958       * @param  result            The result that was returned to the client.
959       *
960       * @return  Information about the result of the plugin processing.
961       */
962      public PostResponsePluginResult doPostResponse(
963                  final CompletedOperationContext operationContext,
964                  final DeleteRequest request, final DeleteResult result)
965      {
966        // No processing is performed by default.
967        return PostResponsePluginResult.SUCCESS;
968      }
969    
970    
971    
972      /**
973       * Performs any processing which may be necessary after all other processing
974       * has been completed for a delete operation which has been received from
975       * another server via replication.
976       *
977       * @param  operationContext  The context for the delete operation.
978       * @param  request           The delete request that was processed.
979       * @param  result            The result that was returned to the client.
980       */
981      public void doPostReplication(
982                       final CompletedOperationContext operationContext,
983                       final DeleteRequest request, final DeleteResult result)
984      {
985        // No processing is performed by default.
986      }
987    
988    
989    
990      /**
991       * Performs any processing which may be necessary before the server starts
992       * processing for an extended request.
993       *
994       * @param  operationContext  The context for the extended operation.
995       * @param  request           The extended request to be processed.  It may be
996       *                           altered if desired.
997       * @param  result            The result that will be returned to the client if
998       *                           the plugin result indicates that processing on
999       *                           the operation should be interrupted.  It may be
1000       *                           altered if desired.
1001       *
1002       * @return  Information about the result of the plugin processing.
1003       */
1004      public PreParsePluginResult doPreParse(
1005                  final ActiveOperationContext operationContext,
1006                  final UpdatableExtendedRequest request,
1007                  final UpdatableExtendedResult result)
1008      {
1009        // No processing is performed by default.
1010        return PreParsePluginResult.SUCCESS;
1011      }
1012    
1013    
1014    
1015      /**
1016       * Performs any processing which may be necessary before the server actually
1017       * attempts to perform the core processing for the extended operation.
1018       *
1019       * @param  operationContext  The context for the extended operation.
1020       * @param  request           The extended request to be processed.
1021       * @param  result            The result that will be returned to the client if
1022       *                           the plugin result indicates that processing on
1023       *                           the operation should be interrupted.  It may be
1024       *                           altered if desired.
1025       *
1026       * @return  Information about the result of the plugin processing.
1027       */
1028      public PreOperationPluginResult doPreOperation(
1029                  final ActiveOperationContext operationContext,
1030                  final ExtendedRequest request,
1031                  final UpdatableExtendedResult result)
1032      {
1033        // No processing is performed by default.
1034        return PreOperationPluginResult.SUCCESS;
1035      }
1036    
1037    
1038    
1039      /**
1040       * Performs any processing which may be necessary before the server sends a
1041       * response for an extended operation.
1042       *
1043       * @param  operationContext  The context for the extended operation.
1044       * @param  request           The extended request that was processed.
1045       * @param  result            The result to be returned to the client.  It may
1046       *                           be altered if desired.
1047       *
1048       * @return  Information about the result of the plugin processing.
1049       */
1050      public PostOperationPluginResult doPostOperation(
1051                  final ActiveOperationContext operationContext,
1052                  final ExtendedRequest request,
1053                  final UpdatableExtendedResult result)
1054      {
1055        // No processing is performed by default.
1056        return PostOperationPluginResult.SUCCESS;
1057      }
1058    
1059    
1060    
1061      /**
1062       * Performs any processing which may be necessary after all other processing
1063       * has been completed for an extended operation and the response has been sent
1064       * to the client.
1065       *
1066       * @param  operationContext  The context for the extended operation.
1067       * @param  request           The extended request that was processed.
1068       * @param  result            The result that was returned to the client.
1069       *
1070       * @return  Information about the result of the plugin processing.
1071       */
1072      public PostResponsePluginResult doPostResponse(
1073                  final CompletedOperationContext operationContext,
1074                  final ExtendedRequest request, final ExtendedResult result)
1075      {
1076        // No processing is performed by default.
1077        return PostResponsePluginResult.SUCCESS;
1078      }
1079    
1080    
1081    
1082      /**
1083       * Performs any processing which may be necessary before the server starts
1084       * processing for a modify request.  This will be invoked only for modify
1085       * operations requested directly by clients, but not for modify operations
1086       * received from another server via replication.
1087       *
1088       * @param  operationContext  The context for the modify operation.
1089       * @param  request           The modify request to be processed.  It may be
1090       *                           altered if desired.
1091       * @param  result            The result that will be returned to the client if
1092       *                           the plugin result indicates that processing on
1093       *                           the operation should be interrupted.  It may be
1094       *                           altered if desired.
1095       *
1096       * @return  Information about the result of the plugin processing.
1097       */
1098      public PreParsePluginResult doPreParse(
1099                  final ActiveOperationContext operationContext,
1100                  final UpdatableModifyRequest request,
1101                  final UpdatableModifyResult result)
1102      {
1103        // No processing is performed by default.
1104        return PreParsePluginResult.SUCCESS;
1105      }
1106    
1107    
1108    
1109      /**
1110       * Performs any processing which may be necessary before the server actually
1111       * attempts to update the entry in the backend.  This will be invoked only for
1112       * modify operations requested directly by clients, but not for modify
1113       * operations received from another server via replication.
1114       *
1115       * @param  operationContext  The context for the modify operation.
1116       * @param  request           The modify request to be processed.
1117       * @param  result            The result that will be returned to the client if
1118       *                           the plugin result indicates that processing on
1119       *                           the operation should be interrupted.  It may be
1120       *                           altered if desired.
1121       * @param  oldEntry          The entry as it appeared before the modifications
1122       *                           were applied.
1123       * @param  newEntry          The updated entry as it will appear after the
1124       *                           modifications have been applied.
1125       *
1126       * @return  Information about the result of the plugin processing.
1127       */
1128      public PreOperationPluginResult doPreOperation(
1129                  final ActiveOperationContext operationContext,
1130                  final ModifyRequest request, final UpdatableModifyResult result,
1131                  final Entry oldEntry, final Entry newEntry)
1132      {
1133        // No processing is performed by default.
1134        return PreOperationPluginResult.SUCCESS;
1135      }
1136    
1137    
1138    
1139      /**
1140       * Performs any processing which may be necessary before the server sends a
1141       * response for a modify operation.  This will be invoked only for modify
1142       * operations requested directly by clients, but not for modify operations
1143       * received from another server via replication.
1144       *
1145       * @param  operationContext  The context for the modify operation.
1146       * @param  request           The modify request that was processed.
1147       * @param  result            The result to be returned to the client.  It may
1148       *                           be altered if desired.
1149       * @param  oldEntry          The entry as it appeared before the modifications
1150       *                           were applied, if it exists. .
1151       * @param  newEntry          The entry as it appears after the modifications
1152       *                           have been applied, if it exists. .
1153       *
1154       * @return  Information about the result of the plugin processing.
1155       */
1156      public PostOperationPluginResult doPostOperation(
1157                  final ActiveOperationContext operationContext,
1158                  final ModifyRequest request, final UpdatableModifyResult result,
1159                  final Entry oldEntry, final Entry newEntry)
1160      {
1161        // No processing is performed by default.
1162        return PostOperationPluginResult.SUCCESS;
1163      }
1164    
1165    
1166    
1167      /**
1168       * Performs any processing which may be necessary after all other processing
1169       * has been completed for a modify operation and the response has been sent
1170       * to the client.  This will be invoked only for modify operations requested
1171       * directly by clients, but not for modify operations received from another
1172       * server via replication.
1173       *
1174       * @param  operationContext  The context for the modify operation.
1175       * @param  request           The modify request that was processed.
1176       * @param  result            The result that was returned to the client.
1177       *
1178       * @return  Information about the result of the plugin processing.
1179       */
1180      public PostResponsePluginResult doPostResponse(
1181                  final CompletedOperationContext operationContext,
1182                  final ModifyRequest request, final ModifyResult result)
1183      {
1184        // No processing is performed by default.
1185        return PostResponsePluginResult.SUCCESS;
1186      }
1187    
1188    
1189    
1190      /**
1191       * Performs any processing which may be necessary after all other processing
1192       * has been completed for a modify operation which has been received from
1193       * another server via replication.
1194       *
1195       * @param  operationContext  The context for the modify operation.
1196       * @param  request           The modify request that was processed.
1197       * @param  result            The result that was returned to the client.
1198       */
1199      public void doPostReplication(
1200                       final CompletedOperationContext operationContext,
1201                       final ModifyRequest request, final ModifyResult result)
1202      {
1203        // No processing is performed by default.
1204      }
1205    
1206    
1207    
1208      /**
1209       * Performs any processing which may be necessary before the server starts
1210       * processing for a modify DN request.  This will be invoked only for modify
1211       * DN operations requested directly by clients, but not for modify DN
1212       * operations received from another server via replication.
1213       *
1214       * @param  operationContext  The context for the modify DN operation.
1215       * @param  request           The modify DN request to be processed.  It may be
1216       *                           altered if desired.
1217       * @param  result            The result that will be returned to the client if
1218       *                           the plugin result indicates that processing on
1219       *                           the operation should be interrupted.  It may be
1220       *                           altered if desired.
1221       *
1222       * @return  Information about the result of the plugin processing.
1223       */
1224      public PreParsePluginResult doPreParse(
1225                  final ActiveOperationContext operationContext,
1226                  final UpdatableModifyDNRequest request,
1227                  final UpdatableModifyDNResult result)
1228      {
1229        // No processing is performed by default.
1230        return PreParsePluginResult.SUCCESS;
1231      }
1232    
1233    
1234    
1235      /**
1236       * Performs any processing which may be necessary before the server actually
1237       * attempts to update the entry in the backend.  This will be invoked only for
1238       * modify DN operations requested directly by clients, but not for modify DN
1239       * operations received from another server via replication.
1240       *
1241       * @param  operationContext  The context for the modify DN operation.
1242       * @param  request           The modify DN request to be processed.
1243       * @param  result            The result that will be returned to the client if
1244       *                           the plugin result indicates that processing on
1245       *                           the operation should be interrupted.  It may be
1246       *                           altered if desired.
1247       * @param  oldEntry          The entry as it appeared before being renamed.
1248       * @param  newEntry          The updated entry as it will appear after it has
1249       *                           been renamed.
1250       *
1251       * @return  Information about the result of the plugin processing.
1252       */
1253      public PreOperationPluginResult doPreOperation(
1254                  final ActiveOperationContext operationContext,
1255                  final ModifyDNRequest request,
1256                  final UpdatableModifyDNResult result, final Entry oldEntry,
1257                  final Entry newEntry)
1258      {
1259        // No processing is performed by default.
1260        return PreOperationPluginResult.SUCCESS;
1261      }
1262    
1263    
1264    
1265      /**
1266       * Performs any processing which may be necessary during the course of
1267       * renaming an entry which is subordinate to an entry targeted by a modify DN
1268       * operation.  This will be invoked only for both modify DN operations
1269       * requested by clients and for modify DN operations received from another
1270       * server via replication.
1271       *
1272       * @param  operationContext         The context for the modify DN operation.
1273       * @param  request                  The modify DN request being processed.
1274       * @param  result                   The result that will be returned to the
1275       *                                  client if the plugin result indicates that
1276       *                                  processing on the operation should be
1277       *                                  interrupted.  It may be altered if
1278       *                                  desired.
1279       * @param  oldSubordinateEntry      The subordinate entry as it appeared
1280       *                                  before being renamed.
1281       * @param  newSubordinateEntry      The subordinate entry as it will appear
1282       *                                  after being renamed.
1283       * @param  additionalModifications  A list of additional modifications that
1284       *                                  should be applied to the entry as it is
1285       *                                  renamed.  This list may be altered if
1286       *                                  desired.
1287       *
1288       * @return  Information about the result of the plugin processing.
1289       */
1290      public SubordinateModifyDNPluginResult doSubordinateModifyDN(
1291                  final ActiveOperationContext operationContext,
1292                  final ModifyDNRequest request,
1293                  final UpdatableModifyDNResult result,
1294                  final Entry oldSubordinateEntry,
1295                  final Entry newSubordinateEntry,
1296                  final List<Modification> additionalModifications)
1297      {
1298        // No processing is performed by default.
1299        return SubordinateModifyDNPluginResult.SUCCESS;
1300      }
1301    
1302    
1303    
1304      /**
1305       * Performs any processing which may be necessary before the server sends a
1306       * response for a modify DN operation.  This will be invoked only for modify
1307       * DN operations requested directly by clients, but not for modify DN
1308       * operations received from another server via replication.
1309       *
1310       * @param  operationContext  The context for the modify DN operation.
1311       * @param  request           The modify DN request that was processed.
1312       * @param  result            The result to be returned to the client.  It may
1313       *                           be altered if desired.
1314       * @param  oldEntry          The entry as it appeared before it was renamed,
1315       *                           if it exists.
1316       * @param  newEntry          The entry as it appears after it was renamed, if
1317       *                           it exists. .
1318       *
1319       * @return  Information about the result of the plugin processing.
1320       */
1321      public PostOperationPluginResult doPostOperation(
1322                  final ActiveOperationContext operationContext,
1323                  final ModifyDNRequest request,
1324                  final UpdatableModifyDNResult result, final Entry oldEntry,
1325                  final Entry newEntry)
1326      {
1327        // No processing is performed by default.
1328        return PostOperationPluginResult.SUCCESS;
1329      }
1330    
1331    
1332    
1333      /**
1334       * Performs any processing which may be necessary after all other processing
1335       * has been completed for a modify DN operation and the response has been
1336       * sent to the client.  This will be invoked only for modify DN operations
1337       * requested directly by clients, but not for modify DN operations received
1338       * from another server via replication.
1339       *
1340       * @param  operationContext  The context for the modify DN operation.
1341       * @param  request           The modify DN request that was processed.
1342       * @param  result            The result that was returned to the client.
1343       *
1344       * @return  Information about the result of the plugin processing.
1345       */
1346      public PostResponsePluginResult doPostResponse(
1347                  final CompletedOperationContext operationContext,
1348                  final ModifyDNRequest request, final ModifyDNResult result)
1349      {
1350        // No processing is performed by default.
1351        return PostResponsePluginResult.SUCCESS;
1352      }
1353    
1354    
1355    
1356      /**
1357       * Performs any processing which may be necessary after all other processing
1358       * has been completed for a modify DN operation which has been received from
1359       * another server via replication.
1360       *
1361       * @param  operationContext  The context for the modify DN operation.
1362       * @param  request           The modify DN request that was processed.
1363       * @param  result            The result that was returned to the client.
1364       */
1365      public void doPostReplication(
1366                       final CompletedOperationContext operationContext,
1367                       final ModifyDNRequest request, final ModifyDNResult result)
1368      {
1369        // No processing is performed by default.
1370      }
1371    
1372    
1373    
1374      /**
1375       * Performs any processing which may be necessary before the server starts
1376       * processing for a search request.
1377       *
1378       * @param  operationContext  The context for the search operation.
1379       * @param  request           The search request to be processed.  It may be
1380       *                           altered if desired.
1381       * @param  result            The result that will be returned to the client if
1382       *                           the plugin result indicates that processing on
1383       *                           the operation should be interrupted.  It may be
1384       *                           altered if desired.
1385       *
1386       * @return  Information about the result of the plugin processing.
1387       */
1388      public PreParsePluginResult doPreParse(
1389                  final ActiveSearchOperationContext operationContext,
1390                  final UpdatableSearchRequest request,
1391                  final UpdatableSearchResult result)
1392      {
1393        // No processing is performed by default.
1394        return PreParsePluginResult.SUCCESS;
1395      }
1396    
1397    
1398    
1399      /**
1400       * Performs any processing which may be necessary before the server actually
1401       * attempts to process the search in the backend.
1402       *
1403       * @param  operationContext  The context for the search operation.
1404       * @param  request           The search request to be processed.
1405       * @param  result            The result that will be returned to the client if
1406       *                           the plugin result indicates that processing on
1407       *                           the operation should be interrupted.  It may be
1408       *                           altered if desired.
1409       *
1410       * @return  Information about the result of the plugin processing.
1411       */
1412      public PreOperationPluginResult doPreOperation(
1413                  final ActiveSearchOperationContext operationContext,
1414                  final SearchRequest request, final UpdatableSearchResult result)
1415      {
1416        // No processing is performed by default.
1417        return PreOperationPluginResult.SUCCESS;
1418      }
1419    
1420    
1421    
1422      /**
1423       * Performs any processing which may be necessary before the server sends a
1424       * search result entry to the client.
1425       *
1426       * @param  operationContext  The context for the search operation.
1427       * @param  request           The search request being processed.
1428       * @param  result            The result that will be returned to the client if
1429       *                           the plugin result indicates that processing on
1430       *                           the operation should be interrupted.  It may be
1431       *                           altered if desired.
1432       * @param  entry             The entry to be returned to the client.  It may
1433       *                           be altered if desired.
1434       * @param  controls          The set of controls to be included with the
1435       *                           entry.  It may be altered if desired.
1436       *
1437       * @return  Information about the result of the plugin processing.
1438       */
1439      public SearchEntryPluginResult doSearchEntry(
1440                  final ActiveSearchOperationContext operationContext,
1441                  final SearchRequest request, final UpdatableSearchResult result,
1442                  final UpdatableEntry entry, final List<Control> controls)
1443      {
1444        // No processing is performed by default.
1445        return SearchEntryPluginResult.SUCCESS;
1446      }
1447    
1448    
1449    
1450      /**
1451       * Performs any processing which may be necessary before the server sends a
1452       * search result reference to the client.
1453       *
1454       * @param  operationContext  The context for the search operation.
1455       * @param  request           The search request being processed.
1456       * @param  result            The result that will be returned to the client if
1457       *                           the plugin result indicates that processing on
1458       *                           the operation should be interrupted.  It may be
1459       *                           altered if desired.
1460       * @param  referralURLs      The set of referral URLs to be returned to the
1461       *                           client.  It may be altered if desired.
1462       * @param  controls          The set of controls to be included with the
1463       *                           reference.  It may be altered if desired.
1464       *
1465       * @return  Information about the result of the plugin processing.
1466       */
1467      public SearchReferencePluginResult doSearchReference(
1468                  final ActiveSearchOperationContext operationContext,
1469                  final SearchRequest request, final UpdatableSearchResult result,
1470                  final List<String> referralURLs, final List<Control> controls)
1471      {
1472        // No processing is performed by default.
1473        return SearchReferencePluginResult.SUCCESS;
1474      }
1475    
1476    
1477    
1478      /**
1479       * Performs any processing which may be necessary before the server sends a
1480       * response for a search operation.
1481       *
1482       * @param  operationContext  The context for the search operation.
1483       * @param  request           The search request that was processed.
1484       * @param  result            The result to be returned to the client.  It may
1485       *                           be altered if desired.
1486       *
1487       * @return  Information about the result of the plugin processing.
1488       */
1489      public PostOperationPluginResult doPostOperation(
1490                  final ActiveSearchOperationContext operationContext,
1491                  final SearchRequest request, final UpdatableSearchResult result)
1492      {
1493        // No processing is performed by default.
1494        return PostOperationPluginResult.SUCCESS;
1495      }
1496    
1497    
1498    
1499      /**
1500       * Performs any processing which may be necessary after all other processing
1501       * has been completed for a search operation and the response has been sent to
1502       * the client.
1503       *
1504       * @param  operationContext  The context for the search operation.
1505       * @param  request           The search request that was processed.
1506       * @param  result            The result that was returned to the client.
1507       *
1508       * @return  Information about the result of the plugin processing.
1509       */
1510      public PostResponsePluginResult doPostResponse(
1511                  final CompletedSearchOperationContext operationContext,
1512                  final SearchRequest request, final SearchResult result)
1513      {
1514        // No processing is performed by default.
1515        return PostResponsePluginResult.SUCCESS;
1516      }
1517    
1518    
1519    
1520      /**
1521       * Performs any processing which may be necessary before the server starts
1522       * processing for an unbind request.
1523       *
1524       * @param  operationContext  The context for the unbind operation.
1525       * @param  request           The unbind request to be processed.  It may be
1526       *                           altered if desired.
1527       *
1528       * @return  Information about the result of the plugin processing.
1529       */
1530      public PreParsePluginResult doPreParse(
1531                  final ActiveOperationContext operationContext,
1532                  final UpdatableUnbindRequest request)
1533      {
1534        // No processing is performed by default.
1535        return PreParsePluginResult.SUCCESS;
1536      }
1537    
1538    
1539    
1540      /**
1541       * Performs any processing which may be necessary before the server sends an
1542       * intermediate response to the client.
1543       *
1544       * @param  operationContext      The context for the associated operation.
1545       * @param  result                The result that will be returned to the
1546       *                               client if the plugin result indicates that
1547       *                               processing on the operation should be
1548       *                               interrupted.  It may be altered if desired.
1549       * @param  intermediateResponse  The intermediate response to be returned to
1550       *                               the client.  It may be altered if desired.
1551       *
1552       * @return  Information about the result of the plugin processing.
1553       */
1554      public IntermediateResponsePluginResult doIntermediateResponse(
1555                  final ActiveOperationContext operationContext,
1556                  final UpdatableGenericResult result,
1557                  final IntermediateResponse intermediateResponse)
1558      {
1559        // No processing is performed by default.
1560        return IntermediateResponsePluginResult.SUCCESS;
1561      }
1562    }