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.shared.ldap.schema.comparators;
021    
022    
023    import java.util.Comparator;
024    
025    import org.apache.directory.shared.i18n.I18n;
026    import org.apache.directory.shared.ldap.exception.LdapException;
027    import org.apache.directory.shared.ldap.schema.LdapComparator;
028    import org.apache.directory.shared.ldap.schema.SchemaManager;
029    
030    
031    /**
032     * A serializable wrapper around a Comparator which uses delayed initialization
033     * of the underlying wrapped comparator which is JIT resolved from a static
034     * global registry.
035     *
036     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
037     * @version $Rev: 923524 $
038     */
039    public class SerializableComparator<E> extends LdapComparator<E>
040    {
041        private static final long serialVersionUID = 3257566226288162870L;
042    
043        /** the OID of the matchingRule for this comparator */
044        private String matchingRuleOid;
045        
046        /** the transient wrapped comparator */
047        private transient Comparator<E> wrapped;
048    
049        /** A reference to the schema manager */ 
050        private transient SchemaManager schemaManager;
051        
052        // ------------------------------------------------------------------------
053        // C O N T R U C T O R S
054        // ------------------------------------------------------------------------
055        public SerializableComparator( String matchingRuleOid )
056        {
057            super( matchingRuleOid );
058            this.matchingRuleOid = matchingRuleOid;
059        }
060    
061    
062        // ------------------------------------------------------------------------
063        // 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
064        // ------------------------------------------------------------------------
065    
066        /**
067         * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
068         */
069        @SuppressWarnings("unchecked")
070        public int compare( E o1, E o2 )
071        {
072            if ( wrapped == null )
073            {
074                try
075                {
076                    wrapped = (Comparator<E>)schemaManager.lookupComparatorRegistry( matchingRuleOid );
077                }
078                catch ( LdapException e )
079                {
080                    throw new RuntimeException( I18n.err( I18n.ERR_04221, matchingRuleOid ) );
081                }
082            }
083    
084            return wrapped.compare( o1, o2 );
085        }
086    
087    
088        /**
089         * @param schemaManager the schemaManager to set
090         */
091        public void setSchemaManager( SchemaManager schemaManager )
092        {
093            if ( wrapped == null )
094            {
095                try
096                {
097                    wrapped = (Comparator<E>)schemaManager.lookupComparatorRegistry( matchingRuleOid );
098                }
099                catch ( LdapException ne )
100                {
101                    // Not found : get the default comparator
102                    wrapped = (Comparator<E>)new ComparableComparator<Comparable<E>>( matchingRuleOid );
103                }
104            }
105    
106            ((LdapComparator<E>)wrapped).setSchemaManager( schemaManager );
107            super.setSchemaManager( schemaManager );
108        }
109    }