/* * 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-2013 ForgeRock AS */ package org.opends.server.backends.jeb; import org.opends.server.types.DN; import java.util.ArrayList; /** * 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; /** * The names of indexes to rebuild. */ private ArrayList rebuildList; private RebuildMode rebuildMode = RebuildMode.USER_DEFINED; private String tmpDirectory; private boolean isClearDegradedState; /** * Create a new rebuild configuration. */ public RebuildConfig() { rebuildList = new ArrayList(); } /** * 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 ArrayList 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) { String[] newIndexParts = index.split("\\."); for (String s : new ArrayList(rebuildList)) { String[] existingIndexParts = s.split("\\."); if (existingIndexParts[0].equalsIgnoreCase(newIndexParts[0])) { if (newIndexParts.length == 1 && existingIndexParts.length == 1) { return; } else if (newIndexParts.length > 1 && existingIndexParts.length == 1) { return; } else if (newIndexParts.length == 1 && existingIndexParts.length > 1) { rebuildList.remove(s); } else if (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 (existingIndexParts[0].equalsIgnoreCase(newIndexParts[0])) { if (newIndexParts.length == 1 && existingIndexParts.length == 1) { return thatIndex; } else if (newIndexParts.length > 1 && existingIndexParts.length == 1) { return thatIndex; } else if (newIndexParts.length == 1 && existingIndexParts.length > 1) { return thatIndex; } else if (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. * @throws InitializationException */ public boolean includesSystemIndex() { for (String index : rebuildList) { // Removed because the id2entry is not A system indexes is THE // primary system index. It cannot be rebuilt. /*if (index.equalsIgnoreCase("id2entry")) { return true; }*/ if (index.equalsIgnoreCase("dn2id")) { return true; } if (index.equalsIgnoreCase("dn2uri")) { 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; } }