package org.compiere.model;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.DisplayType;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.compiere.util.Util;
public class MColumn extends X_AD_Column
{
private static final long serialVersionUID = 6543789555737635129L;
public static I_AD_Column
setAD_Column(Properties ctx ,I_AD_Column column , String trxName)
{
MTable table = (MTable) column.getAD_Table();
M_Element element = new M_Element(ctx, column.getAD_Element_ID() , trxName);
if(element.getAD_Reference_ID() == DisplayType.ID)
{
String columnName = table.get_TableName()+"_ID";
if(!columnName.equals(element.getColumnName()) )
{
column.setAD_Reference_ID(DisplayType.TableDir);
}
}
String entityType = column.getAD_Table().getEntityType();
if(!MTable.ENTITYTYPE_Dictionary.equals(entityType))
column.setEntityType(entityType);
if(column.getColumnName() == null || column.getColumnName().length() <= 0)
column.setColumnName(element.getColumnName());
if(column.getFieldLength() <= 0 )
column.setFieldLength(element.getFieldLength());
if(column.getAD_Reference_ID() <= 0)
column.setAD_Reference_ID(element.getAD_Reference_ID());
if(column.getAD_Reference_Value_ID() <= 0)
column.setAD_Reference_Value_ID(element.getAD_Reference_Value_ID());
if(column.getName() == null || column.getName().length() <= 0)
column.setName(element.getName());
if(column.getDescription() == null || column.getDescription().length() <= 0)
column.setDescription(element.getDescription());
if(column.getHelp() == null || column.getHelp().length() <= 0)
column.setHelp(element.getHelp());
if(column.getColumnName().equals("Name") || column.getColumnName().equals("Value"))
{
column.setIsIdentifier(true);
int seqNo = DB.getSQLValue(trxName,"SELECT MAX(SeqNo) FROM AD_Column "+
"WHERE AD_Table_ID=?"+
" AND IsIdentifier='Y'",column.getAD_Table_ID());
column.setSeqNo(seqNo + 1);
}
return column;
}
public static MColumn
get (Properties ctx,
int AD_Column_ID)
{
Integer key = new Integer (AD_Column_ID);
MColumn retValue = (MColumn) s_cache.get (key);
if (retValue != null)
return retValue;
retValue = new MColumn (ctx, AD_Column_ID, null);
if (retValue.get_ID () != 0)
s_cache.put (key, retValue);
return retValue;
}
public static String
getColumnName (Properties ctx,
int AD_Column_ID)
{
MColumn col = MColumn.get(ctx, AD_Column_ID);
if (col.get_ID() == 0)
return null;
return col.getColumnName();
}
private static CCache<Integer,MColumn> s_cache = new CCache<Integer,MColumn>("AD_Column", 20);
private static CLogger s_log = CLogger.getCLogger (MColumn.class);
public MColumn (Properties ctx,
int AD_Column_ID, String trxName)
{
super (ctx, AD_Column_ID, trxName);
if (AD_Column_ID == 0)
{
setIsAlwaysUpdateable (false);
setIsEncrypted (false);
setIsIdentifier (false);
setIsKey (false);
setIsMandatory (false);
setIsParent (false);
setIsSelectionColumn (false);
setIsTranslated (false);
setIsUpdateable (true);
setVersion (Env.ZERO);
}
}
public MColumn (Properties ctx, ResultSet rs, String trxName)
{
super(ctx, rs, trxName);
}
{
this (parent.getCtx(), 0, parent.get_TrxName());
setClientOrg(parent);
setAD_Table_ID (parent.getAD_Table_ID());
setEntityType(parent.getEntityType());
}
public MColumn (MTable parent, String columnName,
int length ,
int AD_Reference , String defaultValue)
{
this (parent.getCtx(), 0, parent.get_TrxName());
setClientOrg(parent);
setAD_Table_ID (parent.getAD_Table_ID());
setEntityType(parent.getEntityType());
setColumnName(columnName);
M_Element AD_Element = M_Element.get(getCtx(),columnName);
if(AD_Element != null )
{
setAD_Element_ID(AD_Element.get_ID());
}
setName(columnName);
setIsActive(true);
setVersion(Env.ONE);
setIsMandatory(true);
setIsAllowLogging(true);
setFieldLength(length);
setAD_Reference_ID(AD_Reference);
setDefaultValue(defaultValue);
setUpdateable(false);
}
{
String columnName = getColumnName();
if (columnName.equals("AD_Client_ID")
|| columnName.equals("AD_Org_ID")
|| columnName.equals("IsActive")
|| columnName.startsWith("Created")
|| columnName.startsWith("Updated") )
return true;
return false;
}
{
String s = getColumnSQL();
return s != null && s.length() > 0;
}
{
String s = getIsEncrypted();
return "Y".equals(s);
}
{
setIsEncrypted (IsEncrypted ? "Y" : "N");
}
{
if(newRecord)
setAD_Column(getCtx(), this, get_TrxName());
int displayType = getAD_Reference_ID();
if (DisplayType.isLOB(displayType))
{
if (getFieldLength() != 0)
setFieldLength(0);
}
else if (getFieldLength() == 0)
{
if (DisplayType.isID(displayType))
setFieldLength(10);
else if (DisplayType.isNumeric (displayType))
setFieldLength(14);
else if (DisplayType.isDate (displayType))
setFieldLength(7);
else
{
log.saveError("FillMandatory", Msg.getElement(getCtx(), "FieldLength"));
return false;
}
}
if (isIdentifier())
{
int cnt = DB.getSQLValue(get_TrxName(),"SELECT COUNT(*) FROM AD_Column "+
"WHERE AD_Table_ID=?"+
" AND AD_Column_ID!=?"+
" AND IsIdentifier='Y'"+
" AND SeqNo=?",
new Object[] {getAD_Table_ID(), getAD_Column_ID(), getSeqNo()});
if (cnt>0)
{
log.saveError("SaveErrorNotUnique", Msg.getElement(getCtx(), COLUMNNAME_SeqNo));
return false;
}
}
if (isVirtualColumn())
{
if (isMandatory())
setIsMandatory(false);
if (isUpdateable())
setIsUpdateable(false);
}
if (isParent() || isKey())
setIsUpdateable(false);
if (isAlwaysUpdateable() && !isUpdateable())
setIsAlwaysUpdateable(false);
if (isEncrypted())
{
int dt = getAD_Reference_ID();
if (isKey() || isParent() || isStandardColumn()
|| isVirtualColumn() || isIdentifier() || isTranslated()
|| DisplayType.isLookup(dt) || DisplayType.isLOB(dt)
|| "DocumentNo".equalsIgnoreCase(getColumnName())
|| "Value".equalsIgnoreCase(getColumnName())
|| "Name".equalsIgnoreCase(getColumnName()))
{
log.warning("Encryption not sensible - " + getColumnName());
setIsEncrypted(false);
}
}
if ((newRecord || is_ValueChanged ("AD_Element_ID"))
&& getAD_Element_ID() != 0)
{
M_Element element = new M_Element (getCtx(), getAD_Element_ID (), get_TrxName());
setColumnName (element.getColumnName());
setName (element.getName());
setDescription (element.getDescription());
setHelp (element.getHelp());
}
return true;
}
protected boolean afterSave (
boolean newRecord,
boolean success)
{
if (!newRecord)
{
if ( is_ValueChanged(MColumn.COLUMNNAME_Name)
|| is_ValueChanged(MColumn.COLUMNNAME_Description)
|| is_ValueChanged(MColumn.COLUMNNAME_Help)
) {
StringBuffer sql = new StringBuffer("UPDATE AD_Field SET Name=")
.append(DB.TO_STRING(getName()))
.append(", Description=").append(DB.TO_STRING(getDescription()))
.append(", Help=").append(DB.TO_STRING(getHelp()))
.append(" WHERE AD_Column_ID=").append(get_ID())
.append(" AND IsCentrallyMaintained='Y'");
int no = DB.executeUpdate(sql.toString(), get_TrxName());
log.fine("afterSave - Fields updated #" + no);
}
}
return success;
}
{
StringBuffer sql = new StringBuffer ("ALTER TABLE ")
.append(table.getTableName())
.append(" ADD ").append(getSQLDDL());
String constraint = getConstraint(table.getTableName());
if (constraint != null && constraint.length() > 0) {
sql.append(DB.SQLSTATEMENT_SEPARATOR).append("ALTER TABLE ")
.append(table.getTableName())
.append(" ADD ").append(constraint);
}
return sql.toString();
}
{
if (isVirtualColumn())
return null;
StringBuffer sql = new StringBuffer (getColumnName())
.append(" ").append(getSQLDataType());
String defaultValue = getDefaultValue();
if (defaultValue != null
&& defaultValue.length() > 0
&& defaultValue.indexOf('@') == -1
&& ( ! (DisplayType.isID(getAD_Reference_ID()) && defaultValue.equals("-1") ) ) )
{
if (DisplayType.isText(getAD_Reference_ID())
|| getAD_Reference_ID() == DisplayType.List
|| getAD_Reference_ID() == DisplayType.YesNo
|| getColumnName().equals("EntityType") || getColumnName().equals("AD_Language")
|| (getAD_Reference_ID() == DisplayType.Button &&
!(getColumnName().endsWith("_ID"))))
{
if (!defaultValue.startsWith("'") && !defaultValue.endsWith("'"))
defaultValue = DB.TO_STRING(defaultValue);
}
sql.append(" DEFAULT ").append(defaultValue);
}
else
{
if (! isMandatory())
sql.append(" DEFAULT NULL ");
defaultValue = null;
}
if (getAD_Reference_ID() == DisplayType.YesNo)
sql.append(" CHECK (").append(getColumnName()).append(" IN ('Y','N'))");
if (isMandatory())
sql.append(" NOT NULL");
return sql.toString();
}
public String
getSQLModify (MTable table,
boolean setNullOption)
{
StringBuffer sql = new StringBuffer();
StringBuffer sqlBase = new StringBuffer ("ALTER TABLE ")
.append(table.getTableName())
.append(" MODIFY ").append(getColumnName());
StringBuffer sqlDefault = new StringBuffer(sqlBase)
.append(" ").append(getSQLDataType());
String defaultValue = getDefaultValue();
if (defaultValue != null
&& defaultValue.length() > 0
&& defaultValue.indexOf('@') == -1
&& ( ! (DisplayType.isID(getAD_Reference_ID()) && defaultValue.equals("-1") ) ) )
{
if (DisplayType.isText(getAD_Reference_ID())
|| getAD_Reference_ID() == DisplayType.List
|| getAD_Reference_ID() == DisplayType.YesNo
|| getColumnName().equals("EntityType") || getColumnName().equals("AD_Language")
|| (getAD_Reference_ID() == DisplayType.Button &&
!(getColumnName().endsWith("_ID"))))
{
if (!defaultValue.startsWith("'") && !defaultValue.endsWith("'"))
defaultValue = DB.TO_STRING(defaultValue);
}
sqlDefault.append(" DEFAULT ").append(defaultValue);
}
else
{
if (! isMandatory())
sqlDefault.append(" DEFAULT NULL ");
defaultValue = null;
}
sql.append(sqlDefault);
if (isMandatory() && defaultValue != null && defaultValue.length() > 0)
{
StringBuffer sqlSet = new StringBuffer("UPDATE ")
.append(table.getTableName())
.append(" SET ").append(getColumnName())
.append("=").append(defaultValue)
.append(" WHERE ").append(getColumnName()).append(" IS NULL");
sql.append(DB.SQLSTATEMENT_SEPARATOR).append(sqlSet);
}
if (setNullOption)
{
StringBuffer sqlNull = new StringBuffer(sqlBase);
if (isMandatory())
sqlNull.append(" NOT NULL");
else
sqlNull.append(" NULL");
sql.append(DB.SQLSTATEMENT_SEPARATOR).append(sqlNull);
}
return sql.toString();
}
{
String columnName = getColumnName();
int dt = getAD_Reference_ID();
return DisplayType.getSQLDataType (dt, columnName, getFieldLength());
}
{
if (isKey()) {
String constraintName;
if (tableName.length() > 26)
constraintName = tableName.substring(0, 26) + "_Key";
else
constraintName = tableName + "_Key";
return "CONSTRAINT " + constraintName + " PRIMARY KEY (" + getColumnName() + ")";
}
return "";
}
{
StringBuffer sb = new StringBuffer ("MColumn[");
sb.append (get_ID()).append ("-").append (getColumnName()).append ("]");
return sb.toString ();
}
public static int getColumn_ID(String TableName,String columnName) {
int m_table_id = MTable.getTable_ID(TableName);
if (m_table_id == 0)
return 0;
int retValue = 0;
String SQL = "SELECT AD_Column_ID FROM AD_Column WHERE AD_Table_ID = ? AND columnname = ?";
try
{
PreparedStatement pstmt = DB.prepareStatement(SQL, null);
pstmt.setInt(1, m_table_id);
pstmt.setString(2, columnName);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
retValue = rs.getInt(1);
rs.close();
pstmt.close();
}
catch (SQLException e)
{
s_log.log(Level.SEVERE, SQL, e);
retValue = -1;
}
return retValue;
}
public static int getTable_ID(Properties ctx,
int AD_Column_ID, String trxName)
{
String sqlStmt = "SELECT AD_Table_ID FROM AD_Column WHERE AD_Column_ID=?";
return DB.getSQLValue(trxName, sqlStmt, AD_Column_ID);
}
{
if (Util.isEmpty(columnName, true))
return false;
if (columnName.equals("Value") || (!caseSensitive && columnName.equalsIgnoreCase("Value")))
return true;
else if (columnName.equals("Name") || (!caseSensitive && columnName.equalsIgnoreCase("Name")))
return true;
else if (columnName.equals("DocumentNo") || (!caseSensitive && columnName.equalsIgnoreCase("DocumentNo")))
return true;
else if (columnName.equals("Description") || (!caseSensitive && columnName.equalsIgnoreCase("Description")))
return true;
else if (columnName.indexOf("Name") != -1
|| (!caseSensitive && columnName.toUpperCase().indexOf("Name".toUpperCase()) != -1) )
return true;
else
return false;
}
}