/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
* or http://forgerock.org/license/CDDLv1.0.html.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at legal-notices/CDDLv1_0.txt.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2006-2009 Sun Microsystems, Inc.
* Portions Copyright 2011-2015 ForgeRock AS
*/
package org.opends.server.backends;
import java.util.ArrayList;
import java.util.List;
import org.opends.server.types.DN;
/** Configuration for the indexType rebuild process. */
public class RebuildConfig
{
/** Identifies how indexes will be selected for rebuild. */
public static enum RebuildMode
{
/** Rebuild all indexes, including system indexes. */
ALL,
/** Rebuild all degraded indexes, including system indexes. */
DEGRADED,
/** Rebuild used defined list of indexes. */
USER_DEFINED;
}
/** The base DN to rebuild. */
private DN baseDN;
private RebuildMode rebuildMode = RebuildMode.USER_DEFINED;
/** The names of indexes to rebuild. */
private final List<String> rebuildList = new ArrayList<>();
private String tmpDirectory;
private boolean isClearDegradedState;
/**
* Get the base DN to rebuild.
*
* @return The base DN to rebuild.
*/
public DN getBaseDN()
{
return baseDN;
}
/**
* Set the base DN to rebuild.
*
* @param baseDN
* The base DN to rebuild.
*/
public void setBaseDN(DN baseDN)
{
this.baseDN = baseDN;
}
/**
* Get the list of indexes to rebuild in this configuration.
*
* @return The list of indexes to rebuild.
*/
public List<String> getRebuildList()
{
return rebuildList;
}
/**
* Add an index to be rebuilt into the configuration. Duplicate index names
* will be ignored. Adding an index that causes a mix of complete and partial
* rebuild for the same attribute index in the configuration will remove the
* partial and just keep the complete attribute index name. (ie. uid and
* uid.presence).
*
* @param index
* The index to add.
*/
public void addRebuildIndex(String index)
{
final String[] newIndexParts = index.split("\\.");
for (String s : new ArrayList<String>(rebuildList))
{
final String[] existingIndexParts = s.split("\\.");
if (newIndexParts[0].equalsIgnoreCase(existingIndexParts[0]))
{
if (newIndexParts.length == 1 && existingIndexParts.length > 1)
{
rebuildList.remove(s);
}
else if ((newIndexParts.length == 1 && existingIndexParts.length == 1)
|| (newIndexParts.length > 1 && existingIndexParts.length == 1)
|| newIndexParts[1].equalsIgnoreCase(existingIndexParts[1]))
{
return;
}
}
}
this.rebuildList.add(index);
}
/**
* Check the given config for conflicts with this config. A conflict is
* detected if both configs specify the same indexType/database to be rebuilt.
*
* @param config
* The rebuild config to check against.
* @return the name of the indexType causing the conflict or null if no
* conflict is detected.
*/
public String checkConflicts(RebuildConfig config)
{
//If they specify different base DNs, no conflicts can occur.
if (this.baseDN.equals(config.baseDN))
{
for (String thisIndex : this.rebuildList)
{
for (String thatIndex : config.rebuildList)
{
String[] existingIndexParts = thisIndex.split("\\.");
String[] newIndexParts = thatIndex.split("\\.");
if (newIndexParts[0].equalsIgnoreCase(existingIndexParts[0]))
{
if ((newIndexParts.length == 1 && existingIndexParts.length >= 1)
|| (newIndexParts.length > 1 && existingIndexParts.length == 1)
|| newIndexParts[1].equalsIgnoreCase(existingIndexParts[1]))
{
return thatIndex;
}
}
}
}
}
return null;
}
/**
* Test if this rebuild config includes any system indexes to rebuild.
*
* @return True if rebuilding of system indexes are included. False otherwise.
*/
public boolean includesSystemIndex()
{
for (String index : rebuildList)
{
// id2entry is not A system index, it is THE primary system index.
// It cannot be rebuilt.
if ("dn2id".equalsIgnoreCase(index) || "dn2uri".equalsIgnoreCase(index))
{
return true;
}
}
return false;
}
/**
* Set the temporary directory to the specified path.
*
* @param path
* The path to set the temporary directory to.
*/
public void setTmpDirectory(String path)
{
tmpDirectory = path;
}
/**
* Return the temporary directory path.
*
* @return The temporary directory string.
*/
public String getTmpDirectory()
{
return tmpDirectory;
}
/**
* Sets the rebuild mode.
*
* @param mode
* The new rebuild mode.
*/
public void setRebuildMode(RebuildMode mode)
{
rebuildMode = mode;
}
/**
* Returns the rebuild mode.
*
* @return The rebuild mode.
*/
public RebuildMode getRebuildMode()
{
return rebuildMode;
}
/**
* Returns {@code true} if indexes should be forcefully marked as valid even
* if they are currently degraded.
*
* @return {@code true} if index should be forcefully marked as valid.
*/
public boolean isClearDegradedState()
{
return isClearDegradedState;
}
/**
* Sets the 'clear degraded index' status.
*
* @param isClearDegradedState
* {@code true} if indexes should be forcefully marked as valid even
* if they are currently degraded.
*/
public void isClearDegradedState(boolean isClearDegradedState)
{
this.isClearDegradedState = isClearDegradedState;
}
}