001    /**
002     * JDBM LICENSE v1.00
003     *
004     * Redistribution and use of this software and associated documentation
005     * ("Software"), with or without modification, are permitted provided
006     * that the following conditions are met:
007     *
008     * 1. Redistributions of source code must retain copyright
009     *    statements and notices.  Redistributions must also contain a
010     *    copy of this document.
011     *
012     * 2. Redistributions in binary form must reproduce the
013     *    above copyright notice, this list of conditions and the
014     *    following disclaimer in the documentation and/or other
015     *    materials provided with the distribution.
016     *
017     * 3. The name "JDBM" must not be used to endorse or promote
018     *    products derived from this Software without prior written
019     *    permission of Cees de Groot.  For written permission,
020     *    please contact cg@cdegroot.com.
021     *
022     * 4. Products derived from this Software may not be called "JDBM"
023     *    nor may "JDBM" appear in their names without prior written
024     *    permission of Cees de Groot.
025     *
026     * 5. Due credit should be given to the JDBM Project
027     *    (http://jdbm.sourceforge.net/).
028     *
029     * THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS
030     * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
031     * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
032     * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
033     * CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
034     * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
035     * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
036     * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
037     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
038     * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
039     * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
040     * OF THE POSSIBILITY OF SUCH DAMAGE.
041     *
042     * Copyright 2000 (C) Cees de Groot. All Rights Reserved.
043     * Copyright 2000-2001 (C) Alex Boisvert. All Rights Reserved.
044     * Contributions are Copyright (C) 2000 by their associated contributors.
045     *
046     * $Id: Provider.java,v 1.3 2005/06/25 23:12:32 doomdark Exp $
047     */
048    
049    package jdbm.recman;
050    
051    import java.io.IOException;
052    import java.util.Properties;
053    
054    import org.apache.directory.server.i18n.I18n;
055    
056    import jdbm.RecordManager;
057    import jdbm.RecordManagerOptions;
058    import jdbm.RecordManagerProvider;
059    
060    import jdbm.helper.MRU;
061    
062    /**
063     * Provider of the default RecordManager implementation.
064     *
065     * @author <a href="mailto:boisvert@intalio.com">Alex Boisvert</a>
066     * @version $Id: Provider.java,v 1.3 2005/06/25 23:12:32 doomdark Exp $
067     */
068    public final class Provider implements RecordManagerProvider
069    {
070        /**
071         * Create a default implementation record manager.
072         *
073         * @param name Name of the record file.
074         * @param options Record manager options.
075         * @throws IOException if an I/O related exception occurs while creating
076         *                    or opening the record manager.
077         * @throws UnsupportedOperationException if some options are not supported by the
078         *                                      implementation.
079         * @throws IllegalArgumentException if some options are invalid.
080         */
081        public RecordManager createRecordManager( String name, Properties options ) throws IOException
082        {
083            RecordManager  recman;
084            String         value;
085            int            cacheSize;
086    
087            recman = new BaseRecordManager( name );
088    
089            value = options.getProperty( RecordManagerOptions.DISABLE_TRANSACTIONS, "false" );
090            
091            if ( value.equalsIgnoreCase( "TRUE" ) ) 
092            {
093                ( ( BaseRecordManager ) recman ).disableTransactions();
094            }
095    
096            value = options.getProperty( RecordManagerOptions.CACHE_SIZE, "1000" );
097            cacheSize = Integer.parseInt( value );
098    
099            value = options.getProperty( RecordManagerOptions.CACHE_TYPE, RecordManagerOptions.NORMAL_CACHE );
100            
101            if ( value.equalsIgnoreCase( RecordManagerOptions.NORMAL_CACHE ) ) 
102            {
103                MRU cache = new MRU( cacheSize );
104                recman = new CacheRecordManager( recman, cache );
105            } 
106            else if ( value.equalsIgnoreCase( RecordManagerOptions.SOFT_REF_CACHE ) ) 
107            {
108                throw new IllegalArgumentException( I18n.err( I18n.ERR_551 ) );
109            } 
110            else if ( value.equalsIgnoreCase( RecordManagerOptions.WEAK_REF_CACHE ) ) 
111            {
112                throw new IllegalArgumentException( I18n.err( I18n.ERR_552 ) );
113            } 
114            else 
115            {
116                throw new IllegalArgumentException( I18n.err( I18n.ERR_553, value ) );
117            }
118    
119            return recman;
120        }
121    }