All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mplates.1.2.source-code.PojoTableCheck.ftl Maven / Gradle / Ivy

<#include "license.ftl">
<@license/>
<#assign object = doc.object>
package ${object.@package}.service.check;

import org.jetbrains.annotations.NotNull;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Map;
import java.sql.SQLException;
import java.util.logging.Logger;
import java.io.PrintWriter;

import redora.db.Statement;
import ${object.@package}.model.fields.${object.@name}Fields;
import redora.exceptions.ConnectException;
import redora.exceptions.QueryException;

import static java.util.logging.Level.SEVERE;
import static redora.service.ServiceBase.close;

/**
* Handler for the model vs database synchronization. It can create the ${object.@name} table if it does exists
* and it can check if the database definition is still in sync with your model with the check() function.
* For your convenience is can also drop the ${object.@name} table.
* @author Redora (www.redora.net)
*/
public class ${object.@name}TableCheck {
    private static final transient Logger l = Logger.getLogger("${object.@package}.service.check.${object.@name}TableCheck");
    private final Statement st;

    public ${object.@name}TableCheck(Statement st) {
        this.st = st;
    }

    /**
    * Checks if the model is the same with the database table, logs warning level message
    * if this is not the case.
    * @param out HTML stream with check results. If the check results OK, nothing is streamed
    */
    public void check(@NotNull PrintWriter out) throws ConnectException, QueryException {
        ResultSet rs = null;
        try {
            rs = st.con.con.getMetaData().getColumns("", "", "${object.@name}", "");
            Map> map = new HashMap>();
            while (rs.next()) {
                Map list = new HashMap();
                list.put("COLUMN_NAME", rs.getString("COLUMN_NAME"));
                list.put("DATA_TYPE", rs.getInt("DATA_TYPE"));
                list.put("COLUMN_SIZE", rs.getInt("COLUMN_SIZE"));
                list.put("IS_NULLABLE", rs.getString("IS_NULLABLE"));
                map.put(rs.getString("COLUMN_NAME"), list);
            }
            for (String key : map.keySet()) {
                boolean check = false;
                for (${object.@name?cap_first}Fields fields : ${object.@name?cap_first}Fields.values()) {
                    if (map.get(key).get("COLUMN_NAME").toString().equalsIgnoreCase(fields.name())) {
                        check = true;
                        break;
                    }
<#if object.trashcan == "true">
                    if (map.get(key).get("COLUMN_NAME").toString().equalsIgnoreCase("roDeleted")) {
                        check = true;
                        break;
                    }

                }
                if (!check) {
                    out.print("${object.@name} does not have " + key + " attribute but it exists in database.
"); } } for (${object.@name?cap_first}Fields fields : ${object.@name?cap_first}Fields.values()) { if (fields.name().equalsIgnoreCase("creationDate")) { fields.sqlType = java.sql.Types.TIMESTAMP; } if (fields.name().equalsIgnoreCase("updateDate")) { fields.sqlType = java.sql.Types.TIMESTAMP; } <#list object.attributes?children as att> <#if att?node_name == "datetime"> if (fields.name().equalsIgnoreCase("${att.@name}")) { fields.sqlType = java.sql.Types.TIMESTAMP; } if (fields.sqlType == java.sql.Types.BOOLEAN) { fields.sqlType = java.sql.Types.BIT; } if (map.containsKey(fields.name()) && Integer.parseInt(map.get(fields.name()).get("DATA_TYPE").toString()) == fields.sqlType) { <#list object.attributes?children as att> <#if att?node_name != "set" && att?node_type == "element"> if (fields.name().equalsIgnoreCase("${att.@name[0]!att.@class}")) { <#if att.@notnull[0]?? && att.@notnull[0] == "true"> if (!map.get(fields.name()).get("IS_NULLABLE").toString().equalsIgnoreCase("NO")) { out.print("${object.@name}." + fields.name()+ " can't have null values.
"); } <#else> if (!map.get(fields.name()).get("IS_NULLABLE").toString().equalsIgnoreCase("YES")) { out.print("${object.@name}." + fields.name()+ " can have null values.
"); } <#if att?node_name=="string" && att.@maxlength[0]??> if (Integer.parseInt(map.get(fields.name()).get("COLUMN_SIZE").toString()) != <#if att.@maxlength[0]?number > 65000><#if att.@maxlength[0]?number > 16000000>2147483647<#else>16777215<#else>${att.@maxlength[0]}) { out.print("${object.@name}." + fields.name()+ "'s maxlength do not match the database's.
"); } <#if att?node_name=="enum"> <#assign enumValue = "enum("> <#list att.element as value> <#assign enumValue = enumValue + "'" + "${value.@name}" + "'"> <#if value_has_next> <#assign enumValue = enumValue + "," > <#assign enumValue = enumValue + ")"> String enumValue = ""; rs = st.st.executeQuery("show columns from `${object.@name}` like '${att.@class?uncap_first}'"); while (rs.next()) { enumValue = rs.getString("Type"); } if (!enumValue.equals("${enumValue}")) { out.print("${object.@name}." + fields.name()+ "'s value ${enumValue} do not match the database's value " + enumValue + ".
"); } } } else { out.print("${object.@name}." + fields.name() + " does not exist or its sqltype does not match according to xml.
"); } } } catch (SQLException e) { l.log(SEVERE, "Failed to execute check ${object.@name}", e); throw new QueryException("failed to execute check ${object.@name?cap_first}", e); } finally { close(rs); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy