opends/src/admin/defn/org/opends/server/admin/std/RootConfiguration.xml
@@ -163,7 +163,7 @@ <adm:one-to-one /> <adm:profile name="ldap"> <ldap:rdn-sequence> cn=config cn=Root DSE,cn=config </ldap:rdn-sequence> </adm:profile> </adm:relation> opends/src/server/org/opends/server/admin/server/ServerManagedObject.java
@@ -179,7 +179,7 @@ * If one or more of the managed object's properties could * not be decoded. */ public static <S extends Configuration> static <S extends Configuration> ServerManagedObject<? extends S> decode( ManagedObjectPath path, AbstractManagedObjectDefinition<?, S> definition, opends/src/server/org/opends/server/api/AccessControlProvider.java
@@ -40,8 +40,8 @@ * should specify the name of a class implementing this interface. * * @param <T> * The type of connection handler configuration handled by * this connection handler implementation. * The type of access control configuration handled by * this access control provider implementation. */ public interface AccessControlProvider <T extends AccessControlHandlerCfg> opends/src/server/org/opends/server/api/Backend.java
@@ -34,7 +34,6 @@ import java.util.Set; import java.util.concurrent.locks.Lock; import org.opends.server.config.ConfigEntry; import org.opends.server.config.ConfigException; import org.opends.server.core.AddOperation; import org.opends.server.core.DeleteOperation; @@ -58,7 +57,7 @@ import static org.opends.server.messages.BackendMessages.*; import static org.opends.server.messages.MessageHandler.*; import org.opends.server.admin.Configuration; /** @@ -111,14 +110,24 @@ /** * Initializes this backend based on the information in the provided * configuration entry. * Configure this backend based on the information in the provided * configuration. * * @param configEntry The configuration entry that contains the * information to use to initialize this * backend. * @param baseDNs The set of base DNs that have been * configured for this backend. * @param cfg The configuration of this backend. * * @throws ConfigException * If there is an error in the configuration. */ public abstract void configureBackend(Configuration cfg) throws ConfigException; /** * Initializes this backend based on the information provided * when the backend was configured. * * @see #configureBackend * * @throws ConfigException If an unrecoverable problem arises in * the process of performing the @@ -129,8 +138,7 @@ * related to the server * configuration. */ public abstract void initializeBackend(ConfigEntry configEntry, DN[] baseDNs) public abstract void initializeBackend() throws ConfigException, InitializationException; @@ -453,18 +461,13 @@ * <CODE>true</CODE>. Note that the server will not explicitly * initialize this backend before calling this method. * * @param configEntry The configuration entry for this backend. * @param baseDNs The set of base DNs configured for this * backend. * @param exportConfig The configuration to use when performing * the export. * * @throws DirectoryException If a problem occurs while performing * the LDIF export. */ public abstract void exportLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFExportConfig exportConfig) public abstract void exportLDIF(LDIFExportConfig exportConfig) throws DirectoryException; @@ -486,18 +489,13 @@ * returns <CODE>true</CODE>. Note that the server will not * explicitly initialize this backend before calling this method. * * @param configEntry The configuration entry for this backend. * @param baseDNs The set of base DNs configured for this * backend. * @param importConfig The configuration to use when performing * the import. * * @throws DirectoryException If a problem occurs while performing * the LDIF import. */ public abstract void importLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFImportConfig importConfig) public abstract void importLDIF(LDIFImportConfig importConfig) throws DirectoryException; @@ -546,15 +544,13 @@ * <CODE>true</CODE>. Note that the server will not explicitly * initialize this backend before calling this method. * * @param configEntry The configuration entry for this backend. * @param backupConfig The configuration to use when performing * the backup. * * @throws DirectoryException If a problem occurs while performing * the backup. */ public abstract void createBackup(ConfigEntry configEntry, BackupConfig backupConfig) public abstract void createBackup(BackupConfig backupConfig) throws DirectoryException; @@ -597,15 +593,13 @@ * <CODE>true</CODE>. Note that the server will not explicitly * initialize this backend before calling this method. * * @param configEntry The configuration entry for this backend. * @param restoreConfig The configuration to use when performing * the restore. * * @throws DirectoryException If a problem occurs while performing * the restore. */ public abstract void restoreBackup(ConfigEntry configEntry, RestoreConfig restoreConfig) public abstract void restoreBackup(RestoreConfig restoreConfig) throws DirectoryException; @@ -847,9 +841,9 @@ { boolean thisMatches = false; DN[] subBaseDNs = b.getBaseDNs(); for (int i=0; i < subBaseDNs.length; i++) for (DN dn : subBaseDNs) { if (subBaseDNs[i].equals(subSuffixDN)) if (dn.equals(subSuffixDN)) { if (subBaseDNs.length > 1) { @@ -977,14 +971,14 @@ public boolean handlesEntry(DN entryDN) { DN[] baseDNs = getBaseDNs(); for (int i=0; i < baseDNs.length; i++) for (DN dn : baseDNs) { if (entryDN.isDescendantOf(baseDNs[i])) if (entryDN.isDescendantOf(dn)) { Backend[] subBackends = subordinateBackends; for (int j=0; j < subBackends.length; j++) for (Backend b : subBackends) { if (subBackends[j].handlesEntry(entryDN)) if (b.handlesEntry(entryDN)) { return false; } opends/src/server/org/opends/server/api/ConfigHandler.java
@@ -35,7 +35,6 @@ import org.opends.server.types.InitializationException; /** * This class defines the set of methods and structures that must be * implemented by a Directory Server configuration handler. opends/src/server/org/opends/server/backends/BackupBackend.java
@@ -33,14 +33,12 @@ import org.opends.server.api.Backend; import org.opends.server.config.ConfigException; import org.opends.server.config.ConfigEntry; import org.opends.server.core.AddOperation; import org.opends.server.core.DeleteOperation; import org.opends.server.core.DirectoryServer; import org.opends.server.core.ModifyOperation; import org.opends.server.core.ModifyDNOperation; import org.opends.server.core.SearchOperation; import org.opends.server.core.BackendConfigManager; import org.opends.server.protocols.asn1.ASN1OctetString; import org.opends.server.schema.BooleanSyntax; import org.opends.server.schema.GeneralizedTimeSyntax; @@ -72,9 +70,10 @@ import static org.opends.server.messages.MessageHandler.*; import static org.opends.server.util.ServerConstants.*; import static org.opends.server.util.StaticUtils.*; import org.opends.server.util.Validator; import org.opends.server.admin.server.ConfigurationChangeListener; import org.opends.server.admin.std.server.BackupBackendCfg; import org.opends.server.admin.std.meta.BackupBackendCfgDefn; import org.opends.server.admin.Configuration; /** @@ -125,25 +124,32 @@ } /** * {@inheritDoc} */ public void initializeBackend(ConfigEntry configEntry, DN[] baseDNs) throws ConfigException, InitializationException public void configureBackend(Configuration config) throws ConfigException { // Make sure that a configuration entry was provided. If not, then we will // not be able to complete initialization. if (configEntry == null) if (config == null) { int msgID = MSGID_BACKUP_CONFIG_ENTRY_NULL; String message = getMessage(msgID); throw new ConfigException(msgID, message); } BackupBackendCfg cfg = getBackupBackendCfg(configEntry); Validator.ensureTrue(config instanceof BackupBackendCfg); currentConfig = (BackupBackendCfg)config; } /** * {@inheritDoc} */ public void initializeBackend() throws ConfigException, InitializationException { // Create the set of base DNs that we will handle. In this case, it's just // the DN of the base backup entry. try @@ -167,7 +173,7 @@ // Determine the set of backup directories that we will use by default. Set<String> values = cfg.getBackupDirectory(); Set<String> values = currentConfig.getBackupDirectory(); backupDirectories = new LinkedHashSet<File>(values.size()); for (String s : values) { @@ -215,8 +221,7 @@ // Register this as a change listener. currentConfig = cfg; cfg.addBackupChangeListener(this); currentConfig.addBackupChangeListener(this); // Register the backup base as a private suffix. @@ -1063,20 +1068,9 @@ /** * Exports the contents of this backend to LDIF. This method should only be * called if <CODE>supportsLDIFExport</CODE> returns <CODE>true</CODE>. Note * that the server will not explicitly initialize this backend before calling * this method. * * @param configEntry The configuration entry for this backend. * @param baseDNs The set of base DNs configured for this backend. * @param exportConfig The configuration to use when performing the export. * * @throws DirectoryException If a problem occurs while performing the LDIF * export. * {@inheritDoc} */ public void exportLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFExportConfig exportConfig) public void exportLDIF(LDIFExportConfig exportConfig) throws DirectoryException { int msgID = MSGID_BACKUP_EXPORT_NOT_SUPPORTED; @@ -1103,20 +1097,9 @@ /** * Imports information from an LDIF file into this backend. This method * should only be called if <CODE>supportsLDIFImport</CODE> returns * <CODE>true</CODE>. Note that the server will not explicitly initialize * this backend before calling this method. * * @param configEntry The configuration entry for this backend. * @param baseDNs The set of base DNs configured for this backend. * @param importConfig The configuration to use when performing the import. * * @throws DirectoryException If a problem occurs while performing the LDIF * import. * {@inheritDoc} */ public void importLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFImportConfig importConfig) public void importLDIF(LDIFImportConfig importConfig) throws DirectoryException { // This backend does not support LDIF imports. @@ -1172,20 +1155,10 @@ /** * Creates a backup of the contents of this backend in a form that may be * restored at a later date if necessary. This method should only be called * if <CODE>supportsBackup</CODE> returns <CODE>true</CODE>. Note that the * server will not explicitly initialize this backend before calling this * method. * * @param configEntry The configuration entry for this backend. * @param backupConfig The configuration to use when performing the backup. * * @throws DirectoryException If a problem occurs while performing the * backup. * {@inheritDoc} */ public void createBackup(ConfigEntry configEntry, BackupConfig backupConfig) throws DirectoryException public void createBackup(BackupConfig backupConfig) throws DirectoryException { // This backend does not provide a backup/restore mechanism. int msgID = MSGID_BACKUP_BACKUP_AND_RESTORE_NOT_SUPPORTED; @@ -1236,20 +1209,9 @@ /** * Restores a backup of the contents of this backend. This method should only * be called if <CODE>supportsRestore</CODE> returns <CODE>true</CODE>. Note * that the server will not explicitly initialize this backend before calling * this method. * * @param configEntry The configuration entry for this backend. * @param restoreConfig The configuration to use when performing the * restore. * * @throws DirectoryException If a problem occurs while performing the * restore. * {@inheritDoc} */ public void restoreBackup(ConfigEntry configEntry, RestoreConfig restoreConfig) public void restoreBackup(RestoreConfig restoreConfig) throws DirectoryException { // This backend does not provide a backup/restore mechanism. @@ -1265,8 +1227,7 @@ * {@inheritDoc} */ public boolean isConfigurationChangeAcceptable( BackupBackendCfg configEntry, List<String> unacceptableReasons) BackupBackendCfg cfg, List<String> unacceptableReasons) { // We'll accept anything here. The only configurable attribute is the // default set of backup directories, but that doesn't require any @@ -1278,22 +1239,21 @@ /** * {@inheritDoc} */ public ConfigChangeResult applyConfigurationChange( BackupBackendCfg configEntry) public ConfigChangeResult applyConfigurationChange(BackupBackendCfg cfg) { ResultCode resultCode = ResultCode.SUCCESS; boolean adminActionRequired = false; ArrayList<String> messages = new ArrayList<String>(); Set<String> values = configEntry.getBackupDirectory(); Set<String> values = cfg.getBackupDirectory(); backupDirectories = new LinkedHashSet<File>(values.size()); for (String s : values) { backupDirectories.add(getFileForPath(s)); } currentConfig = configEntry; currentConfig = cfg; return new ConfigChangeResult(resultCode, adminActionRequired, messages); } @@ -1314,18 +1274,5 @@ } /** * Gets the backup backend configuration corresponding to a backup * backend config entry. * * @param configEntry A backup backend config entry. * @return Returns the backup backend configuration. * @throws ConfigException If the config entry could not be decoded. */ static BackupBackendCfg getBackupBackendCfg(ConfigEntry configEntry) throws ConfigException { return BackendConfigManager.getConfiguration( BackupBackendCfgDefn.getInstance(), configEntry); } } opends/src/server/org/opends/server/backends/MemoryBackend.java
@@ -34,7 +34,6 @@ import java.util.LinkedList; import org.opends.server.api.Backend; import org.opends.server.config.ConfigEntry; import org.opends.server.config.ConfigException; import org.opends.server.core.AddOperation; import org.opends.server.core.DeleteOperation; @@ -58,6 +57,7 @@ import org.opends.server.util.LDIFException; import org.opends.server.util.LDIFReader; import org.opends.server.util.LDIFWriter; import org.opends.server.util.Validator; import static org.opends.server.loggers.debug.DebugLogger.debugCaught; import static org.opends.server.loggers.debug.DebugLogger.debugEnabled; @@ -66,7 +66,8 @@ import static org.opends.server.messages.MessageHandler.*; import static org.opends.server.util.ServerConstants.*; import static org.opends.server.util.StaticUtils.*; import org.opends.server.admin.std.server.BackendCfg; import org.opends.server.admin.Configuration; /** @@ -135,13 +136,38 @@ } /** * Set the base DNs for this backend. This is used by the unit tests * to set the base DNs without having to provide a configuration * object when initializing the backend. * @param baseDNs The set of base DNs to be served by this memory backend. */ public void setBaseDNs(DN[] baseDNs) { this.baseDNs = baseDNs; } /** * {@inheritDoc} */ public synchronized void initializeBackend(ConfigEntry configEntry, DN[] baseDNs) throws ConfigException, InitializationException public void configureBackend(Configuration config) throws ConfigException { if (config != null) { Validator.ensureTrue(config instanceof BackendCfg); BackendCfg cfg = (BackendCfg)config; DN[] baseDNs = new DN[cfg.getBackendBaseDN().size()]; cfg.getBackendBaseDN().toArray(baseDNs); setBaseDNs(baseDNs); } } /** * {@inheritDoc} */ public synchronized void initializeBackend() throws ConfigException, InitializationException { // We won't support anything other than exactly one base DN in this // implementation. If we were to add such support in the future, we would @@ -154,9 +180,6 @@ throw new ConfigException(msgID, message); } this.baseDNs = baseDNs; baseDNSet = new HashSet<DN>(); for (DN dn : baseDNs) { @@ -643,8 +666,7 @@ /** * {@inheritDoc} */ public synchronized void exportLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFExportConfig exportConfig) public synchronized void exportLDIF(LDIFExportConfig exportConfig) throws DirectoryException { // Create the LDIF writer. @@ -716,8 +738,7 @@ /** * {@inheritDoc} */ public synchronized void importLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFImportConfig importConfig) public synchronized void importLDIF(LDIFImportConfig importConfig) throws DirectoryException { clearMemoryBackend(); @@ -820,7 +841,7 @@ /** * {@inheritDoc} */ public void createBackup(ConfigEntry configEntry, BackupConfig backupConfig) public void createBackup(BackupConfig backupConfig) throws DirectoryException { int msgID = MSGID_MEMORYBACKEND_BACKUP_RESTORE_NOT_SUPPORTED; @@ -860,8 +881,7 @@ /** * {@inheritDoc} */ public void restoreBackup(ConfigEntry configEntry, RestoreConfig restoreConfig) public void restoreBackup(RestoreConfig restoreConfig) throws DirectoryException { int msgID = MSGID_MEMORYBACKEND_BACKUP_RESTORE_NOT_SUPPORTED; opends/src/server/org/opends/server/backends/MonitorBackend.java
@@ -45,7 +45,6 @@ import org.opends.server.core.ModifyOperation; import org.opends.server.core.ModifyDNOperation; import org.opends.server.core.SearchOperation; import org.opends.server.core.BackendConfigManager; import org.opends.server.protocols.asn1.ASN1OctetString; import org.opends.server.types.Attribute; import org.opends.server.types.AttributeType; @@ -68,6 +67,7 @@ import org.opends.server.util.DynamicConstants; import org.opends.server.util.LDIFWriter; import org.opends.server.util.TimeThread; import org.opends.server.util.Validator; import static org.opends.server.config.ConfigConstants.*; import static org.opends.server.loggers.debug.DebugLogger.debugCaught; @@ -80,6 +80,7 @@ import static org.opends.server.util.StaticUtils.*; import org.opends.server.admin.server.ConfigurationChangeListener; import org.opends.server.admin.std.server.BackendCfg; import org.opends.server.admin.Configuration; /** @@ -132,13 +133,18 @@ } /** * {@inheritDoc} */ public void initializeBackend(ConfigEntry configEntry, DN[] baseDNs) throws ConfigException, InitializationException public void configureBackend(Configuration config) throws ConfigException { Validator.ensureNotNull(config); Validator.ensureTrue(config instanceof BackendCfg); BackendCfg cfg = (BackendCfg)config; ConfigEntry configEntry = DirectoryServer.getConfigEntry(cfg.dn()); // Make sure that a configuration entry was provided. If not, then we will // not be able to complete initialization. if (configEntry == null) @@ -148,7 +154,6 @@ throw new ConfigException(msgID, message); } BackendCfg cfg = BackendConfigManager.getBackendCfg(configEntry); configEntryDN = configEntry.getDN(); @@ -180,6 +185,20 @@ } // Construct the set of objectclasses to include in the base monitor entry. monitorObjectClasses = new LinkedHashMap<ObjectClass,String>(2); ObjectClass topOC = DirectoryServer.getObjectClass(OC_TOP, true); monitorObjectClasses.put(topOC, OC_TOP); ObjectClass monitorOC = DirectoryServer.getObjectClass(OC_MONITOR_ENTRY, true); monitorObjectClasses.put(monitorOC, OC_MONITOR_ENTRY); // Define an empty sets for the supported controls and features. supportedControls = new HashSet<String>(0); supportedFeatures = new HashSet<String>(0); // Create the set of base DNs that we will handle. In this case, it's just // the DN of the base monitor entry. try @@ -195,31 +214,24 @@ int msgID = MSGID_MONITOR_CANNOT_DECODE_MONITOR_ROOT_DN; String message = getMessage(msgID, getExceptionMessage(e)); throw new InitializationException(msgID, message, e); throw new ConfigException(msgID, message, e); } // FIXME -- Deal with this more correctly. this.baseDNs = new DN[] { baseMonitorDN }; // Construct the set of objectclasses to include in the base monitor entry. monitorObjectClasses = new LinkedHashMap<ObjectClass,String>(2); ObjectClass topOC = DirectoryServer.getObjectClass(OC_TOP, true); monitorObjectClasses.put(topOC, OC_TOP); ObjectClass monitorOC = DirectoryServer.getObjectClass(OC_MONITOR_ENTRY, true); monitorObjectClasses.put(monitorOC, OC_MONITOR_ENTRY); // Define an empty sets for the supported controls and features. supportedControls = new HashSet<String>(0); supportedFeatures = new HashSet<String>(0); // Register with the Directory Server as a configurable component. currentConfig = cfg; cfg.addChangeListener(this); } /** * {@inheritDoc} */ public void initializeBackend() throws ConfigException, InitializationException { // Register with the Directory Server as a configurable component. currentConfig.addChangeListener(this); // Register the monitor base as a private suffix. @@ -951,72 +963,11 @@ /** * {@inheritDoc} */ public void exportLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFExportConfig exportConfig) public void exportLDIF(LDIFExportConfig exportConfig) throws DirectoryException { // TODO export-ldif reports nonsense for upTime etc. configEntryDN = configEntry.getDN(); // Get the set of user-defined attributes for the configuration entry. Any // attributes that we don't recognize will be included directly in the base // monitor entry. userDefinedAttributes = new ArrayList<Attribute>(); for (List<Attribute> attrs : configEntry.getEntry().getUserAttributes().values()) { for (Attribute a : attrs) { if (! isMonitorConfigAttribute(a)) { userDefinedAttributes.add(a); } } } for (List<Attribute> attrs : configEntry.getEntry().getOperationalAttributes().values()) { for (Attribute a : attrs) { if (! isMonitorConfigAttribute(a)) { userDefinedAttributes.add(a); } } } // Create the set of base DNs that we will handle. In this case, it's just // the DN of the base monitor entry. try { baseMonitorDN = DN.decode(DN_MONITOR_ROOT); } catch (Exception e) { if (debugEnabled()) { debugCaught(DebugLogLevel.ERROR, e); } int msgID = MSGID_MONITOR_CANNOT_DECODE_MONITOR_ROOT_DN; String message = getMessage(msgID, getExceptionMessage(e)); throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), message, msgID, e); } // Construct the set of objectclasses to include in the base monitor entry. monitorObjectClasses = new LinkedHashMap<ObjectClass,String>(2); ObjectClass topOC = DirectoryServer.getObjectClass(OC_TOP, true); monitorObjectClasses.put(topOC, OC_TOP); ObjectClass monitorOC = DirectoryServer.getObjectClass(OC_MONITOR_ENTRY, true); monitorObjectClasses.put(monitorOC, OC_MONITOR_ENTRY); // Create the LDIF writer. LDIFWriter ldifWriter; try @@ -1140,8 +1091,7 @@ /** * {@inheritDoc} */ public void importLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFImportConfig importConfig) public void importLDIF(LDIFImportConfig importConfig) throws DirectoryException { // This backend does not support LDIF imports. @@ -1199,7 +1149,7 @@ /** * {@inheritDoc} */ public void createBackup(ConfigEntry configEntry, BackupConfig backupConfig) public void createBackup(BackupConfig backupConfig) throws DirectoryException { // This backend does not provide a backup/restore mechanism. @@ -1253,8 +1203,7 @@ /** * {@inheritDoc} */ public void restoreBackup(ConfigEntry configEntry, RestoreConfig restoreConfig) public void restoreBackup(RestoreConfig restoreConfig) throws DirectoryException { // This backend does not provide a backup/restore mechanism. opends/src/server/org/opends/server/backends/RootDSEBackend.java
@@ -47,7 +47,6 @@ import org.opends.server.core.ModifyOperation; import org.opends.server.core.ModifyDNOperation; import org.opends.server.core.SearchOperation; import org.opends.server.core.BackendConfigManager; import org.opends.server.protocols.asn1.ASN1OctetString; import org.opends.server.types.Attribute; import org.opends.server.types.AttributeType; @@ -71,6 +70,7 @@ import org.opends.server.types.ResultCode; import org.opends.server.types.SearchFilter; import org.opends.server.util.LDIFWriter; import org.opends.server.util.Validator; import static org.opends.server.config.ConfigConstants.*; import static org.opends.server.loggers.debug.DebugLogger.debugCaught; @@ -84,8 +84,8 @@ import static org.opends.server.util.ServerConstants.*; import static org.opends.server.util.StaticUtils.*; import org.opends.server.admin.std.server.RootDSEBackendCfg; import org.opends.server.admin.std.meta.RootDSEBackendCfgDefn; import org.opends.server.admin.server.ConfigurationChangeListener; import org.opends.server.admin.Configuration; /** @@ -156,13 +156,26 @@ } /** * {@inheritDoc} */ public void configureBackend(Configuration config) throws ConfigException { Validator.ensureNotNull(config); Validator.ensureTrue(config instanceof RootDSEBackendCfg); currentConfig = (RootDSEBackendCfg)config; configEntryDN = config.dn(); } /** * {@inheritDoc} */ public void initializeBackend(ConfigEntry configEntry, DN[] baseDNs) public void initializeBackend() throws ConfigException, InitializationException { ConfigEntry configEntry = DirectoryServer.getConfigEntry(configEntryDN); // Make sure that a configuration entry was provided. If not, then we will // not be able to complete initialization. if (configEntry == null) @@ -172,10 +185,6 @@ throw new ConfigException(msgID, message); } configEntryDN = configEntry.getDN(); RootDSEBackendCfg cfg = getRootDSEBackendCfg(configEntry); // Get the set of user-defined attributes for the configuration entry. Any // attributes that we don't recognize will be included directly in the root // DSE. @@ -215,7 +224,7 @@ // backends defined in the server. try { Set<DN> subDNs = cfg.getSubordinateBaseDN(); Set<DN> subDNs = currentConfig.getSubordinateBaseDN(); if (subDNs.isEmpty()) { // This is fine -- we'll just use the set of user-defined suffixes. @@ -256,7 +265,7 @@ // Determine whether all root DSE attributes should be treated as user // attributes. showAllAttributes = cfg.isShowAllAttributes(); showAllAttributes = currentConfig.isShowAllAttributes(); // Construct the set of "static" attributes that will always be present in @@ -303,8 +312,7 @@ // Register as a change listener. currentConfig = cfg; cfg.addChangeListener(this); currentConfig.addChangeListener(this); } @@ -1119,8 +1127,7 @@ /** * {@inheritDoc} */ public void exportLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFExportConfig exportConfig) public void exportLDIF(LDIFExportConfig exportConfig) throws DirectoryException { // Create the LDIF writer. @@ -1197,8 +1204,7 @@ /** * {@inheritDoc} */ public void importLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFImportConfig importConfig) public void importLDIF(LDIFImportConfig importConfig) throws DirectoryException { // This backend does not support LDIF imports. @@ -1256,7 +1262,7 @@ /** * {@inheritDoc} */ public void createBackup(ConfigEntry configEntry, BackupConfig backupConfig) public void createBackup(BackupConfig backupConfig) throws DirectoryException { // This backend does not provide a backup/restore mechanism. @@ -1310,8 +1316,7 @@ /** * {@inheritDoc} */ public void restoreBackup(ConfigEntry configEntry, RestoreConfig restoreConfig) public void restoreBackup(RestoreConfig restoreConfig) throws DirectoryException { // This backend does not provide a backup/restore mechanism. @@ -1542,10 +1547,5 @@ private static RootDSEBackendCfg getRootDSEBackendCfg(ConfigEntry configEntry) throws ConfigException { return BackendConfigManager.getConfiguration( RootDSEBackendCfgDefn.getInstance(), configEntry); } } opends/src/server/org/opends/server/backends/SchemaBackend.java
@@ -69,7 +69,6 @@ import org.opends.server.core.ModifyDNOperation; import org.opends.server.core.SchemaConfigManager; import org.opends.server.core.SearchOperation; import org.opends.server.core.BackendConfigManager; import org.opends.server.schema.AttributeTypeSyntax; import org.opends.server.schema.DITContentRuleSyntax; import org.opends.server.schema.DITStructureRuleSyntax; @@ -112,6 +111,7 @@ import org.opends.server.util.DynamicConstants; import org.opends.server.util.LDIFException; import org.opends.server.util.LDIFWriter; import org.opends.server.util.Validator; import org.opends.server.types.DebugLogLevel; import static org.opends.server.config.ConfigConstants.*; @@ -123,8 +123,8 @@ import static org.opends.server.util.ServerConstants.*; import static org.opends.server.util.StaticUtils.*; import org.opends.server.admin.std.server.SchemaBackendCfg; import org.opends.server.admin.std.meta.SchemaBackendCfgDefn; import org.opends.server.admin.server.ConfigurationChangeListener; import org.opends.server.admin.Configuration; import static org.opends.server.messages.ConfigMessages.*; @@ -247,29 +247,24 @@ /** * Initialization shared by multiple backend methods. * @param configEntry The configuration entry that contains the * information to use to initialize this * backend. * @param baseDNs The set of base DNs that have been * configured for this backend. * @throws ConfigException If an unrecoverable problem arises in * the process of performing the * initialization. * {@inheritDoc} */ private void initializeCommon(ConfigEntry configEntry, DN[] baseDNs) public void configureBackend(Configuration config) throws ConfigException { // Make sure that a configuration entry was provided. If not, then we will // not be able to complete initialization. if (configEntry == null) if (config == null) { int msgID = MSGID_SCHEMA_CONFIG_ENTRY_NULL; String message = getMessage(msgID); throw new ConfigException(msgID, message); } SchemaBackendCfg cfg = getSchemaBackendCfg(configEntry); Validator.ensureTrue(config instanceof SchemaBackendCfg); SchemaBackendCfg cfg = (SchemaBackendCfg)config; ConfigEntry configEntry = DirectoryServer.getConfigEntry(cfg.dn()); configEntryDN = configEntry.getDN(); // Get all of the attribute types that we will use for schema elements. @@ -321,6 +316,9 @@ configEntryDN = configEntry.getDN(); DN[] baseDNs = new DN[cfg.getBackendBaseDN().size()]; cfg.getBackendBaseDN().toArray(baseDNs); this.baseDNs = baseDNs; creatorsName = new AttributeValue(creatorsNameType, baseDNs[0].toString()); @@ -375,11 +373,9 @@ /** * {@inheritDoc} */ public void initializeBackend(ConfigEntry configEntry, DN[] baseDNs) public void initializeBackend() throws ConfigException, InitializationException { initializeCommon(configEntry, baseDNs); // Register each of the suffixes with the Directory Server. Also, register // the first one as the schema base. DirectoryServer.setSchemaDN(baseDNs[0]); @@ -4150,20 +4146,9 @@ /** * {@inheritDoc} */ public void exportLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFExportConfig exportConfig) public void exportLDIF(LDIFExportConfig exportConfig) throws DirectoryException { try { initializeCommon(configEntry, baseDNs); } catch (ConfigException e) { throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), e.getMessage(), e.getMessageID()); } // Create the LDIF writer. LDIFWriter ldifWriter; try @@ -4239,8 +4224,7 @@ /** * {@inheritDoc} */ public void importLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFImportConfig importConfig) public void importLDIF(LDIFImportConfig importConfig) throws DirectoryException { // This backend does not support LDIF imports. @@ -4301,7 +4285,7 @@ /** * {@inheritDoc} */ public void createBackup(ConfigEntry configEntry, BackupConfig backupConfig) public void createBackup(BackupConfig backupConfig) throws DirectoryException { // Get the properties to use for the backup. We don't care whether or not @@ -4697,8 +4681,7 @@ /** * {@inheritDoc} */ public void restoreBackup(ConfigEntry configEntry, RestoreConfig restoreConfig) public void restoreBackup(RestoreConfig restoreConfig) throws DirectoryException { // First, make sure that the requested backup exists. @@ -5458,10 +5441,5 @@ private static SchemaBackendCfg getSchemaBackendCfg(ConfigEntry configEntry) throws ConfigException { return BackendConfigManager.getConfiguration( SchemaBackendCfgDefn.getInstance(), configEntry); } } opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
@@ -37,14 +37,12 @@ import org.opends.server.api.Backend; import org.opends.server.api.MonitorProvider; import org.opends.server.config.ConfigException; import org.opends.server.config.ConfigEntry; import org.opends.server.core.AddOperation; import org.opends.server.core.DeleteOperation; import org.opends.server.core.DirectoryServer; import org.opends.server.core.ModifyOperation; import org.opends.server.core.ModifyDNOperation; import org.opends.server.core.SearchOperation; import org.opends.server.core.BackendConfigManager; import org.opends.server.util.LDIFException; import org.opends.server.util.Validator; @@ -57,8 +55,8 @@ import org.opends.server.types.*; import static org.opends.server.util.ServerConstants.*; import org.opends.server.admin.std.server.JEBackendCfg; import org.opends.server.admin.std.meta.JEBackendCfgDefn; import org.opends.server.admin.server.ConfigurationChangeListener; import org.opends.server.admin.Configuration; /** * This is an implementation of a Directory Server Backend which stores entries @@ -73,7 +71,7 @@ * The configuration of this JE backend. */ private Config config; private JEBackendCfg currentConfig; private JEBackendCfg cfg; /** * The root JE container to use for this backend. @@ -214,16 +212,28 @@ /** * {@inheritDoc} */ public void initializeBackend(ConfigEntry configEntry, DN[] baseDNs) throws ConfigException, InitializationException public void configureBackend(Configuration cfg) throws ConfigException { Validator.ensureNotNull(configEntry); JEBackendCfg backendCfg = getJEBackendCfg(configEntry); Validator.ensureNotNull(cfg); Validator.ensureTrue(cfg instanceof JEBackendCfg); // Initialize a config object config = new Config(); config.initializeConfig(backendCfg, baseDNs); Config config = new Config(); config.initializeConfig((JEBackendCfg)cfg); this.cfg = (JEBackendCfg)cfg; this.config = config; } /** * {@inheritDoc} */ public void initializeBackend() throws ConfigException, InitializationException { // Open the database environment try { @@ -243,7 +253,7 @@ try { rootContainer.openEntryContainers(baseDNs); rootContainer.openEntryContainers(config.getBaseDNs()); } catch (DatabaseException databaseException) { @@ -264,7 +274,8 @@ { // Log an informational message about the number of entries. int msgID = MSGID_JEB_BACKEND_STARTED; String message = getMessage(msgID, rootContainer.getEntryCount()); String message = getMessage(msgID, cfg.getBackendId(), rootContainer.getEntryCount()); logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.NOTICE, message, msgID); } @@ -280,7 +291,7 @@ message, databaseException); } for (DN dn : baseDNs) for (DN dn : config.getBaseDNs()) { try { @@ -307,10 +318,9 @@ DirectoryServer.registerMonitorProvider(monitorProvider); // Register this backend as a change listener. currentConfig = backendCfg; backendCfg.addJEChangeListener(this); backendCfg.addJEChangeListener(config); backendCfg.addJEChangeListener(rootContainer); cfg.addJEChangeListener(this); cfg.addJEChangeListener(config); cfg.addJEChangeListener(rootContainer); } /** @@ -325,9 +335,9 @@ public void finalizeBackend() { // Deregister as a change listener. currentConfig.removeJEChangeListener(rootContainer); currentConfig.removeJEChangeListener(config); currentConfig.removeJEChangeListener(this); cfg.removeJEChangeListener(rootContainer); cfg.removeJEChangeListener(config); cfg.removeJEChangeListener(this); // Deregister our base DNs. for (DN dn : rootContainer.getBaseDNs()) @@ -379,9 +389,6 @@ // Make sure the thread counts are zero for next initialization. threadTotalCount.set(0); threadWriteCount.set(0); // We will not reuse the config object. config = null; } @@ -871,28 +878,9 @@ /** * {@inheritDoc} */ public void exportLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFExportConfig exportConfig) public void exportLDIF(LDIFExportConfig exportConfig) throws DirectoryException { // Initialize a config object. config = new Config(); try { config.initializeConfig(configEntry, baseDNs); } catch (ConfigException e) { if (debugEnabled()) { debugCaught(DebugLogLevel.ERROR, e); } throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), e.getMessage(), e.getMessageID()); } // If the backend already has the root container open, we must use the same // underlying root container boolean openRootContainer = rootContainer == null; @@ -906,7 +894,7 @@ rootContainer.open(config.getBackendDirectory(), config.getBackendPermission(), true, false, false, false, true, true); rootContainer.openEntryContainers(baseDNs); rootContainer.openEntryContainers(config.getBaseDNs()); } ExportJob exportJob = new ExportJob(exportConfig); @@ -981,28 +969,9 @@ /** * {@inheritDoc} */ public void importLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFImportConfig importConfig) public void importLDIF(LDIFImportConfig importConfig) throws DirectoryException { // Initialize a config object. config = new Config(); try { config.initializeConfig(configEntry, baseDNs); } catch (ConfigException e) { if (debugEnabled()) { debugCaught(DebugLogLevel.ERROR, e); } throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), e.getMessage(), e.getMessageID()); } try { ImportJob importJob = new ImportJob(this, config, importConfig); @@ -1047,9 +1016,6 @@ /** * Verify the integrity of the backend instance. * @param verifyConfig The verify configuration. * @param configEntry The backend instance configuration entry. * @param baseDNs The set of base DNs that have been configured for this * backend. * @param statEntry Optional entry to save stats into. * @throws ConfigException If an unrecoverable problem arises during * initialization. @@ -1058,14 +1024,9 @@ * configuration. * @throws DirectoryException If a Directory Server error occurs. */ public void verifyBackend(VerifyConfig verifyConfig, ConfigEntry configEntry, DN[] baseDNs, Entry statEntry) public void verifyBackend(VerifyConfig verifyConfig, Entry statEntry) throws InitializationException, ConfigException, DirectoryException { // Initialize a config object. config = new Config(); config.initializeConfig(configEntry, baseDNs); // If the backend already has the root container open, we must use the same // underlying root container boolean openRootContainer = rootContainer == null; @@ -1079,7 +1040,7 @@ rootContainer.open(config.getBackendDirectory(), config.getBackendPermission(), true, false, false, false, true, true); rootContainer.openEntryContainers(baseDNs); rootContainer.openEntryContainers(config.getBaseDNs()); } VerifyJob verifyJob = new VerifyJob(config, verifyConfig); @@ -1133,9 +1094,6 @@ * Rebuild index(es) in the backend instance. Note that the server will not * explicitly initialize this backend before calling this method. * @param rebuildConfig The rebuild configuration. * @param configEntry The backend instance configuration entry. * @param baseDNs The set of base DNs that have been configured for this * backend. * @throws ConfigException If an unrecoverable problem arises during * initialization. * @throws InitializationException If a problem occurs during initialization @@ -1143,12 +1101,9 @@ * configuration. * @throws DirectoryException If a Directory Server error occurs. */ public void rebuildBackend(RebuildConfig rebuildConfig, ConfigEntry configEntry, DN[] baseDNs) public void rebuildBackend(RebuildConfig rebuildConfig) throws InitializationException, ConfigException, DirectoryException { JEBackendCfg backendCfg = getJEBackendCfg(configEntry); // If the backend already has the root container open, we must use the same // underlying root container boolean openRootContainer = rootContainer == null; @@ -1168,14 +1123,10 @@ { if (openRootContainer) { // Initialize a config object. config = new Config(); config.initializeConfig(backendCfg, baseDNs); // Open the database environment rootContainer = new RootContainer(config, this); rootContainer.open(); rootContainer.openEntryContainers(baseDNs); rootContainer.openEntryContainers(config.getBaseDNs()); } RebuildJob rebuildJob = new RebuildJob(rebuildConfig); @@ -1229,12 +1180,12 @@ /** * {@inheritDoc} */ public void createBackup(ConfigEntry configEntry, BackupConfig backupConfig) public void createBackup(BackupConfig backupConfig) throws DirectoryException { BackupManager backupManager = new BackupManager(getBackendID()); backupManager.createBackup(configEntry, backupConfig); backupManager.createBackup(cfg, backupConfig); } @@ -1255,13 +1206,12 @@ /** * {@inheritDoc} */ public void restoreBackup(ConfigEntry configEntry, RestoreConfig restoreConfig) public void restoreBackup(RestoreConfig restoreConfig) throws DirectoryException { BackupManager backupManager = new BackupManager(getBackendID()); backupManager.restoreBackup(configEntry, restoreConfig); backupManager.restoreBackup(cfg, restoreConfig); } @@ -1346,7 +1296,7 @@ } // Put the new configuration in place. currentConfig = cfg; this.cfg = cfg; } catch (Exception e) { @@ -1375,37 +1325,16 @@ * Clears all the entries from the backend. This method is for test cases * that use the JE backend. * * @param configEntry The configuration entry that contains the information * to use to initialize this backend. * @param baseDNs The set of base DNs that have been configured for this * backend. * * @throws ConfigException If an unrecoverable problem arises in the * process of performing the initialization. * * @throws JebException If an error occurs while removing the data. */ public void clearBackend(ConfigEntry configEntry, DN[] baseDNs) public void clearBackend() throws ConfigException, JebException { Config config = new Config(); config.initializeConfig(configEntry, baseDNs); EnvManager.removeFiles(config.getBackendDirectory().getPath()); } /** * Gets the JE backend configuration corresponding to a JE * backend config entry. * * @param configEntry A JE backend config entry. * @return Returns the JE backend configuration. * @throws ConfigException If the config entry could not be decoded. */ static JEBackendCfg getJEBackendCfg(ConfigEntry configEntry) throws ConfigException { return BackendConfigManager.getConfiguration( JEBackendCfgDefn.getInstance(), configEntry); } } opends/src/server/org/opends/server/backends/jeb/BackupManager.java
@@ -26,7 +26,6 @@ */ package org.opends.server.backends.jeb; import org.opends.server.config.ConfigEntry; import org.opends.server.config.ConfigException; import org.opends.server.core.DirectoryServer; import org.opends.server.util.DynamicConstants; @@ -77,6 +76,7 @@ import static org.opends.server.messages.JebMessages.*; import static org.opends.server.util.ServerConstants.*; import static org.opends.server.util.StaticUtils.*; import org.opends.server.admin.std.server.JEBackendCfg; /** * A backup manager for JE backends. @@ -138,19 +138,19 @@ * log files that are unchanged since the previous backup. The remaining * zip entries are the JE log files themselves, which, for an incremental, * only include those files that have changed. * @param configEntry The configuration entry of the backend instance for * @param cfg The configuration of the backend instance for * which the backup is required. * @param backupConfig The configuration to use when performing the backup. * @throws DirectoryException If a Directory Server error occurs. */ public void createBackup(ConfigEntry configEntry, BackupConfig backupConfig) public void createBackup(JEBackendCfg cfg, BackupConfig backupConfig) throws DirectoryException { // Parse our backend configuration. Config config = new Config(); try { config.initializeConfig(configEntry, null); config.initializeConfig(cfg); } catch (ConfigException e) { @@ -747,12 +747,12 @@ /** * Restore a JE backend from backup, or verify the backup. * @param configEntry The configuration entry of the backend instance to be * @param cfg The configuration of the backend instance to be * restored. * @param restoreConfig The configuration to use when performing the restore. * @throws DirectoryException If a Directory Server error occurs. */ public void restoreBackup(ConfigEntry configEntry, public void restoreBackup(JEBackendCfg cfg, RestoreConfig restoreConfig) throws DirectoryException { @@ -767,7 +767,7 @@ Config config = new Config(); try { config.initializeConfig(configEntry, null); config.initializeConfig(cfg); } catch (ConfigException e) { opends/src/server/org/opends/server/backends/jeb/Config.java
@@ -201,50 +201,32 @@ /** * Initialize this JE backend configuration from a configuration entry. * Initialize this JE backend configuration from its configuration. * * @param configEntry The backend configuration entry. * @param baseDNs The set of base DNs that have been configured for this * backend. * @param cfg The backend configuration. * @throws ConfigException If there is an error in the configuration entry. */ public void initializeConfig(ConfigEntry configEntry, DN[] baseDNs) public void initializeConfig(JEBackendCfg cfg) throws ConfigException { initializeConfig(BackendImpl.getJEBackendCfg(configEntry), configEntry, baseDNs); initializeConfig(cfg, DirectoryServer.getConfigEntry(cfg.dn())); } /** * Initialize this JE backend configuration from a configuration entry. * * @param cfg The backend configuration entry. * @param baseDNs The set of base DNs that have been configured for this * backend. * @throws ConfigException If there is an error in the configuration entry. */ public void initializeConfig(JEBackendCfg cfg, DN[] baseDNs) throws ConfigException { initializeConfig(cfg, DirectoryServer.getConfigEntry(cfg.dn()), baseDNs); } /** * Initialize this JE backend configuration from a configuration object * Initialize this JE backend configuration from its configuration object * and its configuration entry. * * @param cfg The backend configuration object. * @param configEntry The backend configuration entry. * @param baseDNs The set of base DNs that have been configured for this * backend. * @throws ConfigException If there is an error in the configuration entry. */ private void initializeConfig(JEBackendCfg cfg, ConfigEntry configEntry, DN[] baseDNs) private void initializeConfig(JEBackendCfg cfg, ConfigEntry configEntry) throws ConfigException { DN[] baseDNs = new DN[cfg.getBackendBaseDN().size()]; cfg.getBackendBaseDN().toArray(baseDNs); // Set the base DNs. this.baseDNs = baseDNs; opends/src/server/org/opends/server/backends/jeb/RootContainer.java
@@ -493,7 +493,7 @@ entryContainers.remove(baseDN); } env.close(); if (env != null) env.close(); } /** opends/src/server/org/opends/server/backends/task/TaskBackend.java
@@ -43,7 +43,6 @@ import org.opends.server.core.ModifyOperation; import org.opends.server.core.ModifyDNOperation; import org.opends.server.core.SearchOperation; import org.opends.server.core.BackendConfigManager; import org.opends.server.types.DN; import org.opends.server.types.Entry; import org.opends.server.types.BackupConfig; @@ -68,8 +67,8 @@ import static org.opends.server.util.StaticUtils.*; import org.opends.server.util.Validator; import org.opends.server.admin.std.server.TaskBackendCfg; import org.opends.server.admin.std.meta.TaskBackendCfgDefn; import org.opends.server.admin.server.ConfigurationChangeListener; import org.opends.server.admin.Configuration; /** @@ -136,13 +135,19 @@ /** * {@inheritDoc} */ public void initializeBackend(ConfigEntry configEntry, DN[] baseDNs) throws ConfigException, InitializationException public void configureBackend(Configuration config) throws ConfigException { Validator.ensureNotNull(configEntry); TaskBackendCfg cfg = getTaskBackendCfg(configEntry); Validator.ensureNotNull(config); Validator.ensureTrue(config instanceof TaskBackendCfg); configEntryDN = cfg.dn(); TaskBackendCfg cfg = (TaskBackendCfg)config; DN[] baseDNs = new DN[cfg.getBackendBaseDN().size()]; cfg.getBackendBaseDN().toArray(baseDNs); ConfigEntry configEntry = DirectoryServer.getConfigEntry(cfg.dn()); configEntryDN = configEntry.getDN(); // Make sure that the provided set of base DNs contains exactly one value. @@ -183,7 +188,7 @@ String message = getMessage(msgID, String.valueOf(recurringTaskBaseString), getExceptionMessage(e)); throw new InitializationException(msgID, message, e); throw new ConfigException(msgID, message, e); } String scheduledTaskBaseString = SCHEDULED_TASK_BASE_RDN + "," + @@ -204,7 +209,7 @@ String message = getMessage(msgID, String.valueOf(scheduledTaskBaseString), getExceptionMessage(e)); throw new InitializationException(msgID, message, e); throw new ConfigException(msgID, message, e); } } @@ -217,20 +222,26 @@ // Get the path to the task data backing file. taskBackingFile = cfg.getTaskBackingFile(); // Define an empty sets for the supported controls and features. supportedControls = new HashSet<String>(0); supportedFeatures = new HashSet<String>(0); currentConfig = cfg; } /** * {@inheritDoc} */ public void initializeBackend() throws ConfigException, InitializationException { // Create the scheduler and initialize it from the backing file. taskScheduler = new TaskScheduler(this); taskScheduler.start(); // Define an empty sets for the supported controls and features. supportedControls = new HashSet<String>(0); supportedFeatures = new HashSet<String>(0); // Register with the Directory Server as a configurable component. currentConfig = cfg; cfg.addTaskChangeListener(this); currentConfig.addTaskChangeListener(this); // Register the task base as a private suffix. @@ -930,8 +941,7 @@ /** * {@inheritDoc} */ public void exportLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFExportConfig exportConfig) public void exportLDIF(LDIFExportConfig exportConfig) throws DirectoryException { // FIXME -- Implement support for exporting to LDIF. @@ -957,8 +967,7 @@ /** * {@inheritDoc} */ public void importLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFImportConfig importConfig) public void importLDIF(LDIFImportConfig importConfig) throws DirectoryException { // This backend does not support LDIF imports. @@ -1016,7 +1025,7 @@ /** * {@inheritDoc} */ public void createBackup(ConfigEntry configEntry, BackupConfig backupConfig) public void createBackup(BackupConfig backupConfig) throws DirectoryException { // NYI -- Create the backup. @@ -1062,8 +1071,7 @@ /** * {@inheritDoc} */ public void restoreBackup(ConfigEntry configEntry, RestoreConfig restoreConfig) public void restoreBackup(RestoreConfig restoreConfig) throws DirectoryException { // NYI -- Restore the backup. @@ -1350,10 +1358,5 @@ private static TaskBackendCfg getTaskBackendCfg(ConfigEntry configEntry) throws ConfigException { return BackendConfigManager.getConfiguration( TaskBackendCfgDefn.getInstance(), configEntry); } } opends/src/server/org/opends/server/core/BackendConfigManager.java
@@ -53,16 +53,9 @@ 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.server.ServerManagedObject; import org.opends.server.admin.server.ConfigExceptionFactory; import org.opends.server.admin.server.ServerManagedObjectDecodingException; import org.opends.server.admin.std.server.BackendCfg; import org.opends.server.admin.std.server.RootCfg; import org.opends.server.admin.std.meta.BackendCfgDefn; import org.opends.server.admin.Configuration; import org.opends.server.admin.AbstractManagedObjectDefinition; import org.opends.server.admin.ManagedObjectPath; import org.opends.server.admin.DefinitionDecodingException; /** @@ -285,12 +278,9 @@ // Perform the necessary initialization for the backend entry. DN[] baseDNs = new DN[backendCfg.getBackendBaseDN().size()]; baseDNs = backendCfg.getBackendBaseDN().toArray(baseDNs); try { backend.initializeBackend( DirectoryServer.getConfigEntry(backendCfg.dn()), baseDNs); initializeBackend(backend, backendCfg); } catch (Exception e) { @@ -769,8 +759,7 @@ try { backend.initializeBackend( DirectoryServer.getConfigEntry(cfg.dn()), baseDNs); initializeBackend(backend, cfg); } catch (Exception e) { @@ -1146,8 +1135,7 @@ // Perform the necessary initialization for the backend entry. try { backend.initializeBackend( DirectoryServer.getConfigEntry(cfg.dn()), baseDNs); initializeBackend(backend, cfg); } catch (Exception e) { @@ -1364,53 +1352,13 @@ } } /** * Gets the configuration corresponding to a config entry. * * @param <S> * The type of server configuration. * @param definition * The required definition of the required managed object. * @param configEntry * A configuration entry. * @return Returns the server-side configuration. * @throws ConfigException * If the entry could not be decoded. */ public static <S extends Configuration> S getConfiguration( AbstractManagedObjectDefinition<?, S> definition, ConfigEntry configEntry) throws ConfigException { try { ServerManagedObject<? extends S> mo = ServerManagedObject .decode(ManagedObjectPath.emptyPath(), definition, configEntry); return mo.getConfiguration(); } catch (DefinitionDecodingException e) { throw ConfigExceptionFactory.getInstance() .createDecodingExceptionAdaptor(configEntry.getDN(), e); } catch (ServerManagedObjectDecodingException e) { throw ConfigExceptionFactory.getInstance() .createDecodingExceptionAdaptor(e); } } /** * Gets the backend configuration corresponding to a backend config entry. * * @param configEntry A backend config entry. * @return Returns the backend configuration. * @throws ConfigException If the config entry could not be decoded. */ public static BackendCfg getBackendCfg(ConfigEntry configEntry) throws ConfigException @SuppressWarnings("unchecked") private static void initializeBackend(Backend backend, BackendCfg cfg) throws ConfigException, InitializationException { return getConfiguration(BackendCfgDefn.getInstance(), configEntry); backend.configureBackend(cfg); backend.initializeBackend(); } } opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -48,8 +48,11 @@ import javax.management.MBeanServerFactory; import org.opends.server.admin.ClassLoaderProvider; import org.opends.server.admin.server.ServerManagementContext; import org.opends.server.admin.std.server.PasswordValidatorCfg; import org.opends.server.admin.std.server.SynchronizationProviderCfg; import org.opends.server.admin.std.server.RootDSEBackendCfg; import org.opends.server.admin.std.server.RootCfg; import org.opends.server.api.*; import org.opends.server.api.plugin.PluginType; import org.opends.server.api.plugin.StartupPluginResult; @@ -2190,11 +2193,12 @@ // Make sure to initialize the root DSE backend separately after all other // backends. ConfigEntry rootDSEConfigEntry; RootDSEBackendCfg rootDSECfg; try { DN rootDSEConfigDN = DN.decode(DN_ROOT_DSE_CONFIG); rootDSEConfigEntry = configHandler.getConfigEntry(rootDSEConfigDN); RootCfg root = ServerManagementContext.getInstance().getRootConfiguration(); rootDSECfg = root.getRootDSEBackend(); } catch (Exception e) { @@ -2208,9 +2212,9 @@ throw new InitializationException(msgID, message, e); } DN[] baseDNs = { DN.nullDN() }; rootDSEBackend = new RootDSEBackend(); rootDSEBackend.initializeBackend(rootDSEConfigEntry, baseDNs); rootDSEBackend.configureBackend(rootDSECfg); rootDSEBackend.initializeBackend(); } opends/src/server/org/opends/server/extensions/ConfigFileHandler.java
@@ -113,7 +113,7 @@ import static org.opends.server.messages.MessageHandler.*; import static org.opends.server.util.ServerConstants.*; import static org.opends.server.util.StaticUtils.*; import org.opends.server.admin.Configuration; /** @@ -1095,24 +1095,18 @@ } /** * {@inheritDoc} */ public void configureBackend(Configuration cfg) throws ConfigException { // No action is required. } /** * Initializes this backend based on the information in the provided * configuration entry. * * @param configEntry The configuration entry that contains the information * to use to initialize this backend. * @param baseDNs The set of base DNs that have been configured for this * backend. * * @throws ConfigException If an unrecoverable problem arises in the * process of performing the initialization. * * @throws InitializationException If a problem occurs during initialization * that is not related to the server * configuration. * {@inheritDoc} */ public void initializeBackend(ConfigEntry configEntry, DN[] baseDNs) public void initializeBackend() throws ConfigException, InitializationException { // No action is required, since all initialization was performed in the @@ -2005,7 +1999,7 @@ new LDIFExportConfig(tempConfig, ExistingFileBehavior.OVERWRITE); // FIXME -- Add all the appropriate configuration options. exportLDIF(configRootEntry, baseDNs, exportConfig); writeLDIF(exportConfig); } catch (Exception e) { @@ -2245,24 +2239,20 @@ /** * Exports the contents of this backend to LDIF. This method should only be * called if <CODE>supportsLDIFExport</CODE> returns <CODE>true</CODE>. Note * that the server will not explicitly initialize this backend before calling * this method. * * @param configEntry The configuration entry for this backend. * @param baseDNs The set of base DNs configured for this backend. * @param exportConfig The configuration to use when performing the export. * * @throws DirectoryException If a problem occurs while performing the LDIF * export. * {@inheritDoc} */ public void exportLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFExportConfig exportConfig) public void exportLDIF(LDIFExportConfig exportConfig) throws DirectoryException { // TODO We would need export-ldif to initialize this backend. writeLDIF(exportConfig); } private void writeLDIF(LDIFExportConfig exportConfig) throws DirectoryException { LDIFWriter writer; try { @@ -2366,20 +2356,9 @@ /** * Imports information from an LDIF file into this backend. This method * should only be called if <CODE>supportsLDIFImport</CODE> returns * <CODE>true</CODE>. Note that the server will not explicitly initialize * this backend before calling this method. * * @param configEntry The configuration entry for this backend. * @param baseDNs The set of base DNs configured for this backend. * @param importConfig The configuration to use when performing the import. * * @throws DirectoryException If a problem occurs while performing the LDIF * import. * {@inheritDoc} */ public void importLDIF(ConfigEntry configEntry, DN[] baseDNs, LDIFImportConfig importConfig) public void importLDIF(LDIFImportConfig importConfig) throws DirectoryException { int msgID = MSGID_CONFIG_FILE_UNWILLING_TO_IMPORT; @@ -2437,19 +2416,9 @@ /** * Creates a backup of the contents of this backend in a form that may be * restored at a later date if necessary. This method should only be called * if <CODE>supportsBackup</CODE> returns <CODE>true</CODE>. Note that the * server will not explicitly initialize this backend before calling this * method. * * @param configEntry The configuration entry for this backend. * @param backupConfig The configuration to use when performing the backup. * * @throws DirectoryException If a problem occurs while performing the * backup. * {@inheritDoc} */ public void createBackup(ConfigEntry configEntry, BackupConfig backupConfig) public void createBackup(BackupConfig backupConfig) throws DirectoryException { // Get the properties to use for the backup. We don't care whether or not @@ -2881,20 +2850,9 @@ /** * Restores a backup of the contents of this backend. This method should only * be called if <CODE>supportsRestore</CODE> returns <CODE>true</CODE>. Note * that the server will not explicitly initialize this backend before calling * this method. * * @param configEntry The configuration entry for this backend. * @param restoreConfig The configuration to use when performing the * restore. * * @throws DirectoryException If a problem occurs while performing the * restore. * {@inheritDoc} */ public void restoreBackup(ConfigEntry configEntry, RestoreConfig restoreConfig) public void restoreBackup(RestoreConfig restoreConfig) throws DirectoryException { // First, make sure that the requested backup exists. opends/src/server/org/opends/server/messages/JebMessages.java
@@ -289,8 +289,8 @@ /** * The message ID of an informational message indicating that a JE backend * instance has started, and providing the current number of entries * stored in the backend. This message takes one argument which is the * current number of entries stored in the backend. * stored in the backend. This message takes two arguments which are the * backend ID and the current number of entries stored in the backend. */ public static final int MSGID_JEB_BACKEND_STARTED = CATEGORY_MASK_JEB | SEVERITY_MASK_NOTICE | 42; @@ -1239,7 +1239,8 @@ registerMessage(MSGID_JEB_IO_ERROR, "I/O error during backend operation: %s"); registerMessage(MSGID_JEB_BACKEND_STARTED, "A database backend containing %d entries has started"); "The database backend %s containing %d entries has " + "started"); registerMessage(MSGID_JEB_IMPORT_PARENT_NOT_FOUND, "The parent entry '%s' does not exist"); registerMessage(MSGID_JEB_IMPORT_ENTRY_EXISTS, opends/src/server/org/opends/server/messages/ToolMessages.java
@@ -1827,7 +1827,7 @@ /** * The message ID for the message that will be used if the backend selected * for an LDIF import does not support that operation. This takes a single * argument, which is the requested base DN. * argument, which is the requested backend ID. */ public static final int MSGID_LDIFIMPORT_CANNOT_IMPORT = CATEGORY_MASK_TOOLS | SEVERITY_MASK_SEVERE_ERROR | 214; opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java
@@ -26,14 +26,10 @@ */ package org.opends.server.replication.plugin; import static org.opends.server.config.ConfigConstants.ATTR_BACKEND_BASE_DN; import static org.opends.server.config.ConfigConstants.ATTR_BACKEND_CLASS; import static org.opends.server.config.ConfigConstants.ATTR_BACKEND_ID; import static org.opends.server.config.ConfigConstants.DN_BACKEND_BASE; import static org.opends.server.loggers.ErrorLogger.logError; import static org.opends.server.loggers.debug.DebugLogger.debugEnabled; import static org.opends.server.loggers.debug.DebugLogger.debugInfo; import static org.opends.server.messages.ConfigMessages.*; import static org.opends.server.messages.MessageHandler.getMessage; import static org.opends.server.messages.ToolMessages.*; import static org.opends.server.messages.ReplicationMessages.*; @@ -57,16 +53,14 @@ import org.opends.server.admin.server.ConfigurationChangeListener; import org.opends.server.admin.std.server.MultimasterDomainCfg; import org.opends.server.admin.std.server.BackendCfg; import org.opends.server.api.Backend; import org.opends.server.api.DirectoryThread; import org.opends.server.api.SynchronizationProvider; import org.opends.server.backends.jeb.BackendImpl; import org.opends.server.backends.task.Task; import org.opends.server.backends.task.TaskState; import org.opends.server.config.ConfigEntry; import org.opends.server.config.ConfigException; import org.opends.server.config.DNConfigAttribute; import org.opends.server.config.StringConfigAttribute; import org.opends.server.core.AddOperation; import org.opends.server.core.DeleteOperation; import org.opends.server.core.DirectoryServer; @@ -251,9 +245,8 @@ // Null when none is being processed. private IEContext ieContext = null; // The backend informations necessary to make an import or export. // The backend information necessary to make an import or export. private Backend backend; private ConfigEntry backendConfigEntry; private List<DN> branches = new ArrayList<DN>(0); private int listenerThreadNumber = 10; @@ -1859,13 +1852,9 @@ String dn) throws Exception { BackendImpl backend = (BackendImpl)DirectoryServer.getBackend(beID); DN[] baseDNs = backend.getBaseDNs(); // FIXME Should getConfigEntry be part of TaskUtils ? ConfigEntry configEntry = TaskUtils.getConfigEntry(backend); // FIXME Should setBackendEnabled be part of TaskUtils ? TaskUtils.setBackendEnabled(configEntry, false); TaskUtils.disableBackend(beID); try { @@ -1879,7 +1868,7 @@ try { backend.clearBackend(configEntry, baseDNs); backend.clearBackend(); } finally { @@ -1888,7 +1877,7 @@ } finally { TaskUtils.setBackendEnabled(configEntry, true); TaskUtils.enableBackend(beID); } if (createBaseEntry) @@ -1951,12 +1940,14 @@ ReplLDIFOutputStream os = new ReplLDIFOutputStream(this); LDIFExportConfig exportConfig = new LDIFExportConfig(os); List<DN> includeBranches = new ArrayList<DN>(1); includeBranches.add(this.baseDN); exportConfig.setIncludeBranches(includeBranches); // Launch the export. try { DN[] baseDNs = {this.baseDN}; backend.exportLDIF(backendConfigEntry, baseDNs, exportConfig); backend.exportLDIF(exportConfig); } catch (DirectoryException de) { @@ -2020,14 +2011,6 @@ */ protected void retrievesBackendInfos(DN baseDN) throws DirectoryException { ArrayList<Backend> backendList = new ArrayList<Backend>(); ArrayList<ConfigEntry> entryList = new ArrayList<ConfigEntry>(); ArrayList<List<DN>> dnList = new ArrayList<List<DN>>(); Backend backend = null; ConfigEntry backendConfigEntry = null; List<DN> branches = new ArrayList<DN>(0); // Retrieves the backend related to this domain Backend domainBackend = DirectoryServer.getBackend(baseDN); if (domainBackend == null) @@ -2038,44 +2021,9 @@ ResultCode.OTHER, message, msgID, null); } // Retrieves its config entry and its DNs int code = getBackends(backendList, entryList, dnList); if (code != 0) { int msgID = MSGID_CANNOT_DECODE_BASE_DN; String message = getMessage(msgID, DN_BACKEND_BASE); throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } int numBackends = backendList.size(); for (int i=0; i < numBackends; i++) { Backend b = backendList.get(i); if (domainBackend.getBackendID() != b.getBackendID()) { continue; } if (backend == null) { backend = domainBackend; backendConfigEntry = entryList.get(i).duplicate(); branches = dnList.get(i); } else { int msgID = MSGID_LDIFIMPORT_MULTIPLE_BACKENDS_FOR_ID; String message = getMessage(msgID, domainBackend.getBackendID()); logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR, message, msgID); throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } } if (backend == null) // Retrieves its configuration BackendCfg backendCfg = TaskUtils.getConfigEntry(domainBackend); if (backendCfg == null) { int msgID = MSGID_LDIFIMPORT_NO_BACKENDS_FOR_ID; String message = getMessage(msgID, domainBackend.getBackendID()); @@ -2084,10 +2032,11 @@ throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } else if (! backend.supportsLDIFExport()) if (! domainBackend.supportsLDIFExport()) { int msgID = MSGID_LDIFIMPORT_CANNOT_IMPORT; String message = getMessage(msgID, 0); // FIXME String message = getMessage(msgID, domainBackend.getBackendID()); logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR, message, msgID); throw new DirectoryException( @@ -2095,9 +2044,12 @@ } this.backend = backend; this.backendConfigEntry = backendConfigEntry; this.branches = branches; this.backend = domainBackend; this.branches = new ArrayList<DN>(backendCfg.getBackendBaseDN().size()); for (DN dn : backendCfg.getBackendBaseDN()) { this.branches.add(dn); } } @@ -2127,216 +2079,6 @@ } /** * Retrieves information about the backends defined in the Directory Server * configuration. * * @param backendList A list into which instantiated (but not initialized) * backend instances will be placed. * @param entryList A list into which the config entries associated with * the backends will be placed. * @param dnList A list into which the set of base DNs for each backend * will be placed. */ private static int getBackends(ArrayList<Backend> backendList, ArrayList<ConfigEntry> entryList, ArrayList<List<DN>> dnList) throws DirectoryException { // Get the base entry for all backend configuration. DN backendBaseDN = null; try { backendBaseDN = DN.decode(DN_BACKEND_BASE); } catch (DirectoryException de) { int msgID = MSGID_CANNOT_DECODE_BASE_DN; String message = getMessage(msgID, DN_BACKEND_BASE, de.getErrorMessage()); throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } catch (Exception e) { int msgID = MSGID_CANNOT_DECODE_BASE_DN; String message = getMessage(msgID, DN_BACKEND_BASE, stackTraceToSingleLineString(e)); throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } ConfigEntry baseEntry = null; try { baseEntry = DirectoryServer.getConfigEntry(backendBaseDN); } catch (ConfigException ce) { int msgID = MSGID_CANNOT_RETRIEVE_BACKEND_BASE_ENTRY; String message = getMessage(msgID, DN_BACKEND_BASE, ce.getMessage()); throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } catch (Exception e) { int msgID = MSGID_CANNOT_RETRIEVE_BACKEND_BASE_ENTRY; String message = getMessage(msgID, DN_BACKEND_BASE, stackTraceToSingleLineString(e)); throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } // Iterate through the immediate children, attempting to parse them as // backends. for (ConfigEntry configEntry : baseEntry.getChildren().values()) { // Get the backend ID attribute from the entry. If there isn't one, then // skip the entry. String backendID = null; try { int msgID = MSGID_CONFIG_BACKEND_ATTR_DESCRIPTION_BACKEND_ID; StringConfigAttribute idStub = new StringConfigAttribute(ATTR_BACKEND_ID, getMessage(msgID), true, false, true); StringConfigAttribute idAttr = (StringConfigAttribute) configEntry.getConfigAttribute(idStub); if (idAttr == null) { continue; } else { backendID = idAttr.activeValue(); } } catch (ConfigException ce) { int msgID = MSGID_CANNOT_DETERMINE_BACKEND_ID; String message = getMessage(msgID, String.valueOf(configEntry.getDN()), ce.getMessage()); throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } catch (Exception e) { int msgID = MSGID_CANNOT_DETERMINE_BACKEND_ID; String message = getMessage(msgID, String.valueOf(configEntry.getDN()), stackTraceToSingleLineString(e)); throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } // Get the backend class name attribute from the entry. If there isn't // one, then just skip the entry. String backendClassName = null; try { int msgID = MSGID_CONFIG_BACKEND_ATTR_DESCRIPTION_CLASS; StringConfigAttribute classStub = new StringConfigAttribute(ATTR_BACKEND_CLASS, getMessage(msgID), true, false, false); StringConfigAttribute classAttr = (StringConfigAttribute) configEntry.getConfigAttribute(classStub); if (classAttr == null) { continue; } else { backendClassName = classAttr.activeValue(); } } catch (ConfigException ce) { int msgID = MSGID_CANNOT_DETERMINE_BACKEND_CLASS; String message = getMessage(msgID, String.valueOf(configEntry.getDN()), ce.getMessage()); throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } catch (Exception e) { int msgID = MSGID_CANNOT_DETERMINE_BACKEND_CLASS; String message = getMessage(msgID, String.valueOf(configEntry.getDN()), stackTraceToSingleLineString(e)); throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } Class backendClass = null; try { backendClass = Class.forName(backendClassName); } catch (Exception e) { int msgID = MSGID_CANNOT_LOAD_BACKEND_CLASS; String message = getMessage(msgID, backendClassName, String.valueOf(configEntry.getDN()), stackTraceToSingleLineString(e)); throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } Backend backend = null; try { backend = (Backend) backendClass.newInstance(); backend.setBackendID(backendID); } catch (Exception e) { int msgID = MSGID_CANNOT_INSTANTIATE_BACKEND_CLASS; String message = getMessage(msgID, backendClassName, String.valueOf(configEntry.getDN()), stackTraceToSingleLineString(e)); throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } // Get the base DN attribute from the entry. If there isn't one, then // just skip this entry. List<DN> baseDNs = null; try { int msgID = MSGID_CONFIG_BACKEND_ATTR_DESCRIPTION_BASE_DNS; DNConfigAttribute baseDNStub = new DNConfigAttribute(ATTR_BACKEND_BASE_DN, getMessage(msgID), true, true, true); DNConfigAttribute baseDNAttr = (DNConfigAttribute) configEntry.getConfigAttribute(baseDNStub); if (baseDNAttr == null) { msgID = MSGID_NO_BASES_FOR_BACKEND; String message = getMessage(msgID, String.valueOf(configEntry.getDN())); throw new DirectoryException( DirectoryServer.getServerErrorResultCode(), message,msgID, null); } else { baseDNs = baseDNAttr.activeValues(); } } catch (Exception e) { int msgID = MSGID_CANNOT_DETERMINE_BASES_FOR_BACKEND; String message = getMessage(msgID, String.valueOf(configEntry.getDN()), stackTraceToSingleLineString(e)); throw new DirectoryException( ResultCode.OTHER, message, msgID, null); } backendList.add(backend); entryList.add(configEntry); dnList.add(baseDNs); } return 0; } /** * Initializes this domain from another source server. * * @param source The source from which to initialize @@ -2526,11 +2268,9 @@ /** * Process backend before import. * @param backend The backend. * @param backendConfigEntry The config entry of the backend. * @throws Exception */ private void preBackendImport(Backend backend, ConfigEntry backendConfigEntry) private void preBackendImport(Backend backend) throws Exception { // Stop saving state @@ -2540,7 +2280,7 @@ clearJEBackend(false,backend.getBackendID(),null); // FIXME setBackendEnabled should be part of TaskUtils ? TaskUtils.setBackendEnabled(backendConfigEntry, false); TaskUtils.disableBackend(backend.getBackendID()); // Acquire an exclusive lock for the backend. String lockFile = LockFileManager.getBackendLockFileName(backend); @@ -2583,9 +2323,8 @@ ieContext.entryLeftCount = initializeMessage.getEntryCount(); ieContext.initTaskCounters(initializeMessage.getEntryCount()); preBackendImport(this.backend, this.backendConfigEntry); preBackendImport(this.backend); DN[] baseDNs = {baseDN}; ieContext.ldifImportInputStream = new ReplLDIFInputStream(this); importConfig = new LDIFImportConfig(ieContext.ldifImportInputStream); @@ -2596,7 +2335,7 @@ // ExistingFileBehavior.OVERWRITE); // Process import this.backend.importLDIF(this.backendConfigEntry, baseDNs, importConfig); this.backend.importLDIF(importConfig); stateSavingDisabled = false; @@ -2616,7 +2355,7 @@ importConfig.close(); // Re-enable backend closeBackendImport(this.backend, this.backendConfigEntry); closeBackendImport(this.backend); // Update the task that initiated the import if ((ieContext != null ) && (ieContext.initializeTask != null)) @@ -2635,11 +2374,9 @@ /** * Make post import operations. * @param backend The backend implied in the import. * @param backendConfigEntry The config entry of the backend. * @exception DirectoryException Thrown when an error occurs. */ protected void closeBackendImport(Backend backend, ConfigEntry backendConfigEntry) protected void closeBackendImport(Backend backend) throws DirectoryException { String lockFile = LockFileManager.getBackendLockFileName(backend); @@ -2657,7 +2394,7 @@ } // FIXME setBackendEnabled should be part taskUtils ? TaskUtils.setBackendEnabled(backendConfigEntry, true); TaskUtils.enableBackend(backend.getBackendID()); } /** opends/src/server/org/opends/server/tasks/BackupTask.java
@@ -32,7 +32,6 @@ import static org.opends.server.messages.ToolMessages.*; import static org.opends.server.messages.MessageHandler.getMessage; import static org.opends.server.util.ServerConstants.DATE_FORMAT_GMT_TIME; import static org.opends.server.loggers.ErrorLogger.logError; import static org.opends.server.util.StaticUtils.*; import static org.opends.server.util.ServerConstants. BACKUP_DIRECTORY_DESCRIPTOR_FILE; @@ -56,6 +55,7 @@ import org.opends.server.types.Operation; import org.opends.server.types.Privilege; import org.opends.server.types.ResultCode; import org.opends.server.admin.std.server.BackendCfg; import java.util.ArrayList; import java.util.Date; @@ -358,7 +358,7 @@ private boolean backupBackend(Backend b, File backupLocation) { // Get the config entry for this backend. ConfigEntry configEntry = configEntries.get(b.getBackendID()); BackendCfg cfg = TaskUtils.getConfigEntry(b); // If the directory doesn't exist, then create it. If it does exist, then @@ -396,8 +396,7 @@ } else { backupDir = new BackupDirectory(backupLocation.getPath(), configEntry.getDN()); backupDir = new BackupDirectory(backupLocation.getPath(), cfg.dn()); } } else @@ -417,7 +416,7 @@ } backupDir = new BackupDirectory(backupLocation.getPath(), configEntry.getDN()); cfg.dn()); } @@ -435,7 +434,7 @@ try { DirectoryServer.notifyBackupBeginning(b, backupConfig); b.createBackup(configEntry, backupConfig); b.createBackup(backupConfig); DirectoryServer.notifyBackupEnded(b, backupConfig, true); } catch (DirectoryException de) opends/src/server/org/opends/server/tasks/ExportTask.java
@@ -32,14 +32,12 @@ import static org.opends.server.messages.ToolMessages.*; import static org.opends.server.messages.MessageHandler.getMessage; import static org.opends.server.util.StaticUtils.*; import static org.opends.server.loggers.ErrorLogger.logError; import org.opends.server.backends.task.Task; import org.opends.server.backends.task.TaskState; import org.opends.server.core.DirectoryServer; import org.opends.server.core.LockFileManager; import org.opends.server.api.Backend; import org.opends.server.api.ClientConnection; import org.opends.server.config.ConfigEntry; import org.opends.server.types.Attribute; import org.opends.server.types.AttributeType; import org.opends.server.types.DirectoryException; @@ -311,7 +309,6 @@ // Get the backend into which the LDIF should be imported. Backend backend; ConfigEntry configEntry; ArrayList<DN> defaultIncludeBranches; backend = DirectoryServer.getBackend(backendID); @@ -333,9 +330,6 @@ return TaskState.STOPPED_BY_ERROR; } // Get the config entry for this backend. configEntry = TaskUtils.getConfigEntry(backend); defaultIncludeBranches = new ArrayList<DN>(backend.getBaseDNs().length); for (DN dn : backend.getBaseDNs()) { @@ -347,7 +341,7 @@ { for (String s : excludeBranchStrings) { DN excludeBranch = null; DN excludeBranch; try { excludeBranch = DN.decode(s); @@ -383,7 +377,7 @@ includeBranches = new ArrayList<DN>(); for (String s : includeBranchStrings) { DN includeBranch = null; DN includeBranch; try { includeBranch = DN.decode(s); @@ -493,7 +487,7 @@ try { DirectoryServer.notifyExportBeginning(backend, exportConfig); backend.exportLDIF(configEntry, baseDNs, exportConfig); backend.exportLDIF(exportConfig); DirectoryServer.notifyExportEnded(backend, exportConfig, true); } catch (DirectoryException de) opends/src/server/org/opends/server/tasks/ImportTask.java
@@ -42,7 +42,6 @@ import org.opends.server.core.LockFileManager; import org.opends.server.api.Backend; import org.opends.server.api.ClientConnection; import org.opends.server.config.ConfigEntry; import org.opends.server.types.Attribute; import org.opends.server.types.AttributeType; import org.opends.server.types.DirectoryException; @@ -285,7 +284,6 @@ // Get the backend into which the LDIF should be imported. Backend backend; ConfigEntry configEntry; ArrayList<DN> defaultIncludeBranches; ArrayList<DN> excludeBranches = new ArrayList<DN>(); @@ -308,9 +306,6 @@ return TaskState.STOPPED_BY_ERROR; } // Get the config entry for this backend. configEntry = TaskUtils.getConfigEntry(backend); // Find backends with subordinate base DNs that should be excluded from the // import. @@ -479,7 +474,7 @@ // Disable the backend. try { TaskUtils.setBackendEnabled(configEntry, false); TaskUtils.disableBackend(backendID); } catch (DirectoryException e) { @@ -530,7 +525,7 @@ // Launch the import. try { backend.importLDIF(configEntry, baseDNs, importConfig); backend.importLDIF(importConfig); } catch (DirectoryException de) { @@ -599,7 +594,7 @@ // Enable the backend. try { TaskUtils.setBackendEnabled(configEntry, true); TaskUtils.enableBackend(backendID); // It is necessary to retrieve the backend structure again // because disabling and enabling it again may have resulted // in a new backend being registered to the server. opends/src/server/org/opends/server/tasks/RebuildTask.java
@@ -45,7 +45,6 @@ import org.opends.server.core.LockFileManager; import org.opends.server.api.ClientConnection; import org.opends.server.api.Backend; import org.opends.server.config.ConfigEntry; import static org.opends.server.core.DirectoryServer.getAttributeType; import static org.opends.server.util.StaticUtils.*; @@ -184,10 +183,6 @@ return TaskState.STOPPED_BY_ERROR; } // Get the config entry for this backend. ConfigEntry configEntry = TaskUtils.getConfigEntry(backend); DN[] baseDNs = backend.getBaseDNs(); // Acquire a shared lock for the backend if we are rebuilding attribute // indexes only. If we are rebuilding one or more system indexes, we have // to aquire exclusive lock. @@ -198,7 +193,7 @@ // Disable the backend. try { TaskUtils.setBackendEnabled(configEntry, false); TaskUtils.disableBackend(backend.getBackendID()); } catch (DirectoryException e) { @@ -265,7 +260,7 @@ try { BackendImpl jebBackend = (BackendImpl)backend; jebBackend.rebuildBackend(rebuildConfig, configEntry, baseDNs); jebBackend.rebuildBackend(rebuildConfig); } catch (Exception e) { @@ -311,7 +306,7 @@ // Enable the backend. try { TaskUtils.setBackendEnabled(configEntry, true); TaskUtils.enableBackend(backend.getBackendID()); } catch (DirectoryException e) { opends/src/server/org/opends/server/tasks/RestoreTask.java
@@ -250,10 +250,10 @@ // Get the DN of the backend configuration entry from the backup. DN configEntryDN = backupDir.getConfigEntryDN(); // Get the backend configuration entry. ConfigEntry configEntry; try { // Get the backend configuration entry. configEntry = DirectoryServer.getConfigEntry(configEntryDN); } catch (ConfigException e) @@ -298,7 +298,7 @@ // Disable the backend. try { TaskUtils.setBackendEnabled(configEntry, false); TaskUtils.disableBackend(backendID); } catch (DirectoryException e) { @@ -325,7 +325,7 @@ // Perform the restore. try { backend.restoreBackup(configEntry, restoreConfig); backend.restoreBackup(restoreConfig); } catch (DirectoryException de) { @@ -363,7 +363,7 @@ // Enable the backend. try { TaskUtils.setBackendEnabled(configEntry, true); TaskUtils.enableBackend(backendID); // it is necessary to retrieve the backend structure again // because disabling and enabling it again may have resulted // in a new backend being registered to the server. opends/src/server/org/opends/server/tasks/TaskUtils.java
@@ -57,6 +57,9 @@ import org.opends.server.types.ModificationType; import org.opends.server.types.RawModification; import org.opends.server.types.ResultCode; import org.opends.server.admin.std.server.BackendCfg; import org.opends.server.admin.std.server.RootCfg; import org.opends.server.admin.server.ServerManagementContext; import java.util.ArrayList; import java.util.LinkedHashSet; @@ -89,8 +92,7 @@ true, false, true); StringConfigAttribute idAttr = (StringConfigAttribute) configEntry.getConfigAttribute(idStub); String backendID = idAttr.activeValue(); return backendID; return idAttr.activeValue(); } catch (ConfigException ce) { @@ -126,7 +128,7 @@ // FIXME The error messages should not be the LDIF import messages // Get the base entry for all backend configuration. DN backendBaseDN = null; DN backendBaseDN; try { backendBaseDN = DN.decode(DN_BACKEND_BASE); @@ -151,7 +153,7 @@ return configEntries; } ConfigEntry baseEntry = null; ConfigEntry baseEntry; try { baseEntry = DirectoryServer.getConfigEntry(backendBaseDN); @@ -183,7 +185,7 @@ { // Get the backend ID attribute from the entry. If there isn't one, then // skip the entry. String backendID = null; String backendID; try { int msgID = MSGID_CONFIG_BACKEND_ATTR_DESCRIPTION_BACKEND_ID; @@ -235,35 +237,47 @@ * @return The configuration entry of the backend, or null if it could not * be found. */ public static ConfigEntry getConfigEntry(Backend backend) public static BackendCfg getConfigEntry(Backend backend) { Map<String,ConfigEntry> configEntries = getBackendConfigEntries(); return configEntries.get(backend.getBackendID()); RootCfg root = ServerManagementContext.getInstance(). getRootConfiguration(); try { return root.getBackend(backend.getBackendID()); } catch (ConfigException e) { return null; } } /** * Enable or disable a backend using an internal modify operation on the * Enables a backend using an internal modify operation on the * backend configuration entry. * * @param configEntry The configuration entry of the backend to be enabled * or disabled. * @param enable Specifies whether the backend should be enabled or disabled. * @param backendID Identifies the backend to be enabled. * @throws DirectoryException If the internal modify operation failed. */ public static void setBackendEnabled(ConfigEntry configEntry, boolean enable) public static void enableBackend(String backendID) throws DirectoryException { DN configEntryDN; RootCfg root = ServerManagementContext.getInstance().getRootConfiguration(); try { BackendCfg cfg = root.getBackend(backendID); configEntryDN = cfg.dn(); } catch (ConfigException e) { throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), e.getMessage(), e.getMessageID(), e); } ArrayList<ASN1OctetString> valueList = new ArrayList<ASN1OctetString>(1); if (enable) { valueList.add(new ASN1OctetString("TRUE")); } else { valueList.add(new ASN1OctetString("FALSE")); } valueList.add(new ASN1OctetString("TRUE")); LDAPAttribute a = new LDAPAttribute(ATTR_BACKEND_ENABLED, valueList); LDAPModification m = new LDAPModification(ModificationType.REPLACE, a); @@ -273,7 +287,7 @@ InternalClientConnection conn = InternalClientConnection.getRootConnection(); String backendDNString = configEntry.getDN().toString(); String backendDNString = configEntryDN.toString(); ASN1OctetString rawEntryDN = new ASN1OctetString(backendDNString); ModifyOperation internalModify = conn.processModify(rawEntryDN, modList); @@ -282,14 +296,58 @@ if (resultCode != ResultCode.SUCCESS) { int msgID; if (enable) { msgID = TaskMessages.MSGID_TASK_CANNOT_ENABLE_BACKEND; } else { msgID = TaskMessages.MSGID_TASK_CANNOT_DISABLE_BACKEND; } msgID = TaskMessages.MSGID_TASK_CANNOT_ENABLE_BACKEND; String message = getMessage(msgID, backendDNString); throw new DirectoryException(resultCode, message, msgID); } } /** * Disables a backend using an internal modify operation on the * backend configuration entry. * * @param backendID Identifies the backend to be disabled. * @throws DirectoryException If the internal modify operation failed. */ public static void disableBackend(String backendID) throws DirectoryException { DN configEntryDN; RootCfg root = ServerManagementContext.getInstance().getRootConfiguration(); try { BackendCfg cfg = root.getBackend(backendID); configEntryDN = cfg.dn(); } catch (ConfigException e) { throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), e.getMessage(), e.getMessageID(), e); } ArrayList<ASN1OctetString> valueList = new ArrayList<ASN1OctetString>(1); valueList.add(new ASN1OctetString("FALSE")); LDAPAttribute a = new LDAPAttribute(ATTR_BACKEND_ENABLED, valueList); LDAPModification m = new LDAPModification(ModificationType.REPLACE, a); ArrayList<RawModification> modList = new ArrayList<RawModification>(1); modList.add(m); InternalClientConnection conn = InternalClientConnection.getRootConnection(); String backendDNString = configEntryDN.toString(); ASN1OctetString rawEntryDN = new ASN1OctetString(backendDNString); ModifyOperation internalModify = conn.processModify(rawEntryDN, modList); ResultCode resultCode = internalModify.getResultCode(); if (resultCode != ResultCode.SUCCESS) { int msgID; msgID = TaskMessages.MSGID_TASK_CANNOT_DISABLE_BACKEND; String message = getMessage(msgID, backendDNString); throw new DirectoryException(resultCode, message, msgID); } opends/src/server/org/opends/server/tools/BackUpDB.java
@@ -38,7 +38,6 @@ import java.util.TimeZone; import org.opends.server.api.Backend; import org.opends.server.config.ConfigEntry; import org.opends.server.config.ConfigException; import org.opends.server.core.CoreConfigManager; import org.opends.server.core.DirectoryServer; @@ -66,7 +65,7 @@ import static org.opends.server.util.StaticUtils.*; import org.opends.server.util.StaticUtils; import static org.opends.server.tools.ToolConstants.*; import org.opends.server.admin.std.server.BackendCfg; /** @@ -366,8 +365,8 @@ { try { directoryServer.bootstrapClient(); directoryServer.initializeJMX(); DirectoryServer.bootstrapClient(); DirectoryServer.initializeJMX(); } catch (Exception e) { @@ -506,15 +505,15 @@ // Get information about the backends defined in the server, and determine // whether we are backing up multiple backends or a single backend. ArrayList<Backend> backendList = new ArrayList<Backend>(); ArrayList<ConfigEntry> entryList = new ArrayList<ConfigEntry>(); ArrayList<BackendCfg> entryList = new ArrayList<BackendCfg>(); ArrayList<List<DN>> dnList = new ArrayList<List<DN>>(); BackendToolUtils.getBackends(backendList, entryList, dnList); int numBackends = backendList.size(); boolean multiple; ArrayList<Backend> backendsToArchive = new ArrayList<Backend>(numBackends); HashMap<String,ConfigEntry> configEntries = new HashMap<String,ConfigEntry>(numBackends); HashMap<String,BackendCfg> configEntries = new HashMap<String,BackendCfg>(numBackends); if (backUpAll.isPresent()) { for (int i=0; i < numBackends; i++) @@ -629,7 +628,7 @@ // Get the config entry for this backend. ConfigEntry configEntry = configEntries.get(b.getBackendID()); BackendCfg configEntry = configEntries.get(b.getBackendID()); // Get the path to the directory to use for this backup. If we will be @@ -650,7 +649,7 @@ // If the directory doesn't exist, then create it. If it does exist, then // see if it has a backup descriptor file. BackupDirectory backupDir = null; BackupDirectory backupDir; backupDirFile = new File(backupDirPath); if (backupDirFile.exists()) { @@ -731,7 +730,7 @@ } else { backupDir = new BackupDirectory(backupDirPath, configEntry.getDN()); backupDir = new BackupDirectory(backupDirPath, configEntry.dn()); } } else @@ -773,7 +772,7 @@ continue; } backupDir = new BackupDirectory(backupDirPath, configEntry.getDN()); backupDir = new BackupDirectory(backupDirPath, configEntry.dn()); } @@ -826,7 +825,7 @@ // Perform the backup. try { b.createBackup(configEntry, backupConfig); b.createBackup(backupConfig); } catch (DirectoryException de) { opends/src/server/org/opends/server/tools/BackendToolUtils.java
@@ -43,6 +43,9 @@ import static org.opends.server.messages.ConfigMessages.*; import static org.opends.server.loggers.ErrorLogger.*; import static org.opends.server.util.StaticUtils.*; import org.opends.server.admin.std.server.BackendCfg; import org.opends.server.admin.std.server.RootCfg; import org.opends.server.admin.server.ServerManagementContext; import java.util.ArrayList; import java.util.List; @@ -66,12 +69,13 @@ * @return 0 if everything went fine. 1 if an error occurred. * */ @SuppressWarnings("unchecked") public static int getBackends(ArrayList<Backend> backendList, ArrayList<ConfigEntry> entryList, ArrayList<List<DN>> dnList) ArrayList<BackendCfg> entryList, ArrayList<List<DN>> dnList) { // Get the base entry for all backend configuration. DN backendBaseDN = null; DN backendBaseDN; try { backendBaseDN = DN.decode(DN_BACKEND_BASE); @@ -94,7 +98,7 @@ return 1; } ConfigEntry baseEntry = null; ConfigEntry baseEntry; try { baseEntry = DirectoryServer.getConfigEntry(backendBaseDN); @@ -120,11 +124,12 @@ // Iterate through the immediate children, attempting to parse them as // backends. RootCfg root = ServerManagementContext.getInstance().getRootConfiguration(); for (ConfigEntry configEntry : baseEntry.getChildren().values()) { // Get the backend ID attribute from the entry. If there isn't one, then // skip the entry. String backendID = null; String backendID; try { int msgID = MSGID_CONFIG_BACKEND_ATTR_DESCRIPTION_BACKEND_ID; @@ -164,7 +169,7 @@ // Get the backend class name attribute from the entry. If there isn't // one, then just skip the entry. String backendClassName = null; String backendClassName; try { int msgID = MSGID_CONFIG_BACKEND_ATTR_DESCRIPTION_CLASS; @@ -201,7 +206,7 @@ return 1; } Class backendClass = null; Class backendClass; try { backendClass = Class.forName(backendClassName); @@ -217,11 +222,14 @@ return 1; } Backend backend = null; Backend backend; BackendCfg cfg; try { backend = (Backend) backendClass.newInstance(); backend.setBackendID(backendID); cfg = root.getBackend(backendID); backend.configureBackend(cfg); } catch (Exception e) { @@ -271,7 +279,7 @@ backendList.add(backend); entryList.add(configEntry); entryList.add(cfg); dnList.add(baseDNs); } return 0; opends/src/server/org/opends/server/tools/ExportLDIF.java
@@ -34,7 +34,6 @@ import org.opends.server.api.Backend; import org.opends.server.api.plugin.PluginType; import org.opends.server.config.ConfigEntry; import org.opends.server.config.ConfigException; import org.opends.server.core.CoreConfigManager; import org.opends.server.core.DirectoryServer; @@ -65,7 +64,7 @@ import static org.opends.server.util.StaticUtils.*; import org.opends.server.util.StaticUtils; import static org.opends.server.tools.ToolConstants.*; import org.opends.server.admin.std.server.BackendCfg; /** @@ -312,8 +311,8 @@ { try { directoryServer.bootstrapClient(); directoryServer.initializeJMX(); DirectoryServer.bootstrapClient(); DirectoryServer.initializeJMX(); } catch (Exception e) { @@ -600,13 +599,12 @@ // and also finding backends with subordinate base DNs that should be // excluded from the export. Backend backend = null; ConfigEntry configEntry = null; List<DN> baseDNList = null; List<DN> defaultIncludeBranches = null; ArrayList<DN> excludeBranches = null; ArrayList<Backend> backendList = new ArrayList<Backend>(); ArrayList<ConfigEntry> entryList = new ArrayList<ConfigEntry>(); ArrayList<BackendCfg> entryList = new ArrayList<BackendCfg>(); ArrayList<List<DN>> dnList = new ArrayList<List<DN>>(); BackendToolUtils.getBackends(backendList, entryList, dnList); @@ -622,7 +620,6 @@ if (backend == null) { backend = b; configEntry = entryList.get(i); baseDNList = dnList.get(i); defaultIncludeBranches = dnList.get(i); } @@ -658,7 +655,7 @@ excludeBranches = new ArrayList<DN>(); for (String s : excludeBranchStrings.getValues()) { DN excludeBranch = null; DN excludeBranch; try { excludeBranch = DN.decode(s); @@ -694,7 +691,7 @@ includeBranches = new ArrayList<DN>(); for (String s : includeBranchStrings.getValues()) { DN includeBranch = null; DN includeBranch; try { includeBranch = DN.decode(s); @@ -811,7 +808,7 @@ // Launch the export. try { backend.exportLDIF(configEntry, baseDNs, exportConfig); backend.exportLDIF(exportConfig); } catch (DirectoryException de) { opends/src/server/org/opends/server/tools/ImportLDIF.java
@@ -36,7 +36,6 @@ import org.opends.server.api.Backend; import org.opends.server.api.plugin.PluginType; import org.opends.server.config.ConfigEntry; import org.opends.server.config.ConfigException; import org.opends.server.core.CoreConfigManager; import org.opends.server.core.DirectoryServer; @@ -69,7 +68,7 @@ import static org.opends.server.util.StaticUtils.*; import org.opends.server.util.StaticUtils; import static org.opends.server.tools.ToolConstants.*; import org.opends.server.admin.std.server.BackendCfg; /** @@ -720,12 +719,11 @@ // imported and finding backends with subordinate base DNs that should be // excluded from the import. Backend backend = null; ConfigEntry configEntry = null; List<DN> defaultIncludeBranches = null; List<DN> excludeBranches = new ArrayList<DN>(); ArrayList<Backend> backendList = new ArrayList<Backend>(); ArrayList<ConfigEntry> entryList = new ArrayList<ConfigEntry>(); ArrayList<BackendCfg> entryList = new ArrayList<BackendCfg>(); ArrayList<List<DN>> dnList = new ArrayList<List<DN>>(); int code = BackendToolUtils.getBackends(backendList, entryList, dnList); if (code != 0) @@ -745,7 +743,6 @@ if (backend == null) { backend = b; configEntry = entryList.get(i); defaultIncludeBranches = dnList.get(i); } else @@ -797,7 +794,7 @@ for (String s : excludeBranchStrings.getValues()) { DN excludeBranch = null; DN excludeBranch; try { excludeBranch = DN.decode(s); @@ -836,7 +833,7 @@ includeBranches = new ArrayList<DN>(); for (String s : includeBranchStrings.getValues()) { DN includeBranch = null; DN includeBranch; try { includeBranch = DN.decode(s); @@ -1025,7 +1022,7 @@ int retCode = 0; try { backend.importLDIF(configEntry, baseDNs, importConfig); backend.importLDIF(importConfig); } catch (DirectoryException de) { opends/src/server/org/opends/server/tools/RebuildIndex.java
@@ -35,7 +35,6 @@ import static org.opends.server.messages.ToolMessages.*; import org.opends.server.config.ConfigException; import org.opends.server.config.ConfigEntry; import static org.opends.server.loggers.ErrorLogger.logError; import org.opends.server.loggers.ThreadFilterTextErrorLogPublisher; import org.opends.server.loggers.TextWriter; @@ -51,6 +50,7 @@ import org.opends.server.api.Backend; import org.opends.server.backends.jeb.BackendImpl; import org.opends.server.backends.jeb.RebuildConfig; import org.opends.server.admin.std.server.BackendCfg; import java.util.ArrayList; import java.util.List; @@ -349,7 +349,7 @@ } // Decode the base DN provided by the user. DN rebuildBaseDN = null; DN rebuildBaseDN; try { rebuildBaseDN = DN.decode(baseDNString.getValue()); @@ -375,11 +375,10 @@ // Get information about the backends defined in the server. Backend backend = null; ConfigEntry configEntry = null; DN[] baseDNArray = null; DN[] baseDNArray; ArrayList<Backend> backendList = new ArrayList<Backend>(); ArrayList<ConfigEntry> entryList = new ArrayList<ConfigEntry>(); ArrayList<BackendCfg> entryList = new ArrayList<BackendCfg>(); ArrayList<List<DN>> dnList = new ArrayList<List<DN>>(); int code = BackendToolUtils.getBackends(backendList, entryList, dnList); @@ -387,7 +386,6 @@ for (int i=0; i < numBackends; i++) { Backend b = backendList.get(i); ConfigEntry entry = entryList.get(i); List<DN> baseDNs = dnList.get(i); for (DN baseDN : baseDNs) @@ -397,7 +395,6 @@ if (backend == null) { backend = b; configEntry = entry; baseDNArray = new DN[baseDNs.size()]; baseDNs.toArray(baseDNArray); } @@ -470,7 +467,7 @@ try { BackendImpl jebBackend = (BackendImpl)backend; jebBackend.rebuildBackend(rebuildConfig, configEntry, baseDNArray); jebBackend.rebuildBackend(rebuildConfig); } catch (Exception e) { opends/src/server/org/opends/server/tools/RestoreDB.java
@@ -36,7 +36,6 @@ import java.util.List; import org.opends.server.api.Backend; import org.opends.server.config.ConfigEntry; import org.opends.server.config.ConfigException; import org.opends.server.core.CoreConfigManager; import org.opends.server.core.DirectoryServer; @@ -65,7 +64,7 @@ import static org.opends.server.util.StaticUtils.*; import org.opends.server.util.StaticUtils; import static org.opends.server.tools.ToolConstants.*; import org.opends.server.admin.std.server.BackendCfg; /** @@ -231,8 +230,8 @@ { try { directoryServer.bootstrapClient(); directoryServer.initializeJMX(); DirectoryServer.bootstrapClient(); DirectoryServer.initializeJMX(); } catch (Exception e) { @@ -369,7 +368,7 @@ // Open the backup directory and make sure it is valid. BackupDirectory backupDir = null; BackupDirectory backupDir; try { backupDir = BackupDirectory.readBackupDirectoryDescriptor( @@ -454,7 +453,7 @@ // If a backup ID was specified, then make sure it is valid. If none was // provided, then choose the latest backup from the archive. String backupID = null; String backupID; if (backupIDString.isPresent()) { backupID = backupIDString.getValue(); @@ -495,22 +494,20 @@ // Get information about the backends defined in the server and determine // which to use for the restore. ArrayList<Backend> backendList = new ArrayList<Backend>(); ArrayList<ConfigEntry> entryList = new ArrayList<ConfigEntry>(); ArrayList<BackendCfg> entryList = new ArrayList<BackendCfg>(); ArrayList<List<DN>> dnList = new ArrayList<List<DN>>(); BackendToolUtils.getBackends(backendList, entryList, dnList); Backend backend = null; ConfigEntry configEntry = null; int numBackends = backendList.size(); for (int i=0; i < numBackends; i++) { Backend b = backendList.get(i); ConfigEntry e = entryList.get(i); if (e.getDN().equals(configEntryDN)) BackendCfg e = entryList.get(i); if (e.dn().equals(configEntryDN)) { backend = b; configEntry = e; break; } } @@ -568,7 +565,7 @@ // Perform the restore. try { backend.restoreBackup(configEntry, restoreConfig); backend.restoreBackup(restoreConfig); } catch (DirectoryException de) { opends/src/server/org/opends/server/tools/VerifyIndex.java
@@ -31,7 +31,6 @@ import org.opends.server.api.Backend; import org.opends.server.backends.jeb.BackendImpl; import org.opends.server.backends.jeb.VerifyConfig; import org.opends.server.config.ConfigEntry; import org.opends.server.config.ConfigException; import org.opends.server.core.CoreConfigManager; import org.opends.server.core.DirectoryServer; @@ -60,7 +59,7 @@ import static org.opends.server.util.StaticUtils.*; import org.opends.server.util.StaticUtils; import static org.opends.server.tools.ToolConstants.*; import org.opends.server.admin.std.server.BackendCfg; /** @@ -362,7 +361,7 @@ // Decode the base DN provided by the user. DN verifyBaseDN = null; DN verifyBaseDN ; try { verifyBaseDN = DN.decode(baseDNString.getValue()); @@ -390,11 +389,9 @@ // Get information about the backends defined in the server. Iterate // through them, finding the one backend to be verified. Backend backend = null; ConfigEntry configEntry = null; DN[] baseDNArray = null; ArrayList<Backend> backendList = new ArrayList<Backend>(); ArrayList<ConfigEntry> entryList = new ArrayList<ConfigEntry>(); ArrayList<BackendCfg> entryList = new ArrayList<BackendCfg>(); ArrayList<List<DN>> dnList = new ArrayList<List<DN>>(); BackendToolUtils.getBackends(backendList, entryList, dnList); @@ -402,7 +399,6 @@ for (int i=0; i < numBackends; i++) { Backend b = backendList.get(i); ConfigEntry entry = entryList.get(i); List<DN> baseDNs = dnList.get(i); for (DN baseDN : baseDNs) @@ -412,9 +408,6 @@ if (backend == null) { backend = b; configEntry = entry; baseDNArray = new DN[baseDNs.size()]; baseDNs.toArray(baseDNArray); } else { @@ -496,7 +489,7 @@ try { BackendImpl jebBackend = (BackendImpl)backend; jebBackend.verifyBackend(verifyConfig, configEntry, baseDNArray, null); jebBackend.verifyBackend(verifyConfig, null); } catch (Exception e) { opends/tests/unit-tests-testng/resource/config-changes.ldif
@@ -523,7 +523,7 @@ objectClass: ds-cfg-je-backend ds-cfg-backend-enabled: true ds-cfg-backend-class: org.opends.server.backends.jeb.BackendImpl ds-cfg-backend-id: indexTestRoot ds-cfg-backend-id: indexRoot ds-cfg-backend-writability-mode: enabled ds-cfg-backend-base-dn: dc=test,dc=com ds-cfg-backend-base-dn: dc=test1,dc=com opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
@@ -36,7 +36,6 @@ import java.util.HashMap; import java.util.Enumeration; import java.util.Map; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.logging.Logger; import java.util.logging.Handler; @@ -50,7 +49,6 @@ import org.opends.server.backends.MemoryBackend; import org.opends.server.backends.jeb.BackendImpl; import org.opends.server.config.ConfigException; import org.opends.server.config.ConfigEntry; import org.opends.server.core.AddOperation; import org.opends.server.core.DirectoryServer; import org.opends.server.core.LockFileManager; @@ -74,13 +72,7 @@ import org.opends.server.types.FilePermission; import org.opends.server.types.InitializationException; import org.opends.server.types.OperatingSystem; import org.opends.server.types.NullOutputStream; import org.opends.server.types.ResultCode; import org.opends.server.util.ChangeRecordEntry; import org.opends.server.util.AddChangeRecordEntry; import org.opends.server.util.DeleteChangeRecordEntry; import org.opends.server.util.ModifyChangeRecordEntry; import org.opends.server.util.ModifyDNChangeRecordEntry; import static org.testng.Assert.*; import static org.testng.Assert.assertEquals; @@ -395,7 +387,7 @@ * @throws SocketException in case of underlying exception. */ private static ServerSocket bindPort(int port) throws IOException, SocketException throws IOException { ServerSocket serverLdapSocket; serverLdapSocket = new ServerSocket(); @@ -411,7 +403,7 @@ * @throws IOException in case of underlying exception. * @throws SocketException in case of underlying exception. */ public static ServerSocket bindFreePort() throws IOException, SocketException public static ServerSocket bindFreePort() throws IOException { ServerSocket serverLdapSocket; serverLdapSocket = new ServerSocket(); @@ -459,7 +451,8 @@ { memoryBackend = new MemoryBackend(); memoryBackend.setBackendID("test"); memoryBackend.initializeBackend(null, new DN[] { baseDN }); memoryBackend.setBaseDNs(new DN[] { baseDN }); memoryBackend.initializeBackend(); DirectoryServer.registerBackend(memoryBackend); } @@ -490,10 +483,8 @@ throws Exception { BackendImpl backend = (BackendImpl)DirectoryServer.getBackend(beID); DN[] baseDNs = backend.getBaseDNs(); ConfigEntry configEntry = TaskUtils.getConfigEntry(backend); TaskUtils.setBackendEnabled(configEntry, false); TaskUtils.disableBackend(beID); try { @@ -507,7 +498,7 @@ try { backend.clearBackend(configEntry, baseDNs); backend.clearBackend(); } finally { @@ -516,7 +507,7 @@ } finally { TaskUtils.setBackendEnabled(configEntry, true); TaskUtils.enableBackend(beID); } if (createBaseEntry) @@ -705,7 +696,7 @@ LDIFReader reader = new LDIFReader(ldifImportConfig); List<Entry> entries = new ArrayList<Entry>(); Entry entry = null; Entry entry; while ((entry = reader.readEntry()) != null) { entries.add(entry); } @@ -760,8 +751,8 @@ */ public static String makeLdif(String... lines) { StringBuilder buffer = new StringBuilder(); for (int i = 0; i < lines.length; i++) { buffer.append(lines[i]).append(EOL); for (String line : lines) { buffer.append(line).append(EOL); } // Append an extra line so we can append LDIF Strings. buffer.append(EOL); @@ -1084,7 +1075,7 @@ } /** * @return clear everything written to System.out since the last time * clear everything written to System.out since the last time * clearSystemOutContents was called. */ public synchronized static void clearSystemOutContents() { @@ -1092,7 +1083,7 @@ } /** * @return clear everything written to System.err since the last time * clear everything written to System.err since the last time * clearSystemErrContents was called. */ public synchronized static void clearSystemErrContents() { @@ -1157,8 +1148,8 @@ */ private static byte[] readFileBytes(File file) throws IOException { FileInputStream fis = null; byte[] bytes = null; FileInputStream fis; byte[] bytes; fis = new FileInputStream(file); bytes = readInputStreamBytes(fis, true); return bytes; @@ -1175,7 +1166,7 @@ ByteArrayOutputStream bout = new ByteArrayOutputStream(1024); try { byte[] buf = new byte[1024]; int bytesRead = 0; int bytesRead; while ((bytesRead = is.read(buf)) != -1) { bout.write(buf, 0, bytesRead); } // end of while ((read(buf) != -1) opends/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java
@@ -30,29 +30,23 @@ import java.io.File; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import org.opends.server.TestCaseUtils; import org.opends.server.config.ConfigEntry; import org.opends.server.admin.std.server.SchemaBackendCfg; import org.opends.server.config.ConfigException; import org.opends.server.core.AddOperation; import org.opends.server.core.DeleteOperation; import org.opends.server.core.DirectoryServer; import org.opends.server.core.ModifyOperation; import org.opends.server.core.ModifyDNOperation; import org.opends.server.core.SchemaConfigManager; import org.opends.server.protocols.internal.InternalClientConnection; import org.opends.server.protocols.internal.InternalSearchOperation; import org.opends.server.tools.LDAPModify; import org.opends.server.types.Attribute; import org.opends.server.types.AttributeType; import org.opends.server.types.AttributeValue; import org.opends.server.types.ByteStringFactory; import org.opends.server.types.DirectoryException; import org.opends.server.types.DITContentRule; import org.opends.server.types.DN; @@ -62,10 +56,7 @@ import org.opends.server.types.LDIFExportConfig; import org.opends.server.types.LDIFImportConfig; import org.opends.server.types.MatchingRuleUse; import org.opends.server.types.Modification; import org.opends.server.types.ModificationType; import org.opends.server.types.ObjectClass; import org.opends.server.types.RDN; import org.opends.server.types.ResultCode; import org.opends.server.types.SearchFilter; import org.opends.server.types.SearchScope; @@ -86,7 +77,6 @@ private SchemaBackend schemaBackend; /** * Ensures that the Directory Server is running and gets a reference to the * schema backend. @@ -117,7 +107,7 @@ throws Exception { SchemaBackend schemaBackend = new SchemaBackend(); schemaBackend.initializeBackend(null, new DN[0]); schemaBackend.configureBackend(null); } @@ -5346,20 +5336,13 @@ public void testExportLDIF() throws Exception { DN configEntryDN = DN.decode("ds-cfg-backend-id=schema,cn=Backends,cn=config"); DN[] baseDNs = { DN.decode("cn=schema") }; ConfigEntry configEntry = DirectoryServer.getConfigHandler().getConfigEntry(configEntryDN); File tempFile = File.createTempFile("schema", "testExportLDIF"); tempFile.deleteOnExit(); LDIFExportConfig exportConfig = new LDIFExportConfig(tempFile.getAbsolutePath(), ExistingFileBehavior.OVERWRITE); schemaBackend.exportLDIF(configEntry, baseDNs, exportConfig); schemaBackend.exportLDIF(exportConfig); assertTrue(tempFile.exists()); assertTrue(tempFile.length() > 0); @@ -5376,20 +5359,13 @@ public void testImportLDIF() throws Exception { DN configEntryDN = DN.decode("cn=schema,cn=Backends,cn=config"); DN[] baseDNs = { DN.decode("cn=schema") }; ConfigEntry configEntry = DirectoryServer.getConfigHandler().getConfigEntry(configEntryDN); File tempFile = File.createTempFile("schema", "testImportLDIF"); tempFile.deleteOnExit(); LDIFImportConfig importConfig = new LDIFImportConfig(tempFile.getAbsolutePath()); schemaBackend.importLDIF(configEntry, baseDNs, importConfig); schemaBackend.importLDIF(importConfig); } opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
@@ -79,7 +79,7 @@ homeDirName = "db_index_test"; backend = (BackendImpl)DirectoryServer.getBackend("indexTestRoot"); backend = (BackendImpl)DirectoryServer.getBackend("indexRoot"); topEntries = TestCaseUtils.makeEntries( "dn: dc=test,dc=com", @@ -1160,7 +1160,7 @@ "ds-cfg-backend-enabled: true", "ds-cfg-backend-writability-mode: enabled", "ds-cfg-backend-class: org.opends.server.backends.jeb.BackendImpl", "ds-cfg-backend-id: indexTestRoot", "ds-cfg-backend-id: indexRoot", "ds-cfg-backend-directory:: " + Base64.encode(homeDirName.getBytes()), "ds-cfg-backend-import-temp-directory: importTmp"); opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestEntryContainer.java
@@ -179,8 +179,7 @@ JEBackendCfg cfg = AdminTestCaseUtils.getConfiguration( JEBackendCfgDefn.getInstance(), configEntry); Config backendConfig = new Config(); backendConfig.initializeConfig(cfg, cfg.getBackendBaseDN().toArray(new DN[0])); backendConfig.initializeConfig(cfg); RootContainer rootContainer = new RootContainer(backendConfig, null); rootContainer.open(new File(homeDirName), new FilePermission(true, true, true), opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestImportJob.java
@@ -27,8 +27,10 @@ package org.opends.server.backends.jeb; import org.opends.server.TestCaseUtils; import org.opends.server.admin.std.server.JEBackendCfg; import org.opends.server.admin.std.meta.JEBackendCfgDefn; import org.opends.server.admin.server.AdminTestCaseUtils; import org.opends.server.core.DirectoryServer; import org.opends.server.protocols.asn1.ASN1OctetString; import org.opends.server.config.ConfigEntry; import org.opends.server.util.Base64; import static org.opends.server.util.ServerConstants.OC_TOP; @@ -36,7 +38,6 @@ import org.opends.server.types.*; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.testng.annotations.AfterTest; import org.testng.annotations.AfterClass; import static org.testng.Assert.*; import static org.testng.Assert.assertEquals; @@ -47,7 +48,6 @@ import java.io.ByteArrayOutputStream; import java.util.*; import com.sleepycat.je.DatabaseEntry; public class TestImportJob extends JebTestCase { @@ -248,6 +248,8 @@ "ds-cfg-backend-import-temp-directory:: " + Base64.encode(importDirName.getBytes())); ConfigEntry backendConfigEntry = new ConfigEntry(configEntry, null); JEBackendCfg cfg = AdminTestCaseUtils.getConfiguration( JEBackendCfgDefn.getInstance(), configEntry); Entry indexEntry = TestCaseUtils.makeEntry( "dn: cn=Index,ds-cfg-backend-id=userRoot,cn=Backends,cn=config\n" + @@ -280,7 +282,7 @@ }; backendConfig = new Config(); backendConfig.initializeConfig(backendConfigEntry, baseDNs); backendConfig.initializeConfig(cfg); } @AfterClass opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestRebuildJob.java
@@ -35,7 +35,6 @@ import org.opends.server.tasks.TaskUtils; import static org.opends.server.util.ServerConstants.OC_TOP; import static org.opends.server.util.ServerConstants.OC_EXTENSIBLE_OBJECT; import org.opends.server.config.ConfigEntry; import org.opends.server.core.DirectoryServer; import org.opends.server.types.*; @@ -46,8 +45,6 @@ public class TestRebuildJob extends JebTestCase { private String cfgDN= "ds-cfg-backend-id=rebuildRoot,cn=Backends,cn=config"; private String beID="rebuildRoot"; private static String suffix="dc=rebuild,dc=jeb"; private static String vBranch="ou=rebuild tests," + suffix; @@ -55,9 +52,7 @@ //Attribute type in stat entry containing error count private String errorCount="verify-error-count"; private DN configDN; private DN[] baseDNs; private ConfigEntry configEntry; private BackendImpl be; @DataProvider(name = "systemIndexes") @@ -131,11 +126,9 @@ @BeforeClass public void setup() throws Exception { TestCaseUtils.startServer(); configDN = DN.decode(cfgDN); baseDNs = new DN[] { DN.decode(suffix) }; configEntry = DirectoryServer.getConfigEntry(configDN); } @AfterClass @@ -169,7 +162,7 @@ rebuildConfig.setBaseDN(baseDNs[0]); rebuildConfig.addRebuildIndex(index); be=(BackendImpl) DirectoryServer.getBackend(beID); be.rebuildBackend(rebuildConfig, configEntry, baseDNs); be.rebuildBackend(rebuildConfig); assertEquals(verifyBackend("mail"), 0); @@ -183,7 +176,7 @@ rebuildConfig.setBaseDN(baseDNs[0]); rebuildConfig.addRebuildIndex(index); be=(BackendImpl) DirectoryServer.getBackend(beID); be.rebuildBackend(rebuildConfig, configEntry, baseDNs); be.rebuildBackend(rebuildConfig); } @Test(dataProvider = "systemIndexes", @@ -195,21 +188,21 @@ rebuildConfig.setBaseDN(baseDNs[0]); rebuildConfig.addRebuildIndex(index); be=(BackendImpl) DirectoryServer.getBackend(beID); be.rebuildBackend(rebuildConfig, configEntry, baseDNs); be.rebuildBackend(rebuildConfig); } @Test(dataProvider = "systemIndexes") public void testRebuildSystemIndexesOffline(String index) throws Exception { cleanAndLoad(10); cleanAndLoad(10); RebuildConfig rebuildConfig = new RebuildConfig(); rebuildConfig.setBaseDN(baseDNs[0]); rebuildConfig.addRebuildIndex(index); be=(BackendImpl) DirectoryServer.getBackend(beID); TaskUtils.setBackendEnabled(configEntry, false); TaskUtils.disableBackend(beID); be.rebuildBackend(rebuildConfig, configEntry, baseDNs); be.rebuildBackend(rebuildConfig); //TODO: Verify dn2uri database as well. if(!index.equalsIgnoreCase("dn2uri")) @@ -217,7 +210,7 @@ assertEquals(verifyBackend(index), 0); } TaskUtils.setBackendEnabled(configEntry, true); TaskUtils.enableBackend(beID); } @Test @@ -231,13 +224,13 @@ be=(BackendImpl) DirectoryServer.getBackend(beID); TaskUtils.setBackendEnabled(configEntry, false); TaskUtils.disableBackend(beID); be.rebuildBackend(rebuildConfig, configEntry, baseDNs); be.rebuildBackend(rebuildConfig); assertEquals(verifyBackend(null), 0); TaskUtils.setBackendEnabled(configEntry, true); TaskUtils.enableBackend(beID); } @Test @@ -293,7 +286,7 @@ verifyConfig.addCleanIndex(index); } Entry statEntry=bldStatEntry(""); be.verifyBackend(verifyConfig, configEntry, baseDNs, statEntry); be.verifyBackend(verifyConfig, statEntry); return getStatEntryCount(statEntry, errorCount); } opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestVerifyJob.java
@@ -26,7 +26,6 @@ */ package org.opends.server.backends.jeb; import org.opends.server.config.ConfigEntry; import org.opends.server.core.DirectoryServer; import org.opends.server.TestCaseUtils; import org.opends.server.types.*; @@ -50,696 +49,689 @@ public class TestVerifyJob extends JebTestCase { private String cfgDN= "ds-cfg-backend-id=verifyRoot,cn=Backends,cn=config"; //Root suffix for verify backend private static String suffix="dc=verify,dc=jeb"; private static String vBranch="ou=verify tests," + suffix; private String beID="verifyRoot"; private String numUsersLine="define numusers= #numEntries#"; //Attribute type in stat entry containing error count private String errorCount="verify-error-count"; private DN configDN; private DN[] baseDNs; private ConfigEntry configEntry; private BackendImpl be; private RootContainer rContainer; private EntryContainer eContainer; private DN2ID dn2id; private ID2Entry id2entry; private Index id2child; private Index id2subtree; private Transaction txn; //Some DNs needed mostly for DN2ID tests private String junkDN="cn=junk," + vBranch; private String junkDN1="cn=junk1," + vBranch; private String junkDN2="cn=junk2," + vBranch; private String junkDN3="cn=junk3," + vBranch; //This DN has no parent private String noParentDN="cn=junk1,cn=junk22," + vBranch; //Parent child combo for id2child/subtree type tests private String pDN="cn=junk222," + vBranch; private String cDN="cn=junk4,cn=junk222," + vBranch; //Bad DN private String badDN="this is a bad DN"; //This index file should not exist private String badIndexName="badIndexName"; @DataProvider(name = "indexes") public Object[][] indexes() { return new Object[][] { { "telephoneNumber"}, {"givenName"}, { "id2subtree"}, {"id2children"}, {"dn2id"} }; } private static String[] template = new String[] { "define suffix="+suffix, "define maildomain=example.com", "define numusers= #numEntries#", "", "branch: [suffix]", "", "branch: " + vBranch, "subordinateTemplate: person:[numusers]", "", "template: person", "rdnAttr: uid", "objectClass: top", "objectClass: person", "objectClass: organizationalPerson", "objectClass: inetOrgPerson", "givenName: ABOVE LIMIT", "sn: <last>", "cn: {givenName} {sn}", "initials: {givenName:1}<random:chars:" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ:1>{sn:1}", "employeeNumber: <sequential:0>", "uid: user.{employeeNumber}", "mail: {uid}@[maildomain]", "userPassword: password", "telephoneNumber: <random:telephone>", "homePhone: <random:telephone>", "pager: <random:telephone>", "mobile: <random:telephone>", "street: <random:numeric:5> <file:streets> Street", "l: <file:cities>", "st: <file:states>", "postalCode: <random:numeric:5>", "postalAddress: {cn}${street}${l}, {st} {postalCode}", "description: This is the description for {cn}.", ""}; //Root suffix for verify backend private static String suffix="dc=verify,dc=jeb"; private static String vBranch="ou=verify tests," + suffix; private String beID="verifyRoot"; private String numUsersLine="define numusers= #numEntries#"; //Attribute type in stat entry containing error count private String errorCount="verify-error-count"; private DN[] baseDNs; private BackendImpl be; private EntryContainer eContainer; private DN2ID dn2id; private ID2Entry id2entry; private Index id2child; private Index id2subtree; private Transaction txn; @BeforeClass public void setup() throws Exception { TestCaseUtils.startServer(); configDN = DN.decode(cfgDN); baseDNs = new DN[] { DN.decode(suffix) }; configEntry = DirectoryServer.getConfigEntry(configDN); } @AfterClass public void cleanUp() throws Exception { TestCaseUtils.clearJEBackend(false, beID, suffix); } /** * Performs a ncomplete verify against a backend using the * entries loaded in the setup initializer. * * @throws Exception if error count is not equal to 0. */ //Some DNs needed mostly for DN2ID tests private String junkDN="cn=junk," + vBranch; private String junkDN1="cn=junk1," + vBranch; private String junkDN2="cn=junk2," + vBranch; private String junkDN3="cn=junk3," + vBranch; //This DN has no parent private String noParentDN="cn=junk1,cn=junk22," + vBranch; //Parent child combo for id2child/subtree type tests private String pDN="cn=junk222," + vBranch; private String cDN="cn=junk4,cn=junk222," + vBranch; //Bad DN private String badDN="this is a bad DN"; //This index file should not exist private String badIndexName="badIndexName"; @Test() public void testCompleteVerifyJob() throws Exception { cleanAndLoad(9); VerifyConfig verifyConfig = new VerifyConfig(); verifyConfig.setBaseDN(baseDNs[0]); Entry statEntry=bldStatEntry(""); be=(BackendImpl) DirectoryServer.getBackend(beID); be.verifyBackend(verifyConfig, configEntry, baseDNs, statEntry); assertEquals(getStatEntryCount(statEntry, errorCount), 0); } @DataProvider(name = "indexes") public Object[][] indexes() { return new Object[][] { { "telephoneNumber"}, {"givenName"}, { "id2subtree"}, {"id2children"}, {"dn2id"} }; } /** * Adds more than "entry limit" number of entries and runs clean * verify against two indexes. * * @throws Exception if error count is not equal to 0. */ @Test() public void testEntryLimitVerifyJob() throws Exception { cleanAndLoad(25); VerifyConfig verifyConfig = new VerifyConfig(); verifyConfig.setBaseDN(baseDNs[0]); verifyConfig.addCleanIndex("telephoneNumber"); verifyConfig.addCleanIndex("givenName"); Entry statEntry=bldStatEntry(""); be=(BackendImpl) DirectoryServer.getBackend(beID); be.verifyBackend(verifyConfig, configEntry, baseDNs, statEntry); assertEquals(getStatEntryCount(statEntry, errorCount), 0); } private static String[] template = new String[] { "define suffix="+suffix, "define maildomain=example.com", "define numusers= #numEntries#", "", "branch: [suffix]", "", "branch: " + vBranch, "subordinateTemplate: person:[numusers]", "", "template: person", "rdnAttr: uid", "objectClass: top", "objectClass: person", "objectClass: organizationalPerson", "objectClass: inetOrgPerson", "givenName: ABOVE LIMIT", "sn: <last>", "cn: {givenName} {sn}", "initials: {givenName:1}<random:chars:" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ:1>{sn:1}", "employeeNumber: <sequential:0>", "uid: user.{employeeNumber}", "mail: {uid}@[maildomain]", "userPassword: password", "telephoneNumber: <random:telephone>", "homePhone: <random:telephone>", "pager: <random:telephone>", "mobile: <random:telephone>", "street: <random:numeric:5> <file:streets> Street", "l: <file:cities>", "st: <file:states>", "postalCode: <random:numeric:5>", "postalAddress: {cn}${street}${l}, {st} {postalCode}", "description: This is the description for {cn}.", ""}; /** * Runs clean verify jobs against a set of indexes (defined in * indexes array). * @param index An element of the indexes array. * @throws Exception if the error count is not equal to 0. */ @Test(dataProvider = "indexes") public void testCleanVerifyJob(String index) throws Exception { cleanAndLoad(9); VerifyConfig verifyConfig = new VerifyConfig(); verifyConfig.setBaseDN(baseDNs[0]); verifyConfig.addCleanIndex(index); Entry statEntry=bldStatEntry(""); be=(BackendImpl) DirectoryServer.getBackend(beID); be.verifyBackend(verifyConfig, configEntry, baseDNs, statEntry); assertEquals(getStatEntryCount(statEntry, errorCount), 0); } /* @BeforeClass public void setup() throws Exception { TestCaseUtils.startServer(); baseDNs = new DN[] { DN.decode(suffix) }; } @AfterClass public void cleanUp() throws Exception { TestCaseUtils.clearJEBackend(false, beID, suffix); } /** * Performs a ncomplete verify against a backend using the * entries loaded in the setup initializer. * * @throws Exception if error count is not equal to 0. */ @Test() public void testCompleteVerifyJob() throws Exception { cleanAndLoad(9); VerifyConfig verifyConfig = new VerifyConfig(); verifyConfig.setBaseDN(baseDNs[0]); Entry statEntry=bldStatEntry(""); be=(BackendImpl) DirectoryServer.getBackend(beID); be.verifyBackend(verifyConfig, statEntry); assertEquals(getStatEntryCount(statEntry, errorCount), 0); } /** * Adds more than "entry limit" number of entries and runs clean * verify against two indexes. * * @throws Exception if error count is not equal to 0. */ @Test() public void testEntryLimitVerifyJob() throws Exception { cleanAndLoad(25); VerifyConfig verifyConfig = new VerifyConfig(); verifyConfig.setBaseDN(baseDNs[0]); verifyConfig.addCleanIndex("telephoneNumber"); verifyConfig.addCleanIndex("givenName"); Entry statEntry=bldStatEntry(""); be=(BackendImpl) DirectoryServer.getBackend(beID); be.verifyBackend(verifyConfig, statEntry); assertEquals(getStatEntryCount(statEntry, errorCount), 0); } /** * Runs clean verify jobs against a set of indexes (defined in * indexes array). * @param index An element of the indexes array. * @throws Exception if the error count is not equal to 0. */ @Test(dataProvider = "indexes") public void testCleanVerifyJob(String index) throws Exception { cleanAndLoad(9); VerifyConfig verifyConfig = new VerifyConfig(); verifyConfig.setBaseDN(baseDNs[0]); verifyConfig.addCleanIndex(index); Entry statEntry=bldStatEntry(""); be=(BackendImpl) DirectoryServer.getBackend(beID); be.verifyBackend(verifyConfig, statEntry); assertEquals(getStatEntryCount(statEntry, errorCount), 0); } /* * Begin Clean index tests. These are tests that cursor through an index * file and validate it's keys and idlists against the id2entry database entries. * The complete index tests go the other way. They cursor the id2entry database * and validate each entry against the various index files. */ /** * Runs clean verify against the dn2id index after adding * various errors in that index file. * * @throws Exception if the error count is not equal to 5. */ @Test() public void testCleanDN2ID() throws Exception { preTest(3); //Add a junk DN and non-existent entry id to DN2ID index DN testDN=DN.decode(junkDN); EntryID id=new EntryID(45); assertTrue(dn2id.insert(txn, testDN, id)); //Make two DN keys point at same entry. testDN=DN.decode(junkDN1); id=new EntryID(3); assertTrue(dn2id.insert(txn, testDN, id)); //Add badDN key with bad entry id DatabaseEntry key= new DatabaseEntry(StaticUtils.getBytes(badDN)); DatabaseEntry data = new EntryID(37).getDatabaseEntry(); assertTrue(dn2id.putRaw(txn, key, data)); //Add DN key with malformed entryID key=new DatabaseEntry(StaticUtils.getBytes(junkDN2)); data= new DatabaseEntry(new byte[3]); assertTrue(dn2id.putRaw(txn, key, data)); //Try to break JebFormat version addID2EntryReturnKey(junkDN3, 20, true); id=new EntryID(20); assertTrue(dn2id.insert(txn, DN.decode(junkDN3), id)); performBECleanVerify("dn2id", 5); } /** * Runs clean verify against the dn2id index after adding * various errors in that index file. * * @throws Exception if the error count is not equal to 5. */ @Test() public void testCleanDN2ID() throws Exception { preTest(3); //Add a junk DN and non-existent entry id to DN2ID index DN testDN=DN.decode(junkDN); EntryID id=new EntryID(45); assertTrue(dn2id.insert(txn, testDN, id)); //Make two DN keys point at same entry. testDN=DN.decode(junkDN1); id=new EntryID(3); assertTrue(dn2id.insert(txn, testDN, id)); //Add badDN key with bad entry id DatabaseEntry key= new DatabaseEntry(StaticUtils.getBytes(badDN)); DatabaseEntry data = new EntryID(37).getDatabaseEntry(); assertTrue(dn2id.putRaw(txn, key, data)); //Add DN key with malformed entryID key=new DatabaseEntry(StaticUtils.getBytes(junkDN2)); data= new DatabaseEntry(new byte[3]); assertTrue(dn2id.putRaw(txn, key, data)); //Try to break JebFormat version addID2EntryReturnKey(junkDN3, 20, true); id=new EntryID(20); assertTrue(dn2id.insert(txn, DN.decode(junkDN3), id)); performBECleanVerify("dn2id", 5); } /** * Runs clean verify against the id2children index after adding * various errors in that index file. * * @throws Exception if the error count is not equal to 6. */ @Test() public void testCleanID2Children() throws Exception { preTest(3); //Add malformed key byte[] shortBytes = new byte[3]; DatabaseEntry key= new DatabaseEntry(shortBytes); EntryIDSet idSet=new EntryIDSet(); id2child.writeKey(txn, key, idSet); //Try to break JebFormat version of key entry key=addID2EntryReturnKey(junkDN, 4, true); idSet=new EntryIDSet(new byte[16], new byte[16]); id2child.writeKey(txn, key, idSet); //put invalid key -- no EntryID matches key= new EntryID(45).getDatabaseEntry(); id2child.writeKey(txn, key, idSet); //invalid ids in id list key=addID2EntryReturnKey(junkDN1, 5, false); byte[] idBytes=new byte[24]; //doesn't exist idBytes[3] = (byte)0xff; //not a child idBytes[15] = (byte)1; //bad jeb format idBytes[23] = (byte) 0x04; idSet=new EntryIDSet(null, idBytes); id2child.writeKey(txn, key, idSet); performBECleanVerify("id2children", 6); } /** * Runs clean verify against the id2children index after adding * various errors in that index file. * * @throws Exception if the error count is not equal to 6. */ @Test() public void testCleanID2Children() throws Exception { preTest(3); //Add malformed key byte[] shortBytes = new byte[3]; DatabaseEntry key= new DatabaseEntry(shortBytes); EntryIDSet idSet=new EntryIDSet(); id2child.writeKey(txn, key, idSet); //Try to break JebFormat version of key entry key=addID2EntryReturnKey(junkDN, 4, true); idSet=new EntryIDSet(new byte[16], new byte[16]); id2child.writeKey(txn, key, idSet); //put invalid key -- no EntryID matches key= new EntryID(45).getDatabaseEntry(); id2child.writeKey(txn, key, idSet); //invalid ids in id list key=addID2EntryReturnKey(junkDN1, 5, false); byte[] idBytes=new byte[24]; //doesn't exist idBytes[3] = (byte)0xff; //not a child idBytes[15] = (byte)1; //bad jeb format idBytes[23] = (byte) 0x04; idSet=new EntryIDSet(null, idBytes); id2child.writeKey(txn, key, idSet); performBECleanVerify("id2children", 6); } /** * Runs clean verify against the id2subtree index after adding * various errors in that index file. * * @throws Exception if the error count is not equal to 7. */ @Test() public void testCleanID2Subtree() throws Exception { preTest(4); //break key byte[] shortBytes = new byte[3]; DatabaseEntry key= new DatabaseEntry(shortBytes); EntryIDSet idSet=new EntryIDSet(); id2subtree.writeKey(txn, key, idSet); //put invalid ids into entry 3 idlist key= new EntryID(3).getDatabaseEntry(); byte[] idBytes=new byte[16]; //invalid id idBytes[3] = (byte)0xff; //non-subordinate idBytes[15] = (byte)1; idSet=new EntryIDSet(null, idBytes); id2subtree.writeKey(txn, key, idSet); //Try to break JebFormat version of key entry key=addID2EntryReturnKey(junkDN, 4, true); idBytes[3]=(byte) 0x04; idBytes[15]=(byte)0x00; EntryIDSet idSet1=new EntryIDSet(null, idBytes); id2subtree.writeKey(txn, key, idSet1); //put invalid key -- no EntryID matches key= new EntryID(45).getDatabaseEntry(); idSet=new EntryIDSet(null, idBytes); id2subtree.writeKey(txn, key, idSet); performBECleanVerify("id2subtree", 7); } /** * Runs clean verify against the id2subtree index after adding * various errors in that index file. * * @throws Exception if the error count is not equal to 7. */ @Test() public void testCleanID2Subtree() throws Exception { preTest(4); //break key byte[] shortBytes = new byte[3]; DatabaseEntry key= new DatabaseEntry(shortBytes); EntryIDSet idSet=new EntryIDSet(); id2subtree.writeKey(txn, key, idSet); //put invalid ids into entry 3 idlist key= new EntryID(3).getDatabaseEntry(); byte[] idBytes=new byte[16]; //invalid id idBytes[3] = (byte)0xff; //non-subordinate idBytes[15] = (byte)1; idSet=new EntryIDSet(null, idBytes); id2subtree.writeKey(txn, key, idSet); //Try to break JebFormat version of key entry key=addID2EntryReturnKey(junkDN, 4, true); idBytes[3]=(byte) 0x04; idBytes[15]=(byte)0x00; EntryIDSet idSet1=new EntryIDSet(null, idBytes); id2subtree.writeKey(txn, key, idSet1); //put invalid key -- no EntryID matches key= new EntryID(45).getDatabaseEntry(); idSet=new EntryIDSet(null, idBytes); id2subtree.writeKey(txn, key, idSet); performBECleanVerify("id2subtree", 7); } /** * Runs clean verify against the telephoneNumber.equality index * after adding various errors in that index file. * * @throws Exception if the error count is not equal to 4. */ @Test() public void testCleanAttrIndex() throws Exception { String phoneType="telephoneNumber"; preTest(3); //Need to open a second database against this index //so we can manipulate it. We can't get the index DB handle //any other way. DatabaseConfig config = new DatabaseConfig(); config.setAllowCreate(true); config.setTransactional(true); Database db= eContainer.openDatabase(config, phoneType + ".equality"); //Add entry with bad JEB format Version addID2EntryReturnKey(junkDN, 4, true); //Add phone number with various bad id list entryIDs byte[] subBytes = StaticUtils.getBytes("0009999999"); DatabaseEntry key= new DatabaseEntry(subBytes); byte[] dataBytes=new byte[32]; //put duplicate ids in list dataBytes[7] = (byte)1; dataBytes[15] = (byte)1; //put id that doesn't exist dataBytes[23] = (byte)0xff; //point to bad entry added above dataBytes[31] = (byte) 0x04; DatabaseEntry data= new DatabaseEntry(dataBytes); OperationStatus status = EntryContainer.put(db, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); //really 5 errors, but duplicate reference doesn't increment error //count for some reason performBECleanVerify(phoneType, 4); } /* /** * Runs clean verify against the telephoneNumber.equality index * after adding various errors in that index file. * * @throws Exception if the error count is not equal to 4. */ @Test() public void testCleanAttrIndex() throws Exception { String phoneType="telephoneNumber"; preTest(3); //Need to open a second database against this index //so we can manipulate it. We can't get the index DB handle //any other way. DatabaseConfig config = new DatabaseConfig(); config.setAllowCreate(true); config.setTransactional(true); Database db= eContainer.openDatabase(config, phoneType + ".equality"); //Add entry with bad JEB format Version addID2EntryReturnKey(junkDN, 4, true); //Add phone number with various bad id list entryIDs byte[] subBytes = StaticUtils.getBytes("0009999999"); DatabaseEntry key= new DatabaseEntry(subBytes); byte[] dataBytes=new byte[32]; //put duplicate ids in list dataBytes[7] = (byte)1; dataBytes[15] = (byte)1; //put id that doesn't exist dataBytes[23] = (byte)0xff; //point to bad entry added above dataBytes[31] = (byte) 0x04; DatabaseEntry data= new DatabaseEntry(dataBytes); OperationStatus status = EntryContainer.put(db, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); //really 5 errors, but duplicate reference doesn't increment error //count for some reason performBECleanVerify(phoneType, 4); } /* * Begin complete verify index tests. As described above, these are * tests that cursor through the id2entry database and validate * tests that cursor through the id2entry database and validate * each entry against the various index files. * */ /** * Runs complete verify against the telephoneNumber index * after adding various errors in the id2entry file. * * @throws Exception if the error count is not equal to 3. */ @Test() public void testVerifyID2Entry() throws Exception { preTest(3); //Add entry with short id byte[] shortBytes = new byte[3]; DatabaseEntry key= new DatabaseEntry(shortBytes); Entry testEntry=bldStatEntry(junkDN); byte []entryBytes = JebFormat.entryToDatabase(testEntry, new DataConfig()); DatabaseEntry data= new DatabaseEntry(entryBytes); assertTrue(id2entry.putRaw(txn, key, data)); //add entry with ramdom bytes DatabaseEntry key1= new EntryID(4).getDatabaseEntry(); byte []eBytes = new byte[459]; for(int i=0;i<459;i++) { eBytes[i]=(byte) (i*2); } //set version correctly eBytes[0]=0x01; DatabaseEntry data1= new DatabaseEntry(eBytes); assertTrue(id2entry.putRaw(txn, key1, data1)); performBECompleteVerify("telephoneNumber", 3); } /** * * Runs complete verify against the dn2id index * after adding various errors in the dn2id file. * * @throws Exception if the error count is not equal to 3. */ @Test() public void testVerifyDN2ID() throws Exception { preTest(9); //add entry but no corresponding dn2id key addID2EntryReturnKey(junkDN, 10, false); //entry has dn2id key but its entryID -- don't need key addID2EntryReturnKey(junkDN1, 11, false); //insert key with bad entry id (45 instead of 10) DN testDN=DN.decode(junkDN1); EntryID id=new EntryID(45); assertTrue(dn2id.insert(txn, testDN, id)); //entry has no parent in dn2id addID2EntryReturnKey(noParentDN, 12, false); //add the key/id testDN=DN.decode(noParentDN); id=new EntryID(12); assertTrue(dn2id.insert(txn, testDN, id)); performBECompleteVerify("dn2id", 3); } /** * * Runs complete verify against the id2children index * after adding various errors in the id2children file. * * @throws Exception if the error count is not equal to 3. */ @Test() public void testVerifyID2Children() throws Exception { preTest(9); //Add dn with no parent DatabaseEntry key=addID2EntryReturnKey(noParentDN, 10, false); byte[] idBytes=new byte[16]; idBytes[7]=(byte) 0x0A; EntryIDSet idSet=new EntryIDSet(null, idBytes); id2child.writeKey(txn, key, idSet); //Add child entry - don't worry about key addID2EntryReturnKey(cDN, 11, false); //Add its parent entry -- need the key DatabaseEntry keyp=addID2EntryReturnKey(pDN, 12, false); //add parent key/IDSet with bad IDset id byte[] idBytesp=new byte[16]; idBytesp[7]=(byte) 0xFF; EntryIDSet idSetp=new EntryIDSet(null, idBytesp); id2child.writeKey(txn, keyp, idSetp); performBECompleteVerify("id2children", 3); } /** * * Runs complete verify against the id2children index * after adding various errors in the id2children file. * This is a second test because the key needed to have * null idlist. This test is really just for coverage and * should have a 0 error count. * * @throws Exception if the error count is not equal to 0. */ @Test() public void testVerifyID2Children1() throws Exception { preTest(2); //Add child entry - don't worry about key addID2EntryReturnKey(pDN, 10, false); //add parent key/IDSet with null keyset EntryIDSet idSetp=new EntryIDSet(); DatabaseEntry key= new EntryID(2).getDatabaseEntry(); id2child.writeKey(txn, key, idSetp); performBECompleteVerify("id2children", 0); } /** * * Runs complete verify against the id2subtree index * after adding various errors in the id2subtree file. * * @throws Exception if the error count is not equal to 3. */ @Test public void testVerifyID2Subtree() throws Exception { preTest(2); //Add entry with no parent addID2EntryReturnKey(noParentDN, 3, false); performBECompleteVerify("id2subtree", 3); } /** * * Runs complete verify against the id2subtree index * after adding various errors in the id2subtree file. * This is a second test because the key needed to have * null idlist. * * @throws Exception if the error count is not equal to 1. */ @Test public void testVerifyID2Subtree1() throws Exception { preTest(2); //Add child entry - don't worry about key addID2EntryReturnKey(pDN, 3, false); //add parent key/IDSet with null keyset EntryIDSet idSet=new EntryIDSet(); DatabaseEntry key= new EntryID(2).getDatabaseEntry(); id2subtree.writeKey(txn, key, idSet); performBECompleteVerify("id2subtree", 1); } /** * Runs complete verify against the mail indexes * (equality, presence, substring, ordering) * after adding various errors to each of these index files. * @throws Exception if the error count is not equal to 6. */ @Test() public void testVerifyAttribute() throws Exception { String mailType="mail"; preTest(4); //Need to open a second databases against this index //so we can manipulate it. DatabaseConfig config = new DatabaseConfig(); config.setAllowCreate(true); config.setTransactional(true); //Get db handles to each index. Database dbEq= eContainer.openDatabase(config, mailType + ".equality"); Database dbPres= eContainer.openDatabase(config, mailType + ".presence"); Database dbSub= eContainer.openDatabase(config, mailType + ".substring"); Database dbOr= eContainer.openDatabase(config, mailType + ".ordering"); //Add invalid idlist ids to both equality and ordering indexes. DatabaseEntry key= new DatabaseEntry(StaticUtils.getBytes("user.0@example.com")); byte[] dataBytes=new byte[16]; //put duplicate ids in list dataBytes[7] = (byte)0xff; dataBytes[15] = (byte)0xfe; DatabaseEntry data= new DatabaseEntry(dataBytes); OperationStatus status = EntryContainer.put(dbEq, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); status = EntryContainer.put(dbOr, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); //Add null idlist to both equality and ordering indexes. key = new DatabaseEntry(StaticUtils.getBytes("user.1@example.com")); data= new DatabaseEntry(new EntryIDSet().toDatabase()); status = EntryContainer.put(dbEq, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); status = EntryContainer.put(dbOr, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); //Add invalid idlist ids to presence index. key = new DatabaseEntry(StaticUtils.getBytes("+")); data = new DatabaseEntry(dataBytes); status = EntryContainer.put(dbPres, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); //Add invalid idlist ids to substring index. key = new DatabaseEntry(StaticUtils.getBytes("@examp")); data = new DatabaseEntry(dataBytes); status = EntryContainer.put(dbSub, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); performBECompleteVerify(mailType, 6); } /** * Runs complete verify against the telephoneNumber index * after adding various errors in the id2entry file. * * @throws Exception if the error count is not equal to 3. */ @Test() public void testVerifyID2Entry() throws Exception { preTest(3); //Add entry with short id byte[] shortBytes = new byte[3]; DatabaseEntry key= new DatabaseEntry(shortBytes); Entry testEntry=bldStatEntry(junkDN); byte []entryBytes = JebFormat.entryToDatabase(testEntry, new DataConfig()); DatabaseEntry data= new DatabaseEntry(entryBytes); assertTrue(id2entry.putRaw(txn, key, data)); /* Various tests not either clean or complete */ /** * Try to verify a non-indexed attribute. * @throws Exception if error count is not equal to 0. */ @Test(expectedExceptions=Exception.class) public void testVerifyNotIndexed() throws Exception { cleanAndLoad(2); VerifyConfig verifyConfig = new VerifyConfig(); verifyConfig.setBaseDN(baseDNs[0]); verifyConfig.addCleanIndex("userPassword"); Entry statEntry=bldStatEntry(""); be=(BackendImpl) DirectoryServer.getBackend(beID); be.verifyBackend(verifyConfig, configEntry, baseDNs, statEntry); assertEquals(getStatEntryCount(statEntry, errorCount), 0); //add entry with ramdom bytes DatabaseEntry key1= new EntryID(4).getDatabaseEntry(); byte []eBytes = new byte[459]; for(int i=0;i<459;i++) { eBytes[i]=(byte) (i*2); } /** * Try to verify an nonexistent attribute. * @throws Exception if verify backend fails. */ @Test(expectedExceptions=Exception.class) public void testInvalidIndex() throws Exception { cleanAndLoad(2); VerifyConfig verifyConfig = new VerifyConfig(); verifyConfig.setBaseDN(baseDNs[0]); verifyConfig.addCleanIndex(badIndexName); Entry statEntry=bldStatEntry(""); be=(BackendImpl) DirectoryServer.getBackend(beID); be.verifyBackend(verifyConfig, configEntry, baseDNs, statEntry); } /* end tests */ /** * Adds an entry to the id2entry database with a dn and id passed into the * method. Optional flag to set the Jeb version byte for those types of tests. * @param dn the dn string to put in the entry. * @param id to use as the id2entry key, * @param trashFormat true if first byte should be changed to invalid value. * @return Database entry key of the entry. * @throws Exception if the entry is not added to the id2entry database. */ private DatabaseEntry addID2EntryReturnKey(String dn, long id, boolean trashFormat) throws Exception { DatabaseEntry key= new EntryID(id).getDatabaseEntry(); Entry testEntry=bldStatEntry(dn); byte []entryBytes = JebFormat.entryToDatabase(testEntry, new DataConfig()); if(trashFormat) entryBytes[0] = 0x67; DatabaseEntry data= new DatabaseEntry(entryBytes); assertTrue(id2entry.putRaw(txn, key, data)); return key; } /** * Wrapper to do a clean verify. * @param indexToDo index file to run verify against. * @param expectedErrors number of errors expected for this test. * @throws Exception if the verify fails. */ private void performBECleanVerify(String indexToDo, int expectedErrors) throws Exception { performBEVerify(indexToDo, expectedErrors, true); } /** * Wrapper to do a complete verify. * @param indexToDo index file to run verify against. * @param expectedErrors number of errors expected for this test. * @throws Exception if the verify fails. */ private void performBECompleteVerify(String indexToDo, int expectedErrors) throws Exception { performBEVerify(indexToDo, expectedErrors, false); } /** * Performs either a clean or complete verify depending on * flag passed in. * * @param indexToDo index file to run verify against. * @param expectedErrors number of errors expected for this test. * @param clean do clean verify if true. * @throws Exception if the verify fails. */ private void performBEVerify(String indexToDo, int expectedErrors, boolean clean) throws Exception { EntryContainer.transactionCommit(txn); VerifyConfig verifyConfig = new VerifyConfig(); verifyConfig.setBaseDN(baseDNs[0]); if(!clean) verifyConfig.addCompleteIndex(indexToDo); else verifyConfig.addCleanIndex(indexToDo); Entry statEntry=bldStatEntry(""); be.verifyBackend(verifyConfig, configEntry, baseDNs, statEntry); assertEquals(getStatEntryCount(statEntry, errorCount), expectedErrors); } /** * Does a pretest setup. Creates some number of entries, gets * backend, rootcontainer, entryContainer objects, as well as * various index objects. * Also starts a transaction. * @param numEntries number of entries to add to the verify backend. * @throws Exception if entries cannot be loaded. */ private void preTest(int numEntries) throws Exception { cleanAndLoad(numEntries); be=(BackendImpl) DirectoryServer.getBackend(beID); rContainer= be.getRootContainer(); eContainer= rContainer.getEntryContainer(DN.decode(suffix)); id2child=eContainer.getID2Children(); id2entry=eContainer.getID2Entry(); id2subtree=eContainer.getID2Subtree(); dn2id=eContainer.getDN2ID(); txn = eContainer.beginTransaction(); } /** * Cleans verify backend and loads some number of entries. * @param numEntries number of entries to load into the backend. * @throws Exception if the entries are not loaded or created. */ private void cleanAndLoad(int numEntries) throws Exception { TestCaseUtils.clearJEBackend(false, beID, suffix); template[2]=numUsersLine; template[2]= template[2].replaceAll("#numEntries#", String.valueOf(numEntries)); createLoadEntries(template, numEntries); } //set version correctly eBytes[0]=0x01; DatabaseEntry data1= new DatabaseEntry(eBytes); assertTrue(id2entry.putRaw(txn, key1, data1)); performBECompleteVerify("telephoneNumber", 3); } /** * Gets information from the stat entry and returns that value as a Long. * @param e entry to search. * @param type attribute type * @return Long * @throws NumberFormatException if the attribute value cannot be parsed. */ private long getStatEntryCount(Entry e, String type) throws NumberFormatException { AttributeType attrType = DirectoryServer.getAttributeType(type); if (attrType == null) attrType = DirectoryServer.getDefaultAttributeType(type); List<Attribute> attrList = e.getAttribute(attrType, null); LinkedHashSet<AttributeValue> values = attrList.get(0).getValues(); AttributeValue v = values.iterator().next(); long retVal = Long.parseLong(v.getStringValue()); return (retVal); } /** * * Runs complete verify against the dn2id index * after adding various errors in the dn2id file. * * @throws Exception if the error count is not equal to 3. */ @Test() public void testVerifyDN2ID() throws Exception { preTest(9); //add entry but no corresponding dn2id key addID2EntryReturnKey(junkDN, 10, false); //entry has dn2id key but its entryID -- don't need key addID2EntryReturnKey(junkDN1, 11, false); //insert key with bad entry id (45 instead of 10) DN testDN=DN.decode(junkDN1); EntryID id=new EntryID(45); assertTrue(dn2id.insert(txn, testDN, id)); //entry has no parent in dn2id addID2EntryReturnKey(noParentDN, 12, false); //add the key/id testDN=DN.decode(noParentDN); id=new EntryID(12); assertTrue(dn2id.insert(txn, testDN, id)); performBECompleteVerify("dn2id", 3); } /** * Builds an entry suitable for using in the verify job to gather statistics about * the verify. * @param dn to put into the entry. * @return a suitable entry. * @throws DirectoryException if the cannot be created. */ private Entry bldStatEntry(String dn) throws DirectoryException { DN entryDN = DN.decode(dn); HashMap<ObjectClass, String> ocs = new HashMap<ObjectClass, String>(2); ObjectClass topOC = DirectoryServer.getObjectClass(OC_TOP); if (topOC == null) { topOC = DirectoryServer.getDefaultObjectClass(OC_TOP); } ocs.put(topOC, OC_TOP); ObjectClass extensibleObjectOC = DirectoryServer .getObjectClass(OC_EXTENSIBLE_OBJECT); if (extensibleObjectOC == null) { extensibleObjectOC = DirectoryServer .getDefaultObjectClass(OC_EXTENSIBLE_OBJECT); } ocs.put(extensibleObjectOC, OC_EXTENSIBLE_OBJECT); return new Entry(entryDN, ocs, new LinkedHashMap<AttributeType, List<Attribute>>(0), new HashMap<AttributeType, List<Attribute>>(0)); /** * * Runs complete verify against the id2children index * after adding various errors in the id2children file. * * @throws Exception if the error count is not equal to 3. */ @Test() public void testVerifyID2Children() throws Exception { preTest(9); //Add dn with no parent DatabaseEntry key=addID2EntryReturnKey(noParentDN, 10, false); byte[] idBytes=new byte[16]; idBytes[7]=(byte) 0x0A; EntryIDSet idSet=new EntryIDSet(null, idBytes); id2child.writeKey(txn, key, idSet); //Add child entry - don't worry about key addID2EntryReturnKey(cDN, 11, false); //Add its parent entry -- need the key DatabaseEntry keyp=addID2EntryReturnKey(pDN, 12, false); //add parent key/IDSet with bad IDset id byte[] idBytesp=new byte[16]; idBytesp[7]=(byte) 0xFF; EntryIDSet idSetp=new EntryIDSet(null, idBytesp); id2child.writeKey(txn, keyp, idSetp); performBECompleteVerify("id2children", 3); } /** * * Runs complete verify against the id2children index * after adding various errors in the id2children file. * This is a second test because the key needed to have * null idlist. This test is really just for coverage and * should have a 0 error count. * * @throws Exception if the error count is not equal to 0. */ @Test() public void testVerifyID2Children1() throws Exception { preTest(2); //Add child entry - don't worry about key addID2EntryReturnKey(pDN, 10, false); //add parent key/IDSet with null keyset EntryIDSet idSetp=new EntryIDSet(); DatabaseEntry key= new EntryID(2).getDatabaseEntry(); id2child.writeKey(txn, key, idSetp); performBECompleteVerify("id2children", 0); } /** * * Runs complete verify against the id2subtree index * after adding various errors in the id2subtree file. * * @throws Exception if the error count is not equal to 3. */ @Test public void testVerifyID2Subtree() throws Exception { preTest(2); //Add entry with no parent addID2EntryReturnKey(noParentDN, 3, false); performBECompleteVerify("id2subtree", 3); } /** * * Runs complete verify against the id2subtree index * after adding various errors in the id2subtree file. * This is a second test because the key needed to have * null idlist. * * @throws Exception if the error count is not equal to 1. */ @Test public void testVerifyID2Subtree1() throws Exception { preTest(2); //Add child entry - don't worry about key addID2EntryReturnKey(pDN, 3, false); //add parent key/IDSet with null keyset EntryIDSet idSet=new EntryIDSet(); DatabaseEntry key= new EntryID(2).getDatabaseEntry(); id2subtree.writeKey(txn, key, idSet); performBECompleteVerify("id2subtree", 1); } /** * Runs complete verify against the mail indexes * (equality, presence, substring, ordering) * after adding various errors to each of these index files. * @throws Exception if the error count is not equal to 6. */ @Test() public void testVerifyAttribute() throws Exception { String mailType="mail"; preTest(4); //Need to open a second databases against this index //so we can manipulate it. DatabaseConfig config = new DatabaseConfig(); config.setAllowCreate(true); config.setTransactional(true); //Get db handles to each index. Database dbEq= eContainer.openDatabase(config, mailType + ".equality"); Database dbPres= eContainer.openDatabase(config, mailType + ".presence"); Database dbSub= eContainer.openDatabase(config, mailType + ".substring"); Database dbOr= eContainer.openDatabase(config, mailType + ".ordering"); //Add invalid idlist ids to both equality and ordering indexes. DatabaseEntry key= new DatabaseEntry(StaticUtils.getBytes("user.0@example.com")); byte[] dataBytes=new byte[16]; //put duplicate ids in list dataBytes[7] = (byte)0xff; dataBytes[15] = (byte)0xfe; DatabaseEntry data= new DatabaseEntry(dataBytes); OperationStatus status = EntryContainer.put(dbEq, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); status = EntryContainer.put(dbOr, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); //Add null idlist to both equality and ordering indexes. key = new DatabaseEntry(StaticUtils.getBytes("user.1@example.com")); data= new DatabaseEntry(new EntryIDSet().toDatabase()); status = EntryContainer.put(dbEq, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); status = EntryContainer.put(dbOr, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); //Add invalid idlist ids to presence index. key = new DatabaseEntry(StaticUtils.getBytes("+")); data = new DatabaseEntry(dataBytes); status = EntryContainer.put(dbPres, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); //Add invalid idlist ids to substring index. key = new DatabaseEntry(StaticUtils.getBytes("@examp")); data = new DatabaseEntry(dataBytes); status = EntryContainer.put(dbSub, txn, key, data); assertTrue(status == OperationStatus.SUCCESS); performBECompleteVerify(mailType, 6); } /* Various tests not either clean or complete */ /** * Try to verify a non-indexed attribute. * @throws Exception if error count is not equal to 0. */ @Test(expectedExceptions=Exception.class) public void testVerifyNotIndexed() throws Exception { cleanAndLoad(2); VerifyConfig verifyConfig = new VerifyConfig(); verifyConfig.setBaseDN(baseDNs[0]); verifyConfig.addCleanIndex("userPassword"); Entry statEntry=bldStatEntry(""); be=(BackendImpl) DirectoryServer.getBackend(beID); be.verifyBackend(verifyConfig, statEntry); assertEquals(getStatEntryCount(statEntry, errorCount), 0); } /** * Try to verify an nonexistent attribute. * @throws Exception if verify backend fails. */ @Test(expectedExceptions=Exception.class) public void testInvalidIndex() throws Exception { cleanAndLoad(2); VerifyConfig verifyConfig = new VerifyConfig(); verifyConfig.setBaseDN(baseDNs[0]); verifyConfig.addCleanIndex(badIndexName); Entry statEntry=bldStatEntry(""); be=(BackendImpl) DirectoryServer.getBackend(beID); be.verifyBackend(verifyConfig, statEntry); } /* end tests */ /** * Adds an entry to the id2entry database with a dn and id passed into the * method. Optional flag to set the Jeb version byte for those types of tests. * @param dn the dn string to put in the entry. * @param id to use as the id2entry key, * @param trashFormat true if first byte should be changed to invalid value. * @return Database entry key of the entry. * @throws Exception if the entry is not added to the id2entry database. */ private DatabaseEntry addID2EntryReturnKey(String dn, long id, boolean trashFormat) throws Exception { DatabaseEntry key= new EntryID(id).getDatabaseEntry(); Entry testEntry=bldStatEntry(dn); byte []entryBytes = JebFormat.entryToDatabase(testEntry, new DataConfig()); if(trashFormat) entryBytes[0] = 0x67; DatabaseEntry data= new DatabaseEntry(entryBytes); assertTrue(id2entry.putRaw(txn, key, data)); return key; } /** * Wrapper to do a clean verify. * @param indexToDo index file to run verify against. * @param expectedErrors number of errors expected for this test. * @throws Exception if the verify fails. */ private void performBECleanVerify(String indexToDo, int expectedErrors) throws Exception { performBEVerify(indexToDo, expectedErrors, true); } /** * Wrapper to do a complete verify. * @param indexToDo index file to run verify against. * @param expectedErrors number of errors expected for this test. * @throws Exception if the verify fails. */ private void performBECompleteVerify(String indexToDo, int expectedErrors) throws Exception { performBEVerify(indexToDo, expectedErrors, false); } /** * Performs either a clean or complete verify depending on * flag passed in. * * @param indexToDo index file to run verify against. * @param expectedErrors number of errors expected for this test. * @param clean do clean verify if true. * @throws Exception if the verify fails. */ private void performBEVerify(String indexToDo, int expectedErrors, boolean clean) throws Exception { EntryContainer.transactionCommit(txn); VerifyConfig verifyConfig = new VerifyConfig(); verifyConfig.setBaseDN(baseDNs[0]); if(!clean) verifyConfig.addCompleteIndex(indexToDo); else verifyConfig.addCleanIndex(indexToDo); Entry statEntry=bldStatEntry(""); be.verifyBackend(verifyConfig, statEntry); assertEquals(getStatEntryCount(statEntry, errorCount), expectedErrors); } /** * Does a pretest setup. Creates some number of entries, gets * backend, rootcontainer, entryContainer objects, as well as * various index objects. * Also starts a transaction. * @param numEntries number of entries to add to the verify backend. * @throws Exception if entries cannot be loaded. */ private void preTest(int numEntries) throws Exception { cleanAndLoad(numEntries); be=(BackendImpl) DirectoryServer.getBackend(beID); RootContainer rContainer = be.getRootContainer(); eContainer= rContainer.getEntryContainer(DN.decode(suffix)); id2child=eContainer.getID2Children(); id2entry=eContainer.getID2Entry(); id2subtree=eContainer.getID2Subtree(); dn2id=eContainer.getDN2ID(); txn = eContainer.beginTransaction(); } /** * Cleans verify backend and loads some number of entries. * @param numEntries number of entries to load into the backend. * @throws Exception if the entries are not loaded or created. */ private void cleanAndLoad(int numEntries) throws Exception { TestCaseUtils.clearJEBackend(false, beID, suffix); template[2]=numUsersLine; template[2]= template[2].replaceAll("#numEntries#", String.valueOf(numEntries)); createLoadEntries(template, numEntries); } /** * Gets information from the stat entry and returns that value as a Long. * @param e entry to search. * @param type attribute type * @return Long * @throws NumberFormatException if the attribute value cannot be parsed. */ private long getStatEntryCount(Entry e, String type) throws NumberFormatException { AttributeType attrType = DirectoryServer.getAttributeType(type); if (attrType == null) attrType = DirectoryServer.getDefaultAttributeType(type); List<Attribute> attrList = e.getAttribute(attrType, null); LinkedHashSet<AttributeValue> values = attrList.get(0).getValues(); AttributeValue v = values.iterator().next(); long retVal = Long.parseLong(v.getStringValue()); return (retVal); } /** * Builds an entry suitable for using in the verify job to gather statistics about * the verify. * @param dn to put into the entry. * @return a suitable entry. * @throws DirectoryException if the cannot be created. */ private Entry bldStatEntry(String dn) throws DirectoryException { DN entryDN = DN.decode(dn); HashMap<ObjectClass, String> ocs = new HashMap<ObjectClass, String>(2); ObjectClass topOC = DirectoryServer.getObjectClass(OC_TOP); if (topOC == null) { topOC = DirectoryServer.getDefaultObjectClass(OC_TOP); } ocs.put(topOC, OC_TOP); ObjectClass extensibleObjectOC = DirectoryServer .getObjectClass(OC_EXTENSIBLE_OBJECT); if (extensibleObjectOC == null) { extensibleObjectOC = DirectoryServer .getDefaultObjectClass(OC_EXTENSIBLE_OBJECT); } ocs.put(extensibleObjectOC, OC_EXTENSIBLE_OBJECT); return new Entry(entryDN, ocs, new LinkedHashMap<AttributeType, List<Attribute>>(0), new HashMap<AttributeType, List<Attribute>>(0)); } } opends/tests/unit-tests-testng/src/server/org/opends/server/tools/ImportLDIFTestCase.java
@@ -26,35 +26,21 @@ */ package org.opends.server.tools; import static org.opends.server.config.ConfigConstants.DN_BACKEND_BASE; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import org.opends.server.TestCaseUtils; import org.opends.server.config.ConfigEntry; import org.opends.server.util.Base64; import org.opends.server.api.Backend; import org.opends.server.backends.jeb.BackendImpl; import org.opends.server.core.DirectoryServer; import org.opends.server.core.LockFileManager; import static org.testng.Assert.*; import java.io.*; import java.util.*; import org.testng.annotations.BeforeClass; import org.testng.annotations.AfterClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import org.opends.server.tools.ToolsTestCase; import org.opends.server.tasks.TaskUtils; import org.opends.server.tools.ImportLDIF; import org.opends.server.types.ResultCode; import org.opends.server.types.Entry; import org.opends.server.types.DN; import org.opends.server.types.Attribute; import static org.testng.Assert.*; @@ -63,9 +49,7 @@ private File tempDir; private String ldifFilePath; String configFilePath ; private BackendImpl backend; private String homeDirName; private ConfigEntry backendConfigEntry; private String beID; /** @@ -78,10 +62,8 @@ { TestCaseUtils.startServer(); beID = "userRoot"; configFilePath = DirectoryServer.getInstance().getConfigFile(); backend = (BackendImpl)DirectoryServer.getBackend(beID); backendConfigEntry = TaskUtils.getConfigEntry(backend); TaskUtils.setBackendEnabled(backendConfigEntry, false); configFilePath = DirectoryServer.getConfigFile(); TaskUtils.disableBackend(beID); String entry = "dn: dc=example,dc=com\n" + @@ -194,7 +176,7 @@ String rejectFilePath = reject.getAbsolutePath(); String[] args = { "-f", DirectoryServer.getInstance().getConfigFile(), "-f", DirectoryServer.getConfigFile(), "-l",ldifFilePath, "-n", beID, "-R", rejectFilePath @@ -231,7 +213,7 @@ String[] args = { "-f", DirectoryServer.getInstance().getConfigFile(), "-f", DirectoryServer.getConfigFile(), "-l",ldifFilePath, "-n", beID, "-R",rejectFilePath, @@ -263,7 +245,7 @@ String rejectFilePath = reject.getAbsolutePath(); String[] args = { "-f", DirectoryServer.getInstance().getConfigFile(), "-f", DirectoryServer.getConfigFile(), "-l",ldifFilePath, "-n", beID, "-R",rejectFilePath, @@ -289,7 +271,7 @@ String rejectFilePath = reject.getAbsolutePath(); String[] args = { "-f", DirectoryServer.getInstance().getConfigFile(), "-f", DirectoryServer.getConfigFile(), "-l",ldifFilePath, "-n", beID, "-R",rejectFilePath, @@ -320,7 +302,7 @@ String rejectFilePath = reject.getAbsolutePath(); String[] args = { "-f", DirectoryServer.getInstance().getConfigFile(), "-f", DirectoryServer.getConfigFile(), "-l",ldifFilePath, "-n", beID, "-R",rejectFilePath, @@ -351,7 +333,7 @@ String rejectFilePath = reject.getAbsolutePath(); String[] args = { "-f", DirectoryServer.getInstance().getConfigFile(), "-f", DirectoryServer.getConfigFile(), "-l",ldifFilePath, "-n", beID, "-R",rejectFilePath, @@ -390,7 +372,7 @@ String rejectFilePath = reject.getAbsolutePath(); String[] args = { "-f", DirectoryServer.getInstance().getConfigFile(), "-f", DirectoryServer.getConfigFile(), "-l",ldifFilePath, "-n", beID, "-R",rejectFilePath, @@ -446,21 +428,21 @@ { if(attrs != null && attrs.length > 0) { TaskUtils.setBackendEnabled(backendConfigEntry, true); TaskUtils.enableBackend(beID); Entry entry = DirectoryServer.getEntry(DN.decode( " uid=user.0,dc=example,dc=com")); TaskUtils.setBackendEnabled(backendConfigEntry,false); TaskUtils.disableBackend(beID); assertNotNull(entry); List<Attribute> list = entry.getAttributes(); for(int i=0;i<attrs.length;i++) for(Attribute a : attrs) { if(assertType) { assertTrue(list.contains(attrs[i])); assertTrue(list.contains(a)); } else { assertFalse(list.contains(attrs[i])); assertFalse(list.contains(a)); } } } @@ -477,7 +459,7 @@ public void cleanUp() throws Exception { //reinstate the backend. TaskUtils.setBackendEnabled(backendConfigEntry, true); TaskUtils.enableBackend(beID); TestCaseUtils.deleteDirectory(tempDir); } }