@Extensible @SynchronizationServerExtension(appliesToLocalContent=false, appliesToSynchronizedContent=true) @ThreadSafety(level=INTERFACE_THREADSAFE) public abstract class LDAPSyncDestinationPlugin extends java.lang.Object implements UnboundIDExtension, Reconfigurable<LDAPSyncDestinationPluginConfig>, ExampleUsageProvider
dsconfig create-sync-destination-plugin \ --plugin-name "{plugin-name}" \ --type third-party-ldap \ --set "extension-class:{class-name}" \ --set "extension-argument:{name=value}"where "{plugin-name}" is the name to use for the LDAP sync destination plugin instance, "{class-name}" is the fully-qualified name of the Java class that extends
com.unboundid.directory.sdk.sync.api.LDAPSyncDestinationPlugin
, and
"{name=value}" represents name-value pairs for any arguments to
provide to the LDAP sync destination plugin. If multiple arguments should be
provided to the LDAP sync destination plugin, then the
"--set extension-argument:{name=value}
" option should be
provided multiple times.ScriptedLDAPSyncDestinationPlugin
Constructor and Description |
---|
LDAPSyncDestinationPlugin()
Creates a new instance of this LDAP sync destination plugin.
|
Modifier and Type | Method and Description |
---|---|
ResultCode |
applyConfiguration(LDAPSyncDestinationPluginConfig config,
ArgumentParser parser,
java.util.List<java.lang.String> adminActionsRequired,
java.util.List<java.lang.String> messages)
Attempts to apply the configuration from the provided argument parser to
this extension.
|
void |
defineConfigArguments(ArgumentParser parser)
Updates the provided argument parser to define any configuration arguments
which may be used by this extension.
|
void |
finalizeLDAPSyncDestinationPlugin()
Performs any cleanup which may be necessary when this LDAP sync destination
plugin is taken out of service.
|
java.util.Map<java.util.List<java.lang.String>,java.lang.String> |
getExamplesArgumentSets()
Retrieves a map containing examples of configurations that may be used for
this extension.
|
abstract java.lang.String[] |
getExtensionDescription()
Retrieves a human-readable description for this extension.
|
abstract java.lang.String |
getExtensionName()
Retrieves a human-readable name for this extension.
|
void |
initializeLDAPSyncDestinationPlugin(SyncServerContext serverContext,
LDAPSyncDestinationPluginConfig config,
ArgumentParser parser)
Initializes this LDAP sync destination plugin.
|
boolean |
isConfigurationAcceptable(LDAPSyncDestinationPluginConfig config,
ArgumentParser parser,
java.util.List<java.lang.String> unacceptableReasons)
Indicates whether the configuration represented by the provided argument
parser is acceptable for use by this extension.
|
PostStepResult |
postFetch(LDAPInterface destinationConnection,
SearchRequest searchRequest,
java.util.List<Entry> fetchedEntries,
SyncOperation operation)
This method is called after an attempt to fetch a destination entry.
|
PreStepResult |
preCreate(LDAPInterface destinationConnection,
Entry entryToCreate,
SyncOperation operation)
This method is called before a destination entry is created.
|
PreStepResult |
preDelete(LDAPInterface destinationConnection,
Entry entryToDelete,
SyncOperation operation)
This method is called before a destination entry is deleted.
|
PreStepResult |
preFetch(LDAPInterface destinationConnection,
SearchRequest searchRequest,
java.util.List<Entry> fetchedEntries,
SyncOperation operation)
This method is called before a destination entry is fetched.
|
PreStepResult |
preModify(LDAPInterface destinationConnection,
Entry entryToModify,
java.util.List<Modification> modsToApply,
SyncOperation operation)
This method is called before a destination entry is modified.
|
java.lang.String |
toString()
Retrieves a string representation of this LDAP sync destination plugin.
|
abstract void |
toString(java.lang.StringBuilder buffer)
Appends a string representation of this LDAP sync destination plugin to the
provided buffer.
|
PreStepResult |
transformRequest(LDAPInterface destinationConnection,
UpdatableLDAPRequest request,
SyncOperation operation)
This method is called prior to executing any add, modify, delete, or
search from the destination but after the respective pre method (e.g
preFetch or preModify).
|
public LDAPSyncDestinationPlugin()
initializeLDAPSyncDestinationPlugin
method.public abstract java.lang.String getExtensionName()
getExtensionName
in interface UnboundIDExtension
public abstract java.lang.String[] getExtensionDescription()
getExtensionDescription
in interface UnboundIDExtension
null
or an empty array if no description should be available.public void defineConfigArguments(ArgumentParser parser) throws ArgumentException
defineConfigArguments
in interface Configurable
parser
- The argument parser to be updated with the configuration
arguments which may be used by this extension.ArgumentException
- If a problem is encountered while updating the
provided argument parser.public void initializeLDAPSyncDestinationPlugin(SyncServerContext serverContext, LDAPSyncDestinationPluginConfig config, ArgumentParser parser) throws LDAPException
serverContext
- A handle to the server context for the
Data Sync Server in which this extension is
running. Extensions should typically store this
in a class member.config
- The general configuration for this proxy
transformation.parser
- The argument parser which has been initialized from
the configuration for this LDAP sync destination
plugin.LDAPException
- If a problem occurs while initializing this ldap
sync destination plugin.public boolean isConfigurationAcceptable(LDAPSyncDestinationPluginConfig config, ArgumentParser parser, java.util.List<java.lang.String> unacceptableReasons)
isConfigurationAcceptable
in interface Reconfigurable<LDAPSyncDestinationPluginConfig>
config
- The general configuration for this extension.parser
- The argument parser that has been used to
parse the proposed configuration for this
extension.unacceptableReasons
- A list to which messages may be added to
provide additional information about why the
provided configuration is not acceptable.true
if the configuration in the provided argument parser
appears to be acceptable, or false
if not.public ResultCode applyConfiguration(LDAPSyncDestinationPluginConfig config, ArgumentParser parser, java.util.List<java.lang.String> adminActionsRequired, java.util.List<java.lang.String> messages)
applyConfiguration
in interface Reconfigurable<LDAPSyncDestinationPluginConfig>
config
- The general configuration for this extension.parser
- The argument parser that has been used to
parse the new configuration for this
extension.adminActionsRequired
- A list to which messages may be added to
provide additional information about any
additional administrative actions that may
be required to apply some of the
configuration changes.messages
- A list to which messages may be added to
provide additional information about the
processing performed by this method.SUCCESS
should be
used to indicate that all processing completed successfully. Any
other result will indicate that a problem occurred during
processing.public void finalizeLDAPSyncDestinationPlugin()
public PreStepResult preFetch(LDAPInterface destinationConnection, SearchRequest searchRequest, java.util.List<Entry> fetchedEntries, SyncOperation operation) throws LDAPException
SearchRequest
that will be sent to the server. This method is
overridden by plugins that need to have access to the search request
before it is sent to the destination server. This includes updating the
search request as well as performing the search instead of the core server,
including doing additional searches. For plugins that need to manipulate
the entries that the core LDAP Sync Destination code retrieves from the
destination, implementing the postFetch(com.unboundid.ldap.sdk.LDAPInterface, com.unboundid.ldap.sdk.SearchRequest, java.util.List<com.unboundid.ldap.sdk.Entry>, com.unboundid.directory.sdk.sync.types.SyncOperation)
method is more natural.
This method might be called multiple times for a single synchronization operation, specifically when there are multiple search criteria or multiple base DNs defined for the Sync Destination.
destinationConnection
- A connection to the destination server.searchRequest
- The search request that the LDAP Sync
Destination will use to fetch the entry.fetchedEntries
- A list of entries that have been fetched.
When the search criteria matches multiple
entries, they should all be returned. A
plugin that wishes to implement the fetch
should put the fetched entries here and
return
PreStepResult#SKIP_CURRENT_STEP
.operation
- The synchronization operation for this
change.PreStepResult#RETRY_OPERATION_UNLIMITED
as this
can stall all in flight operations until this operation completes.
This return value should only be used in situations where a
remote service (e.g., the LDAP server) is unavailable. In this
case, it's preferable to just throw the underlying LDAPException,
which the Data Sync Server will handle correctly based on
the type of the operation. Note:
PreStepResult#SKIP_CURRENT_STEP
should only be returned
if this plugin takes responsibility for fully fetching the entry
according to the search request and for populating the
fetched entry list.LDAPException
- In general subclasses should not catch
LDAPExceptions that are thrown when
using the LDAPInterface unless there
are specific exceptions that are
expected. The Data Sync Server
will handle LDAPExceptions in an
appropriate way based on the specific
cause of the exception. For example,
some errors will result in the
SyncOperation being retried, and others
will trigger fail over to a different
server. Plugins should only throw
LDAPException for errors related to
communication with the LDAP server.
Use the return code to indicate other
types of errors, which might require
retry.public PostStepResult postFetch(LDAPInterface destinationConnection, SearchRequest searchRequest, java.util.List<Entry> fetchedEntries, SyncOperation operation) throws LDAPException
SearchRequest
that was sent to the server. This method is
overridden by plugins that need to manipulate the search results that
are returned to the Sync Pipe. This can include filtering out certain
entries, remove information from the entries, or adding additional
information, possibly by doing a followup LDAP search.
This method might be called multiple times for a single synchronization operation, specifically when there are multiple search criteria or multiple base DNs defined for the Sync Destination.
This method will not be called if the search fails, for instance, if the base DN of the search does not exist.
destinationConnection
- A connection to the destination server.searchRequest
- The search request that the LDAP Sync
Destination used to fetch the entry.fetchedEntries
- A list of entries that have been fetched.
When the search criteria matches multiple
entries, they will all be returned. Entries
in this list can be edited directly, and the
list can be edited as well.operation
- The synchronization operation for this
change.PostStepResult#RETRY_OPERATION_UNLIMITED
as this
can stall all in flight operations until this operation completes.
This return value should only be used in situations where a
remote service (e.g., the LDAP server) is unavailable. In this
case, it's preferable to just throw the underlying LDAPException,
which the Data Sync Server will handle correctly based on
the type of the operation.LDAPException
- In general subclasses should not catch
LDAPExceptions that are thrown when
using the LDAPInterface unless there
are specific exceptions that are
expected. The Data Sync Server
will handle LDAPExceptions in an
appropriate way based on the specific
cause of the exception. For example,
some errors will result in the
SyncOperation being retried, and others
will trigger fail over to a different
server. Plugins should only throw
LDAPException for errors related to
communication with the LDAP server.
Use the return code to indicate other
types of errors, which might require
retry.public PreStepResult preCreate(LDAPInterface destinationConnection, Entry entryToCreate, SyncOperation operation) throws LDAPException
Entry
that will be sent to the server. This method is
overridden by plugins that need to alter the entry before it is created
at the server.destinationConnection
- A connection to the destination server.entryToCreate
- The entry that will be created at the
destination. A plugin that wishes to
create the entry should be sure to return
PreStepResult#SKIP_CURRENT_STEP
.operation
- The synchronization operation for this
change.PreStepResult#RETRY_OPERATION_UNLIMITED
as this
can stall all in flight operations until this operation completes.
This return value should only be used in situations where a
remote service (e.g., the LDAP server) is unavailable. In this
case, it's preferable to just throw the underlying LDAPException,
which the Data Sync Server will handle correctly based on
the type of the operation.LDAPException
- In general subclasses should not catch
LDAPExceptions that are thrown when
using the LDAPInterface unless there
are specific exceptions that are
expected. The Data Sync Server
will handle LDAPExceptions in an
appropriate way based on the specific
cause of the exception. For example,
some errors will result in the
SyncOperation being retried, and others
will trigger fail over to a different
server. Plugins should only throw
LDAPException for errors related to
communication with the LDAP server.
Use the return code to indicate other
types of errors, which might require
retry.public PreStepResult preModify(LDAPInterface destinationConnection, Entry entryToModify, java.util.List<Modification> modsToApply, SyncOperation operation) throws LDAPException
Entry
that will be sent to the server. This method is
overridden by plugins that need to perform some processing on an entry
before it is modified.destinationConnection
- A connection to the destination server.entryToModify
- The entry that will be modified at the
destination. A plugin that wishes to
modify the entry should be sure to return
PreStepResult#SKIP_CURRENT_STEP
.modsToApply
- A modifiable list of the modifications to
apply at the server.operation
- The synchronization operation for this
change.PreStepResult#RETRY_OPERATION_UNLIMITED
as this
can stall all in flight operations until this operation completes.
This return value should only be used in situations where a
remote service (e.g., the LDAP server) is unavailable. In this
case, it's preferable to just throw the underlying LDAPException,
which the Data Sync Server will handle correctly based on
the type of the operation.LDAPException
- In general subclasses should not catch
LDAPExceptions that are thrown when
using the LDAPInterface unless there
are specific exceptions that are
expected. The Data Sync Server
will handle LDAPExceptions in an
appropriate way based on the specific
cause of the exception. For example,
some errors will result in the
SyncOperation being retried, and others
will trigger fail over to a different
server. Plugins should only throw
LDAPException for errors related to
communication with the LDAP server.
Use the return code to indicate other
types of errors, which might require
retry.public PreStepResult preDelete(LDAPInterface destinationConnection, Entry entryToDelete, SyncOperation operation) throws LDAPException
Entry
that will be sent to the server. This method is
overridden by plugins that need to perform some processing on an entry
before it is deleted. A plugin could choose to mark an entry as disabled
instead of deleting it for instance, or move the entry to a different
part of the directory hierarchy.destinationConnection
- A connection to the destination server.entryToDelete
- The entry that will be deleted at the
destination. A plugin that wishes to
delete the entry should be sure to return
PreStepResult#SKIP_CURRENT_STEP
.operation
- The synchronization operation for this
change.PreStepResult#RETRY_OPERATION_UNLIMITED
as this
can stall all in flight operations until this operation completes.
This return value should only be used in situations where a
remote service (e.g., the LDAP server) is unavailable. In this
case, it's preferable to just throw the underlying LDAPException,
which the Data Sync Server will handle correctly based on
the type of the operation.LDAPException
- In general subclasses should not catch
LDAPExceptions that are thrown when
using the LDAPInterface unless there
are specific exceptions that are
expected. The Data Sync Server
will handle LDAPExceptions in an
appropriate way based on the specific
cause of the exception. For example,
some errors will result in the
SyncOperation being retried, and others
will trigger fail over to a different
server. Plugins should only throw
LDAPException for errors related to
communication with the LDAP server.
Use the return code to indicate other
types of errors, which might require
retry.public PreStepResult transformRequest(LDAPInterface destinationConnection, UpdatableLDAPRequest request, SyncOperation operation) throws LDAPException
UpdatableLDAPRequest
that will be sent to the
server. this method is overridden by plugins that need to modify the
LDAP request prior to execution. For example, attaching a Control
to the request. Callers of this method can use instanceof
to determine which type of LDAP request is being made.destinationConnection
- A connection to the destination server.request
- The LDAP request that will be sent to
the destination server.operation
- The synchronization operation for this
change.PreStepResult#RETRY_OPERATION_UNLIMITED
as this
can stall all in flight operations until this operation completes.
This return value should only be used in situations where a
remote service (e.g., the LDAP server) is unavailable. In this
case, it's preferable to just throw the underlying LDAPException,
which the Data Sync Server will handle correctly based on
the type of the operation.LDAPException
- In general subclasses should not catch
LDAPExceptions that are thrown when
using the LDAPInterface unless there
are specific exceptions that are
expected. The Data Sync Server
will handle LDAPExceptions in an
appropriate way based on the specific
cause of the exception. For example,
some errors will result in the
SyncOperation being retried, and others
will trigger fail over to a different
server. Plugins should only throw
LDAPException for errors related to
communication with the LDAP server.
Use the return code to indicate other
types of errors, which might require
retry.public final java.lang.String toString()
toString
in class java.lang.Object
public abstract void toString(java.lang.StringBuilder buffer)
buffer
- The buffer to which the string representation should be
appended.public java.util.Map<java.util.List<java.lang.String>,java.lang.String> getExamplesArgumentSets()
getExamplesArgumentSets
in interface ExampleUsageProvider
null
or empty if there should
not be any example argument sets.