From 980147a25e6e1d817e24c0fa7ebe173313dce27d Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Thu, 19 Apr 2007 20:47:34 +0000
Subject: [PATCH] Fix a bug in add/delete listener registration for instantiable (one-to-many) relations. Listener registration would fail if the entry associated with the relation did not exist (this is the case when the parent managed object has only just been created). The solution is to wait for the "relation" entry to be created and, when it is added, automatically register the add/delete listener then. This automatic registration is managed by a "delayed" config add listener which is registered against the parent managed object.
---
opends/src/server/org/opends/server/admin/server/ServerManagedObject.java | 63 +++++++++++++++++++------------
1 files changed, 39 insertions(+), 24 deletions(-)
diff --git a/opends/src/server/org/opends/server/admin/server/ServerManagedObject.java b/opends/src/server/org/opends/server/admin/server/ServerManagedObject.java
index 67d12df..99ebc42 100644
--- a/opends/src/server/org/opends/server/admin/server/ServerManagedObject.java
+++ b/opends/src/server/org/opends/server/admin/server/ServerManagedObject.java
@@ -720,10 +720,19 @@
validateRelationDefinition(d);
DN baseDN = DNBuilder.create(path, d);
- ConfigEntry configEntry = getListenerConfigEntry(baseDN);
+ ConfigEntry relationEntry = getListenerConfigEntry(baseDN);
ConfigAddListener adaptor = new ConfigAddListenerAdaptor<M>(path,
d, listener);
- configEntry.registerAddListener(adaptor);
+
+ if (relationEntry != null) {
+ relationEntry.registerAddListener(adaptor);
+ } else {
+ // The relation entry does not exist yet so register a delayed
+ // add listener.
+ ConfigAddListener delayedListener = new DelayedConfigAddListener(
+ configEntry.getDN(), baseDN, adaptor);
+ configEntry.registerAddListener(delayedListener);
+ }
}
@@ -795,11 +804,19 @@
validateRelationDefinition(d);
DN baseDN = DNBuilder.create(path, d);
- ConfigEntry configEntry = getListenerConfigEntry(baseDN);
-
+ ConfigEntry relationEntry = getListenerConfigEntry(baseDN);
ConfigDeleteListener adaptor = new ConfigDeleteListenerAdaptor<M>(
path, d, listener);
- configEntry.registerDeleteListener(adaptor);
+
+ if (relationEntry != null) {
+ relationEntry.registerDeleteListener(adaptor);
+ } else {
+ // The relation entry does not exist yet so register a delayed
+ // add listener.
+ ConfigAddListener delayedListener = new DelayedConfigAddListener(
+ configEntry.getDN(), baseDN, adaptor);
+ configEntry.registerAddListener(delayedListener);
+ }
}
@@ -851,11 +868,13 @@
DN baseDN, ConfigurationAddListener<M> listener) {
try {
ConfigEntry configEntry = getListenerConfigEntry(baseDN);
- for (ConfigAddListener l : configEntry.getAddListeners()) {
- if (l instanceof ConfigAddListenerAdaptor) {
- ConfigAddListenerAdaptor adaptor = (ConfigAddListenerAdaptor) l;
- if (adaptor.getConfigurationAddListener() == listener) {
- configEntry.deregisterAddListener(adaptor);
+ if (configEntry != null) {
+ for (ConfigAddListener l : configEntry.getAddListeners()) {
+ if (l instanceof ConfigAddListenerAdaptor) {
+ ConfigAddListenerAdaptor adaptor = (ConfigAddListenerAdaptor) l;
+ if (adaptor.getConfigurationAddListener() == listener) {
+ configEntry.deregisterAddListener(adaptor);
+ }
}
}
}
@@ -875,11 +894,15 @@
ConfigurationDeleteListener<M> listener) {
try {
ConfigEntry configEntry = getListenerConfigEntry(baseDN);
- for (ConfigDeleteListener l : configEntry.getDeleteListeners()) {
- if (l instanceof ConfigDeleteListenerAdaptor) {
- ConfigDeleteListenerAdaptor adaptor = (ConfigDeleteListenerAdaptor) l;
- if (adaptor.getConfigurationDeleteListener() == listener) {
- configEntry.deregisterDeleteListener(adaptor);
+ if (configEntry != null) {
+ for (ConfigDeleteListener l : configEntry
+ .getDeleteListeners()) {
+ if (l instanceof ConfigDeleteListenerAdaptor) {
+ ConfigDeleteListenerAdaptor adaptor =
+ (ConfigDeleteListenerAdaptor) l;
+ if (adaptor.getConfigurationDeleteListener() == listener) {
+ configEntry.deregisterDeleteListener(adaptor);
+ }
}
}
}
@@ -915,7 +938,7 @@
// Gets a config entry required for a listener and throws a config
- // exception on failure.
+ // exception on failure or returns null if the entry does not exist.
private ConfigEntry getListenerConfigEntry(DN dn)
throws ConfigException {
// Attempt to retrieve the listener base entry.
@@ -934,14 +957,6 @@
throw new ConfigException(msgID, message, e);
}
- // The configuration handler is free to return null indicating
- // that the entry does not exist.
- if (configEntry == null) {
- int msgID = AdminMessages.MSGID_ADMIN_LISTENER_BASE_DOES_NOT_EXIST;
- String message = getMessage(msgID, String.valueOf(dn));
- throw new ConfigException(msgID, message);
- }
-
return configEntry;
}
--
Gitblit v1.10.0