From e038f697b622bbe1b55fe661f1fc47bd48cf6477 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Fri, 25 Jan 2013 17:41:37 +0000
Subject: [PATCH] Fix OPENDJ-169: Modifying an existing object class definition requires server restart

---
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/JECompressedSchema.java |  753 +++++++++++++++------------------------------------------
 1 files changed, 206 insertions(+), 547 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/JECompressedSchema.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/JECompressedSchema.java
index 5e0365e..9f790bb 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/JECompressedSchema.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/JECompressedSchema.java
@@ -23,29 +23,33 @@
  *
  *
  *      Copyright 2008-2009 Sun Microsystems, Inc.
+ *      Portions copyright 2013 ForgeRock AS.
  */
 package org.opends.server.backends.jeb;
 
 
 
 import static org.opends.messages.JebMessages.*;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import static org.opends.server.util.StaticUtils.*;
+import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
+import static org.opends.server.loggers.debug.DebugLogger.getTracer;
 
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.io.IOException;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
 
 import org.opends.messages.Message;
 import org.opends.server.api.CompressedSchema;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.server.protocols.asn1.*;
-import org.opends.server.types.*;
+import org.opends.server.protocols.asn1.ASN1;
+import org.opends.server.protocols.asn1.ASN1Exception;
+import org.opends.server.protocols.asn1.ASN1Reader;
+import org.opends.server.protocols.asn1.ASN1Writer;
+import org.opends.server.types.ByteStringBuilder;
+import org.opends.server.types.DebugLogLevel;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import com.sleepycat.je.Cursor;
 import com.sleepycat.je.Database;
@@ -63,129 +67,190 @@
  * This class provides a compressed schema implementation whose definitions are
  * stored in a Berkeley DB JE database.
  */
-public final class JECompressedSchema
-       extends CompressedSchema
+public final class JECompressedSchema extends CompressedSchema
 {
   /**
-   * The tracer object for the debug logger.
-   */
-  private static final DebugTracer TRACER = getTracer();
-
-
-
-  /**
    * The name of the database used to store compressed attribute description
    * definitions.
    */
-  public static final String DB_NAME_AD = "compressed_attributes";
-
-
+  private static final String DB_NAME_AD = "compressed_attributes";
 
   /**
    * The name of the database used to store compressed object class set
    * definitions.
    */
-  public static final String DB_NAME_OC = "compressed_object_classes";
+  private static final String DB_NAME_OC = "compressed_object_classes";
 
-
-
-  // The counter used for attribute descriptions.
-  private AtomicInteger adCounter;
-
-  // The counter used for object class sets.
-  private AtomicInteger ocCounter;
-
-  // The map between encoded representations and attribute types.
-  private ConcurrentHashMap<ByteSequence,AttributeType> atDecodeMap;
-
-  // The map between encoded representations and attribute options.
-  private ConcurrentHashMap<ByteSequence,Set<String>> aoDecodeMap;
-
-  // The map between encoded representations and object class sets.
-  private ConcurrentHashMap<ByteSequence,Map<ObjectClass,String>> ocDecodeMap;
-
-  // The map between attribute descriptions and their encoded
-  // representations.
-  private final ConcurrentHashMap<AttributeType,
-                ConcurrentHashMap<Set<String>, ByteSequence>> adEncodeMap;
-
-  // The map between object class sets and encoded representations.
-  private final ConcurrentHashMap<Map<ObjectClass,String>,
-      ByteSequence> ocEncodeMap;
+  /**
+   * The tracer object for the debug logger.
+   */
+  private static final DebugTracer TRACER = getTracer();
 
   // The compressed attribute description schema database.
   private Database adDatabase;
 
-  // The compresesd object class set schema database.
-  private Database ocDatabase;
-
   // The environment in which the databases are held.
   private Environment environment;
 
-  private final ByteStringBuilder storeWriterBuffer;
-  private final ASN1Writer storeWriter;
+  // The compresesd object class set schema database.
+  private Database ocDatabase;
+
+  private final ByteStringBuilder storeAttributeWriterBuffer =
+      new ByteStringBuilder();
+  private final ASN1Writer storeAttributeWriter = ASN1
+      .getWriter(storeAttributeWriterBuffer);
+  private final ByteStringBuilder storeObjectClassesWriterBuffer =
+      new ByteStringBuilder();
+  private final ASN1Writer storeObjectClassesWriter = ASN1
+      .getWriter(storeObjectClassesWriterBuffer);
 
 
 
   /**
    * Creates a new instance of this JE compressed schema manager.
    *
-   * @param  environment  A reference to the database environment in which the
-   *                      databases will be held.
-   *
-   * @throws DatabaseException       If a database problem occurs while loading
-   *                                 the compressed schema definitions from the
-   *                                 database.
-   * @throws InitializationException If an error occurs while loading and
-   *                                 processing the compressed schema
-   *                                 definitions.
+   * @param environment
+   *          A reference to the database environment in which the databases
+   *          will be held.
+   * @throws DatabaseException
+   *           If a database problem occurs while loading the compressed schema
+   *           definitions from the database.
+   * @throws InitializationException
+   *           If an error occurs while loading and processing the compressed
+   *           schema definitions.
    */
-  public JECompressedSchema(Environment environment)
-         throws DatabaseException, InitializationException
+  public JECompressedSchema(final Environment environment)
+      throws DatabaseException, InitializationException
   {
     this.environment = environment;
-
-    atDecodeMap = new ConcurrentHashMap<ByteSequence,AttributeType>();
-    aoDecodeMap = new ConcurrentHashMap<ByteSequence,Set<String>>();
-    ocDecodeMap = new ConcurrentHashMap<ByteSequence,Map<ObjectClass,String>>();
-    adEncodeMap =
-         new ConcurrentHashMap<AttributeType,
-                  ConcurrentHashMap<Set<String>, ByteSequence>>();
-    ocEncodeMap = new ConcurrentHashMap<Map<ObjectClass,String>,
-        ByteSequence>();
-
-    adCounter = new AtomicInteger(1);
-    ocCounter = new AtomicInteger(1);
-
-    storeWriterBuffer = new ByteStringBuilder();
-    storeWriter = ASN1.getWriter(storeWriterBuffer);
-
     load();
   }
 
 
 
   /**
+   * Closes the databases and releases any resources held by this compressed
+   * schema manager.
+   */
+  public void close()
+  {
+    try
+    {
+      adDatabase.sync();
+    }
+    catch (final Exception e)
+    {
+      // Ignore.
+    }
+
+    try
+    {
+      adDatabase.close();
+    }
+    catch (final Exception e)
+    {
+      // Ignore.
+    }
+
+    try
+    {
+      ocDatabase.sync();
+    }
+    catch (final Exception e)
+    {
+      // Ignore.
+    }
+
+    try
+    {
+      ocDatabase.close();
+    }
+    catch (final Exception e)
+    {
+      // Ignore.
+    }
+
+    adDatabase = null;
+    ocDatabase = null;
+    environment = null;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected void storeAttribute(final byte[] encodedAttribute,
+      final String attributeName, final Collection<String> attributeOptions)
+      throws DirectoryException
+  {
+    try
+    {
+      storeAttributeWriterBuffer.clear();
+      storeAttributeWriter.writeStartSequence();
+      storeAttributeWriter.writeOctetString(attributeName);
+      for (final String option : attributeOptions)
+      {
+        storeAttributeWriter.writeOctetString(option);
+      }
+      storeAttributeWriter.writeEndSequence();
+      store(adDatabase, encodedAttribute, storeAttributeWriterBuffer);
+    }
+    catch (final IOException e)
+    {
+      // TODO: Shouldn't happen but should log a message
+    }
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected void storeObjectClasses(final byte[] encodedObjectClasses,
+      final Collection<String> objectClassNames) throws DirectoryException
+  {
+    try
+    {
+      storeObjectClassesWriterBuffer.clear();
+      storeObjectClassesWriter.writeStartSequence();
+      for (final String ocName : objectClassNames)
+      {
+        storeObjectClassesWriter.writeOctetString(ocName);
+      }
+      storeObjectClassesWriter.writeEndSequence();
+      store(ocDatabase, encodedObjectClasses, storeObjectClassesWriterBuffer);
+    }
+    catch (final IOException e)
+    {
+      // TODO: Shouldn't happen but should log a message
+    }
+  }
+
+
+
+  /**
    * Loads the compressed schema information from the database.
    *
-   * @throws DatabaseException       If a database error occurs while
-   *                                 loading the definitions from the
-   *                                 database.
-   * @throws InitializationException If an error occurs while loading
-   *                                 and processing the definitions.
+   * @throws DatabaseException
+   *           If a database error occurs while loading the definitions from the
+   *           database.
+   * @throws InitializationException
+   *           If an error occurs while loading and processing the definitions.
    */
-  private void load()
-          throws DatabaseException, InitializationException
+  private void load() throws DatabaseException, InitializationException
   {
-    DatabaseConfig dbConfig = new DatabaseConfig();
+    final DatabaseConfig dbConfig = new DatabaseConfig();
 
-    if(environment.getConfig().getReadOnly())
+    if (environment.getConfig().getReadOnly())
     {
       dbConfig.setReadOnly(true);
       dbConfig.setAllowCreate(false);
       dbConfig.setTransactional(false);
     }
-    else if(!environment.getConfig().getTransactional())
+    else if (!environment.getConfig().getTransactional())
     {
       dbConfig.setAllowCreate(true);
       dbConfig.setTransactional(false);
@@ -201,53 +266,40 @@
     ocDatabase = environment.openDatabase(null, DB_NAME_OC, dbConfig);
 
     // Cursor through the object class database and load the object class set
-    // definitions.  At the same time, figure out the highest token value and
+    // definitions. At the same time, figure out the highest token value and
     // initialize the object class counter to one greater than that.
-    Cursor ocCursor = ocDatabase.openCursor(null, null);
-    int highestToken = 0;
-
+    final Cursor ocCursor = ocDatabase.openCursor(null, null);
     try
     {
-      DatabaseEntry keyEntry   = new DatabaseEntry();
-      DatabaseEntry valueEntry = new DatabaseEntry();
+      final DatabaseEntry keyEntry = new DatabaseEntry();
+      final DatabaseEntry valueEntry = new DatabaseEntry();
       OperationStatus status = ocCursor.getFirst(keyEntry, valueEntry,
-                                                 LockMode.READ_UNCOMMITTED);
+          LockMode.READ_UNCOMMITTED);
       while (status == OperationStatus.SUCCESS)
       {
-        byte[] tokenBytes = keyEntry.getData();
-        ByteString token = ByteString.wrap(tokenBytes);
-        highestToken = Math.max(highestToken, decodeInt(tokenBytes));
-
-        ASN1Reader reader =
-            ASN1.getReader(valueEntry.getData());
+        final byte[] encodedObjectClasses = keyEntry.getData();
+        final ASN1Reader reader = ASN1.getReader(valueEntry.getData());
         reader.readStartSequence();
-        LinkedHashMap<ObjectClass,String> ocMap =
-             new LinkedHashMap<ObjectClass,String>();
-        while(reader.hasNextElement())
+        final List<String> objectClassNames = new LinkedList<String>();
+        while (reader.hasNextElement())
         {
-          String ocName = reader.readOctetStringAsString();
-          String lowerName = toLowerCase(ocName);
-          ObjectClass oc = DirectoryServer.getObjectClass(lowerName, true);
-          ocMap.put(oc, ocName);
+          objectClassNames.add(reader.readOctetStringAsString());
         }
         reader.readEndSequence();
-
-        ocEncodeMap.put(ocMap, token);
-        ocDecodeMap.put(token, ocMap);
-
+        loadObjectClasses(encodedObjectClasses, objectClassNames);
         status = ocCursor.getNext(keyEntry, valueEntry,
-                                  LockMode.READ_UNCOMMITTED);
+            LockMode.READ_UNCOMMITTED);
       }
     }
-    catch (ASN1Exception ae)
+    catch (final ASN1Exception ae)
     {
       if (debugEnabled())
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, ae);
       }
 
-      Message m =
-           ERR_JEB_COMPSCHEMA_CANNOT_DECODE_OC_TOKEN.get(ae.getMessage());
+      final Message m = ERR_JEB_COMPSCHEMA_CANNOT_DECODE_OC_TOKEN.get(ae
+          .getMessage());
       throw new InitializationException(m, ae);
     }
     finally
@@ -255,393 +307,64 @@
       ocCursor.close();
     }
 
-    ocCounter.set(highestToken+1);
-
-
     // Cursor through the attribute description database and load the attribute
     // set definitions.
-    Cursor adCursor = adDatabase.openCursor(null, null);
-    highestToken = 0;
-
+    final Cursor adCursor = adDatabase.openCursor(null, null);
     try
     {
-      DatabaseEntry keyEntry   = new DatabaseEntry();
-      DatabaseEntry valueEntry = new DatabaseEntry();
+      final DatabaseEntry keyEntry = new DatabaseEntry();
+      final DatabaseEntry valueEntry = new DatabaseEntry();
       OperationStatus status = adCursor.getFirst(keyEntry, valueEntry,
-                                                 LockMode.READ_UNCOMMITTED);
+          LockMode.READ_UNCOMMITTED);
       while (status == OperationStatus.SUCCESS)
       {
-        byte[] tokenBytes = keyEntry.getData();
-        ByteString token = ByteString.wrap(tokenBytes);
-        highestToken = Math.max(highestToken, decodeInt(tokenBytes));
-
-        ASN1Reader reader =
-            ASN1.getReader(valueEntry.getData());
+        final byte[] encodedAttribute = keyEntry.getData();
+        final ASN1Reader reader = ASN1.getReader(valueEntry.getData());
         reader.readStartSequence();
-        String attrName = reader.readOctetStringAsString();
-        String lowerName = toLowerCase(attrName);
-        AttributeType attrType =
-            DirectoryServer.getAttributeType(lowerName, true);
-
-        LinkedHashSet<String> options =
-            new LinkedHashSet<String>();
-        while(reader.hasNextElement())
+        final String attributeName = reader.readOctetStringAsString();
+        final List<String> attributeOptions = new LinkedList<String>();
+        while (reader.hasNextElement())
         {
-          options.add(reader.readOctetStringAsString());
+          attributeOptions.add(reader.readOctetStringAsString());
         }
         reader.readEndSequence();
-
-        atDecodeMap.put(token, attrType);
-        aoDecodeMap.put(token, options);
-
-        ConcurrentHashMap<Set<String>, ByteSequence> map = adEncodeMap
-            .get(attrType);
-        if (map == null)
-        {
-          map = new ConcurrentHashMap<Set<String>, ByteSequence>(1);
-          map.put(options, token);
-          adEncodeMap.put(attrType, map);
-        }
-        else
-        {
-          map.put(options, token);
-        }
-
+        loadAttribute(encodedAttribute, attributeName, attributeOptions);
         status = adCursor.getNext(keyEntry, valueEntry,
-                                  LockMode.READ_UNCOMMITTED);
+            LockMode.READ_UNCOMMITTED);
       }
     }
-    catch (ASN1Exception ae)
+    catch (final ASN1Exception ae)
     {
       if (debugEnabled())
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, ae);
       }
 
-      Message m =
-           ERR_JEB_COMPSCHEMA_CANNOT_DECODE_AD_TOKEN.get(ae.getMessage());
+      final Message m = ERR_JEB_COMPSCHEMA_CANNOT_DECODE_AD_TOKEN.get(ae
+          .getMessage());
       throw new InitializationException(m, ae);
     }
     finally
     {
       adCursor.close();
     }
-
-    adCounter.set(highestToken+1);
   }
 
 
 
-  /**
-   * Closes the databases and releases any resources held by this compressed
-   * schema manager.
-   */
-  public void close()
-  {
-    try
-    {
-      adDatabase.sync();
-    } catch (Exception e) {}
-
-    try
-    {
-      adDatabase.close();
-    } catch (Exception e) {}
-
-    try
-    {
-      ocDatabase.sync();
-    } catch (Exception e) {}
-
-    try
-    {
-      ocDatabase.close();
-    } catch (Exception e) {}
-
-    adDatabase  = null;
-    ocDatabase  = null;
-    environment = null;
-    atDecodeMap = null;
-    aoDecodeMap = null;
-    ocDecodeMap = null;
-    //adEncodeMap = null;
-    //ocEncodeMap = null;
-    adCounter   = null;
-    ocCounter   = null;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public void encodeObjectClasses(ByteStringBuilder entryBuffer,
-                                  Map<ObjectClass,String> objectClasses)
-         throws DirectoryException
-  {
-    ByteSequence encodedClasses = ocEncodeMap.get(objectClasses);
-    if (encodedClasses == null)
-    {
-      synchronized (ocEncodeMap)
-      {
-        int setValue = ocCounter.getAndIncrement();
-        byte[] tokenArray = encodeInt(setValue);
-        encodedClasses = ByteString.wrap(tokenArray);
-
-        storeObjectClass(tokenArray, objectClasses);
-        ocEncodeMap.put(objectClasses, encodedClasses);
-        ocDecodeMap.put(encodedClasses, objectClasses);
-      }
-    }
-
-    entryBuffer.appendBERLength(encodedClasses.length());
-    encodedClasses.copyTo(entryBuffer);
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public Map<ObjectClass,String> decodeObjectClasses(
-      ByteSequenceReader entryBufferReader) throws DirectoryException
-  {
-    int tokenLength = entryBufferReader.getBERLength();
-    ByteSequence byteArray = entryBufferReader.getByteSequence(tokenLength);
-    Map<ObjectClass,String> ocMap = ocDecodeMap.get(byteArray);
-    if (ocMap == null)
-    {
-      Message message = ERR_JEB_COMPSCHEMA_UNKNOWN_OC_TOKEN.get(byteArray
-          .toByteString().toHex());
-      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-          message);
-    }
-    else
-    {
-      return ocMap;
-    }
-  }
-
-  private void storeObjectClass(byte[] token,
-                                Map<ObjectClass,String> objectClasses)
-      throws DirectoryException
-  {
-    synchronized(storeWriter)
-    {
-      try
-      {
-        storeWriterBuffer.clear();
-        storeWriter.writeStartSequence();
-        for (String ocName : objectClasses.values())
-        {
-          storeWriter.writeOctetString(ocName);
-        }
-        storeWriter.writeEndSequence();
-        store(ocDatabase, token, storeWriterBuffer);
-      }
-      catch(IOException ioe)
-      {
-        // TODO: Shouldn't happen but should log a message
-      }
-    }
-  }
-
-  private void storeAttribute(byte[] token,
-                              AttributeType attrType, Set<String> options)
-      throws DirectoryException
-  {
-    synchronized(storeWriter)
-    {
-      try
-      {
-        storeWriterBuffer.clear();
-        storeWriter.writeStartSequence();
-        storeWriter.writeOctetString(attrType.getNameOrOID());
-        for (String option : options)
-        {
-          storeWriter.writeOctetString(option);
-        }
-        storeWriter.writeEndSequence();
-        store(adDatabase, token, storeWriterBuffer);
-      }
-      catch(IOException ioe)
-      {
-        // TODO: Shouldn't happen but should log a message
-      }
-    }
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public void encodeAttribute(ByteStringBuilder entryBuffer,
-                              Attribute attribute) throws DirectoryException
-  {
-    AttributeType type = attribute.getAttributeType();
-    Set<String> options = attribute.getOptions();
-
-    ConcurrentHashMap<Set<String>, ByteSequence> map = adEncodeMap.get(type);
-    if (map == null)
-    {
-      byte[] tokenArray;
-      ByteString byteString;
-      synchronized (adEncodeMap)
-      {
-        map = new ConcurrentHashMap<Set<String>, ByteSequence>(1);
-
-        int intValue = adCounter.getAndIncrement();
-        tokenArray = encodeInt(intValue);
-        byteString = ByteString.wrap(tokenArray);
-        map.put(options,byteString);
-
-        storeAttribute(tokenArray, type, options);
-        adEncodeMap.put(type, map);
-        atDecodeMap.put(byteString, type);
-        aoDecodeMap.put(byteString, options);
-      }
-
-      encodeAttribute(entryBuffer, byteString, attribute);
-    }
-    else
-    {
-      ByteSequence byteArray = map.get(options);
-      if (byteArray == null)
-      {
-        byte[] tokenArray;
-        synchronized (map)
-        {
-          int intValue = adCounter.getAndIncrement();
-          tokenArray = encodeInt(intValue);
-          byteArray = ByteString.wrap(tokenArray);
-          map.put(options,byteArray);
-
-          storeAttribute(tokenArray, type, options);
-          atDecodeMap.put(byteArray, type);
-          aoDecodeMap.put(byteArray, options);
-        }
-      }
-
-      encodeAttribute(entryBuffer, byteArray, attribute);
-    }
-  }
-
-
-
-  /**
-   * Encodes the information in the provided attribute to a byte
-   * array.
-   *
-   * @param  buffer     The byte buffer to encode the attribute into.
-   * @param  adArray    The byte array that is a placeholder for the
-   *                    attribute type and set of options.
-   * @param  attribute  The attribute to be encoded.
-   */
-  private void encodeAttribute(ByteStringBuilder buffer, ByteSequence adArray,
-                                 Attribute attribute)
-  {
-    // Write the length of the adArray followed by the adArray.
-    buffer.appendBERLength(adArray.length());
-    adArray.copyTo(buffer);
-
-    // Write the number of attributes
-    buffer.appendBERLength(attribute.size());
-
-    // Write the attribute values as length / value pairs
-    for(AttributeValue v : attribute)
-    {
-      buffer.appendBERLength(v.getValue().length());
-      buffer.append(v.getValue());
-    }
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public Attribute decodeAttribute(ByteSequenceReader entryBufferReader)
-         throws DirectoryException
-  {
-    // Figure out how many bytes are in the token that is the placeholder for
-    // the attribute description.
-    int adArrayLength = entryBufferReader.getBERLength();
-
-
-    // Get the attribute description token and make sure it resolves to an
-    // attribute type and option set.
-    ByteSequence adArray = entryBufferReader.getByteSequence(adArrayLength);
-
-    AttributeType attrType = atDecodeMap.get(adArray);
-    Set<String> options = aoDecodeMap.get(adArray);
-    if ((attrType == null) || (options == null))
-    {
-      Message message = ERR_JEB_COMPSCHEMA_UNRECOGNIZED_AD_TOKEN.get(adArray
-          .toByteString().toHex());
-      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-          message);
-    }
-
-
-    // Determine the number of values for the attribute.
-    int numValues = entryBufferReader.getBERLength();
-
-
-    // For the common case of a single value with no options, generate
-    // less garbage.
-    if (numValues == 1 && options.isEmpty())
-    {
-      int valueLength = entryBufferReader.getBERLength();
-
-      ByteString valueBytes =
-          entryBufferReader.getByteSequence(valueLength).toByteString();
-      return Attributes.create(attrType,
-          AttributeValues.create(attrType, valueBytes));
-    }
-    else
-    {
-      // Read the appropriate number of values.
-      AttributeBuilder builder = new AttributeBuilder(attrType);
-      builder.setOptions(options);
-      builder.setInitialCapacity(numValues);
-      for (int i = 0; i < numValues; i++)
-      {
-        int valueLength = entryBufferReader.getBERLength();
-
-        ByteString valueBytes =
-            entryBufferReader.getByteSequence(valueLength).toByteString();
-        builder.add(AttributeValues.create(attrType,
-            valueBytes));
-      }
-
-      return builder.toAttribute();
-    }
-  }
-
-  /**
-   * Stores the provided key-value pair in the specified database container.
-   *
-   * @param  database    The database in which to store the information.
-   * @param  keyBytes    The byte array containing the key to store.
-   * @param  valueBytes  The byte array containing the value to store.
-   *
-   * @throws  DirectoryException  If a problem occurs while attempting to store
-   *                              the data.
-   */
-  private void store(Database database, byte[] keyBytes,
-                     ByteStringBuilder valueBytes)
-          throws DirectoryException
+  private void store(final Database database, final byte[] key,
+      final ByteStringBuilder value) throws DirectoryException
   {
     boolean successful = false;
-    DatabaseEntry keyEntry   = new DatabaseEntry(keyBytes);
-    DatabaseEntry valueEntry = new DatabaseEntry(valueBytes.getBackingArray(),
-        0, valueBytes.length());
-
-    for (int i=0; i < 3; i++)
+    final DatabaseEntry keyEntry = new DatabaseEntry(key);
+    final DatabaseEntry valueEntry = new DatabaseEntry(value.getBackingArray(),
+        0, value.length());
+    for (int i = 0; i < 3; i++)
     {
       try
       {
-        OperationStatus status = database.putNoOverwrite(null, keyEntry,
-                                                         valueEntry);
+        final OperationStatus status = database.putNoOverwrite(null, keyEntry,
+            valueEntry);
         if (status == OperationStatus.SUCCESS)
         {
           successful = true;
@@ -649,95 +372,31 @@
         }
         else
         {
-          Message m = ERR_JEB_COMPSCHEMA_CANNOT_STORE_STATUS.get(
-                           status.toString());
+          final Message m = ERR_JEB_COMPSCHEMA_CANNOT_STORE_STATUS.get(status
+              .toString());
           throw new DirectoryException(
-                         DirectoryServer.getServerErrorResultCode(), m);
+              DirectoryServer.getServerErrorResultCode(), m);
         }
       }
-      catch (LockConflictException ce)
+      catch (final LockConflictException ce)
       {
         continue;
       }
-      catch (DatabaseException de)
+      catch (final DatabaseException de)
       {
-        Message m = ERR_JEB_COMPSCHEMA_CANNOT_STORE_EX.get(de.getMessage());
-        throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-                                     m, de);
+        final Message m = ERR_JEB_COMPSCHEMA_CANNOT_STORE_EX.get(de
+            .getMessage());
+        throw new DirectoryException(
+            DirectoryServer.getServerErrorResultCode(), m, de);
       }
     }
 
-    if (! successful)
+    if (!successful)
     {
-      Message m = ERR_JEB_COMPSCHEMA_CANNOT_STORE_MULTIPLE_FAILURES.get();
-      throw new DirectoryException(
-                     DirectoryServer.getServerErrorResultCode(), m);
+      final Message m = ERR_JEB_COMPSCHEMA_CANNOT_STORE_MULTIPLE_FAILURES.get();
+      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
+          m);
     }
   }
 
-
-
-
-  /**
-   * Encodes the provided int value to a byte array.
-   *
-   * @param  intValue  The int value to be encoded.
-   *
-   * @return  The byte array containing the encoded int value.
-   */
-  private byte[] encodeInt(int intValue)
-  {
-    byte[] array;
-    if (intValue <= 0xFF)
-    {
-      array = new byte[1];
-      array[0] = (byte) (intValue & 0xFF);
-    }
-    else if (intValue <= 0xFFFF)
-    {
-      array = new byte[2];
-      array[0] = (byte) ((intValue >> 8)  & 0xFF);
-      array[1] = (byte) (intValue & 0xFF);
-    }
-    else if (intValue <= 0xFFFFFF)
-    {
-      array = new byte[3];
-      array[0] = (byte) ((intValue >> 16) & 0xFF);
-      array[1] = (byte) ((intValue >> 8)  & 0xFF);
-      array[2] = (byte) (intValue & 0xFF);
-    }
-    else
-    {
-      array = new byte[4];
-      array[0] = (byte) ((intValue >> 24) & 0xFF);
-      array[1] = (byte) ((intValue >> 16) & 0xFF);
-      array[2] = (byte) ((intValue >> 8)  & 0xFF);
-      array[3] = (byte) (intValue & 0xFF);
-    }
-
-    return array;
-  }
-
-
-
-  /**
-   * Decodes the contents of the provided byte array as an int.
-   *
-   * @param  byteArray  The byte array containing the data to decode.
-   *
-   * @return  The decoded int value.
-   */
-  private int decodeInt(byte[] byteArray)
-  {
-    int intValue = 0;
-
-    for (byte b : byteArray)
-    {
-      intValue <<= 8;
-      intValue |= (b & 0xFF);
-    }
-
-    return intValue;
-  }
 }
-

--
Gitblit v1.10.0