/*
|
* CDDL HEADER START
|
*
|
* The contents of this file are subject to the terms of the
|
* Common Development and Distribution License, Version 1.0 only
|
* (the "License"). You may not use this file except in compliance
|
* with the License.
|
*
|
* You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
|
* or http://forgerock.org/license/CDDLv1.0.html.
|
* See the License for the specific language governing permissions
|
* and limitations under the License.
|
*
|
* When distributing Covered Code, include this CDDL HEADER in each
|
* file and include the License file at legal-notices/CDDLv1_0.txt.
|
* If applicable, add the following below this CDDL HEADER, with the
|
* fields enclosed by brackets "[]" replaced with your own identifying
|
* information:
|
* Portions Copyright [yyyy] [name of copyright owner]
|
*
|
* CDDL HEADER END
|
*
|
*
|
* Copyright 2006-2009 Sun Microsystems, Inc.
|
* Portions Copyright 2013-2014 ForgeRock AS
|
*/
|
package org.opends.server.api;
|
|
import java.util.Collections;
|
import java.util.List;
|
import java.util.Set;
|
|
import org.forgerock.i18n.LocalizableMessage;
|
import org.opends.server.admin.std.server.ExtendedOperationHandlerCfg;
|
import org.forgerock.opendj.config.server.ConfigException;
|
import org.opends.server.core.DirectoryServer;
|
import org.opends.server.core.ExtendedOperation;
|
import org.opends.server.types.InitializationException;
|
|
/**
|
* This class defines the set of methods and structures that must be
|
* implemented by a Directory Server module that implements the
|
* functionality required for one or more types of extended
|
* operations.
|
*
|
* @param <T> The configuration class that will be provided to
|
* initialize the handler.
|
*/
|
@org.opends.server.types.PublicAPI(
|
stability=org.opends.server.types.StabilityLevel.VOLATILE,
|
mayInstantiate=false,
|
mayExtend=true,
|
mayInvoke=false)
|
public abstract class
|
ExtendedOperationHandler<T extends ExtendedOperationHandlerCfg>
|
{
|
|
/** The default set of supported control OIDs for this extended op. */
|
private final Set<String> supportedControlOIDs;
|
|
/** The default set of supported feature OIDs for this extended op. */
|
private final Set<String> supportedFeatureOIDs = Collections.emptySet();
|
|
/**
|
* Builds an extended operation.
|
*/
|
public ExtendedOperationHandler()
|
{
|
this.supportedControlOIDs = Collections.<String> emptySet();
|
}
|
|
/**
|
* Builds an extended operation.
|
*
|
* @param supportedControlOIDs
|
* the default set of supported control OIDs for this extended op
|
*/
|
public ExtendedOperationHandler(Set<String> supportedControlOIDs)
|
{
|
this.supportedControlOIDs = supportedControlOIDs != null ?
|
Collections.unmodifiableSet(supportedControlOIDs)
|
: Collections.<String> emptySet();
|
}
|
|
/**
|
* Initializes this extended operation handler based on the
|
* information in the provided configuration entry. It should also
|
* register itself with the Directory Server for the particular
|
* kinds of extended operations that it will process.
|
*
|
* @param config The extended operation handler configuration that
|
* contains the information to use to initialize
|
* this extended operation handler.
|
*
|
* @throws ConfigException If an unrecoverable problem arises in
|
* the process of performing the
|
* initialization.
|
*
|
* @throws InitializationException If a problem occurs
|
* during initialization that is
|
* not related to the server
|
* configuration.
|
*/
|
public void initializeExtendedOperationHandler(T config)
|
throws ConfigException, InitializationException
|
{
|
DirectoryServer.registerSupportedExtension(getExtendedOperationOID(), this);
|
registerControlsAndFeatures();
|
}
|
|
|
|
/**
|
* Indicates whether the provided configuration is acceptable for
|
* this extended operation handler. It should be possible to call
|
* this method on an uninitialized extended operation handler
|
* instance in order to determine whether the extended operation
|
* handler would be able to use the provided configuration.
|
* <BR><BR>
|
* Note that implementations which use a subclass of the provided
|
* configuration class will likely need to cast the configuration
|
* to the appropriate subclass type.
|
*
|
* @param configuration The extended operation handler
|
* configuration for which to make the
|
* determination.
|
* @param unacceptableReasons A list that may be used to hold the
|
* reasons that the provided
|
* configuration is not acceptable.
|
*
|
* @return {@code true} if the provided configuration is acceptable
|
* for this extended operation handler, or {@code false} if
|
* not.
|
*/
|
public boolean isConfigurationAcceptable(
|
ExtendedOperationHandlerCfg configuration,
|
List<LocalizableMessage> unacceptableReasons)
|
{
|
// This default implementation does not perform any special
|
// validation. It should be overridden by extended operation
|
// handler implementations that wish to perform more detailed
|
// validation.
|
return true;
|
}
|
|
|
|
/**
|
* Performs any finalization that may be necessary for this extended
|
* operation handler. By default, no finalization is performed.
|
*/
|
public void finalizeExtendedOperationHandler()
|
{
|
DirectoryServer.deregisterSupportedExtension(getExtendedOperationOID());
|
deregisterControlsAndFeatures();
|
}
|
|
|
|
/**
|
* Processes the provided extended operation.
|
*
|
* @param operation The extended operation to be processed.
|
*/
|
public abstract void processExtendedOperation(ExtendedOperation
|
operation);
|
|
|
|
/**
|
* Retrieves the OIDs of the controls that may be supported by this
|
* extended operation handler. It should be overridden by any
|
* extended operation handler which provides special support for one
|
* or more controls.
|
*
|
* @return The OIDs of the controls that may be supported by this
|
* extended operation handler.
|
*/
|
public Set<String> getSupportedControls()
|
{
|
return supportedControlOIDs;
|
}
|
|
|
|
/**
|
* Indicates whether this extended operation handler supports the
|
* specified control.
|
*
|
* @param controlOID The OID of the control for which to make the
|
* determination.
|
*
|
* @return {@code true} if this extended operation handler does
|
* support the requested control, or {@code false} if not.
|
*/
|
public final boolean supportsControl(String controlOID)
|
{
|
return getSupportedControls().contains(controlOID);
|
}
|
|
|
|
/**
|
* Retrieves the OIDs of the features that may be supported by this
|
* extended operation handler.
|
*
|
* @return The OIDs of the features that may be supported by this
|
* extended operation handler.
|
*/
|
public Set<String> getSupportedFeatures()
|
{
|
return supportedFeatureOIDs;
|
}
|
|
|
|
/**
|
* Indicates whether this extended operation handler supports the
|
* specified feature.
|
*
|
* @param featureOID The OID of the feature for which to make the
|
* determination.
|
*
|
* @return {@code true} if this extended operation handler does
|
* support the requested feature, or {@code false} if not.
|
*/
|
public final boolean supportsFeature(String featureOID)
|
{
|
return getSupportedFeatures().contains(featureOID);
|
}
|
|
|
|
/**
|
* If the extended operation handler defines any supported controls
|
* and/or features, then register them with the server.
|
*/
|
private void registerControlsAndFeatures()
|
{
|
Set<String> controlOIDs = getSupportedControls();
|
if (controlOIDs != null)
|
{
|
for (String oid : controlOIDs)
|
{
|
DirectoryServer.registerSupportedControl(oid);
|
}
|
}
|
|
Set<String> featureOIDs = getSupportedFeatures();
|
if (featureOIDs != null)
|
{
|
for (String oid : featureOIDs)
|
{
|
DirectoryServer.registerSupportedFeature(oid);
|
}
|
}
|
}
|
|
|
|
/**
|
* If the extended operation handler defines any supported controls
|
* and/or features, then deregister them with the server.
|
*/
|
private void deregisterControlsAndFeatures()
|
{
|
Set<String> controlOIDs = getSupportedControls();
|
if (controlOIDs != null)
|
{
|
for (String oid : controlOIDs)
|
{
|
DirectoryServer.deregisterSupportedControl(oid);
|
}
|
}
|
|
Set<String> featureOIDs = getSupportedFeatures();
|
if (featureOIDs != null)
|
{
|
for (String oid : featureOIDs)
|
{
|
DirectoryServer.deregisterSupportedFeature(oid);
|
}
|
}
|
}
|
|
/**
|
* Retrieves the name associated with this extended operation.
|
*
|
* @return The name associated with this extended operation,
|
* if any, or <CODE>null</CODE> if there is none.
|
*/
|
public String getExtendedOperationName()
|
{
|
return null;
|
}
|
|
/**
|
* Retrieves the object OID associated with this extended operation.
|
*
|
* @return the oid associated with this extended operation, if any, or
|
* <CODE>null</CODE> if there is none.
|
*/
|
public String getExtendedOperationOID()
|
{
|
return null;
|
}
|
}
|