/*******************************************************************************
 * Copyright (c) 2001, 2008 Oracle Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.common.internal.policy;

import java.util.List;

/**
 * Provides a list of order, enablement-modifiable objects.
 * 
 * @author cbateman
 * 
 */
public abstract class OrderedListProvider
{
    private List<OrderableObject> _orderableObjects;

    /**
     * 
     * @return the list of ordered objects
     */
    public final List<OrderableObject> getOrderedObjects()
    {
        if (_orderableObjects == null)
        {
            _orderableObjects = createAndPopulateOrderedObjects();
        }
        return _orderableObjects;
    }
    
    /**
     * <p>Clears the orderableObjects collection so that the next call
     * of getOrderedObjects() </p>
     */
    public final void resetOrderedObjects()
    {
        _orderableObjects = null;
    }

    /**
     * Move the object one toward the front of the list
     * 
     * @param object
     */
    public final void moveUp(final OrderableObject object)
    {
        final List<OrderableObject>     list = getOrderedObjects();
        final int index = list.indexOf(object);
        if (index > 0)
        {
            OrderableObject item = list.remove(index);
            list.add(index - 1, item);
        }
    }

    /**
     * Move the object one toward the end
     * @param object
     */
    public final void moveDown(final OrderableObject object)
    {
        final List<OrderableObject>     list = getOrderedObjects();
        int index = list.indexOf(object);
        if (index < list.size() - 1)
        {
            OrderableObject item = list.remove(index);
            list.add(index + 1, item);
        }
    }

    /**
     * @return a new list orderable objects populate in their initial order
     * The list must be modifiable.
     */
    protected abstract List<OrderableObject> createAndPopulateOrderedObjects();

    /**
     * Proxy object for ordering in list
     * 
     * @author cbateman
     * 
     */
    public static class OrderableObject implements Cloneable
    {
        private boolean _enabled;
        private Object  _object;

        /**
         * @param object
         * @param enabled
         */
        public OrderableObject(final Object object, final boolean enabled)
        {
            _object = object;
            _enabled = enabled;
        }

        private OrderableObject(final OrderableObject copyMe)
        {
            _object = copyMe._object;
            _enabled = copyMe._enabled;
        }

        /**
         * @return true if this object is enabled
         */
        public boolean isEnabled()
        {
            return _enabled;
        }

        /**
         * @param enabled
         */
        public void setEnabled(boolean enabled)
        {
            _enabled = enabled;
        }

        /**
         * @return the object in the ordered list
         */
        public Object getObject()
        {
            return _object;
        }

        /**
         * @param object
         */
        public void setObject(Object object)
        {
            _object = object;
        }

        @Override
        public OrderableObject clone()
        {
            return new OrderableObject(this);
        }

        @Override
        public boolean equals(Object obj)
        {
            if (obj instanceof OrderableObject)
            {
                if (_enabled == ((OrderableObject)obj)._enabled)
                {
                    Object other = ((OrderableObject)obj)._object;
                    if (other != null)
                    {
                        return other.equals(_object);
                    }
                    return _object == null;
                }
            }
            return false;
        }

        @Override
        public int hashCode()
        {
            int enabledCode = _enabled ? 0xcccccccc : 0x33333333;
            if (_object == null)
            {
                return enabledCode;
            }
            return _object.hashCode() ^ enabledCode;
        }
    }
}
