mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Jean-Noël Rouvignac
15.10.2016 595b0d2a712585e169ccde6476818e72c2c75630
Removed all uses of AttributeType.getNormalizedNameOrOID()

TaskEntry.java:
In constructor, rely on the schema for task hierarchy rather than hardcoding it + remove supAttrNames field
In getAttributeDisplayName(), remove use of reflection
4 files modified
185 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/extensions/SubjectAttributeToUserAttributeCertificateMapper.java 66 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskEntry.java 92 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java 25 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/HistoricalTest.java 2 ●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/extensions/SubjectAttributeToUserAttributeCertificateMapper.java
@@ -77,8 +77,6 @@
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
  /** The DN of the configuration entry for this certificate mapper. */
  private DN configEntryDN;
  /** The mappings between certificate attribute names and user attribute types. */
  private LinkedHashMap<String,AttributeType> attributeMap;
  /** The current configuration for this certificate mapper. */
@@ -86,7 +84,6 @@
  /** The set of attributes to return in search result entries. */
  private LinkedHashSet<String> requestedAttributes;
  /**
   * Creates a new instance of this certificate mapper.  Note that all actual
   * initialization should be done in the
@@ -97,9 +94,6 @@
    super();
  }
  /** {@inheritDoc} */
  @Override
  public void initializeCertificateMapper(
      SubjectAttributeToUserAttributeCertificateMapperCfg configuration)
@@ -108,11 +102,10 @@
    configuration.addSubjectAttributeToUserAttributeChangeListener(this);
    currentConfig = configuration;
    configEntryDN = configuration.dn();
    // Get and validate the subject attribute to user attribute mappings.
    ConfigChangeResult ccr = new ConfigChangeResult();
    attributeMap = buildAttributeMap(configuration, configEntryDN, ccr);
    attributeMap = buildAttributeMap(configuration, ccr);
    List<LocalizableMessage> messages = ccr.getMessages();
    if (!messages.isEmpty())
    {
@@ -140,16 +133,12 @@
    requestedAttributes = newLinkedHashSet("*", "+");
  }
  /** {@inheritDoc} */
  @Override
  public void finalizeCertificateMapper()
  {
    currentConfig.removeSubjectAttributeToUserAttributeChangeListener(this);
  }
  /** {@inheritDoc} */
  @Override
  public Entry mapCertificateToUser(Certificate[] certificateChain)
         throws DirectoryException
@@ -157,7 +146,6 @@
    SubjectAttributeToUserAttributeCertificateMapperCfg config = currentConfig;
    LinkedHashMap<String,AttributeType> theAttributeMap = this.attributeMap;
    // Make sure that a peer certificate was provided.
    if (certificateChain == null || certificateChain.length == 0)
    {
@@ -165,14 +153,13 @@
      throw new DirectoryException(ResultCode.INVALID_CREDENTIALS, message);
    }
    // Get the first certificate in the chain.  It must be an X.509 certificate.
    X509Certificate peerCertificate;
    try
    {
      peerCertificate = (X509Certificate) certificateChain[0];
    }
    catch (Exception e)
    catch (ClassCastException e)
    {
      logger.traceException(e);
@@ -180,9 +167,7 @@
      throw new DirectoryException(ResultCode.INVALID_CREDENTIALS, message);
    }
    // Get the subject from the peer certificate and use it to create a search
    // filter.
    // Get the subject from the peer certificate and use it to create a search filter
    DN peerDN;
    X500Principal peerPrincipal = peerCertificate.getSubjectX500Principal();
    String peerName = peerPrincipal.getName(X500Principal.RFC2253);
@@ -202,11 +187,7 @@
    {
      for (AVA ava : rdn)
      {
        String lowerName = toLowerCase(ava.getAttributeName());
        // Try to normalize lowerName
        lowerName = normalizeAttributeName(lowerName);
        String lowerName = normalizeAttributeName(ava.getAttributeName());
        AttributeType attrType = theAttributeMap.get(lowerName);
        if (attrType != null)
        {
@@ -278,13 +259,10 @@
      }
    }
    // If we've gotten here, then we either found exactly one user entry or we
    // didn't find any.  Either way, return the entry or null to the caller.
    // We either found exactly one user entry or we did not find any.
    return userEntry;
  }
  /** {@inheritDoc} */
  @Override
  public boolean isConfigurationAcceptable(CertificateMapperCfg configuration,
                                           List<LocalizableMessage> unacceptableReasons)
@@ -294,26 +272,22 @@
    return isConfigurationChangeAcceptable(config, unacceptableReasons);
  }
  /** {@inheritDoc} */
  @Override
  public boolean isConfigurationChangeAcceptable(
              SubjectAttributeToUserAttributeCertificateMapperCfg configuration,
              List<LocalizableMessage> unacceptableReasons)
  {
    ConfigChangeResult ccr = new ConfigChangeResult();
    buildAttributeMap(configuration, configuration.dn(), ccr);
    buildAttributeMap(configuration, ccr);
    unacceptableReasons.addAll(ccr.getMessages());
    return ResultCode.SUCCESS.equals(ccr.getResultCode());
  }
  /** {@inheritDoc} */
  @Override
  public ConfigChangeResult applyConfigurationChange(SubjectAttributeToUserAttributeCertificateMapperCfg configuration)
  {
    final ConfigChangeResult ccr = new ConfigChangeResult();
    LinkedHashMap<String, AttributeType> newAttributeMap = buildAttributeMap(configuration, configEntryDN, ccr);
    LinkedHashMap<String, AttributeType> newAttributeMap = buildAttributeMap(configuration, ccr);
    // Make sure that all the user attributes are configured with equality
    // indexes in all appropriate backends.
@@ -358,17 +332,17 @@
  /** Get and validate the subject attribute to user attribute mappings. */
  private LinkedHashMap<String, AttributeType> buildAttributeMap(
      SubjectAttributeToUserAttributeCertificateMapperCfg configuration, DN cfgEntryDN, ConfigChangeResult ccr)
      SubjectAttributeToUserAttributeCertificateMapperCfg cfg, ConfigChangeResult ccr)
  {
    LinkedHashMap<String, AttributeType> results = new LinkedHashMap<>();
    for (String mapStr : configuration.getSubjectAttributeMapping())
    for (String mapStr : cfg.getSubjectAttributeMapping())
    {
      String lowerMap = toLowerCase(mapStr);
      int colonPos = lowerMap.indexOf(':');
      if (colonPos <= 0)
      {
        ccr.setResultCodeIfSuccess(ResultCode.CONSTRAINT_VIOLATION);
        ccr.addMessage(ERR_SATUACM_INVALID_MAP_FORMAT.get(cfgEntryDN, mapStr));
        ccr.addMessage(ERR_SATUACM_INVALID_MAP_FORMAT.get(cfg.dn(), mapStr));
        return null;
      }
@@ -377,7 +351,7 @@
      if (certAttrName.length() == 0 || userAttrName.length() == 0)
      {
        ccr.setResultCodeIfSuccess(ResultCode.CONSTRAINT_VIOLATION);
        ccr.addMessage(ERR_SATUACM_INVALID_MAP_FORMAT.get(cfgEntryDN, mapStr));
        ccr.addMessage(ERR_SATUACM_INVALID_MAP_FORMAT.get(cfg.dn(), mapStr));
        return null;
      }
@@ -386,7 +360,7 @@
      if (results.containsKey(certAttrName))
      {
        ccr.setResultCodeIfSuccess(ResultCode.CONSTRAINT_VIOLATION);
        ccr.addMessage(ERR_SATUACM_DUPLICATE_CERT_ATTR.get(cfgEntryDN, certAttrName));
        ccr.addMessage(ERR_SATUACM_DUPLICATE_CERT_ATTR.get(cfg.dn(), certAttrName));
        return null;
      }
@@ -394,13 +368,13 @@
      if (userAttrType.isPlaceHolder())
      {
        ccr.setResultCodeIfSuccess(ResultCode.CONSTRAINT_VIOLATION);
        ccr.addMessage(ERR_SATUACM_NO_SUCH_ATTR.get(mapStr, cfgEntryDN, userAttrName));
        ccr.addMessage(ERR_SATUACM_NO_SUCH_ATTR.get(mapStr, cfg.dn(), userAttrName));
        return null;
      }
      if (results.values().contains(userAttrType))
      {
        ccr.setResultCodeIfSuccess(ResultCode.CONSTRAINT_VIOLATION);
        ccr.addMessage(ERR_SATUACM_DUPLICATE_USER_ATTR.get(cfgEntryDN, userAttrType.getNameOrOID()));
        ccr.addMessage(ERR_SATUACM_DUPLICATE_USER_ATTR.get(cfg.dn(), userAttrType.getNameOrOID()));
        return null;
      }
@@ -409,18 +383,8 @@
    return results;
  }
  /**
   * Normalizes the given attribute name; if normalization is not
   * possible the original String value is returned.
   *
   * @param   attrName  The attribute name which should be normalized.
   * @return  The normalized attribute name.
   */
  private static String normalizeAttributeName(String attrName)
  {
    AttributeType attrType = DirectoryServer.getAttributeType(attrName);
    return attrType.isPlaceHolder() ? attrName : attrType.getNormalizedNameOrOID();
    return toLowerCase(DirectoryServer.getAttributeType(attrName).getNameOrOID());
  }
}
opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskEntry.java
@@ -16,31 +16,31 @@
 */
package org.opends.server.tools.tasks;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.backends.task.FailedDependencyAction;
import org.opends.server.backends.task.Task;
import org.opends.server.backends.task.TaskState;
import org.opends.server.types.Attribute;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.Entry;
import static org.opends.server.util.ServerConstants.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import java.lang.reflect.Method;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import static org.opends.server.util.ServerConstants.*;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.backends.task.FailedDependencyAction;
import org.opends.server.backends.task.Task;
import org.opends.server.backends.task.TaskState;
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.Attribute;
import org.opends.server.types.Entry;
import org.opends.server.types.ObjectClass;
import org.opends.server.util.StaticUtils;
/**
 * Processes information from a task entry from the directory and
@@ -54,27 +54,6 @@
  private int hashCode;
  /**
   * These attributes associated with the ds-task object
   * class are all handled explicitly below in the constructor.
   */
  private static Set<String> supAttrNames = new HashSet<>();
  static {
    supAttrNames.add("ds-task-id");
    supAttrNames.add("ds-task-class-name");
    supAttrNames.add("ds-task-state");
    supAttrNames.add("ds-task-scheduled-start-time");
    supAttrNames.add("ds-task-actual-start-time");
    supAttrNames.add("ds-task-completion-time");
    supAttrNames.add("ds-task-dependency-id");
    supAttrNames.add("ds-task-failed-dependency-action");
    supAttrNames.add("ds-task-log-message");
    supAttrNames.add("ds-task-notify-on-completion");
    supAttrNames.add("ds-task-notify-on-error");
    supAttrNames.add("ds-recurring-task-id");
    supAttrNames.add("ds-recurring-task-schedule");
  }
  private String id;
  private String className;
  private String state;
@@ -119,17 +98,12 @@
    notifyComp = getMultiStringValue(entry,  p + "notify-on-completion");
    schedTab =   getSingleStringValue(entry, "ds-recurring-task-schedule");
    // Build a map of non-superior attribute value pairs for display
    Map<AttributeType, List<Attribute>> attrMap = entry.getUserAttributes();
    for (AttributeType type : attrMap.keySet()) {
      String typeName = type.getNormalizedNameOrOID();
      // See if we've handled it already above
      if (!supAttrNames.contains(typeName)) {
        LocalizableMessage attrTypeName = getAttributeDisplayName(typeName);
        List<Attribute> attrList = entry.getUserAttribute(type);
        for (Attribute attr : attrList) {
    final ObjectClass dsTask = DirectoryServer.getObjectClass("ds-task");
    final ObjectClass dsRecurringTask = DirectoryServer.getObjectClass("ds-recurring-task");
    for (AttributeType attrType : entry.getUserAttributes().keySet()) {
      if (!dsTask.isRequiredOrOptional(attrType) && !dsRecurringTask.isRequiredOrOptional(attrType)) {
        LocalizableMessage attrTypeName = getAttributeDisplayName(attrType);
        for (Attribute attr : entry.getUserAttribute(attrType)) {
          for (ByteString av : attr) {
            List<String> valueList = taskSpecificAttrValues.get(attrTypeName);
            if (valueList == null) {
@@ -156,18 +130,12 @@
    hashCode += taskSpecificAttrValues.hashCode();
  }
  /**
   * Retrieves a hash code for this task entry.
   *
   * @return  The hash code for this task entry.
   */
  @Override
  public int hashCode()
  {
    return hashCode;
  }
  /** {@inheritDoc} */
  @Override
  public boolean equals(Object o)
  {
@@ -175,12 +143,6 @@
    {
      return true;
    }
    if (o == null)
    {
      return false;
    }
    if (! (o instanceof TaskEntry))
    {
      return false;
@@ -440,16 +402,15 @@
    return valuesList;
  }
  private LocalizableMessage getAttributeDisplayName(String attrName) {
  private LocalizableMessage getAttributeDisplayName(AttributeType attrType) {
    final String attrName = StaticUtils.toLowerCase(attrType.getNameOrOID());
    LocalizableMessage name = mapAttrToDisplayName.get(attrName);
    if (name == null) {
      Task task = getTask();
      if (task != null) {
        try {
          Method m = Task.class.getMethod(
                  "getAttributeDisplayName", String.class);
          Object o = m.invoke(task, attrName);
          if (o != null && LocalizableMessage.class.isAssignableFrom(o.getClass())) {
          Object o = task.getAttributeDisplayName(attrName);
          if (o instanceof LocalizableMessage) {
            name= (LocalizableMessage)o;
            mapAttrToDisplayName.put(attrName, name);
          }
@@ -507,5 +468,4 @@
    }
    return task;
  }
}
opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java
@@ -22,7 +22,6 @@
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
@@ -2818,20 +2817,20 @@
    // Get collective attribute exclusions.
    AttributeType exclusionsType = DirectoryServer.getAttributeType(ATTR_COLLECTIVE_EXCLUSIONS_LC);
    List<Attribute> exclusionsAttrList = operationalAttributes.get(exclusionsType);
    Set<String> exclusionsNameSet = new HashSet<>();
    List<String> excludedAttrNames = new ArrayList<>();
    if (exclusionsAttrList != null && !exclusionsAttrList.isEmpty())
    {
      for (Attribute attr : exclusionsAttrList)
      {
        for (ByteString attrValue : attr)
        {
          String exclusionsName = attrValue.toString().toLowerCase();
          if (VALUE_COLLECTIVE_EXCLUSIONS_EXCLUDE_ALL_LC.equals(exclusionsName)
              || OID_COLLECTIVE_EXCLUSIONS_EXCLUDE_ALL.equals(exclusionsName))
          String excludedAttrName = attrValue.toString().toLowerCase();
          if (VALUE_COLLECTIVE_EXCLUSIONS_EXCLUDE_ALL_LC.equals(excludedAttrName)
              || OID_COLLECTIVE_EXCLUSIONS_EXCLUDE_ALL.equals(excludedAttrName))
          {
            return;
          }
          exclusionsNameSet.add(exclusionsName);
          excludedAttrNames.add(excludedAttrName);
        }
      }
    }
@@ -2914,7 +2913,7 @@
        for (Attribute collectiveAttr : collectiveAttrList)
        {
          AttributeType attributeType = collectiveAttr.getAttributeDescription().getAttributeType();
          if (exclusionsNameSet.contains(attributeType.getNormalizedNameOrOID()))
          if (hasAnyNameOrOID(attributeType, excludedAttrNames))
          {
            continue;
          }
@@ -2961,6 +2960,18 @@
    }
  }
  private boolean hasAnyNameOrOID(AttributeType attributeType, Collection<String> attrNames)
  {
    for (String attrName : attrNames)
    {
      if (attributeType.hasNameOrOID(attrName))
      {
        return true;
      }
    }
    return false;
  }
  private ByteString normalize(MatchingRule matchingRule, ByteString value)
      throws DirectoryException
  {
opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/HistoricalTest.java
@@ -340,7 +340,7 @@
  private static void publishModify(ReplicationBroker broker, CSN changeNum,
      DN dn, String entryuuid, AttributeType attrType, String newValue)
  {
    Attribute attr = Attributes.create(attrType.getNormalizedNameOrOID(), newValue);
    Attribute attr = Attributes.create(attrType, newValue);
    List<Modification> mods = newArrayList(new Modification(ModificationType.ADD, attr));
    broker.publish(new ModifyMsg(changeNum, dn, mods, entryuuid));
  }