##################################################################
## 
## 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 manifest element
##
## Documentation of template development can be found in local file
## TemplateHelp.html.
##
#set ($element = ${manifestmodel.getElement($context)})
#set ($oldelement = ${oldmodel.getElement($context)})
###set ($NS = ${element.getNamespace()})
#set ($classname = "${manifestmodel.camelCase($element)}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;
##
## ---------------------------------------------------
##  Class
## ---------------------------------------------------
##
/**
 * Manifest implementation of OpenDocument element  {@odf.element manifest:${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("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:${element}");

	/**
	 * 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 manifest:${context}}.
	 */
	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 = ${manifestmodel.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 = "${manifestmodel.camelCase($attribute)}Attribute")
#set ($aParam = "${manifestmodel.javaCase($attribute)}Value")

	/**
	 * Receives the value of the ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute manifest:${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(${aClassname}.ATTRIBUTE_NAME);
		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 = ${manifestmodel.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $element))})
#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
#if ($defaultValueSet.size()>1)
#set ($constant = $manifestmodel.constantCase($defaultValue))
#if ($valueObject == "String")
		return ${aClassname}.DEFAULT_VALUE_${manifestmodel.escapeKeyword($constant)};
#else
		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${manifestmodel.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 manifest:${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${manifestmodel.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 = "${manifestmodel.camelCase($child)}Element")
#set ($cVar = ${manifestmodel.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 manifest:${child}}.
	 *
#set ($seperateFlag="")
#set ($params="")
#foreach ($ch_attr in $ch_attributes)
#if (${child.isMandatory($ch_attr)})
#set($ch_attri = ${manifestmodel.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 = "${manifestmodel.camelCase($attribute)}Attribute")
#set ($aParam = "${manifestmodel.javaCase($attribute)}Value")
	 * @param $aParam  the <code>$ch_ValueObject</code> value of <code>$aClassname</code>, see {@odf.attribute  manifest:${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 manifest:${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 = "${manifestmodel.camelCase($ch_attr)}Attribute")
#set ($aParam = "${manifestmodel.javaCase($ch_attr)}Value")
		${cVar}.set$aClassname($aParam);
#end
#end
		this.appendChild($cVar);
		return $cVar;
	}

#else
	/**
	 * Create child element {@odf.element manifest:${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 manifest:${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.equals("")) {
			this.appendChild(this.getOwnerDocument().createTextNode(content));
		}
	 }
#end
}
