001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 * 019 */ 020package org.apache.directory.mavibot.btree; 021 022 023import org.apache.directory.mavibot.btree.serializer.ElementSerializer; 024 025 026/** 027 * The B+Tree Configuration. This class can be used to store all the configurable 028 * parameters used by the BTree class 029 * 030 * @param <K> The type for the keys 031 * @param <V> The type for the stored values 032 * 033 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 034 */ 035public class InMemoryBTreeConfiguration<K, V> 036{ 037 /** Number of entries in each Page. */ 038 private int pageSize = InMemoryBTree.DEFAULT_PAGE_SIZE; 039 040 /** The size of the buffer used to write data in disk */ 041 private int writeBufferSize = InMemoryBTree.DEFAULT_WRITE_BUFFER_SIZE; 042 043 /** The Key and Value serializer used for this tree. If none is provided, 044 * the BTree will deduce the serializer to use from the generic type, and 045 * use the default Java serialization */ 046 private ElementSerializer<K> keySerializer; 047 private ElementSerializer<V> valueSerializer; 048 049 /** The BTree name */ 050 private String name; 051 052 /** The path where the BTree file will be stored. Default to the local 053 * temporary directory. 054 */ 055 private String filePath; 056 057 /** 058 * The maximum delay to wait before a revision is considered as unused. 059 * This delay is necessary so that a read that does not ends does not 060 * hold a revision in memory forever. 061 * The default value is 10000 (10 seconds). If the value is 0 or below, 062 * the delay is considered as infinite 063 */ 064 private long readTimeOut = InMemoryBTree.DEFAULT_READ_TIMEOUT; 065 066 /** The maximal size of the journal. When this size is reached, the tree is 067 * flushed on disk. 068 * The default size is 10 Mb 069 */ 070 private long journalSize = 10 * 1024 * 1024L; 071 072 /** 073 * The journal's name. Default to "mavibot.log". 074 */ 075 private String journalName = InMemoryBTree.DEFAULT_JOURNAL; 076 077 /** 078 * The delay between two checkpoints. When we reach the maximum delay, 079 * the BTree is flushed on disk, but only if we have had some modifications. 080 * The default value is 60 seconds. 081 */ 082 private long checkPointDelay = 60 * 1000L; 083 084 /** Flag to enable duplicate key support */ 085 private boolean allowDuplicates; 086 087 /** the type of BTree */ 088 private BTreeTypeEnum type; 089 090 091 /** 092 * @return the pageSize 093 */ 094 public int getPageSize() 095 { 096 return pageSize; 097 } 098 099 100 /** 101 * @param pageSize the pageSize to set 102 */ 103 public void setPageSize( int pageSize ) 104 { 105 this.pageSize = pageSize; 106 } 107 108 109 /** 110 * @return the key serializer 111 */ 112 public ElementSerializer<K> getKeySerializer() 113 { 114 return keySerializer; 115 } 116 117 118 /** 119 * @return the value serializer 120 */ 121 public ElementSerializer<V> getValueSerializer() 122 { 123 return valueSerializer; 124 } 125 126 127 /** 128 * @param keySerializer the key serializer to set 129 * @param valueSerializer the value serializer to set 130 */ 131 public void setSerializers( ElementSerializer<K> keySerializer, ElementSerializer<V> valueSerializer ) 132 { 133 this.keySerializer = keySerializer; 134 this.valueSerializer = valueSerializer; 135 } 136 137 138 /** 139 * @param serializer the key serializer to set 140 */ 141 public void setKeySerializer( ElementSerializer<K> keySerializer ) 142 { 143 this.keySerializer = keySerializer; 144 } 145 146 147 /** 148 * @param serializer the key serializer to set 149 */ 150 public void setValueSerializer( ElementSerializer<V> valueSerializer ) 151 { 152 this.valueSerializer = valueSerializer; 153 } 154 155 156 /** 157 * @return the readTimeOut 158 */ 159 public long getReadTimeOut() 160 { 161 return readTimeOut; 162 } 163 164 165 /** 166 * @param readTimeOut the readTimeOut to set 167 */ 168 public void setReadTimeOut( long readTimeOut ) 169 { 170 this.readTimeOut = readTimeOut; 171 } 172 173 174 /** 175 * @return the journalSize 176 */ 177 public long getJournalSize() 178 { 179 return journalSize; 180 } 181 182 183 /** 184 * @param journalSize the journalSize to set 185 */ 186 public void setJournalSize( long journalSize ) 187 { 188 this.journalSize = journalSize; 189 } 190 191 192 /** 193 * @return the checkPointDelay 194 */ 195 public long getCheckPointDelay() 196 { 197 return checkPointDelay; 198 } 199 200 201 /** 202 * @param checkPointDelay the checkPointDelay to set 203 */ 204 public void setCheckPointDelay( long checkPointDelay ) 205 { 206 this.checkPointDelay = checkPointDelay; 207 } 208 209 210 /** 211 * @return the filePath 212 */ 213 public String getFilePath() 214 { 215 return filePath; 216 } 217 218 219 /** 220 * @param filePath the filePath to set 221 */ 222 public void setFilePath( String filePath ) 223 { 224 this.filePath = filePath; 225 } 226 227 228 /** 229 * @return the journal name 230 */ 231 public String getJournalName() 232 { 233 return journalName; 234 } 235 236 237 /** 238 * @param journalName the journal name to set 239 */ 240 public void setJournalName( String journalName ) 241 { 242 this.journalName = journalName; 243 } 244 245 246 /** 247 * @return the writeBufferSize 248 */ 249 public int getWriteBufferSize() 250 { 251 return writeBufferSize; 252 } 253 254 255 /** 256 * @param writeBufferSize the writeBufferSize to set 257 */ 258 public void setWriteBufferSize( int writeBufferSize ) 259 { 260 this.writeBufferSize = writeBufferSize; 261 } 262 263 264 /** 265 * @return the name 266 */ 267 public String getName() 268 { 269 return name; 270 } 271 272 273 /** 274 * @param name the name to set 275 */ 276 public void setName( String name ) 277 { 278 this.name = name.trim(); 279 } 280 281 282 /** 283 * @return true if duplicate key support is enabled 284 */ 285 public boolean isAllowDuplicates() 286 { 287 return allowDuplicates; 288 } 289 290 291 /** 292 * enable duplicate key support 293 * 294 * @param allowDuplicates 295 * @throws IllegalStateException if the btree was already initialized or when tried to turn off duplicate suport on 296 * an existing btree containing duplicate keys 297 */ 298 public void setAllowDuplicates( boolean allowDuplicates ) 299 { 300 this.allowDuplicates = allowDuplicates; 301 } 302 303 304 /** 305 * @return the type of BTree 306 */ 307 public BTreeTypeEnum getType() 308 { 309 return type; 310 } 311 312 313 /** 314 * Sets the type of the BTree 315 * 316 * @param type the type of the tree 317 */ 318 public void setType( BTreeTypeEnum type ) 319 { 320 this.type = type; 321 } 322}