##################################################################
## 
## 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 artifacts 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.dsig;

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 ($model.getDefaultAttributeValue($attribute, $parent))
import org.odftoolkit.odfdom.pkg.dsig.${model.camelCase($parent.getLocalName())}Element;
#end
#end
#end
/**
 * DOM 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
	}
}
