From 6302f6f5fd7c60771e6c603422edab1f269fd1df Mon Sep 17 00:00:00 2001 From: hengsin Date: Thu, 8 Feb 2024 17:38:28 +0800 Subject: [PATCH] IDEMPIERE-6029 Extract @SQL= and @SQLFIND= to constant (#2230) --- .../src/org/compiere/model/GridField.java | 30 +++++++++---------- .../src/org/compiere/model/GridFieldVO.java | 2 +- .../src/org/compiere/model/InfoRelatedVO.java | 2 +- .../compiere/model/LookupDisplayColumn.java | 2 +- .../src/org/compiere/model/MColumn.java | 18 ++++++----- .../src/org/compiere/model/MField.java | 6 ++-- .../org/compiere/model/MLookupFactory.java | 2 +- .../src/org/compiere/model/MProcessPara.java | 4 +-- .../src/org/compiere/model/MUserDefField.java | 6 ++-- .../src/org/compiere/model/MUserQuery.java | 4 +-- .../src/org/compiere/model/POInfo.java | 10 +++---- .../src/org/compiere/print/DataEngine.java | 9 +++--- .../server/org/compiere/server/Scheduler.java | 3 +- .../webui/adwindow/ToolbarCustomButton.java | 5 ++-- .../webui/adwindow/ToolbarProcessButton.java | 3 +- .../webui/desktop/DashboardController.java | 3 +- .../webui/panel/InfoGeneralPanel.java | 2 +- .../adempiere/webui/window/FindWindow.java | 2 +- .../org/compiere/print/DrillReportCtl.java | 3 +- .../test/base/LogicExpressionTest.java | 2 +- .../src/org/idempiere/test/base/POTest.java | 28 +++++++++++++++++ .../webservices/AbstractService.java | 3 +- 22 files changed, 94 insertions(+), 55 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/GridField.java b/org.adempiere.base/src/org/compiere/model/GridField.java index de545580e9..69ac181f94 100644 --- a/org.adempiere.base/src/org/compiere/model/GridField.java +++ b/org.adempiere.base/src/org/compiere/model/GridField.java @@ -304,7 +304,7 @@ public class GridField Evaluator.parseDepends(list, m_vo.ReadOnlyLogic); Evaluator.parseDepends(list, m_vo.MandatoryLogic); // Virtual UI Column - if (m_vo.ColumnSQL != null && m_vo.ColumnSQL.length() > 0 && m_vo.ColumnSQL.startsWith("@SQL=")) + if (m_vo.ColumnSQL != null && m_vo.ColumnSQL.length() > 0 && m_vo.ColumnSQL.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) Evaluator.parseDepends(list, m_vo.ColumnSQL.substring(5)); // Lookup if (m_lookup != null) @@ -349,7 +349,7 @@ public class GridField if (checkContext && m_vo.MandatoryLogic.length() > 0) { boolean retValue = false; - if (m_vo.MandatoryLogic != null && m_vo.MandatoryLogic.startsWith("@SQL=")) { + if (m_vo.MandatoryLogic != null && m_vo.MandatoryLogic.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { retValue = Evaluator.parseSQLLogic(m_vo.MandatoryLogic, m_vo.ctx, m_vo.WindowNo, m_vo.TabNo, m_vo.ColumnName); } else{ @@ -390,7 +390,7 @@ public class GridField public boolean isEditablePara(boolean checkContext) { if (checkContext && m_vo.ReadOnlyLogic.length() > 0) { - if (m_vo.ReadOnlyLogic.startsWith("@SQL=")) + if (m_vo.ReadOnlyLogic.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { boolean retValue = !Evaluator.parseSQLLogic(m_vo.ReadOnlyLogic, m_vo.ctx, m_vo.WindowNo, m_vo.TabNo, m_vo.ColumnName); if (!retValue) @@ -462,7 +462,7 @@ public class GridField if (checkContext && m_vo.AlwaysUpdatableLogic.length() > 0) { boolean isAlwaysUpdatable = false; - if (m_vo.AlwaysUpdatableLogic.startsWith("@SQL=")) { + if (m_vo.AlwaysUpdatableLogic.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { isAlwaysUpdatable = Evaluator.parseSQLLogic(m_vo.AlwaysUpdatableLogic, ctx, m_vo.WindowNo, m_vo.TabNo, m_vo.ColumnName); } else { @@ -543,7 +543,7 @@ public class GridField // Do we have a readonly rule if (checkContext && m_vo.ReadOnlyLogic.length() > 0) { - if (m_vo.ReadOnlyLogic.startsWith("@SQL=")) + if (m_vo.ReadOnlyLogic.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { boolean retValue = !Evaluator.parseSQLLogic(m_vo.ReadOnlyLogic, ctx, m_vo.WindowNo, m_vo.TabNo, m_vo.ColumnName); if (!retValue) @@ -821,7 +821,7 @@ public class GridField * (b) SQL Statement (for data integity & consistency) */ String defStr = ""; - if (m_vo.DefaultValue != null && m_vo.DefaultValue.startsWith("@SQL=")) + if (m_vo.DefaultValue != null && m_vo.DefaultValue.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { String sql = m_vo.DefaultValue.substring(5); // w/o tag //hengsin, capture unparseable error to avoid subsequent sql exception @@ -878,7 +878,7 @@ public class GridField /** * (c) Field DefaultValue === similar code in AStartRPDialog.getDefault === */ - if (m_vo.DefaultValue != null && !m_vo.DefaultValue.equals("") && !m_vo.DefaultValue.startsWith("@SQL=")) + if (m_vo.DefaultValue != null && !m_vo.DefaultValue.equals("") && !m_vo.DefaultValue.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { String defStr = ""; // problem is with texts like 'sss;sss' // It is one or more variables/constants @@ -1297,7 +1297,7 @@ public class GridField // ** dynamic content ** if (checkContext) { - if (m_vo.DisplayLogic.startsWith("@SQL=")) { + if (m_vo.DisplayLogic.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { return Evaluator.parseSQLLogic(m_vo.DisplayLogic, m_vo.ctx, m_vo.WindowNo, m_vo.TabNo, m_vo.ColumnName); } Evaluatee evaluatee = new Evaluatee() { @@ -1342,7 +1342,7 @@ public class GridField // ** dynamic content ** if (checkContext) { - if (m_vo.DisplayLogic.startsWith("@SQL=")) { + if (m_vo.DisplayLogic.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { return Evaluator.parseSQLLogic(m_vo.DisplayLogic, ctx, m_vo.WindowNo, m_vo.TabNo, m_vo.ColumnName); } Evaluatee evaluatee = new Evaluatee() { @@ -1434,7 +1434,7 @@ public class GridField if (m_vo.ColumnSQL != null && m_vo.ColumnSQL.length() > 0) { String query; - if (m_vo.ColumnSQL.startsWith("@SQL=") || m_vo.ColumnSQL.startsWith("@SQLFIND=")) + if (m_vo.ColumnSQL.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX) || m_vo.ColumnSQL.startsWith(MColumn.VIRTUAL_SEARCH_COLUMN_PREFIX)) query = "NULL"; else query = m_vo.ColumnSQL; @@ -1455,9 +1455,9 @@ public class GridField if (m_vo.ColumnSQL != null && m_vo.ColumnSQL.length() > 0) { String query; - if (m_vo.ColumnSQL.startsWith("@SQL=")) + if (m_vo.ColumnSQL.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) query = "NULL"; - else if (m_vo.ColumnSQL.startsWith("@SQLFIND=")) + else if (m_vo.ColumnSQL.startsWith(MColumn.VIRTUAL_SEARCH_COLUMN_PREFIX)) query = m_vo.ColumnSQL.substring(9); else query = m_vo.ColumnSQL; @@ -1481,7 +1481,7 @@ public class GridField */ public boolean isVirtualDBColumn() { - return (m_vo.ColumnSQL != null && m_vo.ColumnSQL.length() > 0 && !m_vo.ColumnSQL.startsWith("@SQL=")); + return (m_vo.ColumnSQL != null && m_vo.ColumnSQL.length() > 0 && !m_vo.ColumnSQL.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)); } // isVirtualDBColumn /** @@ -1490,7 +1490,7 @@ public class GridField */ public boolean isVirtualUIColumn() { - return (m_vo.ColumnSQL != null && m_vo.ColumnSQL.length() > 0 && m_vo.ColumnSQL.startsWith("@SQL=")); + return (m_vo.ColumnSQL != null && m_vo.ColumnSQL.length() > 0 && m_vo.ColumnSQL.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)); } // isVirtualUIColumn /** @@ -1499,7 +1499,7 @@ public class GridField */ public boolean isVirtualSearchColumn() { - return (m_vo.ColumnSQL != null && m_vo.ColumnSQL.length() > 0 && m_vo.ColumnSQL.startsWith("@SQLFIND=")); + return (m_vo.ColumnSQL != null && m_vo.ColumnSQL.length() > 0 && m_vo.ColumnSQL.startsWith(MColumn.VIRTUAL_SEARCH_COLUMN_PREFIX)); } // isVirtualDBColumn /** diff --git a/org.adempiere.base/src/org/compiere/model/GridFieldVO.java b/org.adempiere.base/src/org/compiere/model/GridFieldVO.java index f5e1b0d14a..853b42eff3 100644 --- a/org.adempiere.base/src/org/compiere/model/GridFieldVO.java +++ b/org.adempiere.base/src/org/compiere/model/GridFieldVO.java @@ -280,7 +280,7 @@ public class GridFieldVO implements Serializable, Cloneable vo.IsQuickForm = "Y".equals(rs.getString ("IsQuickForm")); { vo.ColumnSQL = rs.getString("ColumnSQL"); - if (vo.ColumnSQL != null && !vo.ColumnSQL.startsWith("@SQL=") && !vo.ColumnSQL.startsWith("@SQLFIND=") && vo.ColumnSQL.contains("@")) { + if (vo.ColumnSQL != null && !vo.ColumnSQL.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX) && !vo.ColumnSQL.startsWith(MColumn.VIRTUAL_SEARCH_COLUMN_PREFIX) && vo.ColumnSQL.contains("@")) { // NOTE: cannot use window context because this is set globally on the query, not per record vo.ColumnSQL = Env.parseContext(ctx, -1, vo.ColumnSQL, false, true); } diff --git a/org.adempiere.base/src/org/compiere/model/InfoRelatedVO.java b/org.adempiere.base/src/org/compiere/model/InfoRelatedVO.java index 43c3914b03..a92666c80d 100644 --- a/org.adempiere.base/src/org/compiere/model/InfoRelatedVO.java +++ b/org.adempiere.base/src/org/compiere/model/InfoRelatedVO.java @@ -217,7 +217,7 @@ public class InfoRelatedVO implements Serializable, Cloneable, IInfoColumn { if (Util.isEmpty(getDisplayLogic())) return true; - if (getDisplayLogic().startsWith("@SQL=")) { + if (getDisplayLogic().startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { return Evaluator.parseSQLLogic(DisplayLogic, ctx, WindowNo, 0, infoRelated.toString()); } Evaluatee evaluatee = new Evaluatee() { diff --git a/org.adempiere.base/src/org/compiere/model/LookupDisplayColumn.java b/org.adempiere.base/src/org/compiere/model/LookupDisplayColumn.java index 06e5f2b946..c6251f8ec6 100644 --- a/org.adempiere.base/src/org/compiere/model/LookupDisplayColumn.java +++ b/org.adempiere.base/src/org/compiere/model/LookupDisplayColumn.java @@ -66,7 +66,7 @@ public class LookupDisplayColumn implements Serializable IsTranslated = isTranslated; DisplayType = ad_Reference_ID; AD_Reference_ID = ad_Reference_Value_ID; - if (columnSQL != null && columnSQL.length() > 0 && (columnSQL.startsWith("@SQL=") || columnSQL.startsWith("@SQLFIND="))) + if (columnSQL != null && columnSQL.length() > 0 && (columnSQL.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX) || columnSQL.startsWith(MColumn.VIRTUAL_SEARCH_COLUMN_PREFIX))) ColumnSQL = "NULL"; else ColumnSQL = columnSQL; diff --git a/org.adempiere.base/src/org/compiere/model/MColumn.java b/org.adempiere.base/src/org/compiere/model/MColumn.java index 4358dc9d72..30b422bbdc 100644 --- a/org.adempiere.base/src/org/compiere/model/MColumn.java +++ b/org.adempiere.base/src/org/compiere/model/MColumn.java @@ -51,6 +51,10 @@ import org.idempiere.expression.logic.LogicEvaluator; */ public class MColumn extends X_AD_Column implements ImmutablePOSupport { + public static final String VIRTUAL_SEARCH_COLUMN_PREFIX = "@SQLFIND="; + + public static final String VIRTUAL_UI_COLUMN_PREFIX = "@SQL="; + /** * generated serial id */ @@ -311,7 +315,7 @@ public class MColumn extends X_AD_Column implements ImmutablePOSupport public boolean isVirtualDBColumn() { String s = getColumnSQL(); - return s != null && s.length() > 0 && !s.startsWith("@SQL="); + return s != null && s.length() > 0 && !s.startsWith(VIRTUAL_UI_COLUMN_PREFIX) && !s.startsWith(VIRTUAL_SEARCH_COLUMN_PREFIX); } // isVirtualDBColumn /** @@ -321,7 +325,7 @@ public class MColumn extends X_AD_Column implements ImmutablePOSupport public boolean isVirtualUIColumn() { String s = getColumnSQL(); - return s != null && s.length() > 0 && s.startsWith("@SQL="); + return s != null && s.length() > 0 && s.startsWith(VIRTUAL_UI_COLUMN_PREFIX); } // isVirtualUIColumn /** @@ -331,7 +335,7 @@ public class MColumn extends X_AD_Column implements ImmutablePOSupport public boolean isVirtualSearchColumn() { String s = getColumnSQL(); - return s != null && s.length() > 0 && s.startsWith("@SQLFIND="); + return s != null && s.length() > 0 && s.startsWith(VIRTUAL_SEARCH_COLUMN_PREFIX); } // isVirtualSearchColumn /** @@ -540,7 +544,7 @@ public class MColumn extends X_AD_Column implements ImmutablePOSupport //validate readonly logic expression if (newRecord || is_ValueChanged(COLUMNNAME_ReadOnlyLogic)) { - if (isActive() && !Util.isEmpty(getReadOnlyLogic(), true) && !getReadOnlyLogic().startsWith("@SQL=")) { + if (isActive() && !Util.isEmpty(getReadOnlyLogic(), true) && !getReadOnlyLogic().startsWith(VIRTUAL_UI_COLUMN_PREFIX)) { LogicEvaluator.validate(getReadOnlyLogic()); } } @@ -1375,11 +1379,11 @@ public class MColumn extends X_AD_Column implements ImmutablePOSupport public String getColumnSQL(boolean nullForUI, boolean nullForSearch) { String query = getColumnSQL(); if (query != null && query.length() > 0) { - if (query.startsWith("@SQL=") && nullForUI) + if (query.startsWith(VIRTUAL_UI_COLUMN_PREFIX) && nullForUI) query = "NULL"; - else if (query.startsWith("@SQLFIND=") && nullForSearch) + else if (query.startsWith(VIRTUAL_SEARCH_COLUMN_PREFIX) && nullForSearch) query = "NULL"; - else if (query.startsWith("@SQLFIND=") && !nullForSearch) + else if (query.startsWith(VIRTUAL_SEARCH_COLUMN_PREFIX) && !nullForSearch) query = query.substring(9); } return query; diff --git a/org.adempiere.base/src/org/compiere/model/MField.java b/org.adempiere.base/src/org/compiere/model/MField.java index 4c21f3cacb..14a4d638fa 100644 --- a/org.adempiere.base/src/org/compiere/model/MField.java +++ b/org.adempiere.base/src/org/compiere/model/MField.java @@ -236,17 +236,17 @@ public class MField extends X_AD_Field implements ImmutablePOSupport //validate logic expression if (newRecord || is_ValueChanged(COLUMNNAME_ReadOnlyLogic)) { - if (isActive() && !Util.isEmpty(getReadOnlyLogic(), true) && !getReadOnlyLogic().startsWith("@SQL=")) { + if (isActive() && !Util.isEmpty(getReadOnlyLogic(), true) && !getReadOnlyLogic().startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { LogicEvaluator.validate(getReadOnlyLogic()); } } if (newRecord || is_ValueChanged(COLUMNNAME_DisplayLogic)) { - if (isActive() && !Util.isEmpty(getDisplayLogic(), true) && !getDisplayLogic().startsWith("@SQL=")) { + if (isActive() && !Util.isEmpty(getDisplayLogic(), true) && !getDisplayLogic().startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { LogicEvaluator.validate(getDisplayLogic()); } } if (newRecord || is_ValueChanged(COLUMNNAME_MandatoryLogic)) { - if (isActive() && !Util.isEmpty(getMandatoryLogic(), true) && !getMandatoryLogic().startsWith("@SQL=")) { + if (isActive() && !Util.isEmpty(getMandatoryLogic(), true) && !getMandatoryLogic().startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { LogicEvaluator.validate(getMandatoryLogic()); } } diff --git a/org.adempiere.base/src/org/compiere/model/MLookupFactory.java b/org.adempiere.base/src/org/compiere/model/MLookupFactory.java index caaf9835ec..dc7e5cf864 100644 --- a/org.adempiere.base/src/org/compiere/model/MLookupFactory.java +++ b/org.adempiere.base/src/org/compiere/model/MLookupFactory.java @@ -436,7 +436,7 @@ public class MLookupFactory ZoomWindow = rs.getInt(8); ZoomWindowPO = rs.getInt(9); displayColumnSQL = rs.getString(11); - if (displayColumnSQL != null && displayColumnSQL.length() > 0 && (displayColumnSQL.startsWith("@SQL=") || displayColumnSQL.startsWith("@SQLFIND="))) + if (displayColumnSQL != null && displayColumnSQL.length() > 0 && (displayColumnSQL.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX) || displayColumnSQL.startsWith(MColumn.VIRTUAL_SEARCH_COLUMN_PREFIX))) displayColumnSQL = "NULL"; if (displayColumnSQL != null && displayColumnSQL.contains("@")) displayColumnSQL = Env.parseContext(Env.getCtx(), -1, displayColumnSQL, false, true); diff --git a/org.adempiere.base/src/org/compiere/model/MProcessPara.java b/org.adempiere.base/src/org/compiere/model/MProcessPara.java index 6df69ed8ae..2d2a7a5e53 100644 --- a/org.adempiere.base/src/org/compiere/model/MProcessPara.java +++ b/org.adempiere.base/src/org/compiere/model/MProcessPara.java @@ -358,12 +358,12 @@ public class MProcessPara extends X_AD_Process_Para implements ImmutablePOSuppor //validate logic expression if (newRecord || is_ValueChanged(COLUMNNAME_ReadOnlyLogic)) { - if (isActive() && !Util.isEmpty(getReadOnlyLogic(), true) && !getReadOnlyLogic().startsWith("@SQL=")) { + if (isActive() && !Util.isEmpty(getReadOnlyLogic(), true) && !getReadOnlyLogic().startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { LogicEvaluator.validate(getReadOnlyLogic()); } } if (newRecord || is_ValueChanged(COLUMNNAME_DisplayLogic)) { - if (isActive() && !Util.isEmpty(getDisplayLogic(), true) && !getDisplayLogic().startsWith("@SQL=")) { + if (isActive() && !Util.isEmpty(getDisplayLogic(), true) && !getDisplayLogic().startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { LogicEvaluator.validate(getDisplayLogic()); } } diff --git a/org.adempiere.base/src/org/compiere/model/MUserDefField.java b/org.adempiere.base/src/org/compiere/model/MUserDefField.java index 0ab4059d0f..834b9f6f54 100644 --- a/org.adempiere.base/src/org/compiere/model/MUserDefField.java +++ b/org.adempiere.base/src/org/compiere/model/MUserDefField.java @@ -213,17 +213,17 @@ public class MUserDefField extends X_AD_UserDef_Field implements ImmutablePOSupp //validate logic expression if (newRecord || is_ValueChanged(COLUMNNAME_ReadOnlyLogic)) { - if (isActive() && !Util.isEmpty(getReadOnlyLogic(), true) && !getReadOnlyLogic().startsWith("@SQL=")) { + if (isActive() && !Util.isEmpty(getReadOnlyLogic(), true) && !getReadOnlyLogic().startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { LogicEvaluator.validate(getReadOnlyLogic()); } } if (newRecord || is_ValueChanged(COLUMNNAME_DisplayLogic)) { - if (isActive() && !Util.isEmpty(getDisplayLogic(), true) && !getDisplayLogic().startsWith("@SQL=")) { + if (isActive() && !Util.isEmpty(getDisplayLogic(), true) && !getDisplayLogic().startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { LogicEvaluator.validate(getDisplayLogic()); } } if (newRecord || is_ValueChanged(COLUMNNAME_MandatoryLogic)) { - if (isActive() && !Util.isEmpty(getMandatoryLogic(), true) && !getMandatoryLogic().startsWith("@SQL=")) { + if (isActive() && !Util.isEmpty(getMandatoryLogic(), true) && !getMandatoryLogic().startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { LogicEvaluator.validate(getMandatoryLogic()); } } diff --git a/org.adempiere.base/src/org/compiere/model/MUserQuery.java b/org.adempiere.base/src/org/compiere/model/MUserQuery.java index b5cc511fe5..7f4253134a 100644 --- a/org.adempiere.base/src/org/compiere/model/MUserQuery.java +++ b/org.adempiere.base/src/org/compiere/model/MUserQuery.java @@ -340,7 +340,7 @@ public class MUserQuery extends X_AD_UserQuery get_Value(COLUMNNAME_AD_User_ID) == null) //Cannot save privately (user-specific) an already existing global query return false; - return !getCode().startsWith("@SQL="); + return !getCode().startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX); } /** @@ -353,7 +353,7 @@ public class MUserQuery extends X_AD_UserQuery getAD_Client_ID() != Env.getAD_Client_ID(Env.getCtx())) //Cannot modify a query from another client (e.g. System) return false; - return !getCode().startsWith("@SQL="); + return !getCode().startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX); } } // MUserQuery diff --git a/org.adempiere.base/src/org/compiere/model/POInfo.java b/org.adempiere.base/src/org/compiere/model/POInfo.java index c3a260f50a..ce09001f51 100644 --- a/org.adempiere.base/src/org/compiere/model/POInfo.java +++ b/org.adempiere.base/src/org/compiere/model/POInfo.java @@ -202,7 +202,7 @@ public class POInfo implements Serializable // m_AccessLevel = rs.getString(18); String ColumnSQL = rs.getString(19); - if (ColumnSQL != null && ColumnSQL.length() > 0 && (ColumnSQL.startsWith("@SQL=") || ColumnSQL.startsWith("@SQLFIND="))) + if (ColumnSQL != null && ColumnSQL.length() > 0 && (ColumnSQL.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX) || ColumnSQL.startsWith(MColumn.VIRTUAL_SEARCH_COLUMN_PREFIX))) ColumnSQL = "NULL"; if (ColumnSQL != null && ColumnSQL.contains("@")) ColumnSQL = Env.parseContext(Env.getCtx(), -1, ColumnSQL, false, true); @@ -381,7 +381,7 @@ public class POInfo implements Serializable if (index < 0 || index >= m_columns.length) return null; if (m_columns[index].ColumnSQL != null && m_columns[index].ColumnSQL.length() > 0) { - if (m_columns[index].ColumnSQL.startsWith("@SQL=") || m_columns[index].ColumnSQL.startsWith("@SQLFIND=")) + if (m_columns[index].ColumnSQL.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX) || m_columns[index].ColumnSQL.startsWith(MColumn.VIRTUAL_SEARCH_COLUMN_PREFIX)) return "NULL AS " + m_columns[index].ColumnName; return m_columns[index].ColumnSQL + " AS " + m_columns[index].ColumnName; } @@ -412,7 +412,7 @@ public class POInfo implements Serializable return true; return m_columns[index].ColumnSQL != null && m_columns[index].ColumnSQL.length() > 0 - && !m_columns[index].ColumnSQL.startsWith("@SQL="); + && !m_columns[index].ColumnSQL.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX); } // isVirtualDBColumn /** @@ -426,7 +426,7 @@ public class POInfo implements Serializable return true; return m_columns[index].ColumnSQL != null && m_columns[index].ColumnSQL.length() > 0 - && m_columns[index].ColumnSQL.startsWith("@SQL="); + && m_columns[index].ColumnSQL.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX); } // isVirtualUIColumn /** @@ -440,7 +440,7 @@ public class POInfo implements Serializable return true; return m_columns[index].ColumnSQL != null && m_columns[index].ColumnSQL.length() > 0 - && m_columns[index].ColumnSQL.startsWith("@SQLFIND="); + && m_columns[index].ColumnSQL.startsWith(MColumn.VIRTUAL_SEARCH_COLUMN_PREFIX); } // isVirtualSearchColumn /** diff --git a/org.adempiere.base/src/org/compiere/print/DataEngine.java b/org.adempiere.base/src/org/compiere/print/DataEngine.java index d2c5618e9b..b2e5a2900a 100644 --- a/org.adempiere.base/src/org/compiere/print/DataEngine.java +++ b/org.adempiere.base/src/org/compiere/print/DataEngine.java @@ -34,6 +34,7 @@ import java.util.logging.Level; import java.util.regex.Pattern; import org.adempiere.exceptions.AdempiereException; +import org.compiere.model.MColumn; import org.compiere.model.MLookupFactory; import org.compiere.model.MQuery; import org.compiere.model.MReportView; @@ -340,9 +341,9 @@ public class DataEngine int AD_PrintFormatItem_ID = rs.getInt("AD_PrintFormatItem_ID"); String ColumnName = rs.getString(2); String ColumnSQL = rs.getString(24); - if (ColumnSQL != null && ColumnSQL.length() > 0 && ColumnSQL.startsWith("@SQLFIND=")) + if (ColumnSQL != null && ColumnSQL.length() > 0 && ColumnSQL.startsWith(MColumn.VIRTUAL_SEARCH_COLUMN_PREFIX)) ColumnSQL = ColumnSQL.substring(9); - if (ColumnSQL != null && ColumnSQL.length() > 0 && ColumnSQL.startsWith("@SQL=")) + if (ColumnSQL != null && ColumnSQL.length() > 0 && ColumnSQL.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) ColumnSQL = "NULL"; if (ColumnSQL != null && ColumnSQL.contains("@")) ColumnSQL = Env.parseContext(Env.getCtx(), m_windowNo, ColumnSQL, false, true); @@ -424,9 +425,9 @@ public class DataEngine // => (..) AS AName, Table.ID, if (script != null && !script.isEmpty()) { - if (script.startsWith("@SQL=")) + if (script.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { - script = "(" + script.replace("@SQL=", "").trim() + ")"; + script = "(" + script.replace(MColumn.VIRTUAL_UI_COLUMN_PREFIX, "").trim() + ")"; script = Env.parseContext(Env.getCtx(), m_windowNo, script, false); } else diff --git a/org.adempiere.server/src/main/server/org/compiere/server/Scheduler.java b/org.adempiere.server/src/main/server/org/compiere/server/Scheduler.java index 010e7a1c3f..98b7c491e3 100644 --- a/org.adempiere.server/src/main/server/org/compiere/server/Scheduler.java +++ b/org.adempiere.server/src/main/server/org/compiere/server/Scheduler.java @@ -39,6 +39,7 @@ import org.adempiere.base.upload.UploadResponse; import org.compiere.model.MAttachment; import org.compiere.model.MAuthorizationAccount; import org.compiere.model.MClient; +import org.compiere.model.MColumn; import org.compiere.model.MMailText; import org.compiere.model.MNote; import org.compiere.model.MOrgInfo; @@ -683,7 +684,7 @@ public class Scheduler extends AdempiereServer if (variable == null || (variable != null && variable.length() == 0)) value = null; - else if (variable.startsWith("@SQL=")) { + else if (variable.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { String defStr = ""; String sql = variable.substring(5); // w/o tag //sql = Env.parseContext(m_vo.ctx, m_vo.WindowNo, sql, false, true); // replace variables diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ToolbarCustomButton.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ToolbarCustomButton.java index 98d0f6a418..9a7c96b74f 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ToolbarCustomButton.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ToolbarCustomButton.java @@ -17,6 +17,7 @@ import org.adempiere.base.IServiceHolder; import org.adempiere.webui.action.Actions; import org.adempiere.webui.action.IAction; import org.adempiere.webui.component.ToolBarButton; +import org.compiere.model.MColumn; import org.compiere.model.MToolBarButton; import org.compiere.util.Env; import org.compiere.util.Evaluatee; @@ -120,7 +121,7 @@ public class ToolbarCustomButton implements EventListener, Evaluatee { return; boolean visible = true; - if (displayLogic.startsWith("@SQL=")) { + if (displayLogic.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { ADWindow adwindow = ADWindow.get(windowNo); if (adwindow == null) return; @@ -200,7 +201,7 @@ public class ToolbarCustomButton implements EventListener, Evaluatee { private boolean validateLogic(String logic, int tabNo) { boolean isValid = false; - if (logic.startsWith("@SQL=")) + if (logic.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { isValid = Evaluator.parseSQLLogic(logic, Env.getCtx(), windowNo, tabNo, ""); } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ToolbarProcessButton.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ToolbarProcessButton.java index e45d2c92bc..0678f57d03 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ToolbarProcessButton.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ToolbarProcessButton.java @@ -17,6 +17,7 @@ import org.adempiere.webui.editor.IProcessButton; import org.adempiere.webui.event.ActionEvent; import org.adempiere.webui.event.ActionListener; import org.compiere.model.I_AD_Process; +import org.compiere.model.MColumn; import org.compiere.model.MProcess; import org.compiere.model.MToolBarButton; import org.compiere.util.Env; @@ -189,7 +190,7 @@ public class ToolbarProcessButton implements IProcessButton, Evaluatee { */ private boolean validateLogic(String logic, int tabNo) { boolean isValid = false; - if (logic.startsWith("@SQL=")) { + if (logic.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { isValid = Evaluator.parseSQLLogic(logic, Env.getCtx(), windowNo, tabNo, getColumnName()); } else { isValid = Evaluator.evaluateLogic(this, logic); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/desktop/DashboardController.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/desktop/DashboardController.java index 26f31acbcd..53ea4d4732 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/desktop/DashboardController.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/desktop/DashboardController.java @@ -64,6 +64,7 @@ import org.adempiere.webui.window.ZkReportViewerProvider; import org.compiere.Adempiere; import org.compiere.model.I_AD_Menu; import org.compiere.model.MChart; +import org.compiere.model.MColumn; import org.compiere.model.MDashboardContent; import org.compiere.model.MDashboardContentAccess; import org.compiere.model.MDashboardPreference; @@ -1732,7 +1733,7 @@ public class DashboardController implements EventListener { if (paramValue == null || (paramValue != null && paramValue.length() == 0)) value = null; - else if (paramValue.startsWith("@SQL=")) { + else if (paramValue.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { String sql = paramValue.substring(5); sql = Env.parseContext(Env.getCtx(), 0, sql, false, false); // replace variables if (!Util.isEmpty(sql)) { diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoGeneralPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoGeneralPanel.java index fe134ab873..486266db4c 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoGeneralPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoGeneralPanel.java @@ -550,7 +550,7 @@ public class InfoGeneralPanel extends InfoPanel implements EventListener boolean isDisplayed = rs.getString(4).equals("Y"); int AD_Reference_Value_ID = rs.getInt(5); String columnSql = rs.getString(6); - if (columnSql != null && columnSql.length() > 0 && (columnSql.startsWith("@SQL=") || columnSql.startsWith("@SQLFIND="))) + if (columnSql != null && columnSql.length() > 0 && (columnSql.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX) || columnSql.startsWith(MColumn.VIRTUAL_SEARCH_COLUMN_PREFIX))) columnSql = "NULL"; if (columnSql != null && columnSql.contains("@")) columnSql = Env.parseContext(Env.getCtx(), -1, columnSql, false, true); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java index 6d6ab4edc5..59d7b1daa5 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java @@ -2052,7 +2052,7 @@ public class FindWindow extends Window implements EventListener, ValueCha return; String code = userQuery.getCode(); - if (code.startsWith("@SQL=")) { + if (code.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { m_whereUserQuery = "(" + code.substring(code.indexOf("=")+1, code.length()) + ")"; if (log.isLoggable(Level.INFO)) log.log(Level.INFO, m_whereUserQuery); diff --git a/org.adempiere.ui/src/org/compiere/print/DrillReportCtl.java b/org.adempiere.ui/src/org/compiere/print/DrillReportCtl.java index 966e63c299..1ae0cabd7f 100644 --- a/org.adempiere.ui/src/org/compiere/print/DrillReportCtl.java +++ b/org.adempiere.ui/src/org/compiere/print/DrillReportCtl.java @@ -40,6 +40,7 @@ import java.util.Map.Entry; import java.util.logging.Level; import org.adempiere.exceptions.AdempiereException; +import org.compiere.model.MColumn; import org.compiere.model.MProcess; import org.compiere.model.MProcessDrillRule; import org.compiere.model.MProcessDrillRulePara; @@ -660,7 +661,7 @@ public class DrillReportCtl { if (variable == null || (variable != null && variable.length() == 0)) value = null; - else if (variable.startsWith("@SQL=")) { + else if (variable.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) { String defStr = ""; String sql = variable.substring(5); // w/o tag //hengsin, capture unparseable error to avoid subsequent sql exception diff --git a/org.idempiere.test/src/org/idempiere/test/base/LogicExpressionTest.java b/org.idempiere.test/src/org/idempiere/test/base/LogicExpressionTest.java index a6783e153e..2b43982b33 100644 --- a/org.idempiere.test/src/org/idempiere/test/base/LogicExpressionTest.java +++ b/org.idempiere.test/src/org/idempiere/test/base/LogicExpressionTest.java @@ -580,7 +580,7 @@ public class LogicExpressionTest extends AbstractTestCase { ResultSet rs = stmt.executeQuery(); while (rs.next()) { String expr = rs.getString(mc.getColumnName()); - if (expr.startsWith("@SQL=") || expr.startsWith("SQL=")) + if (expr.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX) || expr.startsWith("SQL=")) continue; try { LogicEvaluator.validate(expr); diff --git a/org.idempiere.test/src/org/idempiere/test/base/POTest.java b/org.idempiere.test/src/org/idempiere/test/base/POTest.java index 2595b43fe9..5387072a34 100644 --- a/org.idempiere.test/src/org/idempiere/test/base/POTest.java +++ b/org.idempiere.test/src/org/idempiere/test/base/POTest.java @@ -43,10 +43,12 @@ import org.compiere.model.I_AD_UserPreference; import org.compiere.model.MAcctSchema; import org.compiere.model.MBPartner; import org.compiere.model.MClient; +import org.compiere.model.MColumn; import org.compiere.model.MMessage; import org.compiere.model.MProduct; import org.compiere.model.MProductCategory; import org.compiere.model.MProductCategoryAcct; +import org.compiere.model.MProductionLine; import org.compiere.model.MTest; import org.compiere.model.POInfo; import org.compiere.util.DB; @@ -553,4 +555,30 @@ public class POTest extends AbstractTestCase assertTrue(file.exists(), "Not found: " + folderOr + fileName); file.delete(); } + + @Test + public void testIsVirtualColumnMethods() { + //column sql with no prefix + MColumn column = MColumn.get(Env.getCtx(), MTest.Table_Name, MTest.COLUMNNAME_TestVirtualQty); + assertTrue(column.isVirtualColumn(), "MColumn.isVirtualColumn() not working as expected for ColumnSQL="+column.getColumnSQL()); + assertTrue(column.isVirtualDBColumn(), "MColumn.isVirtualDBColumn() not working as expected for ColumnSQL="+column.getColumnSQL()); + assertFalse(column.isVirtualUIColumn(), "MColumn.isVirtualUIColumn() not working as expected for ColumnSQL="+column.getColumnSQL()); + assertFalse(column.isVirtualSearchColumn(), "MColumn.isVirtualSearchColumn() not working as expected for ColumnSQL="+column.getColumnSQL()); + + //column sql with @SQLFIND= prefix + column = MColumn.get(Env.getCtx(), MProductionLine.Table_Name, "ProductType"); + assertTrue(column.isVirtualColumn(), "MColumn.isVirtualColumn() not working as expected for ColumnSQL="+column.getColumnSQL()); + assertFalse(column.isVirtualDBColumn(), "MColumn.isVirtualDBColumn() not working as expected for ColumnSQL="+column.getColumnSQL()); + assertFalse(column.isVirtualUIColumn(), "MColumn.isVirtualUIColumn() not working as expected for ColumnSQL="+column.getColumnSQL()); + assertTrue(column.isVirtualSearchColumn(), "MColumn.isVirtualSearchColumn() not working as expected for ColumnSQL="+column.getColumnSQL()); + + //column sql with @SQL= prefix + column = MColumn.get(Env.getCtx(), MTest.Table_Name, MTest.COLUMNNAME_TestVirtualQty); + column = new MColumn(column); + column.setColumnSQL(MColumn.VIRTUAL_UI_COLUMN_PREFIX+column.getColumnSQL()); + assertTrue(column.isVirtualColumn(), "MColumn.isVirtualColumn() not working as expected for ColumnSQL="+column.getColumnSQL()); + assertFalse(column.isVirtualDBColumn(), "MColumn.isVirtualDBColumn() not working as expected for ColumnSQL="+column.getColumnSQL()); + assertTrue(column.isVirtualUIColumn(), "MColumn.isVirtualUIColumn() not working as expected for ColumnSQL="+column.getColumnSQL()); + assertFalse(column.isVirtualSearchColumn(), "MColumn.isVirtualSearchColumn() not working as expected for ColumnSQL="+column.getColumnSQL()); + } } diff --git a/org.idempiere.webservices/WEB-INF/src/org/idempiere/webservices/AbstractService.java b/org.idempiere.webservices/WEB-INF/src/org/idempiere/webservices/AbstractService.java index 84611aafe8..f16a955d38 100644 --- a/org.idempiere.webservices/WEB-INF/src/org/idempiere/webservices/AbstractService.java +++ b/org.idempiere.webservices/WEB-INF/src/org/idempiere/webservices/AbstractService.java @@ -33,6 +33,7 @@ import org.adempiere.base.equinox.EquinoxExtensionLocator; import org.adempiere.exceptions.AdempiereException; import org.apache.commons.codec.binary.Base64; import org.compiere.model.Lookup; +import org.compiere.model.MColumn; import org.compiere.model.MUser; import org.compiere.model.PO; import org.compiere.model.POInfo; @@ -390,7 +391,7 @@ public class AbstractService { * @throws AdempiereException */ protected String parseSQL(String sql, ArrayList sqlParas, PO po,POInfo poInfo, Map requestCtx) throws AdempiereException { - if (sql.startsWith("@SQL=")) + if (sql.startsWith(MColumn.VIRTUAL_UI_COLUMN_PREFIX)) sql = sql.substring(5); if (sql.toLowerCase().indexOf(" where ") == -1)