001 /*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License"). You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at
010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012 * See the License for the specific language governing permissions
013 * and limitations under the License.
014 *
015 * When distributing Covered Code, include this CDDL HEADER in each
016 * file and include the License file at
017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
018 * add the following below this CDDL HEADER, with the fields enclosed
019 * by brackets "[]" replaced with your own identifying information:
020 * Portions Copyright [yyyy] [name of copyright owner]
021 *
022 * CDDL HEADER END
023 *
024 *
025 * Copyright 2006-2008 Sun Microsystems, Inc.
026 */
027 package org.opends.server.backends.jeb;
028
029 import org.opends.server.types.DN;
030
031 import java.util.ArrayList;
032
033 /**
034 * Configuration for the indexType rebuild process.
035 */
036 public class RebuildConfig
037 {
038 /**
039 * The base DN to rebuild.
040 */
041 private DN baseDN;
042
043 /**
044 * The names of indexes to rebuild.
045 */
046 private ArrayList<String> rebuildList;
047
048 /**
049 * The maximum number of rebuild threads to use at one time. An negative
050 * number indicates unlimited max number of threads.
051 */
052 private int maxRebuildThreads = -1;
053
054 /**
055 * Create a new rebuild configuraiton.
056 */
057 public RebuildConfig()
058 {
059 rebuildList = new ArrayList<String>();
060 }
061
062 /**
063 * Get the base DN to rebuild.
064 * @return The base DN to rebuild.
065 */
066 public DN getBaseDN()
067 {
068 return baseDN;
069 }
070
071 /**
072 * Set the base DN to rebuild.
073 * @param baseDN The base DN to rebuild.
074 */
075 public void setBaseDN(DN baseDN)
076 {
077 this.baseDN = baseDN;
078 }
079
080 /**
081 * Get the list of indexes to rebuild in this configuration.
082 *
083 * @return The list of indexes to rebuild.
084 */
085 public ArrayList<String> getRebuildList()
086 {
087 return rebuildList;
088 }
089
090 /**
091 * Add an index to be rebuilt into the configuration. Duplicate index names
092 * will be ignored. Adding an index that causes a mix of complete and partial
093 * rebuild for the same attribute index in the configuration will remove
094 * the partial and just keep the complete attribute index name.
095 * (ie. uid and uid.presence).
096 *
097 * @param index The index to add.
098 */
099 public void addRebuildIndex(String index)
100 {
101 String[] newIndexParts = index.split("\\.");
102
103 for(String s : new ArrayList<String>(rebuildList))
104 {
105 String[] existingIndexParts = s.split("\\.");
106 if(existingIndexParts[0].equalsIgnoreCase(newIndexParts[0]))
107 {
108 if(newIndexParts.length == 1 && existingIndexParts.length == 1)
109 {
110 return;
111 }
112 else if(newIndexParts.length > 1 && existingIndexParts.length == 1)
113 {
114 return;
115 }
116 else if(newIndexParts.length == 1 && existingIndexParts.length > 1)
117 {
118 rebuildList.remove(s);
119 }
120 else if(newIndexParts[1].equalsIgnoreCase(existingIndexParts[1]))
121 {
122 return;
123 }
124 }
125 }
126
127 this.rebuildList.add(index);
128 }
129
130 /**
131 * Check the given config for conflicts with this config. A conflict is
132 * detected if both configs specify the same indexType/database to be rebuilt.
133 *
134 * @param config The rebuild config to check against.
135 * @return the name of the indexType causing the conflict or null if no
136 * conflict is detected.
137 */
138 public String checkConflicts(RebuildConfig config)
139 {
140 //If they specify different base DNs, no conflicts can occur.
141 if(this.baseDN.equals(config.baseDN))
142 {
143 for(String thisIndex : this.rebuildList)
144 {
145 for(String thatIndex : config.rebuildList)
146 {
147 String[] existingIndexParts = thisIndex.split("\\.");
148 String[] newIndexParts = thatIndex.split("\\.");
149 if(existingIndexParts[0].equalsIgnoreCase(newIndexParts[0]))
150 {
151 if(newIndexParts.length == 1 && existingIndexParts.length == 1)
152 {
153 return thatIndex;
154 }
155 else if(newIndexParts.length > 1 && existingIndexParts.length == 1)
156 {
157 return thatIndex;
158 }
159 else if(newIndexParts.length == 1 && existingIndexParts.length > 1)
160 {
161 return thatIndex;
162 }
163 else if(newIndexParts[1].equalsIgnoreCase(existingIndexParts[1]))
164 {
165 return thatIndex;
166 }
167 }
168 }
169 }
170 }
171
172 return null;
173 }
174
175 /**
176 * Get the maximum number of rebuild threads to use for the rebuild job
177 * at one time.
178 *
179 * @return The maximum number of rebuild threads.
180 */
181 public int getMaxRebuildThreads()
182 {
183 return maxRebuildThreads;
184 }
185
186 /**
187 * Set the maximum number of rebuild threads to use for the rebuild
188 * job at one time.
189 *
190 * @param maxRebuildThreads The maximum number of rebuild threads.
191 */
192 public void setMaxRebuildThreads(int maxRebuildThreads)
193 {
194 this.maxRebuildThreads = maxRebuildThreads;
195 }
196
197 /**
198 * Test if this rebuild config includes any system indexes to rebuild.
199 *
200 * @return True if rebuilding of system indexes are included. False otherwise.
201 */
202 public boolean includesSystemIndex()
203 {
204 for(String index : rebuildList)
205 {
206 if(index.equalsIgnoreCase("id2entry"))
207 {
208 return true;
209 }
210 if(index.equalsIgnoreCase("dn2id"))
211 {
212 return true;
213 }
214 if(index.equalsIgnoreCase("dn2uri"))
215 {
216 return true;
217 }
218 if(index.equalsIgnoreCase("id2children"))
219 {
220 return true;
221 }
222 if(index.equalsIgnoreCase("id2subtree"))
223 {
224 return true;
225 }
226 }
227
228 return false;
229 }
230
231 }