IDEMPIERE-5229 After migrate helper (FHCA-4070) (#1645)

- Fix NullPointerException when the customized record does not exist
- Fix reporting false positives on tables/columns not audited
This commit is contained in:
Carlos Ruiz 2023-01-18 22:36:22 +01:00 committed by GitHub
parent 89cd0be188
commit 54659001ff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 103 additions and 32 deletions

View File

@ -0,0 +1,19 @@
-- IDEMPIERE-5229 After migrate helper (FHCA-4070)
SELECT register_migration_script('202301182149_IDEMPIERE-5229.sql') FROM dual;
SET SQLBLANKLINES ON
SET DEFINE OFF
-- Jan 18, 2023, 9:49:34 PM CET
UPDATE AD_Column SET IsAllowLogging='N',Updated=TO_TIMESTAMP('2023-01-18 21:49:34','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=11427
;
-- Jan 18, 2023, 9:49:39 PM CET
UPDATE AD_Column SET IsAllowLogging='N',Updated=TO_TIMESTAMP('2023-01-18 21:49:39','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=11432
;
-- Jan 18, 2023, 10:23:34 PM CET
INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','A customized record does not exist in the database.
The column {0} was customized on {1,date,long} by {2} in record {3} that no longer exists',0,0,'Y',TO_TIMESTAMP('2023-01-18 22:23:34','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2023-01-18 22:23:34','YYYY-MM-DD HH24:MI:SS'),100,200819,'VM_CustomizedRecordDoesNotExist','D','bbe7b719-ba3e-42b3-8baf-7f7f1133697a')
;

View File

@ -0,0 +1,16 @@
-- IDEMPIERE-5229 After migrate helper (FHCA-4070)
SELECT register_migration_script('202301182149_IDEMPIERE-5229.sql') FROM dual;
-- Jan 18, 2023, 9:49:34 PM CET
UPDATE AD_Column SET IsAllowLogging='N',Updated=TO_TIMESTAMP('2023-01-18 21:49:34','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=11427
;
-- Jan 18, 2023, 9:49:39 PM CET
UPDATE AD_Column SET IsAllowLogging='N',Updated=TO_TIMESTAMP('2023-01-18 21:49:39','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=11432
;
-- Jan 18, 2023, 10:23:34 PM CET
INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','A customized record does not exist in the database.
The column {0} was customized on {1,date,long} by {2} in record {3} that no longer exists',0,0,'Y',TO_TIMESTAMP('2023-01-18 22:23:34','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2023-01-18 22:23:34','YYYY-MM-DD HH24:MI:SS'),100,200819,'VM_CustomizedRecordDoesNotExist','D','bbe7b719-ba3e-42b3-8baf-7f7f1133697a')
;

View File

@ -59,8 +59,10 @@ public class VerifyMigration extends SvrProcess {
/* Date To */ /* Date To */
private Timestamp p_DateTo = null; private Timestamp p_DateTo = null;
/* SeqNo */ /* SeqNo to insert into AD_VerifyMigration stepping 10 */
private int m_SeqNo = 0; private int m_SeqNo = 0;
/* Counter of records inserted in AD_VerifyMigration */
int m_cnt = 0;
@Override @Override
protected void prepare() { protected void prepare() {
@ -83,21 +85,18 @@ public class VerifyMigration extends SvrProcess {
if (log.isLoggable(Level.INFO)) if (log.isLoggable(Level.INFO))
log.info("DateTo" + p_DateTo); log.info("DateTo" + p_DateTo);
int cnt = 0; verifyCustomizationsInChangeLog();
cnt = cnt + verifyCustomizationsInChangeLog(); verifyCustomViewColumns();
cnt = cnt + verifyCustomViewColumns();
addLog(getAD_PInstance_ID(), null, null, Msg.getElement(getCtx(), MPInstance.COLUMNNAME_AD_PInstance_ID) + " " + getAD_PInstance_ID(), MPInstance.Table_ID, getAD_PInstance_ID()); addLog(getAD_PInstance_ID(), null, null, Msg.getElement(getCtx(), MPInstance.COLUMNNAME_AD_PInstance_ID) + " " + getAD_PInstance_ID(), MPInstance.Table_ID, getAD_PInstance_ID());
return "@Inserted@ " + cnt; return "@Inserted@ " + m_cnt;
} }
/** /**
* @return number of records inserted in AD_VerifyMigration * @return number of records inserted in AD_VerifyMigration
*/ */
private int verifyCustomizationsInChangeLog() { private void verifyCustomizationsInChangeLog() {
int cnt = 0;
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append("SELECT * "); sql.append("SELECT * ");
sql.append("FROM AD_ChangeLog cl "); sql.append("FROM AD_ChangeLog cl ");
@ -122,7 +121,32 @@ public class VerifyMigration extends SvrProcess {
MChangeLog cl = new MChangeLog(getCtx(), rs, get_TrxName()); MChangeLog cl = new MChangeLog(getCtx(), rs, get_TrxName());
MTable table = MTable.get(cl.getAD_Table_ID()); MTable table = MTable.get(cl.getAD_Table_ID());
MColumn column = MColumn.get(cl.getAD_Column_ID()); MColumn column = MColumn.get(cl.getAD_Column_ID());
if (!column.isAllowLogging() || !table.isChangeLog())
continue; // do not process as the table or column was marked as not logging
String tabcol = table.getTableName() + "." + column.getColumnName();
MUser user = MUser.get(cl.getCreatedBy());
PO po = table.getPO(cl.getRecord_ID(), get_TrxName()); PO po = table.getPO(cl.getRecord_ID(), get_TrxName());
if (po == null) {
// the customized record does not exist in the database
String msg = Msg.getMsg(getCtx(), "VM_CustomizedRecordDoesNotExist",
// A customized record does not exist in the database. The column {0} was customized on {1,date,long} by {2} in record {3} that no longer exists
new Object[] {
tabcol,
cl.getCreated(),
user.getName(),
cl.getRecord_ID()
});
addVerifyMigration(
cl.getAD_Table_ID(),
cl.getAD_Column_ID(),
cl.getRecord_ID(),
cl.getAD_ChangeLog_ID(),
msg,
null,
null,
MVerifyMigration.PRIORITYRULE_Medium);
continue;
}
Object currentValue = po.get_Value(column.getColumnName()); Object currentValue = po.get_Value(column.getColumnName());
String expectedValue = cl.getNewValue(); String expectedValue = cl.getNewValue();
// Report if there is a difference between the actual value in the database and the value changed by customization // Report if there is a difference between the actual value in the database and the value changed by customization
@ -130,8 +154,6 @@ public class VerifyMigration extends SvrProcess {
|| (currentValue != null && expectedValue == null) || (currentValue != null && expectedValue == null)
|| (currentValue != null && ! currentValue.toString().equals(expectedValue))) { || (currentValue != null && ! currentValue.toString().equals(expectedValue))) {
if (! MVerifyMigration.isIgnored(cl.getAD_ChangeLog_ID(), cl.getAD_Table_ID(), cl.getAD_Column_ID(), cl.getRecord_ID(), get_TrxName())) { if (! MVerifyMigration.isIgnored(cl.getAD_ChangeLog_ID(), cl.getAD_Table_ID(), cl.getAD_Column_ID(), cl.getRecord_ID(), get_TrxName())) {
String tabcol = table.getTableName() + "." + column.getColumnName();
MUser user = MUser.get(cl.getCreatedBy());
String msg = Msg.getMsg(getCtx(), "VM_ExpectedValueDiffersFromCurrentValue", String msg = Msg.getMsg(getCtx(), "VM_ExpectedValueDiffersFromCurrentValue",
// Expected Value differs from Current Value. The column {0} in record {1} was customized on {2,date,long} by {3} // Expected Value differs from Current Value. The column {0} in record {1} was customized on {2,date,long} by {3}
new Object[] { new Object[] {
@ -140,37 +162,28 @@ public class VerifyMigration extends SvrProcess {
cl.getCreated(), cl.getCreated(),
user.getName() user.getName()
}); });
m_SeqNo += 10; addVerifyMigration(
MVerifyMigration vm = new MVerifyMigration(
getCtx(),
getAD_PInstance_ID(),
cl.getAD_Table_ID(), cl.getAD_Table_ID(),
cl.getAD_Column_ID(), cl.getAD_Column_ID(),
cl.getRecord_ID(), cl.getRecord_ID(),
cl.getAD_ChangeLog_ID(), cl.getAD_ChangeLog_ID(),
msg, msg,
m_SeqNo,
currentValue, currentValue,
expectedValue, expectedValue,
MVerifyMigration.PRIORITYRULE_High, MVerifyMigration.PRIORITYRULE_High);
get_TrxName());
vm.saveEx();
cnt++;
} }
} }
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new DBException(e, sql.toString()); throw new DBException(e, sql.toString());
} }
return cnt;
} }
/** /**
* @return number of records inserted in AD_VerifyMigration * @return number of records inserted in AD_VerifyMigration
* @throws SQLException * @throws SQLException
*/ */
private int verifyCustomViewColumns() throws SQLException { private void verifyCustomViewColumns() throws SQLException {
int cnt = 0;
// custom view columns // custom view columns
List<MViewColumn> viewColumns = new Query(getCtx(), MViewColumn.Table_Name, "EntityType!='D'", get_TrxName()) List<MViewColumn> viewColumns = new Query(getCtx(), MViewColumn.Table_Name, "EntityType!='D'", get_TrxName())
.setOnlyActiveRecords(true) .setOnlyActiveRecords(true)
@ -211,22 +224,15 @@ public class VerifyMigration extends SvrProcess {
viewColumn.getCreated(), viewColumn.getCreated(),
user.getName() user.getName()
}); });
m_SeqNo += 10; addVerifyMigration(
MVerifyMigration vm = new MVerifyMigration(
getCtx(),
getAD_PInstance_ID(),
MViewColumn.Table_ID, MViewColumn.Table_ID,
-1, -1,
viewColumn.getAD_ViewColumn_ID(), viewColumn.getAD_ViewColumn_ID(),
-1, -1,
msg, msg,
m_SeqNo,
null, null,
null, null,
MVerifyMigration.PRIORITYRULE_High, MVerifyMigration.PRIORITYRULE_High);
get_TrxName());
vm.saveEx();
cnt++;
} }
} }
} finally { } finally {
@ -239,7 +245,37 @@ public class VerifyMigration extends SvrProcess {
} }
} }
} }
return cnt; }
/**
* Adds a record to verify migration
* @param tableId
* @param columnId
* @param recordId
* @param changeLogId
* @param msg
* @param currentValue
* @param expectedValue
* @param priorityRule
*/
private void addVerifyMigration(int tableId, int columnId, int recordId, int changeLogId, String msg,
Object currentValue, String expectedValue, String priorityRule) {
m_SeqNo += 10;
MVerifyMigration vm = new MVerifyMigration(
getCtx(),
getAD_PInstance_ID(),
tableId,
columnId,
recordId,
changeLogId,
msg,
m_SeqNo,
currentValue,
expectedValue,
priorityRule,
get_TrxName());
vm.saveEx();
m_cnt++;
} }
} }