## 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
}
