From b6a7d650413cf42003ffae4910e3197d14e889be Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 19 Apr 2016 16:15:40 +0000
Subject: [PATCH] Code cleanup in ACIs

---
 opendj-server-legacy/src/main/java/org/opends/server/authorization/dseecompat/PatternRDN.java |   97 +++++++++++++++++++++---------------------------
 1 files changed, 43 insertions(+), 54 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/authorization/dseecompat/PatternRDN.java b/opendj-server-legacy/src/main/java/org/opends/server/authorization/dseecompat/PatternRDN.java
index 2411ab9..75a1d51 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/authorization/dseecompat/PatternRDN.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/authorization/dseecompat/PatternRDN.java
@@ -19,10 +19,9 @@
 import static org.opends.messages.AccessControlMessages.*;
 import static org.opends.server.util.CollectionUtils.*;
 
-import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Set;
 import java.util.TreeMap;
 
 import org.forgerock.i18n.LocalizableMessage;
@@ -30,6 +29,7 @@
 import org.forgerock.opendj.ldap.AVA;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.ldap.RDN;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.schema.AttributeType;
 import org.forgerock.opendj.ldap.schema.MatchingRule;
@@ -37,7 +37,6 @@
 import org.opends.server.types.Attribute;
 import org.opends.server.types.Attributes;
 import org.opends.server.types.DirectoryException;
-import org.forgerock.opendj.ldap.RDN;
 
 /**
  * This class is used to match RDN patterns containing wildcards in either
@@ -61,10 +60,7 @@
    * a list of one element A.  The value "*A*" is represented as a list
    * of three elements "", A and "".
    */
-  private ArrayList<ArrayList<ByteString>> valuePatterns;
-  /** The number of attribute-value pairs in this RDN pattern. */
-  private int numValues;
-
+  private List<List<ByteString>> valuePatterns;
 
   /**
    * Create a new RDN pattern composed of a single attribute-value pair.
@@ -73,7 +69,7 @@
    * @param dnString The DN pattern containing the attribute-value pair.
    * @throws DirectoryException If the attribute-value pair is not valid.
    */
-  public PatternRDN(String type, ArrayList<ByteString> valuePattern, String dnString)
+  public PatternRDN(String type, List<ByteString> valuePattern, String dnString)
        throws DirectoryException
   {
     // Only Whole-Type wildcards permitted.
@@ -89,7 +85,6 @@
       hasTypeWildcard = true;
     }
 
-    numValues = 1;
     typePatterns = new String[] { type };
     valuePatterns = newArrayList(valuePattern);
   }
@@ -105,9 +100,7 @@
    *          this RDN, or <CODE>false</CODE> if it was not (e.g., it
    *          was already present).
    */
-  public boolean addValue(String type, ArrayList<ByteString> valuePattern,
-                          String dnString)
-       throws DirectoryException
+  public boolean addValue(String type, List<ByteString> valuePattern, String dnString) throws DirectoryException
   {
     // No type wildcards permitted in multi-valued patterns.
     if (hasTypeWildcard || type.contains("*"))
@@ -117,13 +110,9 @@
       throw new DirectoryException(ResultCode.INVALID_DN_SYNTAX, message);
     }
 
-    numValues++;
-
-    String[] newTypes = new String[numValues];
-    System.arraycopy(typePatterns, 0, newTypes, 0,
-                     typePatterns.length);
-    newTypes[typePatterns.length] = type;
-    typePatterns = newTypes;
+    int oldLength = typePatterns.length;
+    typePatterns = Arrays.copyOf(typePatterns, oldLength + 1);
+    typePatterns[oldLength] = type;
 
     valuePatterns.add(valuePattern);
 
@@ -140,7 +129,7 @@
    */
   public int getNumValues()
   {
-    return numValues;
+    return typePatterns.length;
   }
 
 
@@ -164,40 +153,27 @@
         return false;
       }
 
-      AVA firstAVA = rdn.getFirstAVA();
-      AttributeType thatType = firstAVA.getAttributeType();
+      AVA ava = rdn.getFirstAVA();
       if (!typePatterns[0].equals("*"))
       {
         AttributeType thisType = DirectoryServer.getAttributeType(typePatterns[0]);
-        if (thisType.isPlaceHolder() || !thisType.equals(thatType))
+        if (thisType.isPlaceHolder() || !thisType.equals(ava.getAttributeType()))
         {
           return false;
         }
       }
 
-      return matchValuePattern(valuePatterns.get(0), thatType, firstAVA.getAttributeValue());
+      return matchValuePattern(valuePatterns.get(0), ava);
     }
 
-    if (hasTypeWildcard)
-    {
-      return false;
-    }
-
-    if (numValues != rdn.size())
+    if (hasTypeWildcard || typePatterns.length != rdn.size())
     {
       return false;
     }
 
     // Sort the attribute-value pairs by attribute type.
-    TreeMap<String,ArrayList<ByteString>> patternMap = new TreeMap<>();
-    TreeMap<String, ByteString> rdnMap = new TreeMap<>();
-
-    for (AVA ava : rdn)
-    {
-      rdnMap.put(ava.getAttributeType().getNameOrOID(), ava.getAttributeValue());
-    }
-
-    for (int i = 0; i < numValues; i++)
+    TreeMap<String, List<ByteString>> patternMap = new TreeMap<>();
+    for (int i = 0; i < typePatterns.length; i++)
     {
       AttributeType type = DirectoryServer.getAttributeType(typePatterns[i]);
       if (type.isPlaceHolder())
@@ -207,18 +183,12 @@
       patternMap.put(type.getNameOrOID(), valuePatterns.get(i));
     }
 
-    Set<String> patternKeys = patternMap.keySet();
-    Set<String> rdnKeys = rdnMap.keySet();
-    Iterator<String> patternKeyIter = patternKeys.iterator();
-    for (String rdnKey : rdnKeys)
+    Iterator<String> patternKeyIter = patternMap.keySet().iterator();
+    for (AVA ava : rdn)
     {
-      if (!rdnKey.equals(patternKeyIter.next()))
-      {
-        return false;
-      }
-
-      AttributeType rdnAttrType = DirectoryServer.getAttributeType(rdnKey);
-      if (!matchValuePattern(patternMap.get(rdnKey), rdnAttrType, rdnMap.get(rdnKey)))
+      String rdnKey = ava.getAttributeType().getNameOrOID();
+      if (!rdnKey.equals(patternKeyIter.next())
+          || !matchValuePattern(patternMap.get(rdnKey), ava))
       {
         return false;
       }
@@ -227,7 +197,6 @@
     return true;
   }
 
-
   /**
    * Determine whether a value pattern matches a given attribute-value pair.
    * @param pattern The value pattern where each element of the list is a
@@ -236,15 +205,15 @@
    * @param value The value of the attribute-value pair.
    * @return true if the value pattern matches the attribute-value pair.
    */
-  private boolean matchValuePattern(List<ByteString> pattern,
-                                    AttributeType type,
-                                    ByteString value)
+  private boolean matchValuePattern(List<ByteString> pattern, AVA ava)
   {
     if (pattern == null)
     {
       return true;
     }
 
+    final AttributeType type = ava.getAttributeType();
+    ByteString value = ava.getAttributeValue();
     try
     {
       if (pattern.size() == 1)
@@ -288,4 +257,24 @@
     }
   }
 
+  @Override
+  public String toString()
+  {
+    StringBuilder sb = new StringBuilder(getClass().getSimpleName()).append("(");
+    for (int i = 0; i < typePatterns.length; i++)
+    {
+      sb.append(typePatterns[i]).append("=");
+      List<ByteString> patterns = valuePatterns.get(i);
+      if (patterns.size() == 1)
+      {
+        sb.append(patterns.get(0));
+      }
+      else
+      {
+        sb.append(patterns);
+      }
+    }
+    sb.append(")");
+    return sb.toString();
+  }
 }

--
Gitblit v1.10.0