/* * * SchemaCrawler * http://sourceforge.net/projects/schemacrawler * Copyright (c) 2000-2013, Sualeh Fatehi. * * This library is free software; you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Foundation; * either version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along with this * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. * */ package schemacrawler.utility; import java.lang.reflect.Field; import java.sql.Types; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import schemacrawler.schema.JavaSqlType; import schemacrawler.schema.JavaSqlType.JavaSqlTypeGroup; import sf.util.Utility; /** * Utility to work with java.sql.Types. * * @author Sualeh Fatehi */ public final class JavaSqlTypes implements Map<Integer, JavaSqlType>, Iterable<JavaSqlType> { private static final Logger LOGGER = Logger.getLogger(JavaSqlTypes.class .getName()); private static Map<String, Integer> createJavaSqlTypesMap() { final Map<String, Integer> javaSqlTypesMap = new HashMap<>(); for (final Field field: Types.class.getFields()) { try { final String javaSqlTypeName = field.getName(); final Integer javaSqlType = (Integer) field.get(null); javaSqlTypesMap.put(javaSqlTypeName, javaSqlType); } catch (final SecurityException | IllegalAccessException e) { LOGGER.log(Level.WARNING, "Could not access java.sql.Types, field " + field, e); // continue } } return javaSqlTypesMap; } private static JavaSqlTypeGroup groupJavaSqlType(final int type) { final JavaSqlTypeGroup typeGroup; switch (type) { case java.sql.Types.ARRAY: case java.sql.Types.DISTINCT: case java.sql.Types.JAVA_OBJECT: case java.sql.Types.OTHER: case java.sql.Types.STRUCT: typeGroup = JavaSqlTypeGroup.object; break; case java.sql.Types.BINARY: case java.sql.Types.LONGVARBINARY: case java.sql.Types.VARBINARY: typeGroup = JavaSqlTypeGroup.binary; break; case java.sql.Types.BIT: case java.sql.Types.BOOLEAN: typeGroup = JavaSqlTypeGroup.bit; break; case java.sql.Types.CHAR: case java.sql.Types.LONGNVARCHAR: case java.sql.Types.LONGVARCHAR: case java.sql.Types.NCHAR: case java.sql.Types.NVARCHAR: case java.sql.Types.VARCHAR: typeGroup = JavaSqlTypeGroup.character; break; case java.sql.Types.ROWID: typeGroup = JavaSqlTypeGroup.id; break; case java.sql.Types.BIGINT: case java.sql.Types.INTEGER: case java.sql.Types.SMALLINT: case java.sql.Types.TINYINT: typeGroup = JavaSqlTypeGroup.integer; break; case java.sql.Types.BLOB: case java.sql.Types.CLOB: case java.sql.Types.NCLOB: typeGroup = JavaSqlTypeGroup.large_object; break; case java.sql.Types.DECIMAL: case java.sql.Types.DOUBLE: case java.sql.Types.FLOAT: case java.sql.Types.NUMERIC: case java.sql.Types.REAL: typeGroup = JavaSqlTypeGroup.real; break; case java.sql.Types.REF: typeGroup = JavaSqlTypeGroup.reference; break; case java.sql.Types.DATE: case java.sql.Types.TIME: case java.sql.Types.TIMESTAMP: typeGroup = JavaSqlTypeGroup.temporal; break; case java.sql.Types.DATALINK: typeGroup = JavaSqlTypeGroup.url; break; case java.sql.Types.SQLXML: typeGroup = JavaSqlTypeGroup.xml; break; default: typeGroup = JavaSqlTypeGroup.unknown; break; } return typeGroup; } private static Map<Integer, JavaSqlType> mapJavaSqlTypes() { final Map<String, Integer> javaSqlTypesMap = createJavaSqlTypesMap(); final Map<Integer, JavaSqlType> javaSqlTypes = new HashMap<>(); for (final Entry<String, Integer> javaSqlTypesEntry: javaSqlTypesMap .entrySet()) { if (javaSqlTypesEntry.getKey() != null && javaSqlTypesEntry.getValue() != null) { final Integer javaSqlTypeInt = javaSqlTypesEntry.getValue(); final String javaSqlTypeName = javaSqlTypesEntry.getKey(); final JavaSqlTypeGroup javaSqlTypeGroup = groupJavaSqlType(javaSqlTypeInt); final JavaSqlType javaSqlType = new JavaSqlType(javaSqlTypeInt, javaSqlTypeName, javaSqlTypeGroup); javaSqlTypes.put(javaSqlTypeInt, javaSqlType); } } return javaSqlTypes; } private final Map<Integer, JavaSqlType> javaSqlTypeMap; public JavaSqlTypes() { javaSqlTypeMap = mapJavaSqlTypes(); } @Override public void clear() { throw new UnsupportedOperationException(); } @Override public boolean containsKey(final Object key) { return javaSqlTypeMap.containsKey(key); } @Override public boolean containsValue(final Object value) { return javaSqlTypeMap.containsValue(value); } @Override public Set<java.util.Map.Entry<Integer, JavaSqlType>> entrySet() { return new HashSet<>(javaSqlTypeMap.entrySet()); } @Override public boolean equals(final Object o) { return javaSqlTypeMap.equals(o); } @Override public JavaSqlType get(final Object key) { if (containsKey(key)) { return javaSqlTypeMap.get(key); } else { return JavaSqlType.UNKNOWN; } } /** * Lookup java.sql.Types type, and return more detailed information, * including the mapped Java class. * * @param typeName * java.sql.Types type name * @return JavaSqlType type */ public JavaSqlType getFromJavaSqlTypeName(final String typeName) { JavaSqlType sqlDataType = JavaSqlType.UNKNOWN; if (Utility.isBlank(typeName)) { return sqlDataType; } for (final JavaSqlType javaSqlType: javaSqlTypeMap.values()) { if (typeName.equals(javaSqlType.getJavaSqlTypeName())) { sqlDataType = javaSqlType; break; } } return sqlDataType; } @Override public int hashCode() { return javaSqlTypeMap.hashCode(); } @Override public boolean isEmpty() { return javaSqlTypeMap.isEmpty(); } @Override public Iterator<JavaSqlType> iterator() { return javaSqlTypeMap.values().iterator(); } @Override public Set<Integer> keySet() { return new HashSet<>(javaSqlTypeMap.keySet()); } @Override public JavaSqlType put(final Integer key, final JavaSqlType value) { throw new UnsupportedOperationException(); } @Override public void putAll(final Map<? extends Integer, ? extends JavaSqlType> m) { throw new UnsupportedOperationException(); } @Override public JavaSqlType remove(final Object key) { throw new UnsupportedOperationException(); } @Override public int size() { return javaSqlTypeMap.size(); } @Override public String toString() { return javaSqlTypeMap.toString(); } @Override public Collection<JavaSqlType> values() { return new HashSet<>(javaSqlTypeMap.values()); } }