/* * BaseLink - Generic object relational mapping * Copyright (C) 2011-2020 Ulrich Hilger, http://uhilger.de * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/ */ package de.uhilger.baselink; import java.util.*; import java.util.logging.*; import java.sql.*; /** * Utility methods for the BaseLink package * * @author Copyright (c) Ulrich Hilger, http://uhilger.de * @author Published under the terms and conditions of * the GNU General Public License * @version 1, October 31, 2014 */ public class Util { private static final Logger logger = Logger.getLogger(Util.class.getName()); public static final boolean DO_INCLUDE_BLOBS = true; public static final boolean DONT_INCLUDE_BLOBS = false; /** * Generate a database transfer object (DTO) for a table * * @param pm an object to be used for database access * @param schemaName name of database schema that contains the table * @param tableName name of table to create DAO for * @return java source code of DTO */ public String generateDTO(PersistenceManager pm, String schemaName, String tableName) { String indentation = " "; //String indent = ""; StringBuilder code = new StringBuilder(); Connection c = null; try { c = pm.getConnection(); code.append("@DBTable(name=\""); code.append(schemaName.toLowerCase()); code.append("."); code.append(tableName.toLowerCase()); code.append("\")"); code.append(System.lineSeparator()); code.append("@DBPrimaryKey({\""); List> keys = getPrimaryKeys(pm, c, schemaName, tableName); String colName = null; for(int row = 1; row < keys.size(); row++) { if(row > 1) { code.append(",\""); } colName = keys.get(row).get(3).toLowerCase(); code.append(colName); code.append("\""); } code.append("})"); code.append(System.lineSeparator()); code.append("public class "); code.append(tableName.toLowerCase()); code.append(" {"); code.append(System.lineSeparator()); /* columns.size(): Anzahl Zeilen columns.get(0).size(): Anzahl Felder Column Name: columns.get(1).get(3) Datentyp: columns.get(1).get(4) */ List> columns = getColumns(pm, c, schemaName, tableName); String fieldname = null; String typename = null; int type = -1; // class members for(int row = 1; row < columns.size(); row++) { type = Integer.parseInt(columns.get(row).get(4)); fieldname = columns.get(row).get(3).toLowerCase(); typename = getTypeName(type); code.append(indentation); code.append("private "); code.append(typename); code.append(" "); code.append(fieldname); code.append(";"); code.append(System.lineSeparator()); } // setters and getters for(int row = 1; row < columns.size(); row++) { type = Integer.parseInt(columns.get(row).get(4)); fieldname = columns.get(row).get(3).toLowerCase(); typename = getTypeName(type); code.append(System.lineSeparator()); code.append(System.lineSeparator()); code.append(indentation); code.append("public void set"); code.append(fieldname); code.append("("); code.append(typename); code.append(" wert) {"); code.append(System.lineSeparator()); code.append(indentation); code.append(indentation); code.append(fieldname); code.append(" = wert;"); code.append(System.lineSeparator()); code.append(indentation); code.append("}"); code.append(System.lineSeparator()); code.append(System.lineSeparator()); code.append(indentation); // @DBColumn(name="dc_content", type=DBColumn.Type.BLOB) code.append("@DBColumn(name = \""); code.append(fieldname); if(type == java.sql.Types.BLOB) { code.append("\", type=DBColumn.Type.BLOB)"); } else { code.append("\")"); } code.append(System.lineSeparator()); code.append(indentation); code.append("public "); code.append(typename); code.append(" get"); code.append(fieldname); code.append("() {"); code.append(System.lineSeparator()); code.append(indentation); code.append(indentation); code.append("return "); code.append(fieldname); code.append(";"); code.append(System.lineSeparator()); code.append(indentation); code.append("}"); } code.append(System.lineSeparator()); code.append("}"); c.close(); c = null; } catch (Exception ex) { logger.log(Level.SEVERE, ex.getMessage(), ex); } finally { pm.closeConnectionFinally(c); } return code.toString(); } /** * Generate a database transfer object (DTO) for a table * * This method is kept for compatibility reasons, it maps to * generateDTO. * * @param pm an object to be used for database access * @param schemaName name of database schema that contains the table * @param tableName name of table to create DAO for * @return java source code of DTO */ public String generateDAO(PersistenceManager pm, String schemaName, String tableName) { return generateDTO(pm, schemaName, tableName); } /** * Get a description of the columns of a database table * * @param pm an object to be used for database access * @param c the database connection that has been opened for this action * @param schemaName name of database schema that contains the table * @param tableName name of table to get column descriptions for * @return column description as returned by java.sql.DatabaseMetaData, * transformed to a List of rows, each row being a List of Strings, each * String being a field of the column description for respective table * column */ public List> getColumns(PersistenceManager pm, Connection c, String schemaName, String tableName) { List> list = null; ResultSet rs = null; try { DatabaseMetaData meta = c.getMetaData(); rs = meta.getColumns(null, schemaName, tableName, null); list = pm.toList(rs, DONT_INCLUDE_BLOBS); rs.close(); rs = null; } catch (Exception ex) { logger.log(Level.SEVERE, ex.getMessage(), ex); } finally { pm.closeResultSetFinally(rs); } return list; } /** * Get a description of the primary keys of a database table * * @param pm an object to be used for database access * @param c the database connection that has been opened for this action * @param schemaName name of database schema that contains the table * @param tableName name of table to get primary key descriptions for * @return primary key description as returned by java.sql.DatabaseMetaData, * transformed to a List of rows, each row being a List of Strings, each * String being a field of the primary key description for respective table */ public List> getPrimaryKeys(PersistenceManager pm, Connection c, String schemaName, String tableName) { List> list = null; ResultSet rs = null; try { DatabaseMetaData meta = c.getMetaData(); rs = meta.getPrimaryKeys(null, schemaName, tableName); list = pm.toList(rs, DONT_INCLUDE_BLOBS); rs.close(); rs = null; } catch (Exception ex) { logger.log(Level.SEVERE, ex.getMessage(), ex); } finally { pm.closeResultSetFinally(rs); } return list; } /** * Convert a java.sql.Type to a Java type name * @param type SQL type to be converted * @return Java type name, e.g. String oder int; * if the type can not be converted without an * individually developed conversion 'tbd' is * returned with the SQL type name included, e.g. * tbd_CLOB, tbd_DISTINCT, etc. */ private String getTypeName(int type) { String typename = null; switch(type) { case java.sql.Types.ARRAY: typename = "tbd_ARRAY"; break; case java.sql.Types.BIGINT: typename = "long"; break; case java.sql.Types.BINARY: typename = "byte[]"; break; case java.sql.Types.BIT: typename = "tbd_BIT"; break; case java.sql.Types.BLOB: typename = "String"; break; case java.sql.Types.BOOLEAN: typename = "boolean"; break; case java.sql.Types.CHAR: typename = "String"; break; case java.sql.Types.CLOB: typename = "tbd_CLOB"; break; case java.sql.Types.DATALINK: typename = "tbd_DATALINK"; break; case java.sql.Types.DATE: typename = "java.sql.Date"; break; case java.sql.Types.DECIMAL: typename = "float"; break; case java.sql.Types.DISTINCT: typename = "tbd_DISTINCT"; break; case java.sql.Types.DOUBLE: typename = "double"; break; case java.sql.Types.FLOAT: typename = "float"; break; case java.sql.Types.INTEGER: typename = "int"; break; case java.sql.Types.JAVA_OBJECT: typename = "Object"; break; case java.sql.Types.LONGVARCHAR: typename = "String"; break; case java.sql.Types.NCHAR: typename = "String"; break; case java.sql.Types.NCLOB: typename = "tbd_NCLOB"; break; case java.sql.Types.NULL: typename = "tbd_NULL"; break; case java.sql.Types.NUMERIC: typename = "float"; break; case java.sql.Types.NVARCHAR: typename = "String"; break; case java.sql.Types.OTHER: typename = "tbd_OTHER"; break; case java.sql.Types.REAL: typename = "float"; break; case java.sql.Types.REF: typename ="tbd_REF"; break; case java.sql.Types.ROWID: typename = "tbd_ROWID"; break; case java.sql.Types.SMALLINT: typename = "integer"; break; case java.sql.Types.SQLXML: typename = "tbd_SQLXML"; break; case java.sql.Types.STRUCT: typename = "tbd_STRUCT"; break; case java.sql.Types.TIME: typename = "tbd_TIME"; break; case java.sql.Types.TIMESTAMP: typename = "java.sql.Timestamp"; break; case java.sql.Types.TINYINT: typename = "integer"; break; case java.sql.Types.VARBINARY: typename = "tbd_VARBINARY"; break; case java.sql.Types.VARCHAR: typename = "String"; break; default: typename = "tbd_UNDEFINED"; break; } return typename; } }