IDEMPIERE-4824 Boolean Logic Expression Enhancements (#719)
add validation for boolean logic expression in AD
This commit is contained in:
parent
bb0ef7ebb3
commit
401707361d
|
@ -28,7 +28,19 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
|
|||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.compiere.model.MColumn;
|
||||
import org.compiere.model.MTable;
|
||||
import org.compiere.model.PO;
|
||||
import org.compiere.model.Query;
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.Evaluatee;
|
||||
import org.compiere.util.LegacyLogicEvaluator;
|
||||
|
@ -439,6 +451,47 @@ public class LogicExpressionTest extends AbstractTestCase {
|
|||
assertTrue(LogicEvaluator.evaluateLogic(evaluatee, expr));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidateAD() {
|
||||
String[] columns = {"MandatoryLogic","DocValueLogic","ReadOnlyLogic","DisplayLogic","ZoomLogic"};
|
||||
Query query = new Query(Env.getCtx(), MColumn.Table_Name, "AD_Column_ID < 1000000 AND ColumnName=?", getTrxName());
|
||||
query.setOnlyActiveRecords(true);
|
||||
List<Exception> exceptions = new ArrayList<Exception>();
|
||||
for(String column : columns) {
|
||||
List<MColumn> list = query.setParameters(column).list();
|
||||
for(MColumn mc : list) {
|
||||
MTable table = MTable.get(mc.getAD_Table_ID());
|
||||
if (!table.isActive() || table.getAD_Table_ID() >= 1000000)
|
||||
continue;
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append("SELECT * ")
|
||||
.append(" FROM ")
|
||||
.append(table.getTableName())
|
||||
.append(" WHERE ")
|
||||
.append(mc.getColumnName())
|
||||
.append(" IS NOT NULL");
|
||||
try (PreparedStatement stmt = DB.prepareStatement(builder.toString(), getTrxName())) {
|
||||
ResultSet rs = stmt.executeQuery();
|
||||
while (rs.next()) {
|
||||
String expr = rs.getString(mc.getColumnName());
|
||||
if (expr.startsWith("@SQL=") || expr.startsWith("SQL="))
|
||||
continue;
|
||||
try {
|
||||
LogicEvaluator.validate(expr);
|
||||
} catch (Exception e) {
|
||||
PO po = table.getPO(rs, getTrxName());
|
||||
System.out.println(po.toString()+", " + table.getTableName()+"."+mc.getColumnName()+" = " + expr);
|
||||
exceptions.add(e);
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
fail(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
assertTrue(exceptions.isEmpty(), "Found " + exceptions.size() + " logic expression with invalid syntax in AD");
|
||||
}
|
||||
|
||||
private static class ContextEvaluatee implements Evaluatee {
|
||||
|
||||
@Override
|
||||
|
|
Loading…
Reference in New Issue