/* * * 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.crawl; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; import schemacrawler.crawl.JavaSqlType.JavaSqlTypeGroup; import schemacrawler.schemacrawler.Config; /** * Utility to work with java.sql.Types, and Java class name mappings. * * @author Sualeh Fatehi */ public final class JavaSqlTypesUtility { private static final Logger LOGGER = Logger .getLogger(JavaSqlTypesUtility.class.getName()); private static final Map<Integer, JavaSqlType> JAVA_SQL_TYPES_BY_TYPE; private static final Map<String, JavaSqlType> JAVA_SQL_TYPES_BY_TYPE_NAME; static { final List<JavaSqlType> javaSqlTypes = readJavaSqlTypes(); JAVA_SQL_TYPES_BY_TYPE = mapJavaSqlTypesByType(javaSqlTypes); JAVA_SQL_TYPES_BY_TYPE_NAME = mapJavaSqlTypesByTypeName(javaSqlTypes); } /** * Lookup java.sql.Types type, and return more detailed information, * including the mapped Java class. * * @param type * java.sql.Types type * @return JavaSqlType type */ public static JavaSqlType lookupSqlDataType(final int type) { JavaSqlType sqlDataType = JAVA_SQL_TYPES_BY_TYPE.get(type); if (sqlDataType == null) { sqlDataType = JavaSqlType.UNKNOWN; } return sqlDataType; } /** * 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 static JavaSqlType lookupSqlDataType(final String typeName) { JavaSqlType sqlDataType = JAVA_SQL_TYPES_BY_TYPE_NAME.get(typeName); if (sqlDataType == null) { sqlDataType = JavaSqlType.UNKNOWN; } return sqlDataType; } private static Map<Integer, JavaSqlType> mapJavaSqlTypesByType(final List<JavaSqlType> javaSqlTypes) { final Map<Integer, JavaSqlType> javaSqlTypesByTypeMap = new HashMap<Integer, JavaSqlType>(); if (javaSqlTypes != null) { for (final JavaSqlType javaSqlType: javaSqlTypes) { javaSqlTypesByTypeMap.put(javaSqlType.getJavaSqlType(), javaSqlType); } } return Collections.unmodifiableMap(javaSqlTypesByTypeMap); } private static Map<String, JavaSqlType> mapJavaSqlTypesByTypeName(final List<JavaSqlType> javaSqlTypes) { final Map<String, JavaSqlType> javaSqlTypesByTypeNameMap = new HashMap<String, JavaSqlType>(); if (javaSqlTypes != null) { for (final JavaSqlType javaSqlType: javaSqlTypes) { javaSqlTypesByTypeNameMap.put(javaSqlType.getJavaSqlTypeName(), javaSqlType); } } return Collections.unmodifiableMap(javaSqlTypesByTypeNameMap); } private static List<JavaSqlType> readJavaSqlTypes() { final Map<String, JavaSqlTypeGroup> javaSqlTypeGroupsMap = readJavaSqlTypesGroupsMap(); final Map<String, String> javaSqlTypesClassNames = readJavaSqlTypesClassNameMap(); final Map<String, String> javaSqlTypesProperties = Config .loadResource("/java.sql.Types.properties"); final List<JavaSqlType> javaSqlTypes = new ArrayList<JavaSqlType>(); for (final Entry<String, String> javaSqlTypesEntry: javaSqlTypesProperties .entrySet()) { if (javaSqlTypesEntry.getKey() != null && javaSqlTypesEntry.getValue() != null) { final Integer javaSqlType = Integer.parseInt(javaSqlTypesEntry .getValue()); final String javaSqlTypeName = javaSqlTypesEntry.getKey(); final String javaSqlTypesClassName = javaSqlTypesClassNames .get(javaSqlTypeName); final JavaSqlTypeGroup javaSqlTypeGroup = javaSqlTypeGroupsMap .get(javaSqlTypeName); javaSqlTypes.add(new JavaSqlType(javaSqlType, javaSqlTypeName, javaSqlTypesClassName, javaSqlTypeGroup)); } } return Collections.unmodifiableList(javaSqlTypes); } private static Map<String, String> readJavaSqlTypesClassNameMap() { return Config.loadResource("/java.sql.Types.mappings.properties"); } private static Map<String, JavaSqlTypeGroup> readJavaSqlTypesGroupsMap() { final Map<String, JavaSqlTypeGroup> javaSqlTypesGroupsMap = new HashMap<String, JavaSqlTypeGroup>(); final Map<String, String> javaSqlTypesGroups = Config .loadResource("/java.sql.Types.groups.properties"); for (final Entry<String, String> javaSqlTypesGroupsEntry: javaSqlTypesGroups .entrySet()) { try { final String javaSqlTypeName = javaSqlTypesGroupsEntry.getKey(); final JavaSqlTypeGroup group = JavaSqlTypeGroup .valueOf(javaSqlTypesGroupsEntry.getValue()); javaSqlTypesGroupsMap.put(javaSqlTypeName, group); } catch (final IllegalArgumentException e) { LOGGER.log(Level.WARNING, "Could not read java.sql.Types groups", e); // continue } } return Collections.unmodifiableMap(javaSqlTypesGroupsMap); } private JavaSqlTypesUtility() { } }