blob: b65774a072c09e658b3ed333e005e42796842596 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.server.tools;
import java.io.File;
import jdbm.helper.MRU;
import jdbm.recman.BaseRecordManager;
import jdbm.recman.CacheRecordManager;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.directory.server.constants.ApacheSchemaConstants;
import org.apache.directory.server.core.DefaultDirectoryService;
import org.apache.directory.server.core.DirectoryService;
import org.apache.directory.server.core.entry.DefaultServerEntry;
import org.apache.directory.server.core.entry.ServerEntry;
import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmIndex;
import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmMasterTable;
import org.apache.directory.server.xdbm.Tuple;
import org.apache.directory.server.xdbm.tools.IndexUtils;
import org.apache.directory.shared.ldap.cursor.Cursor;
import org.apache.directory.shared.ldap.entry.EntryAttribute;
import org.apache.directory.shared.ldap.schema.AttributeType;
import org.apache.directory.shared.ldap.schema.SchemaManager;
/**
* Simple tool used to dump the contents of a jdbm based partition.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev: 442600 $
*/
public class IndexCommand extends ToolCommand
{
private SchemaManager schemaManager;
private DirectoryService directoryService;
public IndexCommand()
{
super( "index" );
}
@SuppressWarnings("unchecked")
private SchemaManager loadSchemaManager() throws Exception
{
// --------------------------------------------------------------------
// Load the bootstrap schemas to start up the schema partition
// --------------------------------------------------------------------
directoryService = new DefaultDirectoryService();
directoryService.setWorkingDirectory( getInstanceLayout().getPartitionsDir() );
directoryService.startup();
SchemaManager schemaManager = directoryService.getSchemaManager();
return schemaManager;
}
public void execute( CommandLine cmdline ) throws Exception
{
// getLayout().verifyInstallation();
schemaManager = loadSchemaManager();
String[] partitions = cmdline.getOptionValues( 'p' );
String attribute = cmdline.getOptionValue( 'a' );
String indexDirPath = cmdline.getOptionValue( 'w' );
for ( int ii = 0; ii < partitions.length; ii++ )
{
File partitionDirectory = partitionDirectory = new File( getInstanceLayout().getPartitionsDir(), partitions[ii] );
File indexDir = null;
if( indexDirPath != null )
{
indexDir = new File( indexDirPath );
}
AttributeType attrType = schemaManager.lookupAttributeTypeRegistry( attribute );
System.out.println( "building index for attribute type: " + attrType + ", of the partition: " + partitions[ii] );
if( indexDir != null )
{
System.out.println( "The index file location is: " + indexDir.getAbsolutePath() );
}
buildIndex( partitionDirectory, indexDir, attrType );
}
directoryService.shutdown();
}
@SuppressWarnings("unchecked")
private void buildIndex( File partitionDirectory, File indexDirectory, AttributeType attributeType ) throws Exception
{
if ( !partitionDirectory.exists() )
{
System.err.println( "Partition directory " + partitionDirectory + " does not exist!" );
System.exit( 1 );
}
String path = partitionDirectory.getPath() + File.separator + "master";
BaseRecordManager base = new BaseRecordManager( path );
base.disableTransactions();
CacheRecordManager recMan = new CacheRecordManager( base, new MRU( 1000 ) );
JdbmMasterTable<ServerEntry> master = new JdbmMasterTable<ServerEntry>( recMan, schemaManager );
JdbmIndex index = new JdbmIndex();
index.setAttributeId( attributeType.getName() );
index.setCacheSize( JdbmIndex.DEFAULT_INDEX_CACHE_SIZE );
index.setNumDupLimit( JdbmIndex.DEFAULT_DUPLICATE_LIMIT );
if( indexDirectory == null )
{
indexDirectory = partitionDirectory;
}
index.setWkDirPath( indexDirectory );
index.init( schemaManager, attributeType, indexDirectory );
IndexUtils.printContents( index );
JdbmIndex existenceIdx = new JdbmIndex();
existenceIdx.setAttributeId( ApacheSchemaConstants.APACHE_EXISTENCE_AT_OID );
existenceIdx.setCacheSize( JdbmIndex.DEFAULT_INDEX_CACHE_SIZE );
existenceIdx.setNumDupLimit( JdbmIndex.DEFAULT_DUPLICATE_LIMIT );
existenceIdx.setWkDirPath( partitionDirectory );
existenceIdx.init( schemaManager, schemaManager.lookupAttributeTypeRegistry( ApacheSchemaConstants.APACHE_EXISTENCE_AT_OID ), partitionDirectory );
Cursor<Tuple<Long,ServerEntry>> list = master.cursor();
while ( list.next() )
{
Tuple<Long,ServerEntry> tuple = list.get();
Long id = tuple.getKey();
DefaultServerEntry entry = ( DefaultServerEntry ) tuple.getValue();
EntryAttribute attr = entry.get( attributeType );
if ( attr == null )
{
continue;
}
for ( int ii = 0; ii < attr.size(); ii++ )
{
index.add( attr.get( ii ).get(), id );
}
existenceIdx.add( attributeType.getOid(), id );
}
index.sync();
index.close();
existenceIdx.sync();
existenceIdx.close();
}
public Options getOptions()
{
Options opts = new Options();
Option op = null;
op = new Option( "p", "partitions", true, "the partitions to add the attribute indices to" );
op.setRequired( true );
op.setValueSeparator( File.pathSeparatorChar );
opts.addOption( op );
op = new Option( "a", "attributes", true, "the attribute to index" );
op.setRequired( true );
op.setValueSeparator( File.pathSeparatorChar );
opts.addOption( op );
op = new Option( "i", "install-path", true, "path to apacheds installation directory" );
op.setRequired( true );
opts.addOption( op );
op = new Option( "w", "index-path", true, "path to the directory where index should be stored" );
op.setRequired( false );
opts.addOption( op );
return opts;
}
}