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 */
020 package org.apache.directory.server.core.partition.avl;
021
022
023 import java.util.HashSet;
024 import java.util.List;
025 import java.util.Set;
026
027 import org.apache.directory.server.constants.ApacheSchemaConstants;
028 import org.apache.directory.server.xdbm.Index;
029 import org.apache.directory.server.xdbm.AbstractXdbmPartition;
030 import org.apache.directory.server.xdbm.search.impl.CursorBuilder;
031 import org.apache.directory.server.xdbm.search.impl.DefaultOptimizer;
032 import org.apache.directory.server.xdbm.search.impl.DefaultSearchEngine;
033 import org.apache.directory.server.xdbm.search.impl.EvaluatorBuilder;
034 import org.apache.directory.server.xdbm.search.impl.NoOpOptimizer;
035 import org.apache.directory.shared.ldap.constants.SchemaConstants;
036 import org.apache.directory.shared.ldap.entry.Modification;
037 import org.apache.directory.shared.ldap.entry.ServerEntry;
038
039
040 /**
041 * An XDBM Partition backed by in memory AVL Trees.
042 *
043 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
044 * @version $Rev$, $Date$
045 */
046 public class AvlPartition extends AbstractXdbmPartition<Long>
047 {
048 private Set<AvlIndex<?, ServerEntry>> indexedAttributes;
049
050
051 /**
052 * Creates a store based on AVL Trees.
053 */
054 public AvlPartition()
055 {
056 super( new AvlStore<ServerEntry>() );
057 indexedAttributes = new HashSet<AvlIndex<?, ServerEntry>>();
058 }
059
060
061 /**
062 * {@inheritDoc}
063 */
064 protected void doInit() throws Exception
065 {
066 setSchemaManager( schemaManager );
067
068 EvaluatorBuilder<Long> evaluatorBuilder = new EvaluatorBuilder<Long>( store, schemaManager );
069 CursorBuilder<Long> cursorBuilder = new CursorBuilder<Long>( store, evaluatorBuilder );
070
071 // setup optimizer and registries for parent
072 if ( !optimizerEnabled )
073 {
074 optimizer = new NoOpOptimizer();
075 }
076 else
077 {
078 optimizer = new DefaultOptimizer<ServerEntry, Long>( store );
079 }
080
081 searchEngine = new DefaultSearchEngine<Long>( store, cursorBuilder, evaluatorBuilder, optimizer );
082
083 if ( store.isInitialized() )
084 {
085 return;
086 }
087
088 // initialize the store
089 store.setName( getId() );
090 suffix.normalize( schemaManager.getNormalizerMapping() );
091 store.setSuffixDn( suffix.getName() );
092
093 Set<Index<?, ServerEntry, Long>> userIndices = new HashSet<Index<?, ServerEntry, Long>>();
094
095 for ( AvlIndex<?, ServerEntry> obj : indexedAttributes )
096 {
097 AvlIndex<?, ServerEntry> index;
098
099 if ( obj instanceof AvlIndex<?, ?> )
100 {
101 index = ( AvlIndex<?, ServerEntry> ) obj;
102 }
103 else
104 {
105 index = new AvlIndex<Object, ServerEntry>();
106 index.setAttributeId( obj.getAttributeId() );
107 }
108
109 String oid = schemaManager.getAttributeTypeRegistry().getOidByName( index.getAttributeId() );
110
111 if ( SYS_INDEX_OIDS.contains( schemaManager.getAttributeTypeRegistry()
112 .getOidByName( index.getAttributeId() ) ) )
113 {
114 if ( oid.equals( ApacheSchemaConstants.APACHE_ALIAS_AT_OID ) )
115 {
116 store.setAliasIndex( ( Index<String, ServerEntry, Long> ) index );
117 }
118 else if ( oid.equals( ApacheSchemaConstants.APACHE_EXISTENCE_AT_OID ) )
119 {
120 store.setPresenceIndex( ( Index<String, ServerEntry, Long> ) index );
121 }
122 else if ( oid.equals( ApacheSchemaConstants.APACHE_ONE_LEVEL_AT_OID ) )
123 {
124 store.setOneLevelIndex( ( Index<Long, ServerEntry, Long> ) index );
125 }
126 else if ( oid.equals( ApacheSchemaConstants.APACHE_N_DN_AT_OID ) )
127 {
128 store.setNdnIndex( ( Index<String, ServerEntry, Long> ) index );
129 }
130 else if ( oid.equals( ApacheSchemaConstants.APACHE_ONE_ALIAS_AT_OID ) )
131 {
132 store.setOneAliasIndex( ( Index<Long, ServerEntry, Long> ) index );
133 }
134 else if ( oid.equals( ApacheSchemaConstants.APACHE_SUB_ALIAS_AT_OID ) )
135 {
136 store.setSubAliasIndex( ( Index<Long, ServerEntry, Long> ) index );
137 }
138 else if ( oid.equals( ApacheSchemaConstants.APACHE_UP_DN_AT_OID ) )
139 {
140 store.setUpdnIndex( ( Index<String, ServerEntry, Long> ) index );
141 }
142 else if ( oid.equals( SchemaConstants.OBJECT_CLASS_AT_OID ) )
143 {
144 store.addIndex( ( Index<String, ServerEntry, Long> ) index );
145 }
146 else
147 {
148 throw new IllegalStateException( "Unrecognized system index " + oid );
149 }
150 }
151 else
152 {
153 userIndices.add( index );
154 }
155
156 store.setUserIndices( userIndices );
157 }
158
159 store.init( schemaManager );
160 }
161
162
163 /**
164 * {@inheritDoc}
165 */
166 public final void modify( long entryId, List<Modification> modifications ) throws Exception
167 {
168 ( ( AvlStore<ServerEntry> ) store ).modify( entryId, modifications );
169 }
170
171
172 /*
173 * TODO requires review
174 *
175 * This getter deviates from the norm. all the partitions
176 * so far written never return a reference to store but I think that in this
177 * case the presence of this method gives significant ease and advantage to perform
178 * add/delete etc. operations without creating a operation context.
179 */
180 public AvlStore<ServerEntry> getStore()
181 {
182 return ( AvlStore<ServerEntry> ) store;
183 }
184
185 }