/**
 * Copyright (c) 2011, 2014 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: 
 * 		Florian Pirchner - Initial implementation
 */

package ${{BASIC_PROJECT_NAME}}.datatypes {

    datatype boolean jvmType java.lang.Boolean as primitive;
    datatype short jvmType java.lang.Short as primitive;
    datatype int jvmType java.lang.Integer as primitive;
    datatype long jvmType java.lang.Long as primitive;
    datatype double jvmType java.lang.Double as primitive;
    datatype float jvmType java.lang.Float as primitive;
    datatype character jvmType java.lang.Character as primitive;
    datatype byte jvmType java.lang.Byte as primitive;

    datatype Boolean jvmType java.lang.Boolean;
    datatype Short jvmType java.lang.Short;
    datatype Int jvmType java.lang.Integer;
    datatype Long jvmType java.lang.Long;
    datatype Double jvmType java.lang.Double;
    datatype Float jvmType java.lang.Float;
    datatype Character jvmType java.lang.Character;
    datatype Byte jvmType java.lang.Byte;
    datatype BigDecimal jvmType java.math.BigDecimal;

    datatype String jvmType java.lang.String;
	datatype BlobMapping jvmType java.lang.String 
		properties (
			key="Blob" value="2"
			/**
			 * value="0" name="unnormalized" resolution="unknown"
			 * value="1" name="small" resolution="16x16"
			 * value="2" name="mid" resolution="64x64"
			 * value="3" name="portrait" resolution="64x128"
			 * value="4" name="landscape" resolution="128x64"
			 * value="5" name="big" resolution="200x-1"
			 * 			 
			 */
		);

	datatype Date dateType date;
	datatype Price jvmType Double properties(key="decimalformat" value="###,##0.00 &curren;");
	datatype DateOnly dateType date properties(key = "Date" value = "Day");
	datatype BirthDate dateType date isNotNull isPast[severity=error] properties(key = "Date" value = "Day");
	datatype Time dateType time;
	datatype blobtype as blob;
	datatype clobtype as blob;
	datatype NumberToUomo jvmType java.lang.Double;
	datatype BaseAmount jvmType org.eclipse.uomo.units.impl.BaseAmount;
	datatype TextArea jvmType java.lang.String properties(key = "TextArea" value = "5"); // used for TextArea

	/**
     * The RichText_Short datatype represents the attribute as a RichTextArea. 
     * The max length of the input depends on the underlying database. 
     * If you need to hold bigger data, then use the #RichText_Long.   
     */
 	datatype RichText_Short jvmType String
  		properties(key = "type" value = "richTextArea");
	/**
     * The RichText datatype represents the attribute as a RichTextArea. 
     * The type in the data model will be a Blob. 
     */
 	datatype RichText_Long as blob
  		properties(key = "type" value = "richTextArea");
	/**
     * The Password datatype represents the attribute as a PasswordField. 
     * The type in the data model will be a String. 
   	 */
 	datatype Password jvmType String
  		properties(key = "type" value = "password");

	datatype PriceCustomDecimal jvmType java.lang.Double as primitive
		properties (
			key="functionCss" value="${{BASIC_PROJECT_NAME}}.functionlibrary.CssStyler.priceEndCss99", 
			key="functionConverter" value="${{BASIC_PROJECT_NAME}}.functionlibrary.Formatter.currencyFormatter"
		);
	
	datatype LengthCustomDecimal jvmType java.lang.Double as primitive
		properties (
			key="functionCss" value="${{BASIC_PROJECT_NAME}}.functionlibrary.CssStyler.priceEndCss95", 
			key="functionConverter" value="${{BASIC_PROJECT_NAME}}.functionlibrary.UomoConverter" 
		);
		
	datatype LengthMetricCustomDecimal jvmType java.lang.Double as primitive
		properties (
			key="functionCss" value="${{BASIC_PROJECT_NAME}}.functionlibrary.CssStyler.priceEndCss95", 
			key="functionConverter" value="${{BASIC_PROJECT_NAME}}.functionlibrary.UomoCMConverter" 
		);
	
	datatype LengthCMMetricCustomDecimal jvmType java.lang.Double as primitive
		properties (
			key="functionConverter" value="${{BASIC_PROJECT_NAME}}.functionlibrary.UomoCMMetricConverter" 
		);
	
	datatype MassGRAMMetricCustomDecimal jvmType java.lang.Double as primitive
		properties (
			key="functionConverter" value="${{BASIC_PROJECT_NAME}}.functionlibrary.UomoGRAMMetricConverter" 
		);
	
//	// UOMo data types, which are available through de.compex.utils.uomo
//	datatype Length jvmType org.eclipse.uomo.units.impl.BaseAmount<org.unitsofmeasurement.quantity.Length>;
//	datatype Area jvmType org.eclipse.uomo.units.impl.BaseAmount<org.unitsofmeasurement.quantity.Area>;
//	datatype Volume jvmType org.eclipse.uomo.units.impl.BaseAmount<org.unitsofmeasurement.quantity.Volume>;
//	datatype Mass jvmType org.eclipse.uomo.units.impl.BaseAmount<org.unitsofmeasurement.quantity.Mass>;
//	// joda money types
//	datatype Money jvmType org.joda.money.Money;
//	datatype BigMoney jvmType org.joda.money.BigMoney;
		
}