From 3effaf3ab3c08972d5dd6f79b34ae72ed27ff202 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 03 Nov 2014 15:09:47 +0000
Subject: [PATCH] Code cleanup
---
opendj3-server-dev/src/server/org/opends/server/core/BackendConfigManager.java | 440 ++++++++++++++++++++----------------------------------
1 files changed, 163 insertions(+), 277 deletions(-)
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/BackendConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/BackendConfigManager.java
index 75d2610..d348131 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/BackendConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/BackendConfigManager.java
@@ -25,41 +25,41 @@
* Portions Copyright 2014 ForgeRock AS
*/
package org.opends.server.core;
-import org.forgerock.i18n.LocalizableMessage;
-
-
-
-
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.config.server.ConfigException;
+import org.forgerock.opendj.ldap.ResultCode;
+import org.opends.server.admin.server.ConfigurationAddListener;
+import org.opends.server.admin.server.ConfigurationChangeListener;
+import org.opends.server.admin.server.ConfigurationDeleteListener;
+import org.opends.server.admin.server.ServerManagementContext;
+import org.opends.server.admin.std.meta.BackendCfgDefn;
+import org.opends.server.admin.std.server.BackendCfg;
+import org.opends.server.admin.std.server.RootCfg;
import org.opends.server.api.Backend;
import org.opends.server.api.BackendInitializationListener;
import org.opends.server.api.ConfigHandler;
-import org.forgerock.opendj.config.server.ConfigException;
-import org.opends.server.config.ConfigEntry;
import org.opends.server.config.ConfigConstants;
-import org.opends.server.types.*;
-import org.forgerock.opendj.ldap.ResultCode;
-import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.opends.server.config.ConfigEntry;
+import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DN;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
+import org.opends.server.types.WritabilityMode;
+import static org.forgerock.opendj.ldap.ResultCode.*;
import static org.opends.messages.ConfigMessages.*;
import static org.opends.server.util.StaticUtils.*;
-import org.opends.server.admin.server.ConfigurationChangeListener;
-import org.opends.server.admin.server.ConfigurationAddListener;
-import org.opends.server.admin.server.ConfigurationDeleteListener;
-import org.opends.server.admin.server.ServerManagementContext;
-import org.opends.server.admin.std.server.BackendCfg;
-import org.opends.server.admin.std.server.RootCfg;
-import org.opends.server.admin.std.meta.BackendCfgDefn;
-
-
/**
* This class defines a utility that will be used to manage the configuration
* for the set of backends defined in the Directory Server. It will perform
@@ -79,8 +79,7 @@
* The mapping between configuration entry DNs and their corresponding backend
* implementations.
*/
- private final ConcurrentHashMap<DN,Backend> registeredBackends;
-
+ private final ConcurrentHashMap<DN, Backend<?>> registeredBackends = new ConcurrentHashMap<DN, Backend<?>>();
private final ServerContext serverContext;
/**
@@ -92,7 +91,6 @@
public BackendConfigManager(ServerContext serverContext)
{
this.serverContext = serverContext;
- registeredBackends = new ConcurrentHashMap<DN,Backend>();
}
/**
@@ -176,16 +174,13 @@
// for the backend implementation. If it does, then load it and make
// sure that it's a valid backend implementation. There is no such
// attribute, the specified class cannot be loaded, or it does not
- // contain a valid backend implementation, then log an error and skip
- // it.
+ // contain a valid backend implementation, then log an error and skip it.
String className = backendCfg.getJavaClass();
- Class backendClass;
- Backend backend;
+ Backend<?> backend;
try
{
- backendClass = DirectoryServer.loadClass(className);
- backend = (Backend) backendClass.newInstance();
+ backend = loadBackendClass(className).newInstance();
}
catch (Exception e)
{
@@ -203,24 +198,7 @@
continue;
}
-
- // See if the entry contains an attribute that specifies the writability
- // mode.
- WritabilityMode writabilityMode = WritabilityMode.ENABLED;
- BackendCfgDefn.WritabilityMode bwm =
- backendCfg.getWritabilityMode();
- switch (bwm)
- {
- case DISABLED:
- writabilityMode = WritabilityMode.DISABLED;
- break;
- case ENABLED:
- writabilityMode = WritabilityMode.ENABLED;
- break;
- case INTERNAL_ONLY:
- writabilityMode = WritabilityMode.INTERNAL_ONLY;
- break;
- }
+ WritabilityMode writabilityMode = toWritabilityMode(backendCfg.getWritabilityMode());
// Set the backend ID and writability mode for this backend.
backend.setBackendID(backendID);
@@ -318,9 +296,8 @@
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public boolean isConfigurationChangeAcceptable(
BackendCfg configEntry,
List<LocalizableMessage> unacceptableReason)
@@ -332,21 +309,11 @@
// See if the backend is registered with the server. If it is, then
// see what's changed and whether those changes are acceptable.
- Backend backend = registeredBackends.get(backendDN);
+ Backend<?> backend = registeredBackends.get(backendDN);
if (backend != null)
{
- LinkedHashSet<DN> removedDNs = new LinkedHashSet<DN>();
- for (DN dn : backend.getBaseDNs())
- {
- removedDNs.add(dn);
- }
-
- LinkedHashSet<DN> addedDNs = new LinkedHashSet<DN>();
- for (DN dn : baseDNs)
- {
- addedDNs.add(dn);
- }
-
+ LinkedHashSet<DN> removedDNs = new LinkedHashSet<DN>(Arrays.asList(backend.getBaseDNs()));
+ LinkedHashSet<DN> addedDNs = new LinkedHashSet<DN>(baseDNs);
Iterator<DN> iterator = removedDNs.iterator();
while (iterator.hasNext())
{
@@ -400,14 +367,14 @@
String className = configEntry.getJavaClass();
try
{
- Class backendClass = DirectoryServer.loadClass(className);
+ Class<Backend<?>> backendClass = loadBackendClass(className);
if (! Backend.class.isAssignableFrom(backendClass))
{
unacceptableReason.add(ERR_CONFIG_BACKEND_CLASS_NOT_BACKEND.get(className, backendDN));
return false;
}
- Backend b = (Backend) backendClass.newInstance();
+ Backend b = backendClass.newInstance();
if (! b.isConfigurationAcceptable(configEntry, unacceptableReason))
{
return false;
@@ -429,13 +396,12 @@
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public ConfigChangeResult applyConfigurationChange(BackendCfg cfg)
{
DN backendDN = cfg.dn();
- Backend backend = registeredBackends.get(backendDN);
+ Backend<?> backend = registeredBackends.get(backendDN);
ResultCode resultCode = ResultCode.SUCCESS;
boolean adminActionRequired = false;
ArrayList<LocalizableMessage> messages = new ArrayList<LocalizableMessage>();
@@ -452,11 +418,7 @@
if (backend == null)
{
needToEnable = true;
- }
- else
- {
- // It's already enabled, so we don't need to do anything.
- }
+ } // else already enabled, no need to do anything.
}
else
{
@@ -495,20 +457,14 @@
// FIXME -- Do we need to send an admin alert?
}
- return new ConfigChangeResult(resultCode, adminActionRequired,
- messages);
- }
- else
- {
- // It's already disabled, so we don't need to do anything.
- }
+ return new ConfigChangeResult(resultCode, adminActionRequired, messages);
+ } // else already disabled, no need to do anything.
}
}
catch (Exception e)
{
logger.traceException(e);
-
messages.add(ERR_CONFIG_BACKEND_UNABLE_TO_DETERMINE_ENABLED_STATE.get(
backendDN, stackTraceToSingleLineString(e)));
resultCode = DirectoryServer.getServerErrorResultCode();
@@ -516,35 +472,8 @@
}
- // See if the entry contains an attribute that specifies the backend ID for
- // the backend.
String backendID = cfg.getBackendId();
-
- // See if the entry contains an attribute that specifies the writability
- // mode.
- WritabilityMode writabilityMode = WritabilityMode.ENABLED;
- BackendCfgDefn.WritabilityMode bwm =
- cfg.getWritabilityMode();
- switch (bwm)
- {
- case DISABLED:
- writabilityMode = WritabilityMode.DISABLED;
- break;
- case ENABLED:
- writabilityMode = WritabilityMode.ENABLED;
- break;
- case INTERNAL_ONLY:
- writabilityMode = WritabilityMode.INTERNAL_ONLY;
- break;
- }
-
-
- // See if the entry contains an attribute that specifies the base DNs for
- // the backend.
- Set<DN> baseList = cfg.getBaseDN();
- DN[] baseDNs = new DN[baseList.size()];
- baseList.toArray(baseDNs);
-
+ WritabilityMode writabilityMode = toWritabilityMode(cfg.getWritabilityMode());
// See if the entry contains an attribute that specifies the class name
// for the backend implementation. If it does, then load it and make sure
@@ -556,43 +485,38 @@
// See if this backend is currently active and if so if the name of the
// class is the same.
- if (backend != null)
+ if (backend != null && !className.equals(backend.getClass().getName()))
{
- if (! className.equals(backend.getClass().getName()))
+ // It is not the same. Try to load it and see if it is a valid backend
+ // implementation.
+ try
{
- // It is not the same. Try to load it and see if it is a valid backend
- // implementation.
- try
+ Class<?> backendClass = DirectoryServer.loadClass(className);
+ if (Backend.class.isAssignableFrom(backendClass))
{
- Class backendClass = DirectoryServer.loadClass(className);
- if (Backend.class.isAssignableFrom(backendClass))
- {
- // It appears to be a valid backend class. We'll return that the
- // change is successful, but indicate that some administrative
- // action is required.
-
- messages.add(NOTE_CONFIG_BACKEND_ACTION_REQUIRED_TO_CHANGE_CLASS.get(
- backendDN, backend.getClass().getName(), className));
- adminActionRequired = true;
- return new ConfigChangeResult(resultCode, adminActionRequired, messages);
- }
- else
- {
- // It is not a valid backend class. This is an error.
- messages.add(ERR_CONFIG_BACKEND_CLASS_NOT_BACKEND.get(className, backendDN));
- resultCode = ResultCode.CONSTRAINT_VIOLATION;
- return new ConfigChangeResult(resultCode, adminActionRequired, messages);
- }
+ // It appears to be a valid backend class. We'll return that the
+ // change is successful, but indicate that some administrative
+ // action is required.
+ messages.add(NOTE_CONFIG_BACKEND_ACTION_REQUIRED_TO_CHANGE_CLASS.get(
+ backendDN, backend.getClass().getName(), className));
+ adminActionRequired = true;
}
- catch (Exception e)
+ else
{
- logger.traceException(e);
-
- messages.add(ERR_CONFIG_BACKEND_CANNOT_INSTANTIATE.get(
- className, backendDN, stackTraceToSingleLineString(e)));
- resultCode = DirectoryServer.getServerErrorResultCode();
- return new ConfigChangeResult(resultCode, adminActionRequired, messages);
+ // It is not a valid backend class. This is an error.
+ messages.add(ERR_CONFIG_BACKEND_CLASS_NOT_BACKEND.get(className, backendDN));
+ resultCode = ResultCode.CONSTRAINT_VIOLATION;
}
+ return new ConfigChangeResult(resultCode, adminActionRequired, messages);
+ }
+ catch (Exception e)
+ {
+ logger.traceException(e);
+
+ messages.add(ERR_CONFIG_BACKEND_CANNOT_INSTANTIATE.get(
+ className, backendDN, stackTraceToSingleLineString(e)));
+ resultCode = DirectoryServer.getServerErrorResultCode();
+ return new ConfigChangeResult(resultCode, adminActionRequired, messages);
}
}
@@ -601,11 +525,9 @@
// backend. Try to do so.
if (needToEnable)
{
- Class backendClass;
try
{
- backendClass = DirectoryServer.loadClass(className);
- backend = (Backend) backendClass.newInstance();
+ backend = loadBackendClass(className).newInstance();
}
catch (Exception e)
{
@@ -651,8 +573,7 @@
resultCode = ResultCode.CONSTRAINT_VIOLATION;
adminActionRequired = true;
messages.add(message);
- return new ConfigChangeResult(resultCode, adminActionRequired,
- messages);
+ return new ConfigChangeResult(resultCode, adminActionRequired, messages);
}
@@ -687,8 +608,7 @@
// FIXME -- Do we need to send an admin alert?
}
- return new ConfigChangeResult(resultCode, adminActionRequired,
- messages);
+ return new ConfigChangeResult(resultCode, adminActionRequired, messages);
}
@@ -711,29 +631,20 @@
LocalizableMessage message = WARN_CONFIG_BACKEND_CANNOT_REGISTER_BACKEND.get(
backendID, getExceptionMessage(e));
+ logger.warn(message);
+ // FIXME -- Do we need to send an admin alert?
resultCode = DirectoryServer.getServerErrorResultCode();
messages.add(message);
-
- logger.warn(message);
- // FIXME -- Do we need to send an admin alert?
-
- return new ConfigChangeResult(resultCode, adminActionRequired,
- messages);
+ return new ConfigChangeResult(resultCode, adminActionRequired, messages);
}
registeredBackends.put(backendDN, backend);
}
- else if ((resultCode == ResultCode.SUCCESS) && (backend != null))
+ else if (resultCode == ResultCode.SUCCESS && backend != null)
{
- // The backend is already enabled, so we may need to apply a
- // configuration change. Check to see if the writability mode has been
- // changed.
- if (writabilityMode != backend.getWritabilityMode())
- {
- backend.setWritabilityMode(writabilityMode);
- }
+ backend.setWritabilityMode(writabilityMode);
}
@@ -741,9 +652,8 @@
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public boolean isConfigurationAddAcceptable(
BackendCfg configEntry,
List<LocalizableMessage> unacceptableReason)
@@ -775,11 +685,10 @@
// backend implementation, then log an error and skip it.
String className = configEntry.getJavaClass();
- Backend backend;
+ Backend<?> backend;
try
{
- Class backendClass = DirectoryServer.loadClass(className);
- backend = (Backend) backendClass.newInstance();
+ backend = loadBackendClass(className).newInstance();
}
catch (Exception e)
{
@@ -820,9 +729,8 @@
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public ConfigChangeResult applyConfigurationAdd(BackendCfg cfg)
{
DN backendDN = cfg.dn();
@@ -863,31 +771,7 @@
}
- // See if the entry contains an attribute that specifies the writability
- // mode.
- WritabilityMode writabilityMode = WritabilityMode.ENABLED;
- BackendCfgDefn.WritabilityMode bwm =
- cfg.getWritabilityMode();
- switch (bwm)
- {
- case DISABLED:
- writabilityMode = WritabilityMode.DISABLED;
- break;
- case ENABLED:
- writabilityMode = WritabilityMode.ENABLED;
- break;
- case INTERNAL_ONLY:
- writabilityMode = WritabilityMode.INTERNAL_ONLY;
- break;
- }
-
-
- // See if the entry contains an attribute that specifies the base DNs for
- // the entry. If it does not, then skip it.
- Set<DN> dnList = cfg.getBaseDN();
- DN[] baseDNs = new DN[dnList.size()];
- dnList.toArray(baseDNs);
-
+ WritabilityMode writabilityMode = toWritabilityMode(cfg.getWritabilityMode());
// See if the entry contains an attribute that specifies the class name
// for the backend implementation. If it does, then load it and make sure
@@ -895,13 +779,11 @@
// the specified class cannot be loaded, or it does not contain a valid
// backend implementation, then log an error and skip it.
String className = cfg.getJavaClass();
- Class backendClass;
- Backend backend;
+ Backend<?> backend;
try
{
- backendClass = DirectoryServer.loadClass(className);
- backend = (Backend) backendClass.newInstance();
+ backend = loadBackendClass(className).newInstance();
}
catch (Exception e)
{
@@ -950,8 +832,7 @@
resultCode = ResultCode.CONSTRAINT_VIOLATION;
adminActionRequired = true;
messages.add(message);
- return new ConfigChangeResult(resultCode, adminActionRequired,
- messages);
+ return new ConfigChangeResult(resultCode, adminActionRequired, messages);
}
@@ -1009,25 +890,42 @@
LocalizableMessage message = WARN_CONFIG_BACKEND_CANNOT_REGISTER_BACKEND.get(
backendID, getExceptionMessage(e));
-
- resultCode = DirectoryServer.getServerErrorResultCode();
- messages.add(message);
-
logger.error(message);
- // FIXME -- Do we need to send an admin alert?
- return new ConfigChangeResult(resultCode, adminActionRequired,
- messages);
+ // FIXME -- Do we need to send an admin alert?
+ messages.add(message);
+ resultCode = DirectoryServer.getServerErrorResultCode();
+ return new ConfigChangeResult(resultCode, adminActionRequired, messages);
}
registeredBackends.put(backendDN, backend);
return new ConfigChangeResult(resultCode, adminActionRequired, messages);
}
+ @SuppressWarnings("unchecked")
+ private Class<Backend<?>> loadBackendClass(String className) throws Exception
+ {
+ return (Class<Backend<?>>) DirectoryServer.loadClass(className);
+ }
- /**
- * {@inheritDoc}
- */
+ private WritabilityMode toWritabilityMode(BackendCfgDefn.WritabilityMode writabilityMode)
+ {
+ switch (writabilityMode)
+ {
+ case DISABLED:
+ return WritabilityMode.DISABLED;
+ case ENABLED:
+ return WritabilityMode.ENABLED;
+ case INTERNAL_ONLY:
+ return WritabilityMode.INTERNAL_ONLY;
+ default:
+ return WritabilityMode.ENABLED;
+ }
+ }
+
+
+ /** {@inheritDoc} */
+ @Override
public boolean isConfigurationDeleteAcceptable(
BackendCfg configEntry,
List<LocalizableMessage> unacceptableReason)
@@ -1039,7 +937,7 @@
// provided DN. If not, then we don't care if the entry is deleted. If we
// do know about it, then that means that it is enabled and we will not
// allow removing a backend that is enabled.
- Backend backend = registeredBackends.get(backendDN);
+ Backend<?> backend = registeredBackends.get(backendDN);
if (backend == null)
{
return true;
@@ -1048,23 +946,18 @@
// See if the backend has any subordinate backends. If so, then it is not
// acceptable to remove it. Otherwise, it should be fine.
- Backend[] subBackends = backend.getSubordinateBackends();
- if ((subBackends == null) || (subBackends.length == 0))
+ Backend<?>[] subBackends = backend.getSubordinateBackends();
+ if (subBackends != null && subBackends.length != 0)
{
- return true;
- }
- else
- {
- unacceptableReason.add(
- NOTE_CONFIG_BACKEND_CANNOT_REMOVE_BACKEND_WITH_SUBORDINATES.get(backendDN));
+ unacceptableReason.add(NOTE_CONFIG_BACKEND_CANNOT_REMOVE_BACKEND_WITH_SUBORDINATES.get(backendDN));
return false;
}
+ return true;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public ConfigChangeResult applyConfigurationDelete(BackendCfg configEntry)
{
DN backendDN = configEntry.dn();
@@ -1075,70 +968,64 @@
// See if this backend config manager has a backend registered with the
// provided DN. If not, then we don't care if the entry is deleted.
- Backend backend = registeredBackends.get(backendDN);
+ Backend<?> backend = registeredBackends.get(backendDN);
if (backend == null)
{
- return new ConfigChangeResult(resultCode, adminActionRequired,
- messages);
+ return new ConfigChangeResult(resultCode, adminActionRequired, messages);
}
-
// See if the backend has any subordinate backends. If so, then it is not
// acceptable to remove it. Otherwise, it should be fine.
- Backend[] subBackends = backend.getSubordinateBackends();
- if ((subBackends == null) || (subBackends.length == 0))
- {
- registeredBackends.remove(backendDN);
-
- try
- {
- backend.finalizeBackend();
- }
- catch (Exception e)
- {
- logger.traceException(e);
- }
-
- for (BackendInitializationListener listener :
- DirectoryServer.getBackendInitializationListeners())
- {
- listener.performBackendFinalizationProcessing(backend);
- }
-
- DirectoryServer.deregisterBackend(backend);
- configEntry.removeChangeListener(this);
-
- // Remove the shared lock for this backend.
- try
- {
- String lockFile = LockFileManager.getBackendLockFileName(backend);
- StringBuilder failureReason = new StringBuilder();
- if (! LockFileManager.releaseLock(lockFile, failureReason))
- {
- logger.warn(WARN_CONFIG_BACKEND_CANNOT_RELEASE_SHARED_LOCK, backend.getBackendID(), failureReason);
- // FIXME -- Do we need to send an admin alert?
- }
- }
- catch (Exception e2)
- {
- logger.traceException(e2);
- logger.warn(WARN_CONFIG_BACKEND_CANNOT_RELEASE_SHARED_LOCK, backend
- .getBackendID(), stackTraceToSingleLineString(e2));
- // FIXME -- Do we need to send an admin alert?
- }
-
- return new ConfigChangeResult(resultCode, adminActionRequired,
- messages);
- }
- else
+ Backend<?>[] subBackends = backend.getSubordinateBackends();
+ if (subBackends != null && subBackends.length > 0)
{
messages.add(NOTE_CONFIG_BACKEND_CANNOT_REMOVE_BACKEND_WITH_SUBORDINATES.get(backendDN));
- resultCode = ResultCode.UNWILLING_TO_PERFORM;
- return new ConfigChangeResult(resultCode, adminActionRequired, messages);
+ return new ConfigChangeResult(UNWILLING_TO_PERFORM, adminActionRequired, messages);
}
+
+ registeredBackends.remove(backendDN);
+
+ try
+ {
+ backend.finalizeBackend();
+ }
+ catch (Exception e)
+ {
+ logger.traceException(e);
+ }
+
+ for (BackendInitializationListener listener :
+ DirectoryServer.getBackendInitializationListeners())
+ {
+ listener.performBackendFinalizationProcessing(backend);
+ }
+
+ DirectoryServer.deregisterBackend(backend);
+ configEntry.removeChangeListener(this);
+
+ // Remove the shared lock for this backend.
+ try
+ {
+ String lockFile = LockFileManager.getBackendLockFileName(backend);
+ StringBuilder failureReason = new StringBuilder();
+ if (! LockFileManager.releaseLock(lockFile, failureReason))
+ {
+ logger.warn(WARN_CONFIG_BACKEND_CANNOT_RELEASE_SHARED_LOCK, backend.getBackendID(), failureReason);
+ // FIXME -- Do we need to send an admin alert?
+ }
+ }
+ catch (Exception e2)
+ {
+ logger.traceException(e2);
+ logger.warn(WARN_CONFIG_BACKEND_CANNOT_RELEASE_SHARED_LOCK, backend
+ .getBackendID(), stackTraceToSingleLineString(e2));
+ // FIXME -- Do we need to send an admin alert?
+ }
+
+ return new ConfigChangeResult(resultCode, adminActionRequired, messages);
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
private static void initializeBackend(Backend backend, BackendCfg cfg)
throws ConfigException, InitializationException
{
@@ -1147,4 +1034,3 @@
}
}
-
--
Gitblit v1.10.0