##################################################################
## 
## 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 list of artefacts which are to be generated
##
## Documentation of template development can be found in local file
## TemplateHelp.html.
##
## Returns PuzzleComponent covering a PuzzlePiece or PuzzlePieceSet dependent if attribute is multiple times defined
#set($attribute = $model.getAttribute($context))
#set($NS = $attribute.getNamespace())
#set($localname = ${model.extractLocalname($attribute)})
#set($classname = "${model.camelCase($attribute.getLocalName())}Attribute")
#set ($valueobject = "String")
##
#set($datatypes = ${attribute.getDatatypes().withoutMultiples()})
#if ($datatypes.size() > 0)
#set ($hasdatatype = true)
#else
#set ($hasdatatype = false)
#end
##
##2DO: Svante - getValues() vs. getValueLiterals() - only literals / constants for attribute values are taken
#set($values = ${attribute.getValues().withoutMultiples()})
#if ($values.size() > 0)
#if ($values.size() ==2 && $hasdatatype == false)
#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
#set ($enum = true)
#if ($valueobject == "Boolean")
#set ($enum = false)
#end
#else
#set ($enum = false)
#end
##
## Check whether the attribute has default value.
##
#set ($hasDefaultValue = false)
#foreach ($parent in ${attribute.getParents().withoutMultiples()})
#if (${odfmodel.getDefaultAttributeValue($attribute, $parent)})
#set ($hasDefaultValue = true)
#end
#end
##
#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
#if ($hasDefaultValue and $defaultValueSet.size() == 1)
#foreach ($value in $defaultValueSet)
#set ($uniqueDefaultValue = $value)
#end
#end
##
#include('copyright.txt')
/*
 * This file is automatically generated.
 * Don't edit manually.
 */
package org.odftoolkit.odfdom.pkg.manifest;

import org.odftoolkit.odfdom.pkg.OdfAttribute;
#if ($hasDefaultValue)
import org.odftoolkit.odfdom.pkg.OdfElement;
#end
import org.odftoolkit.odfdom.pkg.OdfFileDom;
import org.odftoolkit.odfdom.pkg.OdfName;
import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;

#if ($hasDefaultValue and $defaultValueSet.size()>1)
#foreach ($parent in ${attribute.getParents().withoutMultiples()})
#if ($odfmodel.getDefaultAttributeValue($attribute, $parent))
#if (!$parent.equals("manifest")) ## Do not generate "import" for the same package!
import org.odftoolkit.odfdom.pkg.manifest.${model.camelCase($parent.getLocalName())}Element;
#end
#end
#end
#end
/**
 * Manifest implementation of OpenDocument attribute  {@odf.attribute ${attribute.getQName()}}.
 *
 */
public class $classname extends OdfAttribute {

	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.${NS.toUpperCase()}, "$localname");
#if ($hasDefaultValue)
#if ($defaultValueSet.size()>1)
#foreach ($defaultValue in $defaultValueSet)
#set ($constant = $model.constantCase($defaultValue))
#if (($defaultValue=="true" or $defaultValue=="false") and $enum == false)
	public static final String DEFAULT_VALUE_${model.escapeKeyword($constant)}= "$defaultValue";
#else
	public static final String DEFAULT_VALUE_${model.escapeKeyword($constant)}=	Value.${model.escapeKeyword($constant)}.toString();
#end
#end
#else
#if ($uniqueDefaultValue=="&#34;")
	public static final String DEFAULT_VALUE = "\${uniqueDefaultValue}";
#else
	public static final String DEFAULT_VALUE = "$uniqueDefaultValue";
#end
#end
#end

	/**
	 * Create the instance of OpenDocument attribute {@odf.attribute ${attribute}}.
	 *
	 * @param ownerDocument       The type is <code>OdfFileDom</code>
	 */
	public $classname(OdfFileDom ownerDocument) {
		super(ownerDocument, ATTRIBUTE_NAME);
	}

	/**
	 * Returns the attribute name.
	 *
	 * @return the <code>OdfName</code> for {@odf.attribute ${attribute}}.
	 */
	@Override
	public OdfName getOdfName() {
		return ATTRIBUTE_NAME;
	}

	/**
	 * @return Returns the name of this attribute.
	 */
	@Override
	public String getName() {
		return ATTRIBUTE_NAME.getLocalName();
	}
##
#if ($enum)

	/**
	 * The value set of {@odf.attribute ${attribute}}.
	 */
	public enum Value {
#set ($separator="		")
#foreach($value in $values)
#if (${value.toString().length()} == 1)
#set ($constant = $value)
#else
#set ($constant = $model.constantCase($value))
#end${separator}${model.escapeKeyword($constant)}("${model.escapeLiteral($value)}")#set ($separator=", ")
#end ;

		private String mValue;

		Value(String value) {
			mValue = value;
		}

		@Override
		public String toString() {
			return mValue;
		}

		public static Value enumValueOf(String value) {
			for(Value aIter : values()) {
				if (value.equals(aIter.toString())) {
				return aIter;
				}
			}
			return null;
		}
	}

	/**
	 * @param attrValue The <code>Enum</code> value of the attribute.
	 */
	public void setEnumValue(Value attrValue) {
		setValue(attrValue.toString());
	}

	/**
	 * @return Returns the <code>Enum</code> value of the attribute
	 */
	public Value getEnumValue() {
		return Value.enumValueOf(this.getValue());
	}
#end
##
## Handle Non-String-Attributes
#set ($valuetypes = ${javamodel.getValuetypes($datatypes)})
#if ($valueobject != "Boolean")
#foreach ($valuetype in $valuetypes)
#set ($valueobject = $valuetype)
#end
#end
#if ($valueobject != "String" && $valueobject != "Double" && $valueobject != "Integer" && $valueobject != "Boolean")
#set ($valueobject = "String")
#end
#if ($valueobject != "String")
#set ($simplevalue = ${javamodel.getPrimitiveType($valueobject)})
##

	/**
	 * @param value The <code>${simplevalue}</code> value of the attribute.
	 */
	public void set${model.camelCase($simplevalue)}Value(${simplevalue} value) {
		super.setValue(String.valueOf(value));
	}

	/**
	 * @return Returns the <code>${simplevalue}</code> value of the attribute
	 */
	public ${simplevalue} ${simplevalue}Value() {
		String val = super.getValue();
		try {
			return ${valueobject}.parse${model.camelCase($simplevalue)}(val);
		} catch (NumberFormatException e) {
			// TODO: validation handling/logging
			throw (e);
		}
	}
#end
##

	/**
	 * @param attrValue The <code>String</code> value of the attribute.
	 * @throws IllegalArgumentException If the provided attribute value is invalid
	 */
	@Override
	public void setValue(String attrValue) {
#if ($enum)
#if ($hasdatatype)
## enum and datatype
		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
		super.setValue(attrValue);
#else
## enum and no datatype
		try {
			super.setValue(Value.enumValueOf(attrValue).toString());
		} catch (NullPointerException e) {
			throw new IllegalArgumentException(e);
		}
#end
#else
		try {
			super.setValue(attrValue);
		} catch (NullPointerException e) {
			// TODO: validation handling/logging
			throw new IllegalArgumentException(e);
		} catch (IllegalArgumentException e) {
			// TODO: validation handling/logging
			throw (e);
		}
#end
	}

	/**
	 * @return Returns the <code>String</code> value of the attribute
	 */
	@Override
	public String getValue() {
#if ($enum)
#if ($hasdatatype)
## enum and datatype
		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
		return super.getValue();
#else
## enum and no datatype
		try {
			return Value.enumValueOf(super.getValue()).toString();
		} catch (NullPointerException e) {
			throw new IllegalArgumentException("the value of ${attribute} is not valid");
		}
#end
#else
		try {
			return super.getValue();
		} catch (IllegalArgumentException e) {
			// TODO: validation handling/logging
			throw new NumberFormatException("the value of ${attribute} is not valid");
		}
#end
	}

#if ($hasDefaultValue)
	/**
	 * Returns the default value of {@odf.attribute ${attribute}}.
	 *
	 * @return the default value as <code>String</code> dependent of its element name
	 *         return <code>null</code> if the default value does not exist
	 */
	@Override
	public String getDefault() {
		OdfElement parentElement = (OdfElement)getOwnerElement();
		String defaultValue = null;
		if (parentElement != null) {
#if ($defaultValueSet.size()>1)
#foreach ($parent in ${attribute.getParents().withoutMultiples()})
#if ($odfmodel.getDefaultAttributeValue($attribute, $parent))
			if (parentElement instanceof ${model.camelCase($parent)}Element) {
				defaultValue = "${model.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $parent))}";
			}
#end
#end
#else
			defaultValue = "${model.escapeLiteral($uniqueDefaultValue)}";
#end
		}
		return defaultValue;
	}

	/**
	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
	 *
	 * @return <code>true</code> if {@odf.attribute ${attribute}} has an element parent
	 *         otherwise return <code>false</code> as undefined.
	 */
	@Override
	public boolean hasDefault() {
		return getOwnerElement() == null ? false : true;
	}
#else
	/**
	 * Returns the default value of {@odf.attribute ${attribute}}.
	 *
	 * @return the default value as <code>String</code> dependent of its element name
	 *         return <code>null</code> if the default value does not exist
	 */
	@Override
	public String getDefault() {
		return null;
	}

	/**
	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
	 *
	 * @return <code>true</code> if {@odf.attribute ${attribute}} has an element parent
	 *         otherwise return <code>false</code> as undefined.
	 */
	@Override
	public boolean hasDefault() {
		return false;
	}
#end

	/**
	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
	 */
	@Override
	public boolean isId() {
#if ($hasdatatype and $datatypes.size() > 0)
#set ($datatype="")
#foreach($value in $datatypes)
#set ($datatype=$value)
#end
#if ($datatype == "ID")
		return true;
#else
		return false;
#end
#else
		return false;
#end
	}
}
