001package com.pingidentity.pd.plugin;
002
003import com.unboundid.directory.sdk.common.operation.UpdatableAddRequest;
004import com.unboundid.directory.sdk.common.operation.UpdatableAddResult;
005import com.unboundid.directory.sdk.common.types.ActiveOperationContext;
006import com.unboundid.directory.sdk.common.types.UpdatableEntry;
007import com.unboundid.directory.sdk.ds.api.Plugin;
008import com.unboundid.directory.sdk.ds.config.PluginConfig;
009import com.unboundid.directory.sdk.ds.types.DirectoryServerContext;
010import com.unboundid.directory.sdk.ds.types.PreParsePluginResult;
011import com.unboundid.ldap.sdk.Attribute;
012import com.unboundid.ldap.sdk.LDAPException;
013import com.unboundid.ldap.sdk.ResultCode;
014import com.unboundid.util.args.ArgumentException;
015import com.unboundid.util.args.ArgumentParser;
016import com.unboundid.util.args.AttributeNameArgumentValueValidator;
017import com.unboundid.util.args.StringArgument;
018
019import java.util.List;
020
021/**
022 * This class provides a generic mechanism to inject real attributes
023 * in entries
024 */
025public class AttributeInjector extends Plugin {
026
027    public static final String ATTRIBUTE_TYPE_ARG = "attribute-type";
028    public static final String ATTRIBUTE_VALUE_ARG = "attribute-value";
029    private Attribute attribute;
030
031    @Override
032    public String getExtensionName() {
033        return "Attribute Injector";
034    }
035
036    @Override
037    public String[] getExtensionDescription() {
038        return new String[]{"Injects real attributes into entries"};
039    }
040
041    @Override
042    public void defineConfigArguments(ArgumentParser parser) throws ArgumentException {
043        StringArgument attributeTypeArg = new StringArgument(null, ATTRIBUTE_TYPE_ARG,true,1,"{attribute-type}","The attribute type to inject into entries");
044        attributeTypeArg.addValueValidator(new AttributeNameArgumentValueValidator());
045        parser.addArgument(attributeTypeArg);
046
047        StringArgument attributeValuesArg = new StringArgument(null, ATTRIBUTE_VALUE_ARG,true,0,"{attribute-value}","The attribute value(s) to populate in the attribute");
048        parser.addArgument(attributeValuesArg);
049    }
050
051    @Override
052    public ResultCode applyConfiguration(PluginConfig config, ArgumentParser parser, List<String> adminActionsRequired, List<String> messages) {
053        String attributeType = parser.getStringArgument(ATTRIBUTE_TYPE_ARG).getValue();
054        List<String> attributeValues = parser.getStringArgument(ATTRIBUTE_VALUE_ARG).getValues();
055        attribute = new Attribute(attributeType,attributeValues);
056        return ResultCode.SUCCESS;
057    }
058
059    @Override
060    public void initializePlugin(DirectoryServerContext serverContext, PluginConfig config, ArgumentParser parser) throws LDAPException {
061        ResultCode resultCode = applyConfiguration(config, parser, null, null);
062        if (!ResultCode.SUCCESS.equals(resultCode)) {
063            throw new LDAPException(ResultCode.OTHER,"Error applygin configuration during plugin initialization");
064        }
065    }
066
067    /**
068     * Performs the necessary processing to inject the configured attribute into an entry upon incoming ADD request
069     * @param operationContext the operation context
070     * @param request the incoming request
071     * @param result the result to return to the client
072     * @return
073     */
074    @Override
075    public PreParsePluginResult doPreParse(ActiveOperationContext operationContext, UpdatableAddRequest request, UpdatableAddResult result) {
076        UpdatableEntry entry = request.getEntry();
077        if ( entry != null && !entry.hasAttribute(attribute.getName())){
078            entry.addAttribute(attribute);
079        }
080        return PreParsePluginResult.SUCCESS;
081    }
082}