From f3c2fff8d4282592a95e169a73cbccb423cbe451 Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 29 Mar 2016 19:01:08 +0000
Subject: [PATCH] Prep work for OPENDJ-2803 Migrate Attribute

---
 opendj-server-legacy/src/main/java/org/opends/server/types/AttributeBuilder.java     |  177 +++++-----------------------
 opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java                |   28 ++--
 opendj-server-legacy/src/test/java/org/opends/server/types/AttributeBuilderTest.java |   97 ----------------
 opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java               |    3 
 4 files changed, 50 insertions(+), 255 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/AttributeBuilder.java b/opendj-server-legacy/src/main/java/org/opends/server/types/AttributeBuilder.java
index 2c54a3a..8d312b9 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/AttributeBuilder.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/AttributeBuilder.java
@@ -16,8 +16,6 @@
  */
 package org.opends.server.types;
 
-import static org.opends.server.util.StaticUtils.*;
-
 import java.util.AbstractSet;
 import java.util.Collection;
 import java.util.Collections;
@@ -26,8 +24,6 @@
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.opendj.ldap.Assertion;
@@ -39,7 +35,6 @@
 import org.forgerock.opendj.ldap.schema.MatchingRule;
 import org.forgerock.util.Reject;
 import org.forgerock.util.Utils;
-import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.Attribute.RemoveOnceSwitchingAttributes;
 import org.opends.server.util.CollectionUtils;
 
@@ -174,7 +169,7 @@
     @Override
     public final boolean contains(ByteString value)
     {
-      return values.contains(createAttributeValue(getAttributeType(), value));
+      return values.contains(createAttributeValue(attributeDescription, value));
     }
 
     @Override
@@ -623,7 +618,7 @@
    */
   private static final class AttributeValue
   {
-    private final AttributeType attributeType;
+    private final AttributeDescription attributeDescription;
 
     /** User-provided value. */
     private final ByteString value;
@@ -634,14 +629,14 @@
     /**
      * Construct a new attribute value.
      *
-     * @param attributeType
-     *          The attribute type.
+     * @param attributeDescription
+     *          The attribute description.
      * @param value
      *          The value of the attribute.
      */
-    private AttributeValue(AttributeType attributeType, ByteString value)
+    private AttributeValue(AttributeDescription attributeDescription, ByteString value)
     {
-      this.attributeType = attributeType;
+      this.attributeDescription = attributeDescription;
       this.value = value;
     }
 
@@ -654,7 +649,7 @@
     {
       if (normalizedValue == null)
       {
-        normalizedValue = normalize(attributeType, value);
+        normalizedValue = normalize(attributeDescription, value);
       }
       return normalizedValue;
     }
@@ -757,14 +752,8 @@
     return builder.toAttribute();
   }
 
-  /** The attribute type for this attribute. */
-  private AttributeType attributeType;
-  /** The name of this attribute as provided by the end user. */
-  private String name;
-  /** The normalized set of options if there are more than one. */
-  private SortedSet<String> normalizedOptions;
-  /** The set of options. */
-  private final SmallSet<String> options = new SmallSet<>();
+  /** The attribute description for this attribute. */
+  private AttributeDescription attributeDescription;
   /** The set of attribute values, which are lazily normalized. */
   private Set<AttributeValue> values = new SmallSet<>();
 
@@ -804,8 +793,7 @@
    */
   public AttributeBuilder(AttributeDescription attributeDescription)
   {
-    this(attributeDescription.getAttributeType(), attributeDescription.getNameOrOID());
-    setOptions(attributeDescription.getOptions());
+    this.attributeDescription = attributeDescription;
   }
 
   /**
@@ -835,8 +823,7 @@
   {
     Reject.ifNull(attributeType, name);
 
-    this.attributeType = attributeType;
-    this.name = name;
+    this.attributeDescription = AttributeDescription.create(name, attributeType);
   }
 
 
@@ -853,7 +840,7 @@
    */
   public AttributeBuilder(String attributeName)
   {
-    this(DirectoryServer.getAttributeType(attributeName), attributeName);
+    this(AttributeDescription.valueOf(attributeName));
   }
 
 
@@ -887,7 +874,7 @@
    */
   public boolean add(ByteString attributeValue)
   {
-    AttributeValue value = createAttributeValue(attributeType, attributeValue);
+    AttributeValue value = createAttributeValue(attributeDescription, attributeValue);
     boolean isNewValue = values.add(value);
     if (!isNewValue)
     {
@@ -901,18 +888,19 @@
   }
 
   /** Creates an attribute value with delayed normalization. */
-  private static AttributeValue createAttributeValue(AttributeType attributeType, ByteString attributeValue)
+  private static AttributeValue createAttributeValue(AttributeDescription attributeDescription,
+      ByteString attributeValue)
   {
-    return new AttributeValue(attributeType, attributeValue);
+    return new AttributeValue(attributeDescription, attributeValue);
   }
 
-  private static ByteString normalize(AttributeType attributeType, ByteString attributeValue)
+  private static ByteString normalize(AttributeDescription attributeDescription, ByteString attributeValue)
   {
     try
     {
-      if (attributeType != null)
+      if (attributeDescription != null)
       {
-        final MatchingRule eqRule = attributeType.getEqualityMatchingRule();
+        final MatchingRule eqRule = attributeDescription.getAttributeType().getEqualityMatchingRule();
         return eqRule.normalizeAttributeValue(attributeValue);
       }
     }
@@ -1001,7 +989,7 @@
    */
   public boolean contains(ByteString value)
   {
-    return values.contains(createAttributeValue(attributeType, value));
+    return values.contains(createAttributeValue(attributeDescription, value));
   }
 
   /**
@@ -1027,21 +1015,6 @@
     return true;
   }
 
-
-
-  /**
-   * Retrieves the attribute type for this attribute builder.
-   *
-   * @return The attribute type for this attribute builder, or
-   *         <code>null</code> if one has not yet been specified.
-   */
-  public AttributeType getAttributeType()
-  {
-    return attributeType;
-  }
-
-
-
   /**
    * Returns <code>true</code> if this attribute builder contains no
    * attribute values.
@@ -1085,7 +1058,7 @@
    */
   public boolean remove(ByteString value)
   {
-    return values.remove(createAttributeValue(attributeType, value));
+    return values.remove(createAttributeValue(attributeDescription, value));
   }
 
   /**
@@ -1208,55 +1181,15 @@
     addAll(values);
   }
 
-
-
   /**
-   * Sets the attribute type associated with this attribute builder.
+   * Sets the attribute description associated with this attribute builder.
    *
-   * @param attributeType
-   *          The attribute type for this attribute builder.
+   * @param attrDesc
+   *          The attribute description for this attribute builder.
    */
-  public void setAttributeType(AttributeType attributeType)
+  void setAttributeDescription(AttributeDescription attrDesc)
   {
-    setAttributeType(attributeType, attributeType.getNameOrOID());
-  }
-
-
-
-  /**
-   * Sets the attribute type and user-provided name associated with
-   * this attribute builder.
-   *
-   * @param attributeType
-   *          The attribute type for this attribute builder.
-   * @param name
-   *          The user-provided name for this attribute builder.
-   */
-  public void setAttributeType(
-      AttributeType attributeType,
-      String name)
-  {
-    Reject.ifNull(attributeType, name);
-
-    this.attributeType = attributeType;
-    this.name = name;
-  }
-
-
-
-  /**
-   * Sets the attribute type associated with this attribute builder
-   * using the provided attribute type name.
-   * <p>
-   * If the attribute name cannot be found in the schema, a new
-   * attribute type is created using the default attribute syntax.
-   *
-   * @param attributeName
-   *          The attribute name for this attribute builder.
-   */
-  public void setAttributeType(String attributeName)
-  {
-    setAttributeType(DirectoryServer.getAttributeType(attributeName), attributeName);
+    attributeDescription = attrDesc;
   }
 
   /**
@@ -1270,29 +1203,13 @@
    */
   public boolean setOption(String option)
   {
-    switch (options.size())
+    AttributeDescription newAD = attributeDescription.withOption(option);
+    if (attributeDescription != newAD)
     {
-    case 0:
-      return options.add(option);
-    case 1:
-      // Normalize and add the first option to normalized set.
-      normalizedOptions = new TreeSet<>();
-      normalizedOptions.add(toLowerCase(options.firstElement));
-
-      if (normalizedOptions.add(toLowerCase(option)))
-      {
-        options.add(option);
-        return true;
-      }
-      return false;
-    default:
-      if (normalizedOptions.add(toLowerCase(option)))
-      {
-        options.add(option);
-        return true;
-      }
-      return false;
+      attributeDescription = newAD;
+      return true;
     }
+    return false;
   }
 
 
@@ -1397,7 +1314,7 @@
    */
   public Attribute toAttribute() throws IllegalStateException
   {
-    if (attributeType == null)
+    if (attributeDescription == null)
     {
       throw new IllegalStateException("Undefined attribute type or name");
     }
@@ -1406,10 +1323,7 @@
     Attribute attribute = toAttribute0();
 
     // Reset the state of this builder.
-    attributeType = null;
-    name = null;
-    normalizedOptions = null;
-    options.clear();
+    attributeDescription = null;
     values = new SmallSet<>();
 
     return attribute;
@@ -1417,20 +1331,7 @@
 
   private Attribute toAttribute0()
   {
-    return new RealAttribute(toAttributeDescription(name), values);
-  }
-
-  private AttributeDescription toAttributeDescription(String name)
-  {
-    switch (options.size())
-    {
-    case 0:
-      return AttributeDescription.create(name, attributeType);
-    case 1:
-      return AttributeDescription.create(name, attributeType, options.firstElement);
-    default:
-      return AttributeDescription.create(name, attributeType, options.elements);
-    }
+    return new RealAttribute(attributeDescription, values);
   }
 
   /**
@@ -1454,18 +1355,10 @@
   {
     StringBuilder builder = new StringBuilder();
     builder.append("AttributeBuilder(");
-    builder.append(name);
-
-    for (String option : options)
-    {
-      builder.append(';');
-      builder.append(option);
-    }
-
+    builder.append(attributeDescription);
     builder.append(", {");
     Utils.joinAsString(builder, ", ", values);
     builder.append("})");
-
     return builder.toString();
   }
 }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java b/opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java
index e7b63b9..fe7a952 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java
@@ -3565,8 +3565,7 @@
         entryBuffer.skip(1);
 
         AttributeDescription attrDesc = AttributeDescription.valueOf(name);
-        builder.setAttributeType(attrDesc.getAttributeType(), attrDesc.getNameOrOID());
-        builder.setOptions(attrDesc.getOptions());
+        builder.setAttributeDescription(attrDesc);
 
         // Next, we have the number of values.
         int numValues = entryBuffer.readBERLength();
@@ -3595,8 +3594,6 @@
     return attributes;
   }
 
-
-
   /**
    * Retrieves a list of the lines for this entry in LDIF form.  Long
    * lines will not be wrapped automatically.
@@ -4484,7 +4481,7 @@
                   {
                     // User requested non-default object class type name.
                     AttributeBuilder builder = new AttributeBuilder(ocAttr);
-                    builder.setAttributeType(ocType, attrName);
+                    builder.setAttributeDescription(AttributeDescription.create(attrName, ocType));
                     ocAttr = builder.toAttribute();
                   }
 
@@ -4531,10 +4528,11 @@
     final String attrName = attrDesc.getNameOrOID();
     for (Attribute attribute : sourceList)
     {
+      AttributeDescription subAttrDesc = attribute.getAttributeDescription();
       if (attribute.isEmpty()
           || (omitReal && attribute.isReal())
           || (omitVirtual && attribute.isVirtual())
-          || !attribute.getAttributeDescription().isSubTypeOf(attrDesc))
+          || !subAttrDesc.isSubTypeOf(attrDesc))
       {
         continue;
       }
@@ -4543,32 +4541,32 @@
         // If a non-default attribute name was provided or if the
         // attribute has options then we will need to rebuild the
         // attribute so that it contains the user-requested names and options.
-        AttributeDescription subAttrDesc = attribute.getAttributeDescription();
-        AttributeType subAttrType = subAttrDesc.getAttributeType();
+        final AttributeType subAttrType = subAttrDesc.getAttributeType();
 
-        if ((attrName != null && !attrName.equals(attribute.getAttributeDescription().getNameOrOID()))
+        if ((attrName != null && !attrName.equals(subAttrDesc.getNameOrOID()))
             || attrDesc.hasOptions())
         {
-          AttributeBuilder builder = new AttributeBuilder();
-
           // We want to use the user-provided name only if this attribute has
           // the same type as the requested type. This might not be the case for
           // sub-types e.g. requesting "name" and getting back "cn" - we don't
           // want to rename "name" to "cn".
-          if (attrName == null || !subAttrType.equals(attrDesc.getAttributeType()))
+          AttributeType attrType = attrDesc.getAttributeType();
+          AttributeDescription newAttrDesc;
+          if (attrName == null || !subAttrType.equals(attrType))
           {
-            builder.setAttributeType(subAttrType, attribute.getAttributeDescription().getNameOrOID());
+            newAttrDesc = AttributeDescription.create(subAttrDesc.getNameOrOID(), subAttrDesc.getAttributeType());
           }
           else
           {
-            builder.setAttributeType(subAttrType, attrName);
+            newAttrDesc = AttributeDescription.create(attrName, subAttrDesc.getAttributeType());
           }
+          AttributeBuilder builder = new AttributeBuilder(newAttrDesc);
 
           builder.setOptions(attrDesc.getOptions());
 
           // Now add in remaining options from original attribute
           // (this will not overwrite options already present).
-          builder.setOptions(attribute.getAttributeDescription().getOptions());
+          builder.setOptions(subAttrDesc.getOptions());
 
           if (!omitValues)
           {
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java b/opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java
index 9e51d83..4b90c7c 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java
@@ -42,6 +42,7 @@
 import org.forgerock.i18n.LocalizableMessageDescriptor.Arg0;
 import org.forgerock.i18n.LocalizedIllegalArgumentException;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.AttributeDescription;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ModificationType;
 import org.forgerock.opendj.ldap.ResultCode;
@@ -2454,7 +2455,7 @@
                                 builder.toAttribute()));
     }
 
-    builder.setAttributeType(elementType);
+    builder.setAttributeDescription(AttributeDescription.create(elementType));
     for (String s : newElements)
     {
       if (!oldElements.contains(s))
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/types/AttributeBuilderTest.java b/opendj-server-legacy/src/test/java/org/opends/server/types/AttributeBuilderTest.java
index 521d8e0..997e7fc 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/types/AttributeBuilderTest.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/types/AttributeBuilderTest.java
@@ -722,20 +722,6 @@
     Assert.assertFalse(builder.containsAll(Arrays.asList(av1, av2, av3)));
   }
 
-
-
-  /**
-   * Tests {@link AttributeBuilder#getAttributeType()}.
-   */
-  @Test
-  public void testAttributeBuilderGetAttributeType() throws Exception
-  {
-    AttributeBuilder builder = new AttributeBuilder(cnType);
-    Assert.assertEquals(builder.getAttributeType(), cnType);
-  }
-
-
-
   /**
    * Tests {@link AttributeBuilder#toAttribute()} throws
    * IllegalStateException after default constructor.
@@ -1024,89 +1010,6 @@
     Assert.assertTrue(a.contains(ByteString.valueOfUtf8("value4")));
   }
 
-
-
-  /**
-   * Tests {@link AttributeBuilder#setAttributeType(AttributeType)}.
-   */
-  @Test
-  public void testAttributeBuilderSetAttributeType1() throws Exception
-  {
-    AttributeBuilder builder = new AttributeBuilder();
-
-    Assert.assertNull(builder.getAttributeType());
-
-    builder.setAttributeType(cnType);
-    Assert.assertEquals(builder.getAttributeType(), cnType);
-
-    Attribute a = builder.toAttribute();
-    Assert.assertEquals(a.getAttributeDescription().getAttributeType(), cnType);
-    Assert.assertEquals(a.getAttributeDescription().getNameOrOID(), "cn");
-  }
-
-
-
-  /**
-   * Tests {@link AttributeBuilder#setAttributeType(String)}.
-   */
-  @Test
-  public void testAttributeBuilderSetAttributeType2() throws Exception
-  {
-    AttributeBuilder builder = new AttributeBuilder();
-
-    Assert.assertNull(builder.getAttributeType());
-
-    builder.setAttributeType("cn");
-    Assert.assertEquals(builder.getAttributeType(), cnType);
-
-    Attribute a = builder.toAttribute();
-    Assert.assertEquals(a.getAttributeDescription().getAttributeType(), cnType);
-    Assert.assertEquals(a.getAttributeDescription().getNameOrOID(), "cn");
-  }
-
-
-
-  /**
-   * Tests {@link AttributeBuilder#setAttributeType(String)}.
-   */
-  @Test
-  public void testAttributeBuilderSetAttributeType3() throws Exception
-  {
-    AttributeBuilder builder = new AttributeBuilder();
-
-    Assert.assertNull(builder.getAttributeType());
-
-    builder.setAttributeType("CN");
-    Assert.assertEquals(builder.getAttributeType(), cnType);
-
-    Attribute a = builder.toAttribute();
-    Assert.assertEquals(a.getAttributeDescription().getAttributeType(), cnType);
-    Assert.assertEquals(a.getAttributeDescription().getNameOrOID(), "CN");
-  }
-
-
-
-  /**
-   * Tests
-   * {@link AttributeBuilder#setAttributeType(AttributeType, String)}.
-   */
-  @Test
-  public void testAttributeBuilderSetAttributeType4() throws Exception
-  {
-    AttributeBuilder builder = new AttributeBuilder();
-
-    Assert.assertNull(builder.getAttributeType());
-
-    builder.setAttributeType(cnType, "CN");
-    Assert.assertEquals(builder.getAttributeType(), cnType);
-
-    Attribute a = builder.toAttribute();
-    Assert.assertEquals(a.getAttributeDescription().getAttributeType(), cnType);
-    Assert.assertEquals(a.getAttributeDescription().getNameOrOID(), "CN");
-  }
-
-
-
   /**
    * Tests {@link AttributeBuilder#setOptions(java.util.Collection)}.
    */

--
Gitblit v1.10.0