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/client/ldap/LDAPManagedObject.java | 226 ++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 146 insertions(+), 80 deletions(-)
diff --git a/opends/src/server/org/opends/server/admin/client/ldap/LDAPManagedObject.java b/opends/src/server/org/opends/server/admin/client/ldap/LDAPManagedObject.java
index 63f5b46..0cb44f8 100644
--- a/opends/src/server/org/opends/server/admin/client/ldap/LDAPManagedObject.java
+++ b/opends/src/server/org/opends/server/admin/client/ldap/LDAPManagedObject.java
@@ -112,7 +112,7 @@
* The type of the property.
*/
private static class DefaultValueFinder<T> implements
- DefaultBehaviorProviderVisitor<T, Collection<T>, ManagedObjectPath> {
+ DefaultBehaviorProviderVisitor<T, Collection<T>, Void> {
/**
* Get the default values for the specified property.
@@ -125,6 +125,9 @@
* The managed object path of the current managed object.
* @param pd
* The property definition.
+ * @param isCreate
+ * Indicates whether the managed object has been created
+ * yet.
* @return Returns the default values for the specified property.
* @throws DefaultBehaviorException
* If the default values could not be retrieved or
@@ -132,20 +135,10 @@
*/
public static <T> Collection<T> getDefaultValues(
LDAPManagementContext context, ManagedObjectPath p,
- PropertyDefinition<T> pd) throws DefaultBehaviorException {
- DefaultValueFinder<T> v = new DefaultValueFinder<T>(context, pd);
- Collection<T> values = pd.getDefaultBehaviorProvider().accept(v, p);
-
- if (v.exception != null) {
- throw v.exception;
- }
-
- if (values.size() > 1 && !pd.hasOption(PropertyOption.MULTI_VALUED)) {
- throw new DefaultBehaviorException(pd,
- new PropertyIsSingleValuedException(pd));
- }
-
- return values;
+ PropertyDefinition<T> pd, boolean isCreate)
+ throws DefaultBehaviorException {
+ DefaultValueFinder<T> v = new DefaultValueFinder<T>(context, p, isCreate);
+ return v.find(p, pd);
}
// The LDAP management context.
@@ -155,16 +148,26 @@
// values.
private DefaultBehaviorException exception = null;
- // The property definition whose default values are required.
- private final PropertyDefinition<T> pd;
+ // Indicates whether the managed object has been created yet.
+ private final boolean isCreate;
+
+ // The path of the managed object containing the first property.
+ private final ManagedObjectPath firstPath;
+
+ // The path of the managed object containing the next property.
+ private ManagedObjectPath nextPath = null;
+
+ // The next property whose default values were required.
+ private PropertyDefinition<T> nextProperty = null;
// Private constructor.
private DefaultValueFinder(LDAPManagementContext context,
- PropertyDefinition<T> pd) {
+ ManagedObjectPath p, boolean isCreate) {
this.context = context;
- this.pd = pd;
+ this.firstPath = p;
+ this.isCreate = isCreate;
}
@@ -173,14 +176,14 @@
* {@inheritDoc}
*/
public Collection<T> visitAbsoluteInherited(
- AbsoluteInheritedDefaultBehaviorProvider<T> d, ManagedObjectPath p) {
+ AbsoluteInheritedDefaultBehaviorProvider<T> d, Void p) {
try {
return getInheritedProperty(d.getManagedObjectPath(), d
.getManagedObjectDefinition(), d.getPropertyName());
} catch (DefaultBehaviorException e) {
- exception = new DefaultBehaviorException(pd, e);
+ exception = e;
+ return Collections.emptySet();
}
- return Collections.emptySet();
}
@@ -189,7 +192,7 @@
* {@inheritDoc}
*/
public Collection<T> visitAlias(AliasDefaultBehaviorProvider<T> d,
- ManagedObjectPath p) {
+ Void p) {
return Collections.emptySet();
}
@@ -199,15 +202,15 @@
* {@inheritDoc}
*/
public Collection<T> visitDefined(DefinedDefaultBehaviorProvider<T> d,
- ManagedObjectPath p) {
+ Void p) {
Collection<String> stringValues = d.getDefaultValues();
List<T> values = new ArrayList<T>(stringValues.size());
for (String stringValue : stringValues) {
try {
- values.add(pd.decodeValue(stringValue));
+ values.add(nextProperty.decodeValue(stringValue));
} catch (IllegalPropertyValueStringException e) {
- exception = new DefaultBehaviorException(pd, e);
+ exception = new DefaultBehaviorException(nextProperty, e);
break;
}
}
@@ -221,14 +224,14 @@
* {@inheritDoc}
*/
public Collection<T> visitRelativeInherited(
- RelativeInheritedDefaultBehaviorProvider<T> d, ManagedObjectPath p) {
+ RelativeInheritedDefaultBehaviorProvider<T> d, Void p) {
try {
- return getInheritedProperty(d.getManagedObjectPath(p), d
+ return getInheritedProperty(d.getManagedObjectPath(nextPath), d
.getManagedObjectDefinition(), d.getPropertyName());
} catch (DefaultBehaviorException e) {
- exception = new DefaultBehaviorException(pd, e);
+ exception = e;
+ return Collections.emptySet();
}
- return Collections.emptySet();
}
@@ -237,81 +240,142 @@
* {@inheritDoc}
*/
public Collection<T> visitUndefined(UndefinedDefaultBehaviorProvider<T> d,
- ManagedObjectPath p) {
+ Void p) {
return Collections.emptySet();
}
+ // Find the default values for the next path/property.
+ private Collection<T> find(ManagedObjectPath p, PropertyDefinition<T> pd)
+ throws DefaultBehaviorException {
+ this.nextPath = p;
+ this.nextProperty = pd;
+
+ Collection<T> values = nextProperty.getDefaultBehaviorProvider().accept(
+ this, null);
+
+ if (exception != null) {
+ throw exception;
+ }
+
+ if (values.size() > 1 && !pd.hasOption(PropertyOption.MULTI_VALUED)) {
+ throw new DefaultBehaviorException(pd,
+ new PropertyIsSingleValuedException(pd));
+ }
+
+ return values;
+ }
+
+
+
// Get an inherited property value.
+ @SuppressWarnings("unchecked")
private Collection<T> getInheritedProperty(ManagedObjectPath target,
AbstractManagedObjectDefinition<?, ?> d, String propertyName)
throws DefaultBehaviorException {
+ // First check that the requested type of managed object
+ // corresponds to the path.
+ AbstractManagedObjectDefinition<?, ?> supr = target
+ .getManagedObjectDefinition();
+ if (!supr.isParentOf(d)) {
+ throw new DefaultBehaviorException(nextProperty,
+ new DefinitionDecodingException(Reason.WRONG_TYPE_INFORMATION));
+ }
+
+ // Save the current property in case of recursion.
+ PropertyDefinition<T> pd1 = nextProperty;
+
try {
- // First check that the requested type of managed object
- // corresponds to the path.
- AbstractManagedObjectDefinition<?, ?> supr = target
- .getManagedObjectDefinition();
- if (!supr.isParentOf(d)) {
- throw new DefinitionDecodingException(Reason.WRONG_TYPE_INFORMATION);
- }
+ // If the path relates to the current managed object and the
+ // managed object is in the process of being created it won't
+ // exist, so we should just use the default values of the
+ // referenced property.
+ if (isCreate && firstPath.equals(target)) {
+ PropertyDefinition<T> pd2;
+ try {
+ // FIXME: we use the definition taken from the default
+ // behavior here when we should really use the exact
+ // definition of the component being created.
+ PropertyDefinition<?> pdTmp = d.getPropertyDefinition(propertyName);
+ pd2 = pd1.getClass().cast(pdTmp);
+ } catch (IllegalArgumentException e) {
+ throw new PropertyNotFoundException(propertyName);
+ } catch (ClassCastException e) {
+ // FIXME: would be nice to throw a better exception here.
+ throw new PropertyNotFoundException(propertyName);
+ }
- // Get the actual managed object definition.
- LdapName dn = LDAPNameBuilder.create(target, context.getLDAPProfile());
- ManagedObjectDefinition<?, ?> mod = getEntryDefinition(context, d, dn);
-
- PropertyDefinition<?> pd2;
- try {
- pd2 = mod.getPropertyDefinition(propertyName);
- } catch (IllegalArgumentException e) {
- throw new PropertyNotFoundException(propertyName);
- }
-
- String attrID = context.getLDAPProfile().getAttributeName(mod, pd2);
- Attributes attributes = context.getLDAPConnection().readEntry(dn,
- Collections.singleton(attrID));
- Attribute attr = attributes.get(attrID);
- if (attr == null || attr.size() == 0) {
// Recursively retrieve this property's default values.
- Collection<?> tmp = getDefaultValues(context, target, pd2);
+ Collection<T> tmp = find(target, pd2);
Collection<T> values = new ArrayList<T>(tmp.size());
- for (Object o : tmp) {
- T value;
- try {
- value = pd.castValue(o);
- } catch (ClassCastException e) {
- throw new IllegalPropertyValueException(pd, o);
- }
- pd.validateValue(value);
+ for (T value : tmp) {
+ pd1.validateValue(value);
values.add(value);
}
return values;
} else {
- Collection<T> values = new LinkedList<T>();
- NamingEnumeration<?> ne = attr.getAll();
- while (ne.hasMore()) {
- Object value = ne.next();
- if (value != null) {
- values.add(pd.decodeValue(value.toString()));
- }
+ // Get the actual managed object definition.
+ LdapName dn = LDAPNameBuilder
+ .create(target, context.getLDAPProfile());
+ ManagedObjectDefinition<?, ?> mod =
+ getEntryDefinition(context, d, dn);
+
+ PropertyDefinition<T> pd2;
+ try {
+ PropertyDefinition<?> pdTmp = mod
+ .getPropertyDefinition(propertyName);
+ pd2 = pd1.getClass().cast(pdTmp);
+ } catch (IllegalArgumentException e) {
+ throw new PropertyNotFoundException(propertyName);
+ } catch (ClassCastException e) {
+ // FIXME: would be nice to throw a better exception here.
+ throw new PropertyNotFoundException(propertyName);
}
- return values;
+
+ String attrID = context.getLDAPProfile().getAttributeName(mod, pd2);
+ Attributes attributes = context.getLDAPConnection().readEntry(dn,
+ Collections.singleton(attrID));
+ Attribute attr = attributes.get(attrID);
+ if (attr == null || attr.size() == 0) {
+ // Recursively retrieve this property's default values.
+ Collection<T> tmp = find(target, pd2);
+ Collection<T> values = new ArrayList<T>(tmp.size());
+ for (T value : tmp) {
+ pd1.validateValue(value);
+ values.add(value);
+ }
+ return values;
+ } else {
+ Collection<T> values = new LinkedList<T>();
+ NamingEnumeration<?> ne = attr.getAll();
+ while (ne.hasMore()) {
+ Object value = ne.next();
+ if (value != null) {
+ values.add(pd1.decodeValue(value.toString()));
+ }
+ }
+ return values;
+ }
}
+ } catch (DefaultBehaviorException e) {
+ // Wrap any errors due to recursion.
+ throw new DefaultBehaviorException(pd1, e);
} catch (DefinitionDecodingException e) {
- throw new DefaultBehaviorException(pd, e);
+ throw new DefaultBehaviorException(pd1, e);
} catch (PropertyNotFoundException e) {
- throw new DefaultBehaviorException(pd, e);
+ throw new DefaultBehaviorException(pd1, e);
} catch (IllegalPropertyValueException e) {
- throw new DefaultBehaviorException(pd, e);
+ throw new DefaultBehaviorException(pd1, e);
} catch (IllegalPropertyValueStringException e) {
- throw new DefaultBehaviorException(pd, e);
+ throw new DefaultBehaviorException(pd1, e);
} catch (NameNotFoundException e) {
- throw new DefaultBehaviorException(pd,
+ throw new DefaultBehaviorException(pd1,
new ManagedObjectNotFoundException());
} catch (NoPermissionException e) {
- throw new DefaultBehaviorException(pd, new AuthorizationException(e));
+ throw new DefaultBehaviorException(pd1, new AuthorizationException(e));
} catch (NamingException e) {
- throw new DefaultBehaviorException(pd, new CommunicationException(e));
+ throw new DefaultBehaviorException(pd1, new CommunicationException(e));
}
}
};
@@ -462,6 +526,7 @@
/**
* {@inheritDoc}
*/
+ @SuppressWarnings("unchecked")
public <M extends ConfigurationClient, N extends M>
ManagedObject<N> createChild(
OptionalRelationDefinition<M, ?> r, ManagedObjectDefinition<N, ?> d,
@@ -878,7 +943,7 @@
PropertyDefinition<T> pd) throws DefaultBehaviorException {
try {
Collection<T> defaultValues = DefaultValueFinder.getDefaultValues(
- context, p, pd);
+ context, p, pd, true);
properties.addProperty(pd, defaultValues, Collections.<T> emptySet());
} catch (DefaultBehaviorException e) {
// Make sure that we have still created the property.
@@ -924,7 +989,8 @@
// Get the property's default values.
Collection<T> defaultValues;
try {
- defaultValues = DefaultValueFinder.getDefaultValues(context, p, pd);
+ defaultValues = DefaultValueFinder.getDefaultValues(context, p, pd,
+ false);
} catch (DefaultBehaviorException e) {
defaultValues = Collections.emptySet();
exception = e;
--
Gitblit v1.10.0