/**
 * 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 org.eclipse.osbp.dsl.common.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 float_pos jvmType java.lang.Float as primitive
		digits(7 ,  3 [ msgCode = MSG_Datatype_float_pos__digits msgI18nKey = MSG_Datatype_float_pos__digits.message severity = error ]);
	datatype Float_pos jvmType java.lang.Float
		digits(7 ,  3 [ msgCode = MSG_Datatype_float_pos__digits msgI18nKey = MSG_Datatype_float_pos__digits.message severity = error ]);
	datatype character jvmType java.lang.Character as primitive;
	datatype byte jvmType java.lang.Byte as primitive
		properties(key = "Test" value = "Me" ,  key = "foo" value = "baa");
	datatype Boolean jvmType java.lang.Boolean;
	datatype Short jvmType java.lang.Short;
	datatype Short_7_7 jvmType java.lang.Short
		maxNumber(7)
		minNumber(-7 [ msgCode = MSG_Datatype_Short_7_7__numericMin msgI18nKey = MSG_Datatype_Short_7_7__numericMin.message severity = error ])
		properties(key = "Test" value = "Me" ,  key = "foo" value = "baa");
	datatype Short_Special jvmType java.lang.Short
		minNumber(-7)
		maxNumber(7)
		properties(key = "Test" value = "Me" ,  key = "foo" value = "baa");
	datatype Int jvmType java.lang.Integer
		minNumber(-7);
	datatype Character jvmType java.lang.Character
		isNull
		isNotNull;
	datatype Long jvmType java.lang.Long;
	datatype Double jvmType java.lang.Double
		minDecimal(-123.456)
		maxDecimal(123.456);
	datatype Float jvmType java.lang.Float;
	datatype Float_7_3 jvmType java.lang.Float
		minDecimal(-123.456)
		maxDecimal(123.456)
		digits(7 ,  3)
		isNotNull;

	datatype Byte jvmType java.lang.Byte;
	datatype String jvmType java.lang.String;
	datatype Date dateType date isFuture [ msgCode = MSG_Datatype_Date__isFuture msgI18nKey = MSG_Datatype_Date__isFuture.message severity = error ];

	// BusinessKey
	datatype BK jvmType java.lang.String
		minMaxSize(5 ,  12 [ msgCode = MSG_Datatype_BK__size msgI18nKey = MSG_Datatype_BK__size.message severity = error ])
		regex("A[0-9]*" [ msgCode = MSG_Datatype_BK__regex msgI18nKey = MSG_Datatype_BK__regex.message severity = error ]);
	datatype Desc jvmType java.lang.String
		minMaxSize(3 ,  125 [severity=warn])
		isNotNull [severity=error];
	datatype Iso3Code_String jvmType java.lang.String
		minMaxSize(3 ,  3);
	datatype Axes_Int jvmType java.lang.Integer as primitive
		minNumber(2 [ msgCode = MSG_Datatype_Axes_Int__numericMin msgI18nKey = MSG_Datatype_Axes_Int__numericMin.message severity = error ])
		maxNumber(10);
		
}
