Author: akarasulu Date: Wed Oct 27 18:44:02 2004 New Revision: 55762 Added: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/SerializableComparator.java Removed: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/SerializableComparator.java Modified: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/IndexComparator.java incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/KeyOnlyComparator.java incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/TupleComparator.java incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/jdbm/JdbmIndex.java incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/jdbm/JdbmMasterTable.java incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/jdbm/JdbmTable.java incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/BootstrapComparatorRegistry.java incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/EveComparatorProducer.java incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/EveMatchingRuleProducer.java incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/EveNormalizerProducer.java incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/SystemComparatorProducer.java Log: Changes ...
o replaced old serializable with a new model that uses the comparator registry for delayed resolution of the comparator o no longer using a thread local to do the lookup o made changes to use serializable comparators as a basis and cut out lots of junk code Modified: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/IndexComparator.java ============================================================================== --- incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/IndexComparator.java (original) +++ incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/IndexComparator.java Wed Oct 27 18:44:02 2004 @@ -17,23 +17,31 @@ package org.apache.eve.db; -import java.util.Comparator; - import org.apache.ldap.common.util.BigIntegerComparator; +import org.apache.eve.schema.SerializableComparator; + /** - * Compararator for index records. + * TupleComparator for index records. * * @author <a href="mailto:[EMAIL PROTECTED]">Apache Directory Project</a> * @version $Rev$ */ public class IndexComparator implements TupleComparator { + private static final SerializableComparator BIG_INTEGER_COMPARATOR = + new SerializableComparator( "1.2.6.1.4.1.18060.1.1.1.2.2" ) + { + public int compare( Object o1, Object o2 ) + { + return BigIntegerComparator.INSTANCE.compare( o1, o2 ); + } + }; /** Whether or not the key/value is swapped */ private final boolean isForwardMap; /** The key comparison to use */ - private final Comparator keyComp; + private final SerializableComparator keyComp; /** @@ -43,7 +51,7 @@ * @param isForwardMap whether or not the comparator should swap the * key value pair while conducting comparisons. */ - public IndexComparator( Comparator keyComp, boolean isForwardMap ) + public IndexComparator( SerializableComparator keyComp, boolean isForwardMap ) { this.keyComp = keyComp; this.isForwardMap = isForwardMap; @@ -56,14 +64,14 @@ * * @return the comparator for comparing keys. */ - public Comparator getKeyComparator() + public SerializableComparator getKeyComparator() { if ( isForwardMap ) { return keyComp; } - return BigIntegerComparator.INSTANCE; + return BIG_INTEGER_COMPARATOR; } @@ -73,11 +81,11 @@ * * @return the binary comparator for comparing values. */ - public Comparator getValueComparator() + public SerializableComparator getValueComparator() { if ( isForwardMap ) { - return BigIntegerComparator.INSTANCE; + return BIG_INTEGER_COMPARATOR; } return keyComp; Modified: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/KeyOnlyComparator.java ============================================================================== --- incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/KeyOnlyComparator.java (original) +++ incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/KeyOnlyComparator.java Wed Oct 27 18:44:02 2004 @@ -18,7 +18,8 @@ import java.io.Serializable; -import java.util.Comparator; + +import org.apache.eve.schema.SerializableComparator; /** @@ -31,7 +32,7 @@ implements TupleComparator, Serializable { /** TODO */ - private Comparator keyComparator = null; + private SerializableComparator keyComparator = null; /** @@ -39,7 +40,7 @@ * * @param comparator TODO */ - public KeyOnlyComparator( Comparator comparator ) + public KeyOnlyComparator( SerializableComparator comparator ) { keyComparator = comparator; } @@ -51,7 +52,7 @@ * * @return the comparator for comparing keys. */ - public Comparator getKeyComparator() + public SerializableComparator getKeyComparator() { return keyComparator; } @@ -63,7 +64,7 @@ * @return TODO * @throws UnsupportedOperationException every time. */ - public Comparator getValueComparator() + public SerializableComparator getValueComparator() { throw new UnsupportedOperationException(); } Modified: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/TupleComparator.java ============================================================================== --- incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/TupleComparator.java (original) +++ incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/TupleComparator.java Wed Oct 27 18:44:02 2004 @@ -17,9 +17,10 @@ package org.apache.eve.db; -import java.util.Comparator; import java.io.Serializable; +import org.apache.eve.schema.SerializableComparator; + /** * Used to compare the sorting order of binary data. @@ -35,7 +36,7 @@ * * @return the comparator for comparing keys. */ - Comparator getKeyComparator(); + SerializableComparator getKeyComparator(); /** @@ -44,7 +45,7 @@ * * @return the binary comparator for comparing values. */ - Comparator getValueComparator(); + SerializableComparator getValueComparator(); /** Modified: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/jdbm/JdbmIndex.java ============================================================================== --- incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/jdbm/JdbmIndex.java (original) +++ incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/jdbm/JdbmIndex.java Wed Oct 27 18:44:02 2004 @@ -21,7 +21,6 @@ import java.io.IOException; import java.math.BigInteger; -import java.util.Comparator; import javax.naming.NamingException; import javax.naming.NamingEnumeration; @@ -32,6 +31,7 @@ import org.apache.eve.db.Index; import org.apache.eve.db.IndexComparator; import org.apache.eve.db.IndexEnumeration; +import org.apache.eve.schema.SerializableComparator; import org.apache.ldap.common.util.LRUMap; import org.apache.ldap.common.schema.AttributeType; @@ -135,7 +135,8 @@ */ private void initTables() throws NamingException { - Comparator comp = attribute.getEquality().getComparator(); + SerializableComparator comp; + comp = new SerializableComparator( attribute.getEquality().getOid() ); /* * The forward key/value map stores attribute values to master table Modified: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/jdbm/JdbmMasterTable.java ============================================================================== --- incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/jdbm/JdbmMasterTable.java (original) +++ incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/jdbm/JdbmMasterTable.java Wed Oct 27 18:44:02 2004 @@ -26,6 +26,7 @@ import org.apache.ldap.common.util.BigIntegerComparator; import org.apache.eve.db.MasterTable; +import org.apache.eve.schema.SerializableComparator; /** @@ -36,6 +37,23 @@ */ public class JdbmMasterTable extends JdbmTable implements MasterTable { + private static final StringComparator STRCOMP = new StringComparator(); + private static final SerializableComparator BIG_INTEGER_COMPARATOR = + new SerializableComparator( "1.2.6.1.4.1.18060.1.1.1.2.2" ) + { + public int compare( Object o1, Object o2 ) + { + return BigIntegerComparator.INSTANCE.compare( o1, o2 ); + } + }; + private static final SerializableComparator STRING_COMPARATOR = + new SerializableComparator( "1.2.6.1.4.1.18060.1.1.1.2.3" ) + { + public int compare( Object o1, Object o2 ) + { + return STRCOMP.compare( o1, o2 ); + } + }; /** */ private JdbmTable adminTbl = null; @@ -49,8 +67,8 @@ public JdbmMasterTable( RecordManager recMan ) throws NamingException { - super( DBF, recMan, new BigIntegerComparator() ); - adminTbl = new JdbmTable( "admin", recMan, new StringComparator() ); + super( DBF, recMan, BIG_INTEGER_COMPARATOR ); + adminTbl = new JdbmTable( "admin", recMan, STRING_COMPARATOR ); String seqValue = ( String ) adminTbl.get( SEQPROP_KEY ); if ( null == seqValue ) Modified: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/jdbm/JdbmTable.java ============================================================================== --- incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/jdbm/JdbmTable.java (original) +++ incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/db/jdbm/JdbmTable.java Wed Oct 27 18:44:02 2004 @@ -21,11 +21,9 @@ import java.util.Iterator; import java.util.SortedSet; import java.util.ArrayList; -import java.util.Comparator; import java.util.Collections; import java.io.IOException; -import java.io.Serializable; import javax.naming.NamingException; import javax.naming.NamingEnumeration; @@ -38,6 +36,7 @@ import org.apache.ldap.common.util.SingletonEnumeration; import org.apache.eve.db.*; +import org.apache.eve.schema.SerializableComparator; /** @@ -88,7 +87,7 @@ throws NamingException { this.name = name; - recMan = manager; + this.recMan = manager; this.comparator = comparator; this.allowsDuplicates = allowsDuplicates; @@ -107,27 +106,6 @@ try { - /* - * The comparator passed to us may not be the effective - * comparator if it is not serializable. In this case a - * SerializableComparator will be the effective comparator. - */ - Comparator keyComparator = comparator.getKeyComparator(); - Comparator effective = null; - - if ( comparator instanceof Serializable ) - { - // Serializable comparators are the effective comparators - effective = keyComparator; - } - else - { - /* - * Non-serializable comparators are not effective comparators - * their wrapping SerializableComparators are effective comps - */ - effective = new SerializableComparator( keyComparator ); - } // // Load existing BTree @@ -135,30 +113,15 @@ if ( recId != 0 ) { - /* - * If we have wrapped a non-Serializable Comparator within a - * SerializingComparator we need to set the non-Serializable - * ThreadLocal Comparator and attempt to deserialize - */ - if ( effective instanceof SerializableComparator ) - { - SerializableComparator.set( keyComparator ); - bt = BTree.load( recMan, recId ); - } - else - { - bt = BTree.load( recMan, recId ); - } - + bt = BTree.load( recMan, recId ); recId = recMan.getNamedObject( name + SZSUFFIX ); count = ( ( Integer ) recMan.fetch( recId ) ).intValue(); } else { - bt = BTree.createInstance( recMan, effective ); + bt = BTree.createInstance( recMan, comparator.getKeyComparator() ); recId = bt.getRecid(); recMan.setNamedObject( name, recId ); - recId = recMan.insert( new Integer( 0 ) ); recMan.setNamedObject( name + SZSUFFIX, recId ); } @@ -182,7 +145,8 @@ * @throws NamingException if the table's file cannot be created */ public JdbmTable( String name, RecordManager manager, - Comparator keyComparator ) throws NamingException + SerializableComparator keyComparator ) + throws NamingException { this( name, false, manager, new KeyOnlyComparator( keyComparator ) ); } @@ -543,22 +507,11 @@ if ( allowsDuplicates ) { - Comparator effective = null; TreeSet set = ( TreeSet ) getRaw( key ); - if ( comparator.getValueComparator() instanceof Serializable ) - { - effective = comparator.getValueComparator(); - } - else - { - effective = new SerializableComparator( - comparator.getValueComparator() ); - } - - if ( null == set ) + if ( null == set ) { - set = new TreeSet( effective ); + set = new TreeSet( comparator.getValueComparator() ); } else if ( set.contains( value ) ) { @@ -590,10 +543,9 @@ throws NamingException { TreeSet set = null; - Comparator effective = null; - + /* - * If we do not allow dupliicates call the single add put using the + * If we do not allow duplicates call the single add put using the * first value in the enumeration if it exists. If it does not we * just return null without doing anything. If more than one value * is in the enumeration than we blow a UnsupportedOperationException. @@ -624,19 +576,10 @@ * if it is we add it and increment the table entry counter. */ set = ( TreeSet ) getRaw( key ); - if ( comparator.getValueComparator() instanceof Serializable ) - { - effective = comparator.getValueComparator(); - } - else - { - effective = new SerializableComparator( - comparator.getValueComparator() ); - } if ( null == set ) { - set = new TreeSet( effective ); + set = new TreeSet( comparator.getValueComparator() ); } while ( values.hasMore() ) @@ -1156,14 +1099,7 @@ } else { - Comparator comparator = this.comparator.getValueComparator(); - if ( ! ( comparator instanceof Serializable ) ) - { - SerializableComparator.set( comparator ); - } - val = bt.find( key ); - SerializableComparator.unset(); } } catch ( IOException e ) Added: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/SerializableComparator.java ============================================================================== --- (empty file) +++ incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/SerializableComparator.java Wed Oct 27 18:44:02 2004 @@ -0,0 +1,94 @@ +/* + * Copyright 2004 The Apache Software Foundation + * + * Licensed 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.eve.schema; + + +import java.util.Comparator; +import java.io.Serializable; +import javax.naming.NamingException; + + +/** + * A serializable wrapper around a Comparator which uses delayed initialization + * of the underlying wrapped comparator which is JIT resolved from a static + * global registry. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Apache Directory Project</a> + * @version $Rev$ + */ +public class SerializableComparator implements Comparator, Serializable +{ + /** the system global Comparator registry */ + private static ComparatorRegistry registry = null; + /** the OID of the matchingRule for this comparator */ + private String matchingRuleOid; + /** the transient wrapped comparator */ + private transient Comparator wrapped; + + + // ------------------------------------------------------------------------ + // S T A T I C M E T H O D S + // ------------------------------------------------------------------------ + + + /** + * Sets the global Comparator registry for comparator lookups. + * + * @param registry the comparator registry to use for Comparator lookups + */ + public static void setRegistry( ComparatorRegistry registry ) + { + SerializableComparator.registry = registry; + } + + + // ------------------------------------------------------------------------ + // C O N T R U C T O R S + // ------------------------------------------------------------------------ + + + public SerializableComparator( String matchingRuleOid ) + { + this.matchingRuleOid = matchingRuleOid; + } + + + // ------------------------------------------------------------------------ + // C O M P A R A T O R I M P L E M E N T A T I O N S + // ------------------------------------------------------------------------ + + + /** + * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) + */ + public int compare( Object o1, Object o2 ) + { + if ( wrapped == null ) + { + try + { + wrapped = registry.lookup( matchingRuleOid ); + } + catch ( NamingException e ) + { + e.printStackTrace(); + } + } + + return wrapped.compare( o1, o2 ); + } +} Modified: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/BootstrapComparatorRegistry.java ============================================================================== --- incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/BootstrapComparatorRegistry.java (original) +++ incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/BootstrapComparatorRegistry.java Wed Oct 27 18:44:02 2004 @@ -20,6 +20,7 @@ import org.apache.eve.schema.ComparatorRegistry; import org.apache.eve.schema.ComparatorRegistryMonitor; import org.apache.eve.schema.ComparatorRegistryMonitorAdapter; +import org.apache.eve.schema.SerializableComparator; import java.util.Map; import java.util.HashMap; @@ -57,6 +58,8 @@ this.oidToSchema = new HashMap(); this.comparators = new HashMap(); this.monitor = new ComparatorRegistryMonitorAdapter(); + + SerializableComparator.setRegistry( this ); } Modified: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/EveComparatorProducer.java ============================================================================== --- incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/EveComparatorProducer.java (original) +++ incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/EveComparatorProducer.java Wed Oct 27 18:44:02 2004 @@ -21,6 +21,8 @@ import javax.naming.NamingException; import org.apache.ldap.common.schema.ComparableComparator; +import org.apache.ldap.common.util.BigIntegerComparator; +import jdbm.helper.StringComparator; @@ -54,6 +56,14 @@ // For exactDnAsStringMatch -> 1.2.6.1.4.1.18060.1.1.1.2.1 comparator = new ComparableComparator(); cb.schemaObjectProduced( this, "1.2.6.1.4.1.18060.1.1.1.2.1", comparator ); + + // For bigIntegerMatch -> 1.2.6.1.4.1.18060.1.1.1.2.2 + comparator = new BigIntegerComparator(); + cb.schemaObjectProduced( this, "1.2.6.1.4.1.18060.1.1.1.2.2", comparator ); + + // For jdbmStringMatch -> 1.2.6.1.4.1.18060.1.1.1.2.3 + comparator = new StringComparator(); + cb.schemaObjectProduced( this, "1.2.6.1.4.1.18060.1.1.1.2.3", comparator ); } } Modified: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/EveMatchingRuleProducer.java ============================================================================== --- incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/EveMatchingRuleProducer.java (original) +++ incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/EveMatchingRuleProducer.java Wed Oct 27 18:44:02 2004 @@ -53,5 +53,14 @@ mrule.setSyntaxOid( "1.3.6.1.4.1.1466.115.121.1.12" ); cb.schemaObjectProduced( this, mrule.getOid(), mrule ); + mrule = new BootstrapMatchingRule( "1.2.6.1.4.1.18060.1.1.1.2.2", registries ); + mrule.setNames( new String[] { "bigIntegerMatch" } ); + mrule.setSyntaxOid( "1.3.6.1.4.1.1466.115.121.1.27" ); + cb.schemaObjectProduced( this, mrule.getOid(), mrule ); + + mrule = new BootstrapMatchingRule( "1.2.6.1.4.1.18060.1.1.1.2.3", registries ); + mrule.setNames( new String[] { "jdbmStringMatch" } ); + mrule.setSyntaxOid( "1.3.6.1.4.1.1466.115.121.1.15" ); + cb.schemaObjectProduced( this, mrule.getOid(), mrule ); } } Modified: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/EveNormalizerProducer.java ============================================================================== --- incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/EveNormalizerProducer.java (original) +++ incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/EveNormalizerProducer.java Wed Oct 27 18:44:02 2004 @@ -55,5 +55,13 @@ normalizer = new NoOpNormalizer(); cb.schemaObjectProduced( this, "1.2.6.1.4.1.18060.1.1.1.2.1", normalizer ); + // For bigIntegerMatch -> 1.2.6.1.4.1.18060.1.1.1.2.2 + normalizer = new NoOpNormalizer(); + cb.schemaObjectProduced( this, "1.2.6.1.4.1.18060.1.1.1.2.2", normalizer ); + + // For jdbmStringMatch -> 1.2.6.1.4.1.18060.1.1.1.2.3 + normalizer = new NoOpNormalizer(); + cb.schemaObjectProduced( this, "1.2.6.1.4.1.18060.1.1.1.2.3", normalizer ); + } } Modified: incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/SystemComparatorProducer.java ============================================================================== --- incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/SystemComparatorProducer.java (original) +++ incubator/directory/eve/trunk/backend/core/src/java/org/apache/eve/schema/bootstrap/SystemComparatorProducer.java Wed Oct 27 18:44:02 2004 @@ -49,8 +49,8 @@ ( 2.5.13.0 NAME 'objectIdentifierMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 ) */ - comparator = new ComparableComparator(); - cb.schemaObjectProduced( this, "2.5.13.0", comparator ); + comparator = new ComparableComparator(); + cb.schemaObjectProduced( this, "2.5.13.0", comparator ); /* ( 2.5.13.1 NAME 'distinguishedNameMatch'
