From 567150121840af35c215b2a4323cee149fc5802a Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Thu, 12 Jul 2007 22:48:25 +0000
Subject: [PATCH] Commit missed files from previous revision.
---
opends/src/server/org/opends/server/admin/LDAPProfile.java | 373 ++++++++++++++++++++++++++++++++++-------------------
1 files changed, 240 insertions(+), 133 deletions(-)
diff --git a/opends/src/server/org/opends/server/admin/LDAPProfile.java b/opends/src/server/org/opends/server/admin/LDAPProfile.java
index 5d0d807..46e222b 100644
--- a/opends/src/server/org/opends/server/admin/LDAPProfile.java
+++ b/opends/src/server/org/opends/server/admin/LDAPProfile.java
@@ -33,6 +33,8 @@
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
+import java.util.MissingResourceException;
+import java.util.NoSuchElementException;
import java.util.Set;
@@ -40,24 +42,115 @@
/**
* This class is used to map configuration elements to their LDAP
* schema names.
+ * <p>
+ * It is possible to augment the core LDAP profile with additional
+ * profile mappings at run-time using instances of {@link Wrapper}.
+ * This is useful for unit tests which need to add and remove mock
+ * components.
*/
-public abstract class LDAPProfile {
-
- // This class is abstract so that we can derive a mock LDAP profile
- // for testing.
-
- // The singleton instance.
- private static final LDAPProfile INSTANCE = new MyLDAPProfile();
-
-
+public final class LDAPProfile {
/**
- * Protected default constructor.
+ * LDAP profile wrappers can be used to provide temporary LDAP
+ * profile information for components which do not have LDAP profile
+ * property files. These components are typically "mock" components
+ * used in unit-tests.
*/
- protected LDAPProfile() {
- // No implementation required.
+ public static abstract class Wrapper {
+
+ /**
+ * Default constructor.
+ */
+ protected Wrapper() {
+ // No implementation required.
+ }
+
+
+
+ /**
+ * Get the name of the LDAP attribute associated with the
+ * specified property definition.
+ * <p>
+ * The default implementation of this method is to return
+ * <code>null</code>.
+ *
+ * @param d
+ * The managed object definition.
+ * @param pd
+ * The property definition.
+ * @return Returns the name of the LDAP attribute associated with
+ * the specified property definition, or <code>null</code>
+ * if the property definition is not handled by this LDAP
+ * profile wrapper.
+ */
+ public String getAttributeName(ManagedObjectDefinition<?, ?> d,
+ PropertyDefinition<?> pd) {
+ return null;
+ }
+
+
+
+ /**
+ * Gets the LDAP RDN attribute type for child entries of an
+ * instantiable relation.
+ * <p>
+ * The default implementation of this method is to return
+ * <code>null</code>.
+ *
+ * @param r
+ * The instantiable relation.
+ * @return Returns the LDAP RDN attribute type for child entries
+ * of an instantiable relation, or <code>null</code> if
+ * the instantiable relation is not handled by this LDAP
+ * profile wrapper.
+ */
+ public String getInstantiableRelationChildRDNType(
+ InstantiableRelationDefinition<?, ?> r) {
+ return null;
+ }
+
+
+
+ /**
+ * Get the principle object class associated with the specified
+ * definition.
+ * <p>
+ * The default implementation of this method is to return
+ * <code>null</code>.
+ *
+ * @param d
+ * The managed object definition.
+ * @return Returns the principle object class associated with the
+ * specified definition, or <code>null</code> if the
+ * managed object definition is not handled by this LDAP
+ * profile wrapper.
+ */
+ public String getObjectClass(AbstractManagedObjectDefinition<?, ?> d) {
+ return null;
+ }
+
+
+
+ /**
+ * Get an LDAP RDN sequence associatied with a relation.
+ * <p>
+ * The default implementation of this method is to return
+ * <code>null</code>.
+ *
+ * @param r
+ * The relation.
+ * @return Returns the LDAP RDN sequence associatied with a
+ * relation, or <code>null</code> if the relation is not
+ * handled by this LDAP profile wrapper.
+ */
+ public String getRelationRDNSequence(RelationDefinition<?, ?> r) {
+ return null;
+ }
}
+ // The singleton instance.
+ private static final LDAPProfile INSTANCE = new LDAPProfile();
+
/**
@@ -69,102 +162,45 @@
return INSTANCE;
}
+ // The list of profile wrappers.
+ private final LinkedList<Wrapper> profiles = new LinkedList<Wrapper>();;
+
+ // The LDAP profile property table.
+ private final ManagedObjectDefinitionResource resource =
+ ManagedObjectDefinitionResource.createForProfile("ldap");
+
+
+
+ // Prevent construction.
+ private LDAPProfile() {
+ // No implementation required.
+ }
+
/**
- * Concrete implementation.
+ * Get the name of the LDAP attribute associated with the specified
+ * property definition.
+ *
+ * @param d
+ * The managed object definition.
+ * @param pd
+ * The property definition.
+ * @return Returns the name of the LDAP attribute associated with
+ * the specified property definition.
+ * @throws MissingResourceException
+ * If the LDAP profile properties file associated with the
+ * provided managed object definition could not be loaded.
*/
- private static class MyLDAPProfile extends LDAPProfile {
-
- // The LDAP profile property table.
- private final ManagedObjectDefinitionResource resource;
-
-
-
- // Private constructor.
- private MyLDAPProfile() {
- this.resource = ManagedObjectDefinitionResource
- .createForProfile("ldap");
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- public String getInstantiableRelationChildRDNType(
- InstantiableRelationDefinition<?, ?> r) {
- return resource.getString(r.getParentDefinition(),
- "naming-attribute." + r.getName());
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- public List<String> getInstantiableRelationObjectClasses(
- InstantiableRelationDefinition<?, ?> r) {
- return Arrays.asList(new String[] { "top", "ds-cfg-branch" });
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- public String getRelationRDNSequence(RelationDefinition<?, ?> r) {
- return resource.getString(r.getParentDefinition(), "rdn."
- + r.getName());
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- public String getObjectClass(
- AbstractManagedObjectDefinition<?, ?> d) {
- return resource.getString(d, "objectclass");
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- public List<String> getObjectClasses(
- AbstractManagedObjectDefinition<?, ?> d) {
- LinkedList<String> objectClasses = new LinkedList<String>();
- Set<String> s = new HashSet<String>();
-
- // Add the object classes from the parent hierarchy.
- while (d != null) {
- String oc = getObjectClass(d);
- if (!s.contains(oc)) {
- objectClasses.addFirst(oc);
- s.add(oc);
- }
- d = d.getParent();
+ public String getAttributeName(ManagedObjectDefinition<?, ?> d,
+ PropertyDefinition<?> pd) throws MissingResourceException {
+ for (Wrapper profile : profiles) {
+ String attributeName = profile.getAttributeName(d, pd);
+ if (attributeName != null) {
+ return attributeName;
}
-
- // Make sure that we have top.
- if (!s.contains("top")) {
- objectClasses.addFirst("top");
- }
-
- return objectClasses;
}
-
-
-
- /**
- * {@inheritDoc}
- */
- public String getAttributeName(ManagedObjectDefinition<?, ?> d,
- PropertyDefinition<?> pd) {
- return resource.getString(d, "attribute." + pd.getName());
- }
+ return resource.getString(d, "attribute." + pd.getName());
}
@@ -177,9 +213,21 @@
* The instantiable relation.
* @return Returns the LDAP RDN attribute type for child entries of
* an instantiable relation.
+ * @throws MissingResourceException
+ * If the LDAP profile properties file associated with the
+ * provided managed object definition could not be loaded.
*/
- public abstract String getInstantiableRelationChildRDNType(
- InstantiableRelationDefinition<?, ?> r);
+ public String getInstantiableRelationChildRDNType(
+ InstantiableRelationDefinition<?, ?> r) throws MissingResourceException {
+ for (Wrapper profile : profiles) {
+ String rdnType = profile.getInstantiableRelationChildRDNType(r);
+ if (rdnType != null) {
+ return rdnType;
+ }
+ }
+ return resource.getString(r.getParentDefinition(), "naming-attribute."
+ + r.getName());
+ }
@@ -193,21 +241,10 @@
* @return Returns the LDAP object classes associated with an
* instantiable relation branch.
*/
- public abstract List<String> getInstantiableRelationObjectClasses(
- InstantiableRelationDefinition<?, ?> r);
-
-
-
- /**
- * Get an LDAP RDN sequence associatied with a relation.
- *
- * @param r
- * The relation.
- * @return Returns the LDAP RDN sequence associatied with a
- * relation.
- */
- public abstract String getRelationRDNSequence(
- RelationDefinition<?, ?> r);
+ public List<String> getInstantiableRelationObjectClasses(
+ InstantiableRelationDefinition<?, ?> r) {
+ return Arrays.asList(new String[] { "top", "ds-cfg-branch" });
+ }
@@ -219,9 +256,20 @@
* The managed object definition.
* @return Returns the principle object class associated with the
* specified definition.
+ * @throws MissingResourceException
+ * If the LDAP profile properties file associated with the
+ * provided managed object definition could not be loaded.
*/
- public abstract String getObjectClass(
- AbstractManagedObjectDefinition<?, ?> d);
+ public String getObjectClass(AbstractManagedObjectDefinition<?, ?> d)
+ throws MissingResourceException {
+ for (Wrapper profile : profiles) {
+ String objectClass = profile.getObjectClass(d);
+ if (objectClass != null) {
+ return objectClass;
+ }
+ }
+ return resource.getString(d, "objectclass");
+ }
@@ -236,23 +284,82 @@
* The managed object definition.
* @return Returns all the object classes associated with the
* specified definition.
+ * @throws MissingResourceException
+ * If the LDAP profile properties file associated with the
+ * provided managed object definition could not be loaded.
*/
- public abstract List<String> getObjectClasses(
- AbstractManagedObjectDefinition<?, ?> d);
+ public List<String> getObjectClasses(AbstractManagedObjectDefinition<?, ?> d)
+ throws MissingResourceException {
+ LinkedList<String> objectClasses = new LinkedList<String>();
+ Set<String> s = new HashSet<String>();
+
+ // Add the object classes from the parent hierarchy.
+ while (d != null) {
+ String oc = getObjectClass(d);
+ if (!s.contains(oc)) {
+ objectClasses.addFirst(oc);
+ s.add(oc);
+ }
+ d = d.getParent();
+ }
+
+ // Make sure that we have top.
+ if (!s.contains("top")) {
+ objectClasses.addFirst("top");
+ }
+
+ return objectClasses;
+ }
/**
- * Get the name of the LDAP attribute associated with the specified
- * property definition.
+ * Get an LDAP RDN sequence associatied with a relation.
*
- * @param d
- * The managed object definition.
- * @param pd
- * The property definition.
- * @return Returns the name of the LDAP attribute associated with
- * the specified property definition.
+ * @param r
+ * The relation.
+ * @return Returns the LDAP RDN sequence associatied with a
+ * relation.
+ * @throws MissingResourceException
+ * If the LDAP profile properties file associated with the
+ * provided managed object definition could not be loaded.
*/
- public abstract String getAttributeName(
- ManagedObjectDefinition<?, ?> d, PropertyDefinition<?> pd);
+ public String getRelationRDNSequence(RelationDefinition<?, ?> r)
+ throws MissingResourceException {
+ for (Wrapper profile : profiles) {
+ String rdnSequence = profile.getRelationRDNSequence(r);
+ if (rdnSequence != null) {
+ return rdnSequence;
+ }
+ }
+ return resource.getString(r.getParentDefinition(), "rdn." + r.getName());
+ }
+
+
+
+ /**
+ * Removes the last LDAP profile wrapper added using
+ * {@link #pushWrapper(org.opends.server.admin.LDAPProfile.Wrapper)}.
+ *
+ * @throws NoSuchElementException
+ * If there are no LDAP profile wrappers.
+ */
+ public void popWrapper() throws NoSuchElementException {
+ profiles.removeFirst();
+ }
+
+
+
+ /**
+ * Decorates the core LDAP profile with the provided LDAP profile
+ * wrapper. All profile requests will be directed to the provided
+ * wrapper before being forwarded onto the core profile if the
+ * request could not be satisfied.
+ *
+ * @param wrapper
+ * The LDAP profile wrapper.
+ */
+ public void pushWrapper(Wrapper wrapper) {
+ profiles.addFirst(wrapper);
+ }
}
--
Gitblit v1.10.0