package org.eclipse.jst.jsf.common.runtime.internal.model.component;

import java.util.List;

import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IValueHolderInfo;
import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;

/**
 * A design-time analog for the UIOutput
 * 
 * @author cbateman
 *
 */
public class UIOutputInfo extends ComponentInfo implements IValueHolderInfo {
    /**
     * serializable uid
     */
    private static final long serialVersionUID = 9096297578991706150L;

    /**
     * the value
     */
    protected final Object _value;
    /**
     * the value before any EL evaluation
     */
    protected final Object _localValue;

    /**
     * @param id
     * @param parent
     * @param typeInfo
     * @param valueHolderInfo
     * @param isRendered
     */
    protected UIOutputInfo(final String id, final ComponentInfo parent,
            final ComponentTypeInfo typeInfo,
            final IValueHolderInfo valueHolderInfo, final boolean isRendered) {
        super(id, parent, typeInfo, isRendered);

        if (valueHolderInfo == null) {
            _value = null;
            _localValue = null;
        } else {
            _value = valueHolderInfo.getValue();
            _localValue = valueHolderInfo.getLocalValue();

            final ConverterDecorator converter = valueHolderInfo.getConverter();
            if (converter != null) {
                addDecorator(converter, ComponentFactory.CONVERTER);
            }
        }
    }

    public String toString() {
        return super.toString() + ", isRendered=" + _isRendered;
    }

    // @Override
    public String getMostSpecificComponentName() {
        return "UIOutput";
    }

    public final ConverterDecorator getConverter() {
        // should only be a single converter decorator...
        // so on this interface we'll return the first one if present.
        // to do things like error checking, use the getDecorator
        final List converters = getDecorators(ComponentFactory.CONVERTER);

        if (converters.size() > 0) {
            return (ConverterDecorator) converters.get(0);
        }

        return null;
    }

    public final Object getLocalValue() {
        return _localValue;
    }

    public final Object getValue() {
        return _value;
    }
}