From 65f47d9c24da91fdeac1eb6f012f44cc056ac4e4 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Thu, 25 Aug 2016 15:15:46 +0000
Subject: [PATCH] OPENDJ-3160 Support DN templates in reference property base DNs

---
 opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/DnTemplate.java |   13 +++++++------
 1 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/DnTemplate.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/DnTemplate.java
index b8e7ea2..83d561b 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/DnTemplate.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/DnTemplate.java
@@ -44,10 +44,11 @@
  * </table>
  */
 final class DnTemplate {
-    private static final Pattern TEMPLATE_KEY_RE = Pattern.compile("\\{([^}]+)\\}");
+    private static final Pattern TEMPLATE_VARIABLE_RE = Pattern.compile("\\{([^}]+)\\}");
     private final String template;
     private final String formatString;
     private final List<String> variables;
+    /** A value of -1 means that this DN template is absolute. */
     private final int relativeOffset;
 
     /**
@@ -65,8 +66,7 @@
 
     /**
      * Compiles a DN template which will resolve LDAP entries relative to the root DSE by default, but MAY include
-     * relative RDNs indicating that that the DN template will be resolved against current routing state
-     * instead.
+     * relative RDNs indicating that the DN template will be resolved against current routing state instead.
      *
      * @param template
      *         The string representation of the DN template.
@@ -100,7 +100,7 @@
         }
 
         final List<String> templateVariables = new ArrayList<>();
-        final Matcher matcher = TEMPLATE_KEY_RE.matcher(trimmedTemplate);
+        final Matcher matcher = TEMPLATE_VARIABLE_RE.matcher(trimmedTemplate);
         final StringBuffer buffer = new StringBuffer(trimmedTemplate.length());
         while (matcher.find()) {
             matcher.appendReplacement(buffer, "%s");
@@ -121,7 +121,8 @@
         // First determine the base DN based on the context DN and the relative offset.
         DN baseDn = null;
         if (relativeOffset >= 0 && context.containsContext(RoutingContext.class)) {
-            baseDn = context.asContext(RoutingContext.class).getDn().parent(relativeOffset);
+            final RoutingContext routingContext = context.asContext(RoutingContext.class);
+            baseDn = routingContext.getDn().parent(routingContext.isCollection() ? relativeOffset - 1 : relativeOffset);
         }
         if (baseDn == null) {
             baseDn = DN.rootDN();
@@ -152,7 +153,7 @@
                 return value;
             }
             if (!uriRouterContext.getParent().containsContext(UriRouterContext.class)) {
-                throw new IllegalStateException("DN template parameter " + parameter + " cannot be resolved");
+                throw new IllegalStateException("DN template parameter \"" + parameter + "\" cannot be resolved");
             }
             uriRouterContext = uriRouterContext.getParent().asContext(UriRouterContext.class);
         }

--
Gitblit v1.10.0