##################################################################
## 
## 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.
##
##################################################################

## Template to create the Java class representing an ODF element
##
## Documentation of template development can be found in local file
## TemplateHelp.html.
##
#set ($element = ${model.getElement($context)})
#set ($oldelement = ${oldmodel.getElement($context)})
#set ($NS = ${element.getNamespace()})
#set ($classname = "${model.camelCase($element.getLocalName())}Element")
##
## Set child element and child attributes
#set ($children = ${element.getChildElements().withoutMultiples()})
#set ($attributes = ${element.getAttributes().withoutMultiples()})
##
#set ($baseclassname = "OdfElement")
#set ($baseHasMandatoryAttr = false)
##
## Test if this element has mandatory (non optional) attributes
#set ($hasMandatoryAttr = false)
#foreach ($attribute in $attributes)
#if (${element.isMandatory($attribute)})
#set ($hasMandatoryAttr = true)
#set ($mandatoryAttr = $attribute)
#end
#end
##
## Begin Code
#include('copyright.txt')
/*
 * This file is automatically generated.
 * Don't edit manually.
 */
package org.odftoolkit.odfdom.pkg.manifest;

##
## ---------------------------------------------------
##  Imports
## ---------------------------------------------------
##
import org.odftoolkit.odfdom.pkg.OdfElement;
import org.odftoolkit.odfdom.pkg.OdfFileDom;
import org.odftoolkit.odfdom.pkg.OdfName;
import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;

##
#foreach ($child in $attributes)
#if ($child == "*")
#set ($anyattribute = true)
#else
#set ($childNS = ${child.getNamespace()})
#set ($childClassname = "${model.camelCase($child.getLocalName())}Attribute")
#if (!$childNS.equals("manifest")) ## Do not generate "import" for the same package!
import org.odftoolkit.odfdom.pkg.${childNS}.$childClassname;
#end
#end
#end
##
## If there is a base class which is not in the current package
#if ($baseimport)
import ${baseimport};
#end

##
## ---------------------------------------------------
##  Class
## ---------------------------------------------------
##
/**
 * Manifest implementation of OpenDocument element  {@odf.element ${context}}.
 *
#if ($anychild)
 * This class can have any org.w3c.dom.Element child element.
#end
#if ($anyattribute)
 * This class can have any org.w3c.dom.Attribute attribute.
#end
 */
public class $classname extends $baseclassname {

	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfPackageNamespace.${NS.toUpperCase()}, "${element.getLocalName()}");

	/**
	 * Create the instance of <code>$classname</code>
	 *
	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
	 */
	public $classname(OdfFileDom ownerDoc) {
		super(ownerDoc, ELEMENT_NAME);
	}

	/**
	 * Get the element name
	 *
	 * @return  return   <code>OdfName</code> the name of element {@odf.element ${context}}.
	 */
    @Override
	public OdfName getOdfName() {
		return ELEMENT_NAME;
	}
##
## ---------------------------------------------------
##  Add init method if this element or the base
##  element has mandatory attributes
##  TODO: NO caller use this method.
## ---------------------------------------------------
##
## ---------------------------------------------------
##  Attribute getters and setters
## ---------------------------------------------------
##
#foreach ($attr in $attributes)
#set($attri = ${model.getAttribute($attr.getQName())})
#set ($valueObject = "String")
#set ($simpleValue = "")
#set ($dataTypes = ${attri.getDatatypes().withoutMultiples()})
#set ($valueTypes = ${javamodel.getValuetypes($dataTypes)})
#foreach ($valueType in $valueTypes)
#set ($valueObject = $valueType)
#end
## use attri get all of the values.
#set($values = ${attri.getValues().withoutMultiples()})
#if ($values.size() ==2 && $dataTypes.size()==0)
#set ($trueFlag = false)
#set ($falseFlag = false)
#foreach ($value in $values)
#if ($value==true)
#set ($trueFlag = true)
#end
#if ($value==false)
#set ($falseFlag = true)
#end
#end
#if ($trueFlag and $falseFlag)
#set ($hasdatatype = true)
#set ($valueObject = "Boolean")
#end
#end
#if ($valueObject != "String" && $valueObject != "Double" && $valueObject != "Integer" && $valueObject != "Boolean")
#set ($valueObject = "String")
#end
#if ($valueObject != "String")
#set ($simpleValue = ${javamodel.getPrimitiveType($valueObject)})
#end
#if ($attr != "*")
#set ($attribute = ${attr.withMultiples()})
#set ($aNS = ${attribute.getNamespace()})
#set ($aClassname = "${model.camelCase($attribute.getLocalName())}Attribute")
#set ($aParam = "${model.javaCase($attribute.getLocalName())}Value")

	/**
	 * Receives the value of the ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
	 *
#if (${element.isMandatory($attribute)})
	 * Attribute is mandatory.
	 *
#end
	 * @return - the <code>$valueObject</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
	 */
	public $valueObject get${aClassname}() {
		$aClassname attr = ($aClassname) getOdfAttribute(OdfPackageNamespace.${aNS.toUpperCase()}, "${attribute.getLocalName()}");
		if (attr != null) {
#if ($simpleValue!="")
			return ${valueObject}.valueOf(attr.${simpleValue}Value());
#else
			return ${valueObject}.valueOf(attr.getValue());
#end
		}
#if ($odfmodel.getDefaultAttributeValue($attribute, $element))
#set ($defaultValue = ${model.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $element))})
#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
#if ($defaultValueSet.size()>1)
#set ($constant = $model.constantCase($defaultValue))
#if ($valueObject == "String")
		return ${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)};
#else
		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)});
#end
#else
#if ($valueObject == "String")
		return ${aClassname}.DEFAULT_VALUE;
#else
		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE);
#end
#end
#else
		return null;
#end
	}

	/**
	 * Sets the value of ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
	 *
	 * @param $aParam   The type is <code>$valueObject</code>
	 */
	public void set${aClassname}($valueObject $aParam) {
		$aClassname attr = new ${aClassname}((OdfFileDom) this.ownerDocument);
		setOdfAttribute(attr);
#if ($valueObject == "String")
		attr.setValue($aParam);
#else
		attr.set${model.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
#end
	}
#end
#end

##
## ---------------------------------------------------
##  Methods for child element creation
## ---------------------------------------------------
##
#foreach($ch in $children)
#if ($ch != "*")
#set ($child = ${ch.withMultiples()})
#set ($cClassname = "${model.camelCase($child.getLocalName())}Element")
#set ($cVar = ${model.javaCase($child)})
#set ($ch_attributes = ${child.getAttributes().withoutMultiples()})
##set has parameter flag
#set ($hasParams = false)
#foreach ($ch_attribute in $ch_attributes)
#if (${child.isMandatory($ch_attribute)})
#set ($hasParams = true)
#end
#end
#if ($hasParams)
	/**
	 * Create child element {@odf.element ${child}}.
	 *
#set ($seperateFlag="")
#set ($params="")
#foreach ($ch_attr in $ch_attributes)
#if (${child.isMandatory($ch_attr)})
#set($ch_attri = ${model.getAttribute($ch_attr.getQName())})
#set ($ch_ValueObject = "String")
#set ($ch_SimpleValue = "")
#set ($ch_DataTypes = ${ch_attri.getDatatypes().withoutMultiples()})
#set ($ch_ValueTypes = ${javamodel.getValuetypes($ch_DataTypes)})
#foreach ($ch_ValueType in $ch_ValueTypes)
#set ($ch_ValueObject = $ch_ValueType)
#end
## use ch_attri get all of the values.
#set($ch_Values = ${ch_attri.getValues().withoutMultiples()})
#if ($ch_Values.size() ==2 && $ch_DataTypes.size()==0)
#set ($trueFlag = false)
#set ($falseFlag = false)
#foreach ($ch_Value in $ch_Values)
#if ($ch_Value==true)
#set ($trueFlag = true)
#end
#if ($ch_Value==false)
#set ($falseFlag = true)
#end
#end
#if ($trueFlag and $falseFlag)
#set ($ch_Hasdatatype = true)
#set ($ch_ValueObject = "Boolean")
#end
#end
#if ($ch_ValueObject != "String" && $ch_ValueObject != "Double" && $ch_ValueObject != "Integer" && $ch_ValueObject != "Boolean")
#set ($ch_ValueObject = "String")
#end
#if ($ch_ValueObject != "String")
#set ($ch_SimpleValue = ${javamodel.getPrimitiveType($ch_ValueObject)})
#end
#if ($ch_attr != "*")
#set ($attribute = ${ch_attr.withMultiples()})
#set ($aNS = ${attribute.getNamespace()})
#set ($aClassname = "${model.camelCase($attribute.getLocalName())}Attribute")
#set ($aParam = "${model.javaCase($attribute.getLocalName())}Value")
	 * @param $aParam  the <code>$ch_ValueObject</code> value of <code>$aClassname</code>, see {@odf.attribute  ${attribute.getQName()}} at specification
#if ($ch_SimpleValue!="")
#set ($params="${params}${seperateFlag}${ch_SimpleValue} ${aParam}")
#else
#set ($params="${params}${seperateFlag}${ch_ValueObject} ${aParam}")
#end
#set ($seperateFlag=", ")
#end
#end
#end
## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
## but we can compare by name
#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
	 * Child element is new in Odf 1.2
	 *
#end
#if (${element.isMandatory($child)})
	 * Child element is mandatory.
	 *
#end
	 * @return the element {@odf.element ${child}}
	 */
	 public $cClassname new${cClassname}($params) {
		$cClassname $cVar = ((OdfFileDom) this.ownerDocument).newOdfElement(${cClassname}.class);
#foreach ($ch_attr in $ch_attributes)
#if ($ch_attr != "*" && ${child.isMandatory($ch_attr)})
#set ($aClassname = "${model.camelCase($ch_attr.getLocalName())}Attribute")
#set ($aParam = "${model.javaCase($ch_attr.getLocalName())}Value")
		${cVar}.set$aClassname($aParam);
#end
#end
		this.appendChild($cVar);
		return $cVar;
	}

#else
	/**
	 * Create child element {@odf.element ${child}}.
	 *
## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
## but we can compare by name
#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
	 * Child element is new in Odf 1.2
	 *
#end
#if (${element.isMandatory($child)})
	 * Child element is mandatory.
	 *
#end
	 * @return the element {@odf.element ${child}}
	 */
	public $cClassname new${cClassname}() {
		$cClassname $cVar = ((OdfFileDom) this.ownerDocument).newOdfElement(${cClassname}.class);
		this.appendChild($cVar);
		return $cVar;
	}

#end
#end
#end
##
## -----------------------------------------------------
##  New: newTextNode
## -----------------------------------------------------
##
#if ($element.canHaveText())
	/**
	 * Add text content. Only elements which are allowed to have text content offer this method.
	 */
	 public void newTextNode(String content) {
		if (content != null && !content.isEmpty()) {
			this.appendChild(this.getOwnerDocument().createTextNode(content));
		}
	 }
#end
}
