/*
 *  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.mavibot.btree.serializer;


import java.lang.reflect.Array;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Comparator;


/**
 * An abstract ElementSerializer that implements comon methods
 * 
 * @param <T> The type for the element to serialize and compare
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public abstract class AbstractElementSerializer<T> implements ElementSerializer<T>
{
    /** The associated comparator */
    private final Comparator<T> comparator;

    /** The type which is being serialized */
    private Class<?> type;


    /**
     * Create a new instance of Serializer
     */
    public AbstractElementSerializer( Comparator<T> comparator )
    {
        this.comparator = comparator;

        // We will extract the Type to use for values, using the serializer for that
        Class<?> valueSerializerClass = comparator.getClass();
        Type[] types = valueSerializerClass.getGenericInterfaces();

        if ( types[0] instanceof Class )
        {
            type = ( Class<?> ) types[0];
        }
        else
        {
            Type[] argumentTypes = ( ( ParameterizedType ) types[0] ).getActualTypeArguments();

            if ( ( argumentTypes != null ) && ( argumentTypes.length > 0 ) )
            {
                if ( argumentTypes[0] instanceof Class<?> )
                {
                    type = ( Class<?> ) argumentTypes[0];
                }
                else if ( argumentTypes[0] instanceof GenericArrayType )
                {
                    Class<?> clazz = ( Class<?> ) ( ( GenericArrayType ) argumentTypes[0] ).getGenericComponentType();

                    type = Array.newInstance( clazz, 0 ).getClass();
                }
            }
        }
    }


    /**
     * {@inheritDoc}
     */
    public int compare( T type1, T type2 )
    {
        return comparator.compare( type1, type2 );
    }


    /**
     * {@inheritDoc}
     */
    @Override
    public Comparator<T> getComparator()
    {
        return comparator;
    }


    /**
     * {@inheritDoc}
     */
    @Override
    public Class<?> getType()
    {
        return type;
    }
}
