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

Nicolas Capponi
11.23.2016 2c7d26f5b94a5e4e964dbafd56f30837e53db6d3
OPENDJ-3089 OPENDJ-1237 Remove management of schema files modification times from SchemaBackend

Schema files modification times is handled uniquely by SchemaHandler
2 files modified
174 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java 34 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/core/SchemaHandler.java 140 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
@@ -22,7 +22,6 @@
import static org.opends.messages.ConfigMessages.*;
import static org.opends.messages.SchemaMessages.*;
import static org.opends.server.config.ConfigConstants.*;
import static org.opends.server.core.DirectoryServer.*;
import static org.opends.server.schema.GeneralizedTimeSyntax.*;
import static org.opends.server.util.CollectionUtils.*;
import static org.opends.server.util.SchemaUtils.*;
@@ -136,12 +135,6 @@
  private ByteString creatorsName;
  /** The value containing the DN of the last user to modify the configuration. */
  private ByteString modifiersName;
  /** The timestamp that will be used for the schema creation time. */
  private ByteString createTimestamp;
  /** The timestamp that will be used for the latest schema modification time. */
  private ByteString modifyTimestamp;
  /** The time that the schema was last modified. */
  private long modifyTime;
  /** The DN of the configuration entry for this backend. */
  private DN configEntryDN;
@@ -179,6 +172,7 @@
  public void configureBackend(SchemaBackendCfg cfg, ServerContext serverContext) throws ConfigException
  {
    this.serverContext = serverContext;
    this.schemaHandler = serverContext.getSchemaHandler();
    // Make sure that a configuration entry was provided.  If not, then we will
    // not be able to complete initialization.
@@ -203,8 +197,6 @@
    ByteString newBaseDN = ByteString.valueOfUtf8(baseDNs.iterator().next().toString());
    creatorsName = newBaseDN;
    modifiersName = newBaseDN;
    createTimestamp = createGeneralizedTimeValue(getSchema().getOldestModificationTime());
    modifyTimestamp = createGeneralizedTimeValue(getSchema().getYoungestModificationTime());
    // Get the set of user-defined attributes for the configuration entry.  Any
    // attributes that we don't recognize will be included directly in the
@@ -212,7 +204,6 @@
    userDefinedAttributes = new ArrayList<>();
    addAllNonSchemaConfigAttributes(userDefinedAttributes, configEntry.getAllAttributes());
    schemaHandler = serverContext.getSchemaHandler();
    currentConfig = cfg;
  }
@@ -415,22 +406,20 @@
        operationalAttrs, matchingRuleUsesType, includeSchemaFile, false, true);
    // Add the lastmod attributes.
    if (DirectoryServer.getSchema().getYoungestModificationTime() != modifyTime)
    {
      synchronized (this)
      {
        modifyTime = DirectoryServer.getSchema().getYoungestModificationTime();
        modifyTimestamp = createGeneralizedTimeValue(modifyTime);
      }
    }
    addAttributeToSchemaEntry(
        Attributes.create(getCreatorsNameAttributeType(), creatorsName), userAttrs, operationalAttrs);
        Attributes.create(getCreatorsNameAttributeType(), creatorsName),
        userAttrs, operationalAttrs);
    addAttributeToSchemaEntry(
        Attributes.create(getCreateTimestampAttributeType(), createTimestamp), userAttrs, operationalAttrs);
        Attributes.create(getCreateTimestampAttributeType(),
            createGeneralizedTimeValue(schemaHandler.getOldestModificationTime())),
        userAttrs, operationalAttrs);
    addAttributeToSchemaEntry(
        Attributes.create(getModifiersNameAttributeType(), modifiersName), userAttrs, operationalAttrs);
        Attributes.create(getModifiersNameAttributeType(), modifiersName),
        userAttrs, operationalAttrs);
    addAttributeToSchemaEntry(
        Attributes.create(getModifyTimestampAttributeType(), modifyTimestamp), userAttrs, operationalAttrs);
        Attributes.create(getModifyTimestampAttributeType(),
            createGeneralizedTimeValue(schemaHandler.getYoungestModificationTime())),
        userAttrs, operationalAttrs);
    // Add the extra attributes.
    for (Attribute attribute : DirectoryServer.getSchema().getExtraAttributes())
@@ -558,7 +547,6 @@
    }
    modifiersName = ByteString.valueOfUtf8(authzDN.toString());
    modifyTimestamp = createGeneralizedTimeValue(System.currentTimeMillis());
  }
  private void applyModifications(SchemaBuilder newSchemaBuilder, List<Modification> mods,
opendj-server-legacy/src/main/java/org/opends/server/core/SchemaHandler.java
@@ -15,12 +15,12 @@
 */
package org.opends.server.core;
import static org.opends.messages.ConfigMessages.WARN_CONFIG_SCHEMA_CANNOT_OPEN_FILE;
import static org.opends.server.util.ServerConstants.SCHEMA_PROPERTY_FILENAME;
import static org.opends.messages.SchemaMessages.ERR_SCHEMA_HAS_WARNINGS;
import static org.forgerock.util.Utils.*;
import static org.forgerock.util.Utils.closeSilently;
import static org.opends.messages.ConfigMessages.*;
import static org.opends.server.util.StaticUtils.*;
import static org.opends.messages.SchemaMessages.ERR_SCHEMA_HAS_WARNINGS;
import static org.opends.server.util.ServerConstants.SCHEMA_PROPERTY_FILENAME;
import static org.opends.server.util.StaticUtils.getExceptionMessage;
import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
import java.io.File;
import java.io.FileNotFoundException;
@@ -114,16 +114,40 @@
  /** Guards updates to the schema. */
  private final Lock exclusiveLock = new ReentrantLock();
  private long oldestModificationTime = -1L;
  /** The oldest modification time for any schema configuration file, as a byte string. */
  private long oldestModificationTime;
  private long youngestModificationTime = -1L;
  /** The youngest modification time for any schema configuration file. */
  private long youngestModificationTime;
  /**
   * Creates a new instance.
   */
  public SchemaHandler()
  {
    // no implementation.
    oldestModificationTime = System.currentTimeMillis();
    youngestModificationTime = oldestModificationTime;
  }
  /**
   * Returns the youngest modification time for schema files.
   *
   * @return the youngest modification time for any schema configuration file
   */
  public long getYoungestModificationTime()
  {
    return youngestModificationTime;
  }
  /**
   * Returns the oldest modification time for schema files.
   *
   * @return the oldest modification time for any schema configuration file
   */
  public long getOldestModificationTime()
  {
    return oldestModificationTime;
  }
  /**
@@ -257,6 +281,7 @@
    {
      switchSchema(schema);
      new SchemaWriter().updateSchemaFiles(schemaNG, getExtraAttributes(), modifiedSchemaFiles, alertGenerator);
      youngestModificationTime = System.currentTimeMillis();
    }
    finally
    {
@@ -429,7 +454,7 @@
  }
  /**
   * Complete the schema with schema files.
   * Completes the schema with schema files.
   *
   * @param schemaBuilder
   *          The schema builder to update with the content of the schema files.
@@ -444,58 +469,73 @@
      throws ConfigException, InitializationException
  {
    final File schemaDirectory = getSchemaDirectoryPath();
    for (String schemaFile : getSchemaFileNames(schemaDirectory))
    final File[] schemaFiles = getSchemaFiles(schemaDirectory);
    final List<String> schemaFileNames = getSchemaFileNames(schemaFiles);
    updateModificationTimes(schemaFiles);
    for (String schemaFile : schemaFileNames)
    {
      loadSchemaFile(new File(schemaDirectory, schemaFile), schemaBuilder, Schema.getDefaultSchema());
    }
  }
  /** Returns the list of names of schema files contained in the provided directory. */
  private List<String> getSchemaFileNames(final File schemaDirectory) throws InitializationException {
  private File[] getSchemaFiles(File schemaDirectory) throws InitializationException
  {
    try
    {
      final File[] schemaFiles = schemaDirectory.listFiles(new SchemaFileFilter());
      final List<String> schemaFileNames = new ArrayList<>(schemaFiles.length);
      for (final File f : schemaFiles)
      {
        if (f.isFile())
        {
          schemaFileNames.add(f.getName());
        }
        final long modificationTime = f.lastModified();
        if (oldestModificationTime <= 0L
            || modificationTime < oldestModificationTime)
        {
          oldestModificationTime = modificationTime;
        }
        if (youngestModificationTime <= 0
            || modificationTime > youngestModificationTime)
        {
          youngestModificationTime = modificationTime;
        }
      }
      // If the oldest and youngest modification timestamps didn't get set
      // then set them to the current time.
      if (oldestModificationTime <= 0)
      {
        oldestModificationTime = System.currentTimeMillis();
      }
      if (youngestModificationTime <= 0)
      {
        youngestModificationTime = oldestModificationTime;
      }
      Collections.sort(schemaFileNames);
      return schemaFileNames;
      return schemaDirectory.listFiles(new SchemaFileFilter());
    }
    catch (Exception e)
    {
      logger.traceException(e);
      throw new InitializationException(ERR_CONFIG_SCHEMA_CANNOT_LIST_FILES
          .get(schemaDirectory, getExceptionMessage(e)), e);
      throw new InitializationException(
          ERR_CONFIG_SCHEMA_CANNOT_LIST_FILES.get(schemaDirectory, getExceptionMessage(e)), e);
    }
  }
  /** Returns the sorted list of names of schema files contained in the provided directory. */
  private List<String> getSchemaFileNames(final File[] schemaFiles)
  {
    final List<String> schemaFileNames = new ArrayList<>(schemaFiles.length);
    for (final File f : schemaFiles)
    {
      if (f.isFile())
      {
        schemaFileNames.add(f.getName());
      }
    }
    Collections.sort(schemaFileNames);
    return schemaFileNames;
  }
  private void updateModificationTimes(final File[] schemaFiles)
  {
    for (final File file : schemaFiles)
    {
      final long modificationTime = file.lastModified();
      if (oldestModificationTime <= 0L
          || oldestModificationTime >= modificationTime)
      {
        oldestModificationTime = modificationTime;
      }
      if (youngestModificationTime <= 0
          || youngestModificationTime <= modificationTime)
      {
        youngestModificationTime = modificationTime;
      }
    }
    // If the oldest and youngest modification timestamps didn't get set
    // then set them to the current time.
    if (oldestModificationTime <= 0)
    {
      oldestModificationTime = System.currentTimeMillis();
    }
    if (youngestModificationTime <= 0)
    {
      youngestModificationTime = oldestModificationTime;
    }
  }