From 2d5b96b4f44bc2ac687fdb9718514d30add072e1 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Wed, 05 Feb 2014 23:24:27 +0000
Subject: [PATCH] OPENDJ-1235: Migrate configuration framework

---
 /dev/null                                                                               |   31 ---------------
 opendj-config-maven-plugin/src/main/resources/config/stylesheets/property-types/aci.xsl |    5 --
 opendj-config/src/main/java/org/forgerock/opendj/config/PropertyValueVisitor.java       |    3 -
 opendj-config/src/main/java/org/forgerock/opendj/config/ACIPropertyDefinition.java      |   57 +++++++++++++++++-----------
 4 files changed, 36 insertions(+), 60 deletions(-)

diff --git a/opendj-config-maven-plugin/src/main/resources/config/stylesheets/property-types/aci.xsl b/opendj-config-maven-plugin/src/main/resources/config/stylesheets/property-types/aci.xsl
index b0f5b19..be7654b 100644
--- a/opendj-config-maven-plugin/src/main/resources/config/stylesheets/property-types/aci.xsl
+++ b/opendj-config-maven-plugin/src/main/resources/config/stylesheets/property-types/aci.xsl
@@ -28,11 +28,8 @@
   <!-- 
     Templates for processing dseecompat ACI.
   -->
-  <xsl:template match="adm:aci" mode="java-value-imports">
-    <import>org.opends.server.authorization.dseecompat.Aci</import>
-  </xsl:template>
   <xsl:template match="adm:aci" mode="java-value-type">
-    <xsl:value-of select="'Aci'" />
+    <xsl:value-of select="'String'" />
   </xsl:template>
   <xsl:template match="adm:aci" mode="java-definition-type">
     <xsl:value-of select="'ACIPropertyDefinition'" />
diff --git a/opendj-config/src/main/java/org/forgerock/opendj/config/ACIPropertyDefinition.java b/opendj-config/src/main/java/org/forgerock/opendj/config/ACIPropertyDefinition.java
index 179a2b9..156a9cc 100644
--- a/opendj-config/src/main/java/org/forgerock/opendj/config/ACIPropertyDefinition.java
+++ b/opendj-config/src/main/java/org/forgerock/opendj/config/ACIPropertyDefinition.java
@@ -26,23 +26,20 @@
 
 package org.forgerock.opendj.config;
 
-import org.forgerock.util.Reject;
-import org.opends.server.authorization.dseecompat.Aci;
-import org.forgerock.i18n.LocalizedIllegalArgumentException;
-import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.DN;
-
 import java.util.EnumSet;
+import java.util.regex.Pattern;
+
+import org.forgerock.util.Reject;
 
 /**
  * ACI property definition.
  */
-public final class ACIPropertyDefinition extends PropertyDefinition<Aci> {
+public final class ACIPropertyDefinition extends PropertyDefinition<String> {
 
     /**
      * An interface for incrementally constructing ACI property definitions.
      */
-    public static final class Builder extends AbstractBuilder<Aci, ACIPropertyDefinition> {
+    public static final class Builder extends AbstractBuilder<String, ACIPropertyDefinition> {
 
         // Private constructor
         private Builder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
@@ -53,9 +50,9 @@
          * {@inheritDoc}
          */
         @Override
-        protected ACIPropertyDefinition buildInstance(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-            EnumSet<PropertyOption> options, AdministratorAction adminAction,
-            DefaultBehaviorProvider<Aci> defaultBehavior) {
+        protected ACIPropertyDefinition buildInstance(AbstractManagedObjectDefinition<?, ?> d,
+                String propertyName, EnumSet<PropertyOption> options,
+                AdministratorAction adminAction, DefaultBehaviorProvider<String> defaultBehavior) {
             return new ACIPropertyDefinition(d, propertyName, options, adminAction, defaultBehavior);
         }
     }
@@ -74,18 +71,27 @@
         return new Builder(d, propertyName);
     }
 
+    /**
+     * Pattern used for performing basic ACI syntax validation. Taken from the
+     * Aci class in the server.
+     */
+    private static final Pattern ACI_REGEX =
+            Pattern.compile("^\\s*(\\(\\s*(\\w+)\\s*(!?=)\\s*\"([^\"]+)\"\\s*\\)\\s*)*\\s*\\"
+                    + "(\\s*(?i)version(?-i)\\s*(\\d\\.\\d)\\s*;\\s*(?i)acl(?-i)\\s*\"([^\"]*)"
+                    + "\"\\s*;\\s*\\s*(\\w+)\\s*\\(([^()]+)\\)\\s*(.+?\"[)]*)\\s*;\\s*\\s*\\)\\s*$");
+
     // Private constructor.
     private ACIPropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-        EnumSet<PropertyOption> options, AdministratorAction adminAction,
-        DefaultBehaviorProvider<Aci> defaultBehavior) {
-        super(d, Aci.class, propertyName, options, adminAction, defaultBehavior);
+            EnumSet<PropertyOption> options, AdministratorAction adminAction,
+            DefaultBehaviorProvider<String> defaultBehavior) {
+        super(d, String.class, propertyName, options, adminAction, defaultBehavior);
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public void validateValue(Aci value) {
+    public void validateValue(String value) {
         Reject.ifNull(value);
 
         // No additional validation required.
@@ -95,15 +101,20 @@
      * {@inheritDoc}
      */
     @Override
-    public Aci decodeValue(String value) {
+    public String decodeValue(String value) {
         Reject.ifNull(value);
 
-        try {
-            return Aci.decode(ByteString.valueOf(value), DN.rootDN());
-        } catch (LocalizedIllegalArgumentException e) {
-            // TODO: it would be nice to throw the cause.
-            throw PropertyException.illegalPropertyValueException(this, value);
+        /*
+         * We don't have access to the ACI class from the server so do
+         * best-effort using regular expressions. TODO: is it worth improving on
+         * this? We could use reflection to get the appropriate parser which
+         * would allow us to use full validation in OpenDJ whilst remaining
+         * decoupled in other applications.
+         */
+        if (ACI_REGEX.matcher(value).matches()) {
+            return value;
         }
+        throw PropertyException.illegalPropertyValueException(this, value);
     }
 
     /**
@@ -118,7 +129,7 @@
      * {@inheritDoc}
      */
     @Override
-    public <R, P> R accept(PropertyValueVisitor<R, P> v, Aci value, P p) {
+    public <R, P> R accept(PropertyValueVisitor<R, P> v, String value, P p) {
         return v.visitACI(this, value, p);
     }
 
@@ -126,7 +137,7 @@
      * {@inheritDoc}
      */
     @Override
-    public int compare(Aci o1, Aci o2) {
+    public int compare(String o1, String o2) {
         return o1.toString().compareTo(o2.toString());
     }
 }
diff --git a/opendj-config/src/main/java/org/forgerock/opendj/config/PropertyValueVisitor.java b/opendj-config/src/main/java/org/forgerock/opendj/config/PropertyValueVisitor.java
index 1bb3350..c60a214 100644
--- a/opendj-config/src/main/java/org/forgerock/opendj/config/PropertyValueVisitor.java
+++ b/opendj-config/src/main/java/org/forgerock/opendj/config/PropertyValueVisitor.java
@@ -31,7 +31,6 @@
 import org.forgerock.opendj.ldap.AddressMask;
 import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.schema.AttributeType;
-import org.opends.server.authorization.dseecompat.Aci;
 
 /**
  * A visitor of property values, in the style of the visitor design pattern.
@@ -75,7 +74,7 @@
      *            A visitor specified parameter.
      * @return Returns a visitor specified result.
      */
-    public R visitACI(ACIPropertyDefinition pd, Aci v, P p) {
+    public R visitACI(ACIPropertyDefinition pd, String v, P p) {
         return visitUnknown(pd, v, p);
     }
 
diff --git a/opendj-config/src/main/java/org/opends/server/authorization/dseecompat/Aci.java b/opendj-config/src/main/java/org/opends/server/authorization/dseecompat/Aci.java
deleted file mode 100644
index 9906a7f..0000000
--- a/opendj-config/src/main/java/org/opends/server/authorization/dseecompat/Aci.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
- * or http://forgerock.org/license/CDDLv1.0.html.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at legal-notices/CDDLv1_0.txt.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information:
- *      Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- *
- *
- *      Copyright 2008 Sun Microsystems, Inc.
- *      Portions Copyright 2010-2013 ForgeRock AS
- */
-package org.opends.server.authorization.dseecompat;
-
-import org.forgerock.i18n.LocalizedIllegalArgumentException;
-import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.DN;
-
-/**
- * The Aci class represents ACI strings.
- */
-public class Aci implements Comparable<Aci> {
-    // TODO : to complete when implementing Aci support.
-
-    @Override
-    public int compareTo(Aci o) {
-        throw new RuntimeException("This class is not implemented");
-    }
-
-    /**
-     * Decode an ACI byte string.
-     *
-     * @param byteString
-     *            The ByteString containing the ACI string.
-     * @param dn
-     *            DN of the ACI entry.
-     * @return Returns a decoded ACI representing the string argument.
-     * @throws LocalizedIllegalArgumentException
-     *             If the parsing of the ACI string fails.
-     */
-    public static Aci decode(ByteString byteString, DN dn) {
-        throw new RuntimeException("This class is not implemented");
-    }
-}
diff --git a/opendj-config/src/main/java/org/opends/server/authorization/dseecompat/package-info.java b/opendj-config/src/main/java/org/opends/server/authorization/dseecompat/package-info.java
deleted file mode 100644
index e8181d0..0000000
--- a/opendj-config/src/main/java/org/opends/server/authorization/dseecompat/package-info.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
- * or http://forgerock.org/license/CDDLv1.0.html.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at legal-notices/CDDLv1_0.txt.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information:
- *      Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- *
- *
- *      Copyright 2008 Sun Microsystems, Inc.
- */
-/**
- * Contains the Directory Server Sun Java System Directory Server Enterprise
- * Edition (dseecompat) compatability access control handler implementation.
- */
-package org.opends.server.authorization.dseecompat;
-

--
Gitblit v1.10.0