From 1821de05192e127c781c0971b39ccaf9c78e9060 Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 07 Jun 2016 10:40:22 +0000
Subject: [PATCH] SearchFilter.java: Use more AttributeDescription

---
 opendj-server-legacy/src/main/java/org/opends/server/types/SearchFilter.java        |  247 +++++++++++++++++--------------------------------
 opendj-server-legacy/src/main/java/org/opends/server/protocols/ldap/LDAPFilter.java |   21 ----
 2 files changed, 88 insertions(+), 180 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/protocols/ldap/LDAPFilter.java b/opendj-server-legacy/src/main/java/org/opends/server/protocols/ldap/LDAPFilter.java
index 4195d15..63a0a7a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/protocols/ldap/LDAPFilter.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/protocols/ldap/LDAPFilter.java
@@ -18,11 +18,8 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Set;
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.LocalizedIllegalArgumentException;
@@ -1888,8 +1885,6 @@
     }
 
     AttributeDescription attrDesc = null;
-    AttributeType attributeType = null;
-    Set<String> options = Collections.emptySet();
     if (attributeDescription != null)
     {
       try
@@ -1900,8 +1895,6 @@
       {
         throw new DirectoryException(ResultCode.PROTOCOL_ERROR, e.getMessageObject(), e);
       }
-      attributeType = attrDesc.getAttributeType();
-      options = toSet(attrDesc);
     }
     if (assertionValue != null && attrDesc == null)
     {
@@ -1924,23 +1917,11 @@
 
     ArrayList<ByteString> subAnyComps =
         subAnyElements != null ? new ArrayList<ByteString>(subAnyElements) : null;
-    return new SearchFilter(filterType, subComps, notComp, attributeType, options,
+    return new SearchFilter(filterType, subComps, notComp, attrDesc,
                             assertionValue, subInitialElement, subAnyComps,
                             subFinalElement, matchingRuleID, dnAttributes);
   }
 
-  private Set<String> toSet(AttributeDescription attrDesc)
-  {
-    LinkedHashSet<String> results = new LinkedHashSet<>();
-    for (String option : attrDesc.getOptions())
-    {
-      results.add(option);
-    }
-    return results;
-  }
-
-
-
   /**
    * Appends a string representation of this search filter to the provided
    * buffer.
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/SearchFilter.java b/opendj-server-legacy/src/main/java/org/opends/server/types/SearchFilter.java
index 764d835..acbb488 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/SearchFilter.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/SearchFilter.java
@@ -24,7 +24,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -65,9 +64,6 @@
 
   /** The attribute description for this filter. */
   private final AttributeDescription attributeDescription;
-  /** The attribute type for this filter. */
-  private final AttributeType attributeType;
-
   /** The assertion value for this filter. */
   private final ByteString assertionValue;
 
@@ -92,7 +88,21 @@
   /** The matching rule ID for this search filter. */
   private final String matchingRuleID;
 
-
+  private SearchFilter(FilterType filterType,
+                      Collection<SearchFilter> filterComponents,
+                      SearchFilter notComponent,
+                      AttributeType attributeType,
+                      Set<String> attributeOptions,
+                      ByteString assertionValue,
+                      ByteString subInitialElement,
+                      List<ByteString> subAnyElements,
+                      ByteString subFinalElement,
+                      String matchingRuleID, boolean dnAttributes)
+  {
+    this(filterType, filterComponents, notComponent,
+        attributeType != null ? AttributeDescription.create(attributeType, attributeOptions) : null,
+        assertionValue, subInitialElement, subAnyElements, subFinalElement, matchingRuleID, dnAttributes);
+  }
 
   /**
    * Creates a new search filter with the provided information.
@@ -102,9 +112,7 @@
    * @param  filterComponents   The set of filter components for AND
    *                            and OR filters.
    * @param  notComponent       The filter component for NOT filters.
-   * @param  attributeType      The attribute type for this filter.
-   * @param  attributeOptions   The set of attribute options for the
-   *                            associated attribute type.
+   * @param  attributeDescription The attribute description for this filter.
    * @param  assertionValue     The assertion value for this filter.
    * @param  subInitialElement  The subInitial element for substring
    *                            filters.
@@ -123,8 +131,7 @@
   public SearchFilter(FilterType filterType,
                       Collection<SearchFilter> filterComponents,
                       SearchFilter notComponent,
-                      AttributeType attributeType,
-                      Set<String> attributeOptions,
+                      AttributeDescription attributeDescription,
                       ByteString assertionValue,
                       ByteString subInitialElement,
                       List<ByteString> subAnyElements,
@@ -146,10 +153,7 @@
     this.filterType        = filterType;
     this.filterComponents  = new LinkedHashSet<>(filterComponents);
     this.notComponent      = notComponent;
-    this.attributeDescription = attributeType != null
-        ? AttributeDescription.create(attributeType, attributeOptions)
-        : null;
-    this.attributeType     = attributeType;
+    this.attributeDescription = attributeDescription;
     this.assertionValue    = assertionValue;
     this.subInitialElement = subInitialElement;
     this.subAnyElements    = subAnyElements;
@@ -171,8 +175,7 @@
                                                   filterComponents)
   {
     return new SearchFilter(FilterType.AND, filterComponents, null,
-                            null, null, null, null, null, null, null,
-                            false);
+                            null, null, null, null, null, null, false);
   }
 
 
@@ -189,8 +192,7 @@
                                                  filterComponents)
   {
     return new SearchFilter(FilterType.OR, filterComponents, null,
-                            null, null, null, null, null, null, null,
-                            false);
+                            null, null, null, null, null, null, false);
   }
 
 
@@ -206,8 +208,7 @@
                                   SearchFilter notComponent)
   {
     return new SearchFilter(FilterType.NOT, null, notComponent, null,
-                            null, null, null, null, null, null,
-                            false);
+                            null, null, null, null, null, false);
   }
 
 
@@ -761,56 +762,27 @@
     // The part of the filter string before the equal sign should be
     // the attribute type (with or without options).  Decode it.
     String attrType = filterString.substring(startPos, attrEndPos);
-    StringBuilder lowerType = new StringBuilder(attrType.length());
-    Set<String> attributeOptions = new HashSet<>();
-
-    int semicolonPos = attrType.indexOf(';');
-    if (semicolonPos < 0)
+    AttributeDescription attrDesc = AttributeDescription.valueOf(toLowerCase(attrType));
+    if (!attrDesc.getNameOrOID().equals(attrDesc.getAttributeType().getNameOrOID()))
     {
-      for (int i=0; i < attrType.length(); i++)
-      {
-        lowerType.append(Character.toLowerCase(attrType.charAt(i)));
-      }
-    }
-    else
-    {
-      for (int i=0; i < semicolonPos; i++)
-      {
-        lowerType.append(Character.toLowerCase(attrType.charAt(i)));
-      }
-
-      int nextPos = attrType.indexOf(';', semicolonPos+1);
-      while (nextPos > 0)
-      {
-        attributeOptions.add(attrType.substring(semicolonPos+1,
-                                                nextPos));
-        semicolonPos = nextPos;
-        nextPos = attrType.indexOf(';', semicolonPos+1);
-      }
-
-      attributeOptions.add(attrType.substring(semicolonPos+1));
+      attrDesc = AttributeDescription.create(attrDesc.getAttributeType(), toSet(attrDesc.getOptions()));
     }
 
     // Get the attribute value.
-    AttributeType attributeType = getAttributeType(attrType, lowerType);
     String valueStr = filterString.substring(equalPos+1, endPos);
     if (valueStr.length() == 0)
     {
-      return new SearchFilter(filterType, null, null, attributeType,
-                    attributeOptions, ByteString.empty(),
+      return new SearchFilter(filterType, null, null, attrDesc, ByteString.empty(),
                     null, null, null, null, false);
     }
     else if (valueStr.equals("*"))
     {
-      return new SearchFilter(FilterType.PRESENT, null, null,
-                              attributeType, attributeOptions, null,
+      return new SearchFilter(FilterType.PRESENT, null, null, attrDesc, null,
                               null, null, null, null, false);
     }
     else if (valueStr.indexOf('*') >= 0)
     {
-      return decodeSubstringFilter(filterString, attributeType,
-                                   attributeOptions, equalPos,
-                                   endPos);
+      return decodeSubstringFilter(filterString, attrDesc, equalPos, endPos);
     }
     else
     {
@@ -987,13 +959,20 @@
         userValue = ByteString.wrap(valueBytes);
       }
 
-      return new SearchFilter(filterType, null, null, attributeType,
-                              attributeOptions, userValue, null, null,
-                              null, null, false);
+      return new SearchFilter(filterType, null, null, attrDesc,
+                              userValue, null, null, null, null, false);
     }
   }
 
-
+  private static Set<String> toSet(Iterable<String> options)
+  {
+    LinkedHashSet<String> results = new LinkedHashSet<>();
+    for (String option : options)
+    {
+      results.add(option);
+    }
+    return results;
+  }
 
   /**
    * Decodes a set of filters from the provided filter string within
@@ -1036,8 +1015,7 @@
       {
         // This is valid and will be treated as a TRUE/FALSE filter.
         return new SearchFilter(filterType, filterComponents, null,
-                                null, null, null, null, null, null,
-                                null, false);
+                                null, null, null, null, null, null, false);
       }
     }
 
@@ -1127,14 +1105,12 @@
       }
       SearchFilter notComponent = filterComponents.get(0);
       return new SearchFilter(filterType, null, notComponent, null,
-                              null, null, null, null, null, null,
-                              false);
+                              null, null, null, null, null, false);
     }
     else
     {
       return new SearchFilter(filterType, filterComponents, null,
-                              null, null, null, null, null, null,
-                              null, false);
+                              null, null, null, null, null, null, false);
     }
   }
 
@@ -1145,10 +1121,8 @@
    *
    * @param  filterString  The filter string containing the
    *                       information to decode.
-   * @param  attrType      The attribute type for this substring
+   * @param  attrDesc      The attribute description for this substring
    *                       filter component.
-   * @param  options       The set of attribute options for the
-   *                       associated attribute type.
    * @param  equalPos      The location of the equal sign separating
    *                       the attribute type from the value.
    * @param  endPos        The position of the first character after
@@ -1161,8 +1135,8 @@
    */
   private static SearchFilter decodeSubstringFilter(
                                    String filterString,
-                                   AttributeType attrType,
-                                   Set<String> options, int equalPos,
+                                   AttributeDescription attrDesc,
+                                   int equalPos,
                                    int endPos)
           throws DirectoryException
   {
@@ -1723,7 +1697,7 @@
 
 
     return new SearchFilter(FilterType.SUBSTRING, null, null,
-                            attrType, options, null, subInitial,
+                            attrDesc, null, subInitial,
                             subAny, subFinal, null, false);
   }
 
@@ -1754,8 +1728,7 @@
                                    int equalPos, int endPos)
           throws DirectoryException
   {
-    AttributeType attributeType    = null;
-    Set<String>   attributeOptions = new HashSet<>();
+    AttributeDescription attrDesc  = null;
     boolean       dnAttributes     = false;
     String        matchingRuleID   = null;
 
@@ -1767,9 +1740,7 @@
          toLowerCase(filterString.substring(startPos, equalPos));
     if (filterString.charAt(startPos) == ':')
     {
-      // See if it starts with ":dn".  Otherwise, it much be the
-      // matching rule
-      // ID.
+      // See if it starts with ":dn". Otherwise, it much be the matching rule ID.
       if (lowerLeftStr.startsWith(":dn:"))
       {
         dnAttributes = true;
@@ -1796,38 +1767,7 @@
 
 
       String attrType = filterString.substring(startPos, colonPos);
-      StringBuilder lowerType = new StringBuilder(attrType.length());
-
-      int semicolonPos = attrType.indexOf(';');
-      if (semicolonPos <0)
-      {
-        for (int i=0; i < attrType.length(); i++)
-        {
-          lowerType.append(Character.toLowerCase(attrType.charAt(i)));
-        }
-      }
-      else
-      {
-        for (int i=0; i < semicolonPos; i++)
-        {
-          lowerType.append(Character.toLowerCase(attrType.charAt(i)));
-        }
-
-        int nextPos = attrType.indexOf(';', semicolonPos+1);
-        while (nextPos > 0)
-        {
-          attributeOptions.add(attrType.substring(semicolonPos+1,
-                                                  nextPos));
-          semicolonPos = nextPos;
-          nextPos = attrType.indexOf(';', semicolonPos+1);
-        }
-
-        attributeOptions.add(attrType.substring(semicolonPos+1));
-      }
-
-
-      // Get the attribute type for the specified name.
-      attributeType = getAttributeType(attrType, lowerType);
+      attrDesc = AttributeDescription.valueOf(toLowerCase(attrType));
 
       // If there is anything left, then it should be ":dn" and/or ":"
       // followed by the matching rule ID.
@@ -2029,7 +1969,7 @@
     // Make sure that the filter contains at least one of an attribute
     // type or a matching rule ID.  Also, construct the appropriate
     // attribute  value.
-    if (attributeType == null)
+    if (attrDesc == null)
     {
       if (matchingRuleID == null)
       {
@@ -2048,21 +1988,8 @@
       }
     }
 
-    return new SearchFilter(FilterType.EXTENSIBLE_MATCH, null, null,
-                            attributeType, attributeOptions, userValue,
-                            null, null, null, matchingRuleID,
-                            dnAttributes);
-  }
-
-  private static AttributeType getAttributeType(String attrType, StringBuilder lowerType)
-  {
-    AttributeType attributeType = DirectoryServer.getAttributeType(lowerType.toString());
-    if (attributeType.isPlaceHolder())
-    {
-      String typeStr = attrType.substring(0, lowerType.length());
-      attributeType = DirectoryServer.getAttributeType(typeStr);
-    }
-    return attributeType;
+    return new SearchFilter(FilterType.EXTENSIBLE_MATCH, null, null, attrDesc, userValue,
+                            null, null, null, matchingRuleID, dnAttributes);
   }
 
   /**
@@ -2111,7 +2038,7 @@
    */
   public AttributeType getAttributeType()
   {
-    return attributeType;
+    return attributeDescription != null ? attributeDescription.getAttributeType() : null;
   }
 
 
@@ -2620,7 +2547,7 @@
           throws DirectoryException
   {
     // Make sure that an attribute type has been defined.
-    if (attributeType == null)
+    if (getAttributeType() == null)
     {
       LocalizableMessage message =
           ERR_SEARCH_FILTER_EQUALITY_NO_ATTRIBUTE_TYPE.
@@ -2633,7 +2560,7 @@
     {
       LocalizableMessage message =
           ERR_SEARCH_FILTER_EQUALITY_NO_ASSERTION_VALUE.
-            get(entry.getName(), toString(), attributeType.getNameOrOID());
+            get(entry.getName(), toString(), getAttributeType().getNameOrOID());
       throw new DirectoryException(ResultCode.PROTOCOL_ERROR, message);
     }
 
@@ -2648,13 +2575,13 @@
             "filter %s because entry %s didn't have attribute " +
             "type %s",
                      this, completeFilter, entry.getName(),
-                     attributeType.getNameOrOID());
+                     getAttributeType().getNameOrOID());
       }
       return ConditionResult.FALSE;
     }
 
     // Get the equality matching rule for the given attribute type
-    MatchingRule matchingRule = attributeType.getEqualityMatchingRule();
+    MatchingRule matchingRule = getAttributeType().getEqualityMatchingRule();
     if (matchingRule == null)
     {
       if (logger.isTraceEnabled())
@@ -2662,7 +2589,7 @@
         logger.trace(
          "Attribute type %s does not have an equality matching " +
          "rule -- returning undefined.",
-         attributeType.getNameOrOID());
+            getAttributeType().getNameOrOID());
       }
       return ConditionResult.UNDEFINED;
     }
@@ -2693,7 +2620,7 @@
       logger.trace(
           "Returning %s for equality component %s in filter %s " +
               "because entry %s didn't have attribute type %s with value %s",
-          result, this, completeFilter, entry.getName(), attributeType.getNameOrOID(), assertionValue);
+          result, this, completeFilter, entry.getName(), getAttributeType().getNameOrOID(), assertionValue);
     }
     return result;
   }
@@ -2722,7 +2649,7 @@
           throws DirectoryException
   {
     // Make sure that an attribute type has been defined.
-    if (attributeType == null)
+    if (getAttributeType() == null)
     {
       LocalizableMessage message =
           ERR_SEARCH_FILTER_SUBSTRING_NO_ATTRIBUTE_TYPE.
@@ -2737,7 +2664,7 @@
     {
       LocalizableMessage message =
           ERR_SEARCH_FILTER_SUBSTRING_NO_SUBSTRING_COMPONENTS.
-            get(entry.getName(), toString(), attributeType.getNameOrOID());
+              get(entry.getName(), toString(), getAttributeType().getNameOrOID());
       throw new DirectoryException(ResultCode.PROTOCOL_ERROR, message);
     }
 
@@ -2752,7 +2679,7 @@
             "filter %s because entry %s didn't have attribute " +
             "type %s",
                      this, completeFilter, entry.getName(),
-                     attributeType.getNameOrOID());
+            getAttributeType().getNameOrOID());
       }
       return ConditionResult.FALSE;
     }
@@ -2825,7 +2752,7 @@
           throws DirectoryException
   {
     // Make sure that an attribute type has been defined.
-    if (attributeType == null)
+    if (getAttributeType() == null)
     {
       LocalizableMessage message =
           ERR_SEARCH_FILTER_GREATER_OR_EQUAL_NO_ATTRIBUTE_TYPE.
@@ -2838,7 +2765,7 @@
     {
       LocalizableMessage message =
           ERR_SEARCH_FILTER_GREATER_OR_EQUAL_NO_VALUE.
-            get(entry.getName(), toString(), attributeType.getNameOrOID());
+              get(entry.getName(), toString(), getAttributeType().getNameOrOID());
       throw new DirectoryException(ResultCode.PROTOCOL_ERROR, message);
     }
 
@@ -2852,7 +2779,7 @@
             "greater-or-equal component %s in filter %s " +
             "because entry %s didn't have attribute type %s",
                      this, completeFilter, entry.getName(),
-                     attributeType.getNameOrOID());
+            getAttributeType().getNameOrOID());
       }
       return ConditionResult.FALSE;
     }
@@ -2923,7 +2850,7 @@
           throws DirectoryException
   {
     // Make sure that an attribute type has been defined.
-    if (attributeType == null)
+    if (getAttributeType() == null)
     {
       LocalizableMessage message =
           ERR_SEARCH_FILTER_LESS_OR_EQUAL_NO_ATTRIBUTE_TYPE.
@@ -2936,7 +2863,7 @@
     {
       LocalizableMessage message =
           ERR_SEARCH_FILTER_LESS_OR_EQUAL_NO_ASSERTION_VALUE.
-            get(entry.getName(), toString(), attributeType.getNameOrOID());
+              get(entry.getName(), toString(), getAttributeType().getNameOrOID());
       throw new DirectoryException(ResultCode.PROTOCOL_ERROR, message);
     }
 
@@ -2950,7 +2877,7 @@
             "Returning FALSE for less-or-equal component %s in " +
             "filter %s because entry %s didn't have attribute " +
             "type %s", this, completeFilter, entry.getName(),
-                       attributeType.getNameOrOID());
+            getAttributeType().getNameOrOID());
       }
       return ConditionResult.FALSE;
     }
@@ -3021,7 +2948,7 @@
           throws DirectoryException
   {
     // Make sure that an attribute type has been defined.
-    if (attributeType == null)
+    if (getAttributeType() == null)
     {
       LocalizableMessage message =
           ERR_SEARCH_FILTER_PRESENCE_NO_ATTRIBUTE_TYPE.
@@ -3066,7 +2993,7 @@
           throws DirectoryException
   {
     // Make sure that an attribute type has been defined.
-    if (attributeType == null)
+    if (getAttributeType() == null)
     {
       LocalizableMessage message =
           ERR_SEARCH_FILTER_APPROXIMATE_NO_ATTRIBUTE_TYPE.
@@ -3079,7 +3006,7 @@
     {
       LocalizableMessage message =
           ERR_SEARCH_FILTER_APPROXIMATE_NO_ASSERTION_VALUE.
-            get(entry.getName(), toString(), attributeType.getNameOrOID());
+              get(entry.getName(), toString(), getAttributeType().getNameOrOID());
       throw new DirectoryException(ResultCode.PROTOCOL_ERROR, message);
     }
 
@@ -3093,7 +3020,7 @@
             "Returning FALSE for approximate component %s in " +
             "filter %s because entry %s didn't have attribute " +
             "type %s", this, completeFilter, entry.getName(),
-                       attributeType.getNameOrOID());
+            getAttributeType().getNameOrOID());
       }
       return ConditionResult.FALSE;
     }
@@ -3195,7 +3122,7 @@
     }
     else
     {
-      if (attributeType == null)
+      if (getAttributeType() == null)
       {
         LocalizableMessage message =
             ERR_SEARCH_FILTER_EXTENSIBLE_MATCH_NO_RULE_OR_TYPE.
@@ -3205,7 +3132,7 @@
       }
       else
       {
-        matchingRule = attributeType.getEqualityMatchingRule();
+        matchingRule = getAttributeType().getEqualityMatchingRule();
         if (matchingRule == null)
         {
           if (logger.isTraceEnabled())
@@ -3213,7 +3140,7 @@
             logger.trace(
              "Attribute type %s does not have an equality matching " +
              "rule -- returning undefined.",
-             attributeType.getNameOrOID());
+                getAttributeType().getNameOrOID());
           }
           return ConditionResult.UNDEFINED;
         }
@@ -3224,16 +3151,16 @@
     // If there is an attribute type, then check to see if there is a
     // corresponding matching rule use for the matching rule and
     // determine if it allows that attribute type.
-    if (attributeType != null)
+    if (getAttributeType() != null)
     {
       try
       {
         MatchingRuleUse mru = DirectoryServer.getSchema().getMatchingRuleUse(matchingRule);
-        if (!mru.hasAttribute(attributeType))
+        if (!mru.hasAttribute(getAttributeType()))
         {
           logger.trace("Attribute type %s is not allowed for use with "
               + "matching rule %s because of matching rule use definition %s",
-              attributeType.getNameOrOID(), matchingRule.getNameOrOID(), mru.getNameOrOID());
+              getAttributeType().getNameOrOID(), matchingRule.getNameOrOID(), mru.getNameOrOID());
           return ConditionResult.UNDEFINED;
         }
       }
@@ -3263,7 +3190,7 @@
     // that attribute.  Otherwise, we should check against all
     // attributes in the entry.
     ConditionResult result = ConditionResult.FALSE;
-    if (attributeType == null)
+    if (getAttributeType() == null)
     {
       for (List<Attribute> attrList :
            entry.getUserAttributes().values())
@@ -3429,7 +3356,7 @@
         {
           try
           {
-            if (attributeType == null || attributeType.equals(ava.getAttributeType()))
+            if (getAttributeType() == null || getAttributeType().equals(ava.getAttributeType()))
             {
               ByteString v = ava.getAttributeValue();
               ByteString nv = matchingRule.normalizeAttributeValue(v);
@@ -3554,7 +3481,7 @@
       return false;
     }
 
-    MatchingRule rule = attributeType.getSubstringMatchingRule();
+    MatchingRule rule = getAttributeType().getSubstringMatchingRule();
     if (rule == null)
     {
       return false;
@@ -3593,9 +3520,9 @@
 
   private boolean extensibleEqual(SearchFilter f)
   {
-    if (attributeType == null)
+    if (getAttributeType() == null)
     {
-      if (f.attributeType != null)
+      if (f.getAttributeType() != null)
       {
         return false;
       }
@@ -3690,7 +3617,7 @@
       case LESS_OR_EQUAL:
         return typeAndAssertionHashCode();
       case PRESENT:
-        return attributeType.hashCode();
+        return getAttributeType().hashCode();
       case APPROXIMATE_MATCH:
         return typeAndAssertionHashCode();
       case EXTENSIBLE_MATCH:
@@ -3706,9 +3633,9 @@
   {
     int hashCode = 0;
 
-    if (attributeType != null)
+    if (getAttributeType() != null)
     {
-      hashCode += attributeType.hashCode();
+      hashCode += getAttributeType().hashCode();
     }
 
     if (dnAttributes)
@@ -3731,13 +3658,13 @@
 
   private int typeAndAssertionHashCode()
   {
-    return attributeType.hashCode() + assertionValue.hashCode();
+    return getAttributeType().hashCode() + assertionValue.hashCode();
   }
 
   /** Returns hash code to use for substring filter. */
   private int substringHashCode()
   {
-    int hashCode = attributeType.hashCode();
+    int hashCode = getAttributeType().hashCode();
     if (subInitialElement != null)
     {
       hashCode += subInitialElement.hashCode();

--
Gitblit v1.10.0