## Velocity template used to generate JSF1.2-compatible component classes
## from component meta-data.
##
## Note that there are two types of component generation:
##  * "subclass mode" (use annotated class as a parent class)
##  * "template mode" (use annotated class as a template)
## This template file is used for both.
##
## Variable $component refers to a ComponentMeta object to process
## Variable $utils refers to an instance of MyfacesUtils.
##
## When "template mode" is being used then variable $innersource
## holds a String containing all the non-abstract functions defined
## in the annotated class.
##
## The java package of the generated class is always the same as
## the package in which the annotated class exists.
##
/*
 *  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 ${component.packageName};

import javax.el.ValueExpression;
import javax.faces.context.FacesContext;
import javax.faces.component.PartialStateHolder;
import javax.faces.component.StateHolder;
import org.apache.myfaces.component.AttachedDeltaWrapper;
$utils.importTagClasses($component)

#if ($component.isTemplate())
#set ($generatedClassParent = $component.sourceClassParentClassName)
#else
#set ($generatedClassParent = $component.sourceClassName)
#end
// Generated from class ${component.sourceClassName}.
//
// WARNING: This file was automatically generated. Do not edit it directly,
//          or you will lose your changes.
public class ${utils.getClassFromFullClass($component.className)} extends $generatedClassParent
#if ($component.implements)
    implements $component.implements
#end
{
#if ($component.serialuid)
    private static final long serialVersionUID = ${component.serialuid}; 
#end  

    static public final String COMPONENT_FAMILY =
        "$component.family";
    static public final String COMPONENT_TYPE =
        "$component.type";
#if ($component.rendererType)
#if (!($component.rendererType == ""))
    static public final String DEFAULT_RENDERER_TYPE = 
        "$component.rendererType";
#end
#end

#if ($innersource)
    //BEGIN CODE COPIED FROM $component.sourceClassName 
$innersource
    //END CODE COPIED FROM $component.sourceClassName
#end

    public ${utils.getClassFromFullClass($component.className)}()
    {
#if ($component.rendererType)
#if ($component.rendererType == "")
        setRendererType(null);
#else
        setRendererType("$component.rendererType");
#end
#else
        setRendererType(null);
#end
    }

## On myfaces 1.1 the family is inherited, so this could be commented
## On other this should not be commented    
    public String getFamily()
    {
        return COMPONENT_FAMILY;
    }

## Iterate over full component property list
#set ($propertyList = ${component.propertyList})

## TODO: this condition should be checked for parent components
## and csv implements
#if ($component.isClientBehaviorHolder())
#if ($component.isOverrideEventNames())
    static private final java.util.Collection<String> CLIENT_EVENTS_LIST = 
        java.util.Collections.unmodifiableCollection(
            java.util.Arrays.asList(
#set ($commavar = "")
#foreach( $property in $propertyList )
#if ($property.clientEvent)
#if ($property.clientEvent != "")
            $commavar "$property.clientEvent"
#set ($commavar = ",")            
#end
#end
#end
        ));

    public java.util.Collection<String> getEventNames()
    {
        return CLIENT_EVENTS_LIST;
    }
#end
#end
#if ($component.defaultEventName)
#if ($component.isOverrideDefaultEventName())

    //ClientBehaviorHolder default: $component.defaultEventName
    public String getDefaultEventName()
    {
        return "$component.defaultEventName";
    }
#end
#end

#set ($propertyList = ${component.propertyComponentList})
    
#foreach( $property in $propertyList )
#set ($field = $property.fieldName)
#set ($type = $utils.getClassFromFullClass($property.className))
#if($utils.getDefaultValueField($property)) 
#set ($defaultValue = $utils.getDefaultValueField($property))
#else
#set ($defaultValue = false)
#end
    // Property: $property.name
#if ($property.isPartialStateHolder())
#if ($property.isLiteralOnly() || $property.isTagExcluded() )
    private $type $field #if($defaultValue) = $defaultValue;#{else};#{end}

     
#else
    private $type $field;
    
#end

    private boolean _$utils.getPrefixedPropertyName("isSet", $property.name)()
    {
        Boolean value = (Boolean) getStateHelper().get(PropertyKeys.${property.name}Set);
        return value == null ? false : value;
    }

#if($utils.isPrimitiveClass($type) && !$property.isTagExcluded()
    && !$property.isLiteralOnly() )
    private boolean ${field}Set;
    
#if ($property.isSetMethod())
    $property.setMethodScope boolean $utils.getPrefixedPropertyName("isSet", $property.name)()
    {
        return ${field}Set;
    }
#end
#end
#if($property.isLocalMethod())
#if("boolean" == $type)
#set ($methodName = $utils.getPrefixedPropertyName("isLocal", $property.name))
#else
#set ($methodName = $utils.getPrefixedPropertyName("getLocal", $property.name))
#end
    final $property.localMethodScope $type ${methodName}()
    {
        return $field;
    }
     
#end
    public $type $utils.getMethodReaderFromProperty($property.name, $type)()
    {
#if ($property.isTagExcluded() || $property.isLiteralOnly())
        return $field;
#else
#if ($utils.isPrimitiveClass($type))
        if (${field}Set)
#else
        if ($field != null)
#end
        {
            return $field;
        }
        ValueExpression vb = getValueExpression("$property.name");
        if (vb != null)
        {
#if ($utils.isPrimitiveClass($type))
            return ($utils.castIfNecessary($type) vb.getValue(getFacesContext().getELContext())).${type}Value();
#else
#set ($pritype = $utils.getPrimitiveType($property.className))
#if ($utils.isPrimitiveClass($pritype))
            Object value = vb == null ? null : vb.getValue(getFacesContext().getELContext());
            if (!(value instanceof $type)){
                value = ${type}.valueOf(value.toString());
            }            
            return $utils.castIfNecessary($type) value;
#else
            return $utils.castIfNecessary($type) vb.getValue(getFacesContext().getELContext());
#end
#end
        }
#if ($defaultValue)
        return $defaultValue; 
#elseif ($utils.isPrimitiveClass($type))
        return $utils.primitiveDefaultValue($type);
#else       
        return null;
#end
#end
    }

    public void $utils.getPrefixedPropertyName("set", $property.name)($type $utils.getVariableFromName($property.name))
    {
        this.$field = $utils.getVariableFromName($property.name);
        if (initialStateMarked())
        {
            getStateHelper().put(PropertyKeys.${property.name}Set,Boolean.TRUE);
        }
#if ($utils.isPrimitiveClass($type) && !$property.isTagExcluded() )
        this.${field}Set = true;        
#end
    }
#else
## StateHelper aware property
#if ($property.name == "for")
## To keep compatibility with RI, we should call it forVal
#set ($field = "forVal")
#else
#set ($field = $property.name)
#end
#if ($property.isSetMethod())
    $property.setMethodScope boolean $utils.getPrefixedPropertyName("isSet", $property.name)()
    {
        return getStateHelper().get(PropertyKeys.$field) != null;
    }
#end
#if($property.isLocalMethod())
#if("boolean" == $type)
#set ($methodName = $utils.getPrefixedPropertyName("isLocal", $property.name))
#else
#set ($methodName = $utils.getPrefixedPropertyName("getLocal", $property.name))
#end
    final $property.localMethodScope $type ${methodName}()
    {
        return $utils.castIfNecessary($type) getStateHelper().get(PropertyKeys.$field);
    }
     
#end
    public $type $utils.getMethodReaderFromProperty($property.name, $type)()
    {
#if ($property.isLiteralOnly())
#if ($defaultValue)
        Object value = getStateHelper().get(PropertyKeys.$field);
        if (value != null)
        {
            return $utils.castIfNecessary($type) value;        
        }
        return $defaultValue;        
#elseif ($utils.isPrimitiveClass($type))
        Object value = getStateHelper().get(PropertyKeys.$field);
        if (value != null)
        {
            return $utils.castIfNecessary($type) value;        
        }
        return $utils.primitiveDefaultValue($type);
#else
        return $utils.castIfNecessary($type) getStateHelper().get(PropertyKeys.$field);        
#end
#else
#if ($defaultValue)
        return $utils.castIfNecessary($type) getStateHelper().eval(PropertyKeys.$field, $defaultValue);
#elseif ($utils.isPrimitiveClass($type))
        Object value = $utils.castIfNecessary($type) getStateHelper().eval(PropertyKeys.$field);
        if (value != null)
        {
            return $utils.castIfNecessary($type) value;        
        }
        return $utils.primitiveDefaultValue($type);
#else
        return $utils.castIfNecessary($type) getStateHelper().eval(PropertyKeys.$field);
#end
#end
    }
    
    public void $utils.getPrefixedPropertyName("set", $property.name)($type $utils.getVariableFromName($property.name))
    {
        getStateHelper().put(PropertyKeys.$field, $utils.getVariableFromName($property.name) ); 
    }    
#end
#end

    protected enum PropertyKeys
    {
#set ($comma = "")
#set ($addc = "false")
#foreach( $property in $propertyList )
#if ($property.name == "for")
#set ($addc = "true")
## To keep compatibility with RI, we should call it forVal
#set ($field = "forVal")
#else
#set ($field = $property.name)
#end
#set ($type = $utils.getClassFromFullClass($property.className))
#if($utils.getDefaultValueField($property)) 
#set ($defaultValue = $utils.getDefaultValueField($property))
#else
#set ($defaultValue = false)
#end
#if ($property.name == "for")
        $comma $field("for")
#else
#if ($property.isPartialStateHolder())
        $comma ${field}Set
#else
        $comma $field
#end
#end
#set($comma = ",")
#end
#if ("true" == $addc)
        ;
        String c;
        
        PropertyKeys()
        {
        }
        
        //Constructor needed by "for" property
        PropertyKeys(String c)
        { 
            this.c = c;
        }
        
        public String toString()
        {
            return ((this.c != null) ? this.c : super.toString());
        }
#end
    }

#set ($primitiveCount = 1) ## $propertyList.size() + 1 
#foreach( $property in $propertyList )
#if ($property.isPartialStateHolder())
#set ($primitiveCount = $primitiveCount + 1)
#if($utils.isPrimitiveClass($property.className))
#set ($primitiveCount = $primitiveCount + 1)
#end
#end
#end
## saveState and restoreState methods only has sense if we have properties
## that does not use StateHelper class.
#if ($primitiveCount > 1)

    public void markInitialState()
    {
        super.markInitialState();
#foreach( $property in $propertyList )
#set ($field = $property.fieldName)
#if ($property.isPartialStateHolder())        
        if ($field != null && 
            $field instanceof PartialStateHolder)
        {
            ((PartialStateHolder)$field).markInitialState();
        }
#end
#end
    }
    
    public void clearInitialState()
    {
        if (initialStateMarked())
        {
            super.clearInitialState();
#foreach( $property in $propertyList )
#set ($field = $property.fieldName)
#if ($property.isPartialStateHolder())
##          //Only has sense propagate this method if is initialStateMarked
            if ($field != null && 
                $field instanceof PartialStateHolder)
            {
                ((PartialStateHolder)$field).clearInitialState();
            }
#end
#end
        }
    }

    @Override
    public Object saveState(FacesContext facesContext)
    {
        if (initialStateMarked())
        {
            boolean nullDelta = true;
            Object parentSaved = super.saveState(facesContext);
#set ($arrayIndex = 0)
#foreach( $property in $propertyList )
#set ($field = $property.fieldName)
#set ($type = $property.className)
#if ($property.isPartialStateHolder())
#set ($arrayIndex = $arrayIndex + 1)
            Object ${property.name}Saved = null;
            if (!_$utils.getPrefixedPropertyName("isSet", $property.name)() &&
                $field != null && $field instanceof PartialStateHolder)
            {
                //Delta
                StateHolder holder = (StateHolder) $field;
                if (!holder.isTransient())
                {
                    Object attachedState = holder.saveState(facesContext);
                    if (attachedState != null)
                    {
                        nullDelta = false;
                    }
                    ${property.name}Saved = new AttachedDeltaWrapper(${field}.getClass(),
                        attachedState);
                }
            }
            else if (_$utils.getPrefixedPropertyName("isSet", $property.name)() || $field != null )
            {
                //Full
                ${property.name}Saved = saveAttachedState(facesContext,$field);
                nullDelta = false;
            }        
## StateHelper Properties does not need save and restore
#end
#end
            if (parentSaved == null && nullDelta)
            {
                //No values
                return null;
            }
            
            Object[] values = new Object[$primitiveCount];
            values[0] = parentSaved;
## Save full state
#set ($arrayIndex = 0)
#foreach( $property in $propertyList )
#set ($field = $property.fieldName)
#set ($type = $property.className)
#if ($property.isPartialStateHolder())
#set ($arrayIndex = $arrayIndex + 1)
            values[$arrayIndex] = ${property.name}Saved;
## StateHelper Properties does not need save and restore
#end
#end
            return values;
        }
        else
        {
            Object[] values = new Object[$primitiveCount];
            values[0] = super.saveState(facesContext);
## Save full state
#set ($arrayIndex = 0)
#foreach( $property in $propertyList )
#set ($field = $property.fieldName)
#set ($type = $property.className)
#if ($property.isPartialStateHolder())
#set ($arrayIndex = $arrayIndex + 1)
            values[$arrayIndex] = saveAttachedState(facesContext,$field);
## StateHelper Properties does not need save and restore
#end
#end
            return values;
        }
    }

    @Override
    public void restoreState(FacesContext facesContext, Object state)
    {
        if (state == null)
        {
            return;
        }
        
        Object[] values = (Object[])state;
        super.restoreState(facesContext,values[0]);
#set ($arrayIndex = 0)
#foreach( $property in $propertyList )
#set ($field = $property.fieldName)
#set ($type = $property.className)
#if ($property.isPartialStateHolder())
#set ($arrayIndex = $arrayIndex + 1)
        if (values[$arrayIndex] instanceof AttachedDeltaWrapper)
        {
            //Delta
            ((StateHolder)$field).restoreState(facesContext, ((AttachedDeltaWrapper) values[$arrayIndex]).getWrappedStateObject());
        }
        else
        {
            //Full
            $field = $utils.castIfNecessary($type) restoreAttachedState(facesContext,values[$arrayIndex]);
        }         
#else
## StateHelper Properties does not need save and restore
#end
#end
    }
#end
}
