From e263f56c0c62b6941249f3541fd2c89e9ebb0306 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Tue, 29 May 2007 11:59:21 +0000
Subject: [PATCH] Fix issue 1580: support overriding of property default values.

---
 opendj-sdk/opends/resource/admin/preprocessor.xsl |  115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 113 insertions(+), 2 deletions(-)

diff --git a/opendj-sdk/opends/resource/admin/preprocessor.xsl b/opendj-sdk/opends/resource/admin/preprocessor.xsl
index 246a4e2..2931923 100644
--- a/opendj-sdk/opends/resource/admin/preprocessor.xsl
+++ b/opendj-sdk/opends/resource/admin/preprocessor.xsl
@@ -208,11 +208,15 @@
       <!--
         Copy all inherited properties.
       -->
-      <xsl:copy-of select="$hierarchy/adm:managed-object/adm:property" />
+      <xsl:variable name="property-overrides"
+        select="adm:property-override" />
+      <xsl:copy-of
+        select="$hierarchy/adm:managed-object/adm:property[not(@name=$property-overrides/@name)]" />
       <!--
         Copy all local properties.
       -->
-      <xsl:apply-templates select="adm:property|adm:property-reference"
+      <xsl:apply-templates
+        select="adm:property|adm:property-reference|adm:property-override"
         mode="pre-process">
         <xsl:with-param name="moname" select="@name" />
         <xsl:with-param name="mopackage" select="@package" />
@@ -463,6 +467,113 @@
     </xsl:element>
   </xsl:template>
   <!--
+    Pre-process a property override pulling in the inherited property
+    definition and by adding a "preprocessor" profile which contains
+    information about where the property was redefined.
+  -->
+  <xsl:template match="adm:property-override" mode="pre-process">
+    <xsl:param name="mopackage" select="/.." />
+    <xsl:param name="moname" select="/.." />
+    <xsl:param name="hierarchy" />
+    <!--
+      Make sure that this property override does not have the same name as another
+      property override in this managed object.
+    -->
+    <xsl:variable name="name" select="@name" />
+    <xsl:if test="../adm:property-override[@name=$name][2]">
+      <xsl:message terminate="yes">
+        <xsl:value-of
+          select="concat('Property override ', @name, ' is already overridden in this managed object')" />
+      </xsl:message>
+    </xsl:if>
+    <!--
+      Make sure that this property overrides an existing property.
+    -->
+    <xsl:if
+      test="not($hierarchy/adm:managed-object/adm:property[@name=$name])">
+      <xsl:message terminate="yes">
+        <xsl:value-of
+          select="concat('Cannot find inherited property ', @name, ' for property override')" />
+      </xsl:message>
+    </xsl:if>
+    <!--
+      Copy the inherited property definition taking care to override
+      the default behavior and admin action if required.
+    -->
+    <xsl:variable name="property"
+      select="$hierarchy/adm:managed-object/adm:property[@name=$name]" />
+    <xsl:element name="adm:property">
+      <xsl:copy-of select="$property/@*" />
+      <xsl:apply-templates
+        select="$property/adm:TODO | $property/adm:synopsis | $property/adm:description"
+        mode="pre-process">
+        <xsl:with-param name="mopackage" select="$mopackage" />
+        <xsl:with-param name="moname" select="$moname" />
+        <xsl:with-param name="hierarchy" select="$hierarchy" />
+      </xsl:apply-templates>
+      <xsl:choose>
+        <xsl:when test="adm:requires-admin-action">
+          <xsl:apply-templates select="adm:requires-admin-action"
+            mode="pre-process">
+            <xsl:with-param name="mopackage" select="$mopackage" />
+            <xsl:with-param name="moname" select="$moname" />
+            <xsl:with-param name="hierarchy" select="$hierarchy" />
+          </xsl:apply-templates>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates
+            select="$property/adm:requires-admin-action"
+            mode="pre-process">
+            <xsl:with-param name="mopackage" select="$mopackage" />
+            <xsl:with-param name="moname" select="$moname" />
+            <xsl:with-param name="hierarchy" select="$hierarchy" />
+          </xsl:apply-templates>
+        </xsl:otherwise>
+      </xsl:choose>
+      <xsl:choose>
+        <xsl:when test="adm:default-behavior">
+          <xsl:apply-templates select="adm:default-behavior"
+            mode="pre-process">
+            <xsl:with-param name="mopackage" select="$mopackage" />
+            <xsl:with-param name="moname" select="$moname" />
+            <xsl:with-param name="hierarchy" select="$hierarchy" />
+          </xsl:apply-templates>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates select="$property/adm:default-behavior"
+            mode="pre-process">
+            <xsl:with-param name="mopackage" select="$mopackage" />
+            <xsl:with-param name="moname" select="$moname" />
+            <xsl:with-param name="hierarchy" select="$hierarchy" />
+          </xsl:apply-templates>
+        </xsl:otherwise>
+      </xsl:choose>
+      <xsl:apply-templates
+        select="$property/adm:syntax | $property/adm:profile[@name!='preprocessor']"
+        mode="pre-process">
+        <xsl:with-param name="mopackage" select="$mopackage" />
+        <xsl:with-param name="moname" select="$moname" />
+        <xsl:with-param name="hierarchy" select="$hierarchy" />
+      </xsl:apply-templates>
+      <!--
+        Now append the preprocessor profile.
+      -->
+      <xsl:element name="adm:profile">
+        <xsl:attribute name="name">
+          <xsl:value-of select="'preprocessor'" />
+        </xsl:attribute>
+        <xsl:element name="admpp:managed-object">
+          <xsl:attribute name="name">
+            <xsl:value-of select="$moname" />
+          </xsl:attribute>
+          <xsl:attribute name="package">
+            <xsl:value-of select="$mopackage" />
+          </xsl:attribute>
+        </xsl:element>
+      </xsl:element>
+    </xsl:element>
+  </xsl:template>
+  <!--
     Pre-process a relation, merging information from the referenced
     managed object where required, and by adding a "preprocessor" profile
     which contains information about where the relation was defined.

--
Gitblit v1.10.0