blob: d38d257596c66ef3ddaa95cca222becf7ad389f1 [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.schema.bootstrap.partition;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* Parses the dbfile listing file within this jar.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$
*/
public class DbFileListing
{
Map<String, DbFileType> name2type = new HashMap<String, DbFileType>();
private static final String BASE_PATH = DbFileListing.class.getName()
.substring( 0, DbFileListing.class.getName().lastIndexOf( "." ) + 1 ).replace( '.', '/' );
public DbFileListing() throws IOException
{
init();
}
/**
* Reads the DBFILES resource within some jar on the classpath that
* has this file and loaded it's db files into the name2type map with
* something like the following entries ( key => value ):
* <pre>
* schema/master.db => MASTER_FILE
* schema/apacheOnealias.db => SYSTEM_INDEX
* schema/apacheSubalias.db => SYSTEM_INDEX
* schema/apacheNdn.db => SYSTEM_INDEX
* schema/apacheExistance.db => SYSTEM_INDEX
* schema/apacheAlias.db => SYSTEM_INDEX
* schema/apacheHierarchy.db => SYSTEM_INDEX
* schema/apacheUpdn.db => SYSTEM_INDEX
* schema/objectClass.db => USER_INDEX
* schema/ou.db => USER_INDEX
* schema/cn.db => USER_INDEX
* schema/m-oid.db => USER_INDEX
* schema/m-disabled.db => USER_INDEX
* </pre>
*
* @throws IOException
*/
private void init() throws IOException
{
boolean userIndexMode = false;
String line = null;
BufferedReader in = new BufferedReader(
new InputStreamReader(
getUniqueResourceAsStream(
"DBFILES",
"bootstrap partition database file list. " +
"Be sure there is exactly one bootstrap partition jar in your classpath." ) ) );
try
{
while ( ( line = in.readLine() ) != null )
{
if ( line.indexOf( "master.db" ) != -1 )
{
name2type.put( line.trim(), DbFileType.MASTER_FILE );
continue;
}
if ( line.indexOf( "USER INDICES" ) != -1 )
{
userIndexMode = true;
continue;
}
if ( userIndexMode )
{
name2type.put( line.trim(), DbFileType.USER_INDEX );
}
else
{
name2type.put( line.trim(), DbFileType.SYSTEM_INDEX );
}
}
}
finally
{
in.close();
}
}
/**
* Gets the DBFILE resource from within a jar off the base path. If another jar
* with such a DBFILE resource exists then an error will result since the resource
* is not unique across all the jars.
*
* @param resourceName the file name of the resource to load
* @param resourceDescription
* @return the InputStream to read the contents of the resource
* @throws IOException if there are problems reading or finding a unique copy of the resource
*/
public static InputStream getUniqueResourceAsStream( String resourceName, String resourceDescription ) throws IOException
{
resourceName = BASE_PATH + resourceName;
URL result = getUniqueResource( resourceName, resourceDescription );
return result.openStream();
}
static URL getUniqueResource( String resourceName, String resourceDescription )
throws IOException
{
Enumeration<URL> resources = DbFileListing.class.getClassLoader().getResources( resourceName );
if ( !resources.hasMoreElements() )
{
throw new UniqueResourceException( resourceName, resourceDescription );
}
URL result = resources.nextElement();
if ( resources.hasMoreElements() )
{
throw new UniqueResourceException( resourceName, result, resources, resourceDescription);
}
return result;
}
public DbFileType getType( String dbfile )
{
return name2type.get( dbfile );
}
public Iterator<String> iterator()
{
return name2type.keySet().iterator();
}
public String getIndexAttributeName( String dbfile )
{
if ( dbfile.length() < 10 )
{
throw new IllegalArgumentException( "db file must have a relative jar path name of over 10 characters" );
}
// remove 'schema/'
String dbfileName = dbfile.substring( 7 );
return dbfileName.substring( 0, dbfileName.length() - 3 );
}
/**
* Gets the user indices WITHOUT the system indices.
*
* @return set of user index names
*/
public Set<String> getIndexedAttributes()
{
Set<String> attributes = new HashSet<String>();
Iterator<String> ii = iterator();
while( ii.hasNext() )
{
String name = ii.next();
if ( name2type.get( name ) == DbFileType.USER_INDEX )
{
attributes.add( getIndexAttributeName( name ) );
}
}
return attributes;
}
}