/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.hibernate.xml.model.helpers; import java.util.HashSet; import java.util.Properties; import java.util.Set; import org.jboss.tools.common.model.XModelException; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.util.XModelObjectLoaderUtil; @SuppressWarnings("nls") public class HibernateTypeHelper { static Properties hToJ = new Properties(); static Properties jToH = new Properties(); static Set<String> primitives = new HashSet<String>(); public static String[] TYPE_NAMES = new String[]{ "binary", "big_decimal", "blob", "boolean", "byte", "calendar", "calendar_date", "character", "class", "clob", "currency", "date", "double", "float", "integer", "locale", "long", "serializable", "short", "string", "text", "time", "timestamp", "timezone", "true_false", "yes_no" }; public static String[] VERSION_TYPE_NAMES = new String[]{ "integer", "long", "short", "timestamp", "calendar" }; public static String[] TIMESTAMP_TYPE_NAMES = new String[]{ "timestamp" }; public static String[] DISCRIMINATOR_TYPE_NAMES = new String[]{ "string", "character", "integer", "byte", "short", "boolean", "yes_no", "true_false" }; public static String[] COLLECTION_TYPE_NAMES = new String[]{ "array", "bag", "idbag", "list", "map", "primitive-array", "set" }; static { addType("integer", new String[]{"int", "java.lang.Integer"}, true); addType("long", new String[]{"long", "java.lang.Long"}, true); addType("short", new String[]{"short", "java.lang.Short"}, true); addType("float", new String[]{"float", "java.lang.Float"}, true); addType("double", new String[]{"double", "java.lang.Double"}, true); addType("character", new String[]{"char", "java.lang.Character"}, true); addType("byte", new String[]{"byte", "java.lang.Byte"}, true); addType("boolean", new String[]{"boolean", "java.lang.Boolean"}, true); addType("yes_no", "boolean", true); addType("true_false", "boolean", true); addType("string", "java.lang.String", true); addType("date", "java.util.Date", true); addType("time", "java.util.Time", true); addType("timestamp", "java.sql.Timestamp", true); addType("calendar", "java.util.Calendar", true); addType("calendar_date", "java.util.Calendar", true); addType("big_decimal", "java.math.BigDecimal", true); addType("locale", "java.util.Locale", true); addType("timezone", "java.util.TimeZone", true); addType("currency", "java.util.Currency", true); addType("class", "java.lang.Class", true); addType("text", "java.lang.String", true); addType("binary", "byte[]", false); addType("serializable", "java.io.Serializable", false); addType("clob", "java.sql.Clob", false); addType("blob", "java.sql.Blob", false); addType("map", new String[]{"java.util.Map", "java.util.HashMap", "java.util.TreeMap"}, false); addType("set", new String[]{"java.util.Set", "java.util.HashSet", "java.util.TreeSet"}, false); addType("list", new String[]{"java.util.List", "java.util.ArrayList", "java.util.Vector"}, false); addType("bag", "java.util.List", false); addType("idbag", "java.util.List", false); addType("array", "java.lang.String[]", false); addType("primitive-array", "int[]", false); } private static void addType(String hibernateType, String javaType, boolean isPrimitive) { addType(hibernateType, new String[]{javaType}, isPrimitive); } private static void addType(String hibernateType, String[] javaTypes, boolean isPrimitive) { hToJ.setProperty(hibernateType, javaTypes[0]); for (int i = 0; i < javaTypes.length; i++) { if(!jToH.containsKey(javaTypes[i])) { jToH.setProperty(javaTypes[i], hibernateType); } } if(isPrimitive) { primitives.add(hibernateType); for (int i = 0; i < javaTypes.length; i++) primitives.add(javaTypes[i]); } } public static String getJavaTypeForHibernateType(String hibernateType) { String s = hToJ.getProperty(hibernateType); return (s == null) ? hibernateType : s; } public static String getHibernateTypeForJavaType(String javaType) { String s = jToH.getProperty(javaType); return (s == null) ? javaType : s; } public static boolean isPrimitive(String type) { return type != null && type.length() > 0 && primitives.contains(type); } public static boolean isHibernateType(String type) { boolean result = false; for (int i = 0; i < TYPE_NAMES.length && !result; i++) result = TYPE_NAMES[i].equals(type); return result; } public static void mergeAttributes(XModelObject destination, XModelObject source) throws XModelException { XModelObjectLoaderUtil.mergeAttributes(destination, source); if (destination.getModelEntity().getAttribute("type") != null && source.getModelEntity().getAttribute("type") == null && source.getModelEntity().getAttribute("class") != null) { destination.setAttributeValue("type", source.getAttributeValue("class")); } else if (destination.getModelEntity().getAttribute("class") != null && source.getModelEntity().getAttribute("class") == null && source.getModelEntity().getAttribute("type") != null) { String className = getJavaTypeForHibernateType(source.getAttributeValue("type")); if (className == null || className.length() <= 0) className = source.getAttributeValue("type"); destination.setAttributeValue("class", className); } } public static String getHibernateTypeBySQLType(String sqlType) { if(sqlType == null || sqlType.length() == 0) return ""; if("BIGINT".equals(sqlType)) return "long"; if("BINARY".equals(sqlType)) return "binary"; if("BIT".equals(sqlType)) return "boolean"; if("BLOB".equals(sqlType)) return "blob"; if("CHAR".equals(sqlType)) return "string"; if("CLOB".equals(sqlType)) return "clob"; if("DATE".equals(sqlType)) return "date"; if("DECIMAL".equals(sqlType)) return "double"; if("DOUBLE".equals(sqlType)) return "double"; if("FLOAT".equals(sqlType)) return "float"; if("INTEGER".equals(sqlType)) return "integer"; if("LONG_RAW".equals(sqlType)) return ""; if("LONGVARBINARY".equals(sqlType)) return "binary"; if("LONGVARCHAR".equals(sqlType)) return "binary"; if("NUMBER".equals(sqlType)) return "integer"; if("NUMERIC".equals(sqlType)) return "integer"; if("REAL".equals(sqlType)) return "double"; if("SMALL_INT".equals(sqlType)) return "short"; if("TIME".equals(sqlType)) return "time"; if("TIMESTAMP".equals(sqlType)) return "timestamp"; if("TINYINT".equals(sqlType)) return "byte"; if("VARBINARY".equals(sqlType)) return "binary"; if("VARCHAR".equals(sqlType)) return "string"; if("VARCHAR2".equals(sqlType)) return "string"; //Mssql if("CHAR".equals(sqlType)) return "string"; if("NCHAR".equals(sqlType)) return "string"; if("DATETIME".equals(sqlType)) return "date"; if("NVARCHAR".equals(sqlType)) return "string"; if("TEXT".equals(sqlType)) return "string"; if("NTEXT".equals(sqlType)) return "string"; if("INT".equals(sqlType)) return "int"; return ""; } }