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

Jean-Noël Rouvignac
14.51.2016 f303dd91c4c81b0b2fb9d9479671657a204b577b
code cleanups

SchemaBackend.java:
In getSchemaEntry(DN, boolean), inlined the boolean parameter since it was always called with 'false'.
Removed showAllAttributes field since it is an alias for currentConfig.isShowAllAttributes()

UpgradeUtils.java:
Changed the String CONFIG_FILE_PATH static field into File configFile.

*.java:
Code cleanup
Or consequence of the changes above.
7 files modified
295 ■■■■■ changed files
opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/authz/Authorizations.java 1 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java 69 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/config/JMXMBean.java 54 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java 33 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeUtils.java 59 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java 32 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/backends/SchemaBackendTestCase.java 47 ●●●● patch | view | raw | blame | history
opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/authz/Authorizations.java
@@ -15,7 +15,6 @@
 */
package org.forgerock.opendj.rest2ldap.authz;
import static org.forgerock.opendj.rest2ldap.Rest2ldapMessages.*;
import static org.forgerock.opendj.rest2ldap.authz.ConditionalFilters.asConditionalFilter;
import static org.forgerock.opendj.rest2ldap.authz.ConditionalFilters.newConditionalFilter;
import static org.forgerock.util.promise.Promises.newResultPromise;
opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
@@ -48,6 +48,7 @@
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Pattern;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
@@ -122,8 +123,7 @@
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
  /** The fully-qualified name of this class. */
  private static final String CLASS_NAME =
       "org.opends.server.backends.SchemaBackend";
  private static final String CLASS_NAME = "org.opends.server.backends.SchemaBackend";
  private static final String CONFIG_SCHEMA_ELEMENTS_FILE = "02-config.ldif";
  private static final String CORE_SCHEMA_ELEMENTS_FILE = "00-core.ldif";
@@ -137,9 +137,6 @@
  private static final AttributeType nameFormsType = getNameFormsAttributeType();
  private static final AttributeType objectClassesType = getObjectClassesAttributeType();
  /** The set of user-defined attributes that will be included in the schema entry. */
  private ArrayList<Attribute> userDefinedAttributes;
  /** The value containing DN of the user we'll say created the configuration. */
  private ByteString creatorsName;
  /** The value containing the DN of the last user to modify the configuration. */
@@ -148,33 +145,26 @@
  private ByteString createTimestamp;
  /** The timestamp that will be used for the latest schema modification time. */
  private ByteString modifyTimestamp;
  /**
   * Indicates whether the attributes of the schema entry should always be
   * treated as user attributes even if they are defined as operational.
   */
  private boolean showAllAttributes;
  /** The time that the schema was last modified. */
  private long modifyTime;
  /** The DN of the configuration entry for this backend. */
  private DN configEntryDN;
  /** The current configuration state. */
  private SchemaBackendCfg currentConfig;
  /** The set of base DNs for this backend. */
  private Set<DN> baseDNs;
  /** The set of user-defined attributes that will be included in the schema entry. */
  private List<Attribute> userDefinedAttributes;
  /** The set of objectclasses that will be used in the schema entry. */
  private HashMap<ObjectClass,String> schemaObjectClasses;
  /** The time that the schema was last modified. */
  private long modifyTime;
  private Map<ObjectClass, String> schemaObjectClasses;
  /**
   * Regular expression used to strip minimum upper bound value from syntax
   * Attribute Type Description. The value looks like: {count}.
   */
  private String stripMinUpperBoundRegEx = "\\{\\d+\\}";
  private final Pattern stripMinUpperBoundRegEx = Pattern.compile("\\{\\d+\\}");
  private ServerContext serverContext;
@@ -218,7 +208,6 @@
    ByteString newBaseDN = ByteString.valueOfUtf8(baseDNs.iterator().next().toString());
    creatorsName = newBaseDN;
    modifiersName = newBaseDN;
    createTimestamp = createGeneralizedTimeValue(getSchema().getOldestModificationTime());
    modifyTimestamp = createGeneralizedTimeValue(getSchema().getYoungestModificationTime());
@@ -229,8 +218,6 @@
    addAllNonSchemaConfigAttributes(userDefinedAttributes, configEntry.getUserAttributes().values());
    addAllNonSchemaConfigAttributes(userDefinedAttributes, configEntry.getOperationalAttributes().values());
    showAllAttributes = cfg.isShowAllAttributes();
    currentConfig = cfg;
  }
@@ -449,15 +436,11 @@
   * Generates and returns a schema entry for the Directory Server.
   *
   * @param  entryDN            The DN to use for the generated entry.
   * @param  includeSchemaFile  A boolean indicating if the X-SCHEMA-FILE
   *                            extension should be used when generating
   *                            the entry.
   *
   * @return  The schema entry that was generated.
   */
  public Entry getSchemaEntry(DN entryDN, boolean includeSchemaFile)
  public Entry getSchemaEntry(DN entryDN)
  {
    return getSchemaEntry(entryDN, includeSchemaFile, false);
    return getSchemaEntry(entryDN, false, false);
  }
  /**
@@ -595,7 +578,7 @@
      if (stripSyntaxMinimumUpperBound && value.indexOf('{') != -1)
      {
        // Strip the minimum upper bound value from the attribute value.
        value = value.replaceFirst(stripMinUpperBoundRegEx, "");
        value = stripMinUpperBoundRegEx.matcher(value).replaceFirst("");
      }
      builder.add(value);
    }
@@ -603,7 +586,7 @@
    Attribute attribute = builder.toAttribute();
    AttributeType attrType = attribute.getAttributeDescription().getAttributeType();
    if (attrType.isOperational()
        && (ignoreShowAllOption || !showAllAttributes))
        && (ignoreShowAllOption || !showAllAttributes()))
    {
      operationalAttrs.put(attrType, newArrayList(attribute));
    }
@@ -2742,7 +2725,7 @@
    // Get the schema entry and see if it matches the filter.  If so, then send
    // it to the client.
    Entry schemaEntry = getSchemaEntry(baseDN, false);
    Entry schemaEntry = getSchemaEntry(baseDN);
    SearchFilter filter = searchOperation.getFilter();
    if (filter.matchesEntry(schemaEntry))
    {
@@ -3089,12 +3072,8 @@
      newBaseDNs = null;
    }
    // Check to see if we should change the behavior regarding whether to show
    // all schema attributes.
    boolean newShowAllAttributes = backendCfg.isShowAllAttributes();
    // Check to see if there is a new set of user-defined attributes.
    ArrayList<Attribute> newUserAttrs = new ArrayList<>();
    List<Attribute> newUserAttrs = new ArrayList<>();
    try
    {
      Entry configEntry = DirectoryServer.getConfigEntry(configEntryDN);
@@ -3158,11 +3137,8 @@
        }
      }
      showAllAttributes = newShowAllAttributes;
      userDefinedAttributes = newUserAttrs;
      LocalizableMessage message = INFO_SCHEMA_USING_NEW_USER_ATTRS.get();
      ccr.addMessage(message);
      ccr.addMessage(INFO_SCHEMA_USING_NEW_USER_ATTRS.get());
    }
    currentConfig = backendCfg;
@@ -3192,20 +3168,7 @@
   */
  boolean showAllAttributes()
  {
    return showAllAttributes;
  }
  /**
   * Specifies whether to treat common schema attributes like user attributes
   * rather than operational attributes.
   *
   * @param  showAllAttributes  Specifies whether to treat common schema
   *                            attributes like user attributes rather than
   *                            operational attributes.
   */
  void setShowAllAttributes(boolean showAllAttributes)
  {
    this.showAllAttributes = showAllAttributes;
    return this.currentConfig.isShowAllAttributes();
  }
  @Override
opendj-server-legacy/src/main/java/org/opends/server/config/JMXMBean.java
@@ -20,6 +20,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -44,8 +45,8 @@
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.SearchScope;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.forgerock.util.Utils;
import org.forgerock.opendj.server.config.server.MonitorProviderCfg;
import org.forgerock.util.Utils;
import org.opends.server.api.AlertGenerator;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.DirectoryServerMBean;
@@ -80,22 +81,16 @@
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
  /**
   * The fully-qualified name of this class.
   */
  /** The fully-qualified name of this class. */
  private static final String CLASS_NAME = "org.opends.server.config.JMXMBean";
  /** The set of alert generators for this MBean. */
  private List<AlertGenerator> alertGenerators;
  /** The set of monitor providers for this MBean. */
  private List<MonitorProvider<? extends MonitorProviderCfg>> monitorProviders;
  /** The DN of the configuration entry with which this MBean is associated. */
  private DN configEntryDN;
  /** The object name for this MBean. */
  private ObjectName objectName;
@@ -252,8 +247,8 @@
   * @param  generator  The alert generator to remove from the set of alert
   *                    generators for this JMX MBean.
   *
   * @return  <CODE>true</CODE> if the alert generator was removed, or
   *          <CODE>false</CODE> if it was not associated with this MBean.
   * @return  {@code true} if the alert generator was removed,
   *          or {@code false} if it was not associated with this MBean.
   */
  public boolean removeAlertGenerator(AlertGenerator generator)
  {
@@ -283,8 +278,7 @@
   * @param  component  The component to add to the set of monitor providers
   *                    for this JMX MBean.
   */
  public void addMonitorProvider(MonitorProvider<? extends MonitorProviderCfg>
                                      component)
  public void addMonitorProvider(MonitorProvider<? extends MonitorProviderCfg> component)
  {
    synchronized (monitorProviders)
    {
@@ -304,8 +298,8 @@
   * @param  component  The component to remove from the set of monitor
   *                    providers for this JMX MBean.
   *
   * @return  <CODE>true</CODE> if the specified component was successfully
   *          removed, or <CODE>false</CODE> if not.
   * @return  {@code true} if the specified component was successfully removed,
   *          or {@code false} if not.
   */
  public boolean removeMonitorProvider(MonitorProvider<?> component)
  {
@@ -322,7 +316,7 @@
   *
   * @param  name  The name of the configuration attribute to retrieve.
   *
   * @return  The specified configuration attribute, or <CODE>null</CODE> if
   * @return  The specified configuration attribute, or {@code null} if
   *          there is no such attribute.
   */
  private Attribute getJmxAttribute(String name)
@@ -342,14 +336,14 @@
          }
          Iterator<ByteString> iterator = a.iterator();
          ByteString value = iterator.next();
          ByteString firstValue = iterator.next();
          if (iterator.hasNext())
          {
            List<String> stringValues = newArrayList(value.toString());
            List<String> stringValues = newArrayList(firstValue.toString());
            while (iterator.hasNext())
            {
              value = iterator.next();
              ByteString value = iterator.next();
              stringValues.add(value.toString());
            }
@@ -358,7 +352,7 @@
          }
          else
          {
            return new Attribute(name, value.toString());
            return new Attribute(name, firstValue.toString());
          }
        }
      }
@@ -557,7 +551,7 @@
    StringBuilder buffer = new StringBuilder();
    buffer.append(actionName);
    buffer.append("(");
    Utils.joinAsString(", ", (Object[]) signature);
    Utils.joinAsString(buffer, ", ", (Object[]) signature);
    buffer.append(")");
    LocalizableMessage message = ERR_CONFIG_JMX_NO_METHOD.get(buffer, configEntryDN);
@@ -571,7 +565,7 @@
   * Provides the exposed attributes and actions of the Dynamic MBean using an
   * MBeanInfo object.
   *
   * @return  An instance of <CODE>MBeanInfo</CODE> allowing all attributes and
   * @return  An instance of {@code MBeanInfo} allowing all attributes and
   *          actions exposed by this Dynamic MBean to be retrieved.
   */
  @Override
@@ -601,10 +595,10 @@
      String className = generator.getClassName();
      Map<String, String> alerts = generator.getAlerts();
      for (String type : alerts.keySet())
      for (Entry<String, String> mapEntry : alerts.entrySet())
      {
        String[] types       = { type };
        String   description = alerts.get(type);
        String[] types       = { mapEntry.getKey() };
        String   description = mapEntry.getValue();
        notifications.add(new MBeanNotificationInfo(types, className, description));
      }
    }
@@ -629,23 +623,19 @@
   */
  private ClientConnection getClientConnection()
  {
    ClientConnection clientConnection = null;
    java.security.AccessControlContext acc = java.security.AccessController
        .getContext();
    java.security.AccessControlContext acc = java.security.AccessController.getContext();
    try
    {
      javax.security.auth.Subject subject = javax.security.auth.Subject
          .getSubject(acc);
      javax.security.auth.Subject subject = javax.security.auth.Subject.getSubject(acc);
      if (subject != null)
      {
        Set<?> privateCreds = subject.getPrivateCredentials(Credential.class);
        clientConnection = ((Credential) privateCreds.iterator().next())
            .getClientConnection();
        return ((Credential) privateCreds.iterator().next()).getClientConnection();
      }
    }
    catch (Exception e)
    {
    }
    return clientConnection;
    return null;
  }
}
opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java
@@ -271,18 +271,13 @@
        final ProgressNotificationCallback pnc = new ProgressNotificationCallback(INFORMATION, summary, 20);
        context.notifyProgress(pnc);
        final File schemaFileTemplate =
            new File(templateConfigSchemaDirectory, fileName);
        final File schemaFileTemplate = new File(templateConfigSchemaDirectory, fileName);
        final File pathDestination = new File(configSchemaDirectory, fileName);
        try
        {
          final int changeCount =
              updateSchemaFile(schemaFileTemplate, pathDestination,
                  attributeOids, null);
          final int changeCount = updateSchemaFile(schemaFileTemplate, pathDestination, attributeOids, null);
          displayChangeCount(pathDestination.getPath(), changeCount);
          displayChangeCount(pathDestination, changeCount);
          context.notifyProgress(pnc.setProgress(100));
        }
        catch (final IOException | IllegalStateException e)
@@ -330,21 +325,15 @@
        final ProgressNotificationCallback pnc = new ProgressNotificationCallback(INFORMATION, summary, 20);
        context.notifyProgress(pnc);
        final File schemaFileTemplate =
            new File(templateConfigSchemaDirectory, fileName);
        final File schemaFileTemplate = new File(templateConfigSchemaDirectory, fileName);
        final File pathDestination = new File(configSchemaDirectory, fileName);
        context.notifyProgress(pnc.setProgress(20));
        try
        {
          final int changeCount =
              updateSchemaFile(schemaFileTemplate, pathDestination,
                  null, objectClassesOids);
          final int changeCount = updateSchemaFile(schemaFileTemplate, pathDestination, null, objectClassesOids);
          displayChangeCount(pathDestination.getPath(), changeCount);
          displayChangeCount(pathDestination, changeCount);
          context.notifyProgress(pnc.setProgress(100));
        }
        catch (final IOException e)
@@ -714,7 +703,7 @@
        List<String> args = new ArrayList<>(baseArgs);
        args.add("--configFile");
        args.add(CONFIG_FILE_PATH);
        args.add(configFile.getAbsolutePath());
        for (final String be : baseDNs)
        {
          args.add("--baseDN");
@@ -1147,9 +1136,9 @@
    }
  }
  private static void displayChangeCount(final String fileName,
      final int changeCount)
  private static void displayChangeCount(final File configfile, final int changeCount)
  {
    String fileName = configfile.getAbsolutePath();
    if (changeCount != 0)
    {
      logger.debug(INFO_UPGRADE_CHANGE_DONE_IN_SPECIFIC_FILE, fileName, changeCount);
@@ -1218,8 +1207,8 @@
    try
    {
      final Filter filterVal = filter != null ? Filter.valueOf(filter) : null;
      final int changeCount = updateConfigFile(CONFIG_FILE_PATH, filterVal, changeOperationType, ldif);
      displayChangeCount(CONFIG_FILE_PATH, changeCount);
      final int changeCount = updateConfigFile(configFile, filterVal, changeOperationType, ldif);
      displayChangeCount(configFile, changeCount);
      context.notifyProgress(pnc.setProgress(100));
    }
opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeUtils.java
@@ -23,7 +23,6 @@
import java.io.FileReader;
import java.io.FilenameFilter;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -45,7 +44,6 @@
import org.forgerock.opendj.ldap.LinkedHashMapEntry;
import org.forgerock.opendj.ldap.Matcher;
import org.forgerock.opendj.ldap.SearchScope;
import org.forgerock.opendj.ldap.requests.AddRequest;
import org.forgerock.opendj.ldap.requests.ModifyRequest;
import org.forgerock.opendj.ldap.requests.Requests;
import org.forgerock.opendj.ldap.requests.SearchRequest;
@@ -74,28 +72,27 @@
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
  /** The config folder of the current instance. */
  /** The {@code config} folder of the current instance. */
  static final File configDirectory = new File(getInstancePath(), CONFIG_PATH_RELATIVE);
  /** The config/schema folder of the current instance. */
  /** The {@code config/schema} folder of the current instance. */
  static final File configSchemaDirectory = new File(configDirectory, SCHEMA_PATH_RELATIVE);
  /** The template folder of the current installation. */
  /** The {@code template} folder of the current installation. */
  private static final File templateDirectory = new File(getInstallationPath(), TEMPLATE_RELATIVE_PATH);
  /** The template/config folder of the current installation. */
  /** The {@code template/config} folder of the current installation. */
  static final File templateConfigDirectory = new File(templateDirectory, CONFIG_PATH_RELATIVE);
  /** The template/config/schema folder of the current installation. */
  /** The {@code template/config/schema} folder of the current installation. */
  static final File templateConfigSchemaDirectory = new File(templateConfigDirectory, SCHEMA_PATH_RELATIVE);
  /** The config/snmp/security folder of the current instance. */
  /** The {@code config/snmp/security} folder of the current instance. */
  static final File configSnmpSecurityDirectory = new File(
      configDirectory + File.separator + SNMP_PATH_RELATIVE + File.separator + SECURITY_PATH_RELATIVE);
  /** The lib folder of the current installation. */
  /** The {@code lib} folder of the current installation. */
  static final File libDirectory = new File(getInstallationPath(), LIB_RELATIVE_PATH);
  /** The bin folder of the current installation. */
  /** The {@code bin} folder of the current installation. */
  static final File binDirectory = new File(getInstallationPath(), UNIX_BINARIES_PATH_RELATIVE);
  /** The bat folder of the current installation. */
  /** The {@code bat} folder of the current installation. */
  static final File batDirectory = new File(getInstallationPath(), WINDOWS_BINARIES_PATH_RELATIVE);
  /** The server configuration file path. */
  static final String CONFIG_FILE_PATH =
      Paths.get(configDirectory.getAbsolutePath(), CURRENT_CONFIG_FILE_NAME).toString();
  static final File configFile = new File(configDirectory, CURRENT_CONFIG_FILE_NAME);
  /**
   * Returns the path of the installation of the directory server. Note that
@@ -302,42 +299,41 @@
    return baseDNs;
  }
  static EntryReader searchConfigFile(final SearchRequest sr) throws FileNotFoundException
  static EntryReader searchConfigFile(final SearchRequest searchRequest) throws FileNotFoundException
  {
    final Schema schema = getUpgradeSchema();
    final File configFile = new File(configDirectory, CURRENT_CONFIG_FILE_NAME);
    final LDIFEntryReader entryReader = new LDIFEntryReader(new FileInputStream(configFile)).setSchema(schema);
    return LDIF.search(entryReader, sr, schema);
    return LDIF.search(entryReader, searchRequest, schema);
  }
  /**
   * Updates the config file during the upgrade process.
   *
   * @param configPath
   * @param configFile
   *          The original path to the file.
   * @param filter
   *          The filter to select entries. Only useful for modify change type.
   * @param changeType
   *          The change type which must be applied to ldif lines.
   * @param ldifLines
   *          The change record ldif lines.
   *          For ADD change type, the first line must be the dn.
   *          For DELETE change type, the first and only line must be the dn.
   *          The change record ldif lines. For ADD change type, the first line must be the dn. For
   *          DELETE change type, the first and only line must be the dn.
   * @throws IOException
   *           If an Exception occurs during the input output methods.
   * @return The changes number that have occurred.
   */
  static int updateConfigFile(final String configPath,
  static int updateConfigFile(final File configFile,
      final Filter filter, final ChangeOperationType changeType,
      final String... ldifLines) throws IOException
  {
    final File original = new File(configPath);
    final File original = configFile;
    final File copyConfig =
        File.createTempFile("copyConfig", ".tmp", original.getParentFile());
    int changeCount = 0;
    final Schema schema = getUpgradeSchema();
    try (LDIFEntryReader entryReader = new LDIFEntryReader(new FileInputStream(configPath)).setSchema(schema);
    try (LDIFEntryReader entryReader = new LDIFEntryReader(new FileInputStream(configFile)).setSchema(schema);
        LDIFEntryWriter writer = new LDIFEntryWriter(new FileOutputStream(copyConfig)))
    {
      writer.setWrapColumn(80);
@@ -414,8 +410,7 @@
      if (changeType == ADD && !entryAlreadyExist)
      {
        final AddRequest ar = Requests.newAddRequest(ldifLines);
        writer.writeEntry(ar);
        writer.writeEntry(Requests.newAddRequest(ldifLines));
        logger.debug(LocalizableMessage.raw("Entry successfully added %s in %s", ldifDN, original.getAbsolutePath()));
        changeCount++;
      }
@@ -431,7 +426,8 @@
    try
    {
      // Renaming the file, overwriting previous one.
      rename(copyConfig, new File(configPath));
      rename(copyConfig, configFile);
      return changeCount;
    }
    catch (IOException e)
    {
@@ -439,8 +435,6 @@
      deleteRecursively(original);
      throw e;
    }
    return changeCount;
  }
  private static String removeDnPrefix(String dnLine)
@@ -608,14 +602,13 @@
    {
      throw new IllegalStateException(e);
    }
    throw new IllegalStateException(ERR_UPGRADE_UNKNOWN_OC_ATT.get(type, oid)
        .toString());
    throw new IllegalStateException(ERR_UPGRADE_UNKNOWN_OC_ATT.get(type, oid).toString());
  }
  /**
   * Creates a new file in the config/upgrade folder. The new file is a
   * concatenation of entries of all files contained in the config/schema
   * folder.
   * Creates a new file in The {@code config/upgrade} folder.
   * The new file is a concatenation of entries of all files contained in the
   * {@code config/schema} folder.
   *
   * @param folder
   *          The folder containing the schema files.
@@ -740,7 +733,7 @@
  static List<String> filterExistingIndexes(final Set<String> candidateIndexes, final String backendID)
  {
    final List<String> indexesToRebuild = new ArrayList<>();
    try (final LDIFEntryReader entryReader = new LDIFEntryReader(new FileInputStream(CONFIG_FILE_PATH)))
    try (final LDIFEntryReader entryReader = new LDIFEntryReader(new FileInputStream(configFile)))
    {
      while (entryReader.hasNext())
      {
opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java
@@ -1583,24 +1583,20 @@
      File configFile = new File(DirectoryServer.getConfigFile());
      File configDirectory  = configFile.getParentFile();
      File configDirectory = configFile.getParentFile();
      File upgradeDirectory = new File(configDirectory, "upgrade");
      upgradeDirectory.mkdir();
      File concatFile       = new File(upgradeDirectory,
                                       SCHEMA_CONCAT_FILE_NAME);
      File concatFile = new File(upgradeDirectory, SCHEMA_CONCAT_FILE_NAME);
      concatFilePath = concatFile.getAbsolutePath();
      File tempFile = new File(concatFilePath + ".tmp");
      try (BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile, false)))
      {
        writer.write("dn: " + DirectoryServer.getSchemaDN());
        writer.newLine();
        writer.write("objectClass: top");
        writer.newLine();
        writer.write("objectClass: ldapSubentry");
        writer.newLine();
        writer.write("objectClass: subschema");
        writer.newLine();
        writeLines(writer,
            "dn: " + DirectoryServer.getSchemaDN(),
            "objectClass: top",
            "objectClass: ldapSubentry",
            "objectClass: subschema");
        writeLines(writer, ATTR_ATTRIBUTE_TYPES, attributeTypes);
        writeLines(writer, ATTR_OBJECTCLASSES, objectClasses);
@@ -1630,6 +1626,15 @@
    }
  }
  private static void writeLines(BufferedWriter writer, String... lines) throws IOException
  {
    for (String line : lines)
    {
      writer.write(line);
      writer.newLine();
    }
  }
  private static void writeLines(BufferedWriter writer, String beforeColumn, Set<String> lines) throws IOException
  {
    for (String line : lines)
@@ -1641,8 +1646,6 @@
    }
  }
  /**
   * Reads the files contained in the schema directory and generates a
   * concatenated view of their contents in the provided sets.
@@ -1845,6 +1848,9 @@
  {
    if (definition.startsWith("::"))
    {
      // See OPENDJ-2792: the definition of the ds-cfg-csv-delimiter-char attribute type
      // had a space accidentally added after the closing parenthesis.
      // This was unfortunately interpreted as base64
      definition = ByteString.wrap(Base64.decode(definition.substring(2).trim())).toString();
    }
    else if (definition.startsWith(":"))
opendj-server-legacy/src/test/java/org/opends/server/backends/SchemaBackendTestCase.java
@@ -18,6 +18,7 @@
import static org.forgerock.opendj.ldap.ResultCode.*;
import static org.forgerock.opendj.ldap.schema.CoreSchema.*;
import static org.mockito.Mockito.*;
import static org.opends.server.TestCaseUtils.*;
import static org.opends.server.core.DirectoryServer.*;
import static org.opends.server.protocols.internal.InternalClientConnection.*;
@@ -47,6 +48,7 @@
import org.forgerock.opendj.ldap.schema.ObjectClass;
import org.forgerock.opendj.ldap.schema.Schema;
import org.forgerock.opendj.ldap.schema.SchemaBuilder;
import org.forgerock.opendj.server.config.server.SchemaBackendCfg;
import org.forgerock.util.Utils;
import org.opends.server.TestCaseUtils;
import org.opends.server.core.AddOperation;
@@ -171,11 +173,10 @@
   * @throws  Exception  If an unexpected problem occurs.
   */
  @Test
  public void testGetSchemaEntry()
         throws Exception
  public void testGetSchemaEntry() throws Exception
  {
    DN    schemaDN    = DN.valueOf("cn=schema");
    Entry schemaEntry = schemaBackend.getSchemaEntry(schemaDN, false);
    Entry schemaEntry = schemaBackend.getSchemaEntry(schemaDN);
    assertNotNull(schemaEntry);
    assertEquals(schemaEntry.getName(), schemaDN);
@@ -185,7 +186,7 @@
    assertTrue(schemaEntry.hasAttribute(getMatchingRulesAttributeType()));
    schemaDN    = DN.valueOf("cn=subschema");
    schemaEntry = schemaBackend.getSchemaEntry(schemaDN, false);
    schemaEntry = schemaBackend.getSchemaEntry(schemaDN);
    assertNotNull(schemaEntry);
    assertEquals(schemaEntry.getName(), schemaDN);
@@ -237,9 +238,9 @@
  {
    DN schemaDN = DN.valueOf("cn=schema");
    DeleteOperationBasis deleteOperation =
         new DeleteOperationBasis(getRootConnection(), nextOperationID(), nextMessageID(),
                             null, schemaDN);
    DeleteOperationBasis deleteOperation = new DeleteOperationBasis(
        getRootConnection(), nextOperationID(), nextMessageID(),
        null, schemaDN);
    schemaBackend.deleteEntry(schemaDN, deleteOperation);
  }
@@ -252,16 +253,12 @@
    DN currentSchemaDN = DN.valueOf("cn=schema");
    DN newSchemaDN     = DN.valueOf("cn=newschema");
    InternalClientConnection conn = getRootConnection();
    ModifyDNOperationBasis modifyDNOperation =
         new ModifyDNOperationBasis(conn, InternalClientConnection.nextOperationID(),
                               InternalClientConnection.nextMessageID(), null,
                               currentSchemaDN, newSchemaDN.rdn(),
                               true, null);
    ModifyDNOperationBasis modifyDNOperation = new ModifyDNOperationBasis(
        getRootConnection(), nextOperationID(), nextMessageID(),
        null, currentSchemaDN, newSchemaDN.rdn(), true, null);
    schemaBackend.renameEntry(currentSchemaDN,
                              schemaBackend.getSchemaEntry(newSchemaDN, false),
                              modifyDNOperation);
    Entry newSchemaEntry = schemaBackend.getSchemaEntry(newSchemaDN);
    schemaBackend.renameEntry(currentSchemaDN, newSchemaEntry, modifyDNOperation);
  }
  /**
@@ -377,29 +374,35 @@
    AttributeType s = getLDAPSyntaxesAttributeType();
    assertFalse(schemaBackend.showAllAttributes());
    Entry schemaEntry = schemaBackend.getSchemaEntry(schemaDN, false);
    Entry schemaEntry = schemaBackend.getSchemaEntry(schemaDN);
    assertTrue(schemaEntry.hasOperationalAttribute(a));
    assertTrue(schemaEntry.hasOperationalAttribute(o));
    assertTrue(schemaEntry.hasOperationalAttribute(m));
    assertTrue(schemaEntry.hasOperationalAttribute(s));
    schemaBackend.setShowAllAttributes(true);
    assertTrue(schemaBackend.showAllAttributes());
    schemaEntry = schemaBackend.getSchemaEntry(schemaDN, false);
    setShowAllAttributes(schemaBackend, true);
    schemaEntry = schemaBackend.getSchemaEntry(schemaDN);
    assertFalse(schemaEntry.hasOperationalAttribute(a));
    assertFalse(schemaEntry.hasOperationalAttribute(o));
    assertFalse(schemaEntry.hasOperationalAttribute(m));
    assertTrue(schemaEntry.hasOperationalAttribute(s));
    schemaBackend.setShowAllAttributes(false);
    setShowAllAttributes(schemaBackend, false);
    assertFalse(schemaBackend.showAllAttributes());
    schemaEntry = schemaBackend.getSchemaEntry(schemaDN, false);
    schemaEntry = schemaBackend.getSchemaEntry(schemaDN);
    assertTrue(schemaEntry.hasOperationalAttribute(a));
    assertTrue(schemaEntry.hasOperationalAttribute(o));
    assertTrue(schemaEntry.hasOperationalAttribute(m));
    assertTrue(schemaEntry.hasOperationalAttribute(s));
  }
  private void setShowAllAttributes(SchemaBackend schemaBackend, boolean showAllAttributes)
  {
    SchemaBackendCfg cfg = spy(SchemaBackendCfg.class);
    when(cfg.isShowAllAttributes()).thenReturn(showAllAttributes);
    schemaBackend.applyConfigurationChange(cfg);
  }
  /**
   * Tests the behavior of the schema backend when attempting to add a new
   * attribute type that is not allowed to be altered.