fixed bug 39614: random unique constraint violation message
authorAsier Lostalé <asier.lostale@openbravo.com>
Tue, 13 Nov 2018 09:24:05 +0100
changeset 34962 6323b569fcbb
parent 34961 03d8fd2a8cca
child 34963 e0dd4d4090a1
child 34964 a3bda4f3376a
fixed bug 39614: random unique constraint violation message

Get name to generate error message from actual element associated to the column
in the table we are looking for instead of getting it from any element with that
same name assuming it is unique.
src/org/openbravo/erpCommon/utility/ErrorTextParser.java
src/org/openbravo/erpCommon/utility/ErrorTextParserORACLE.java
src/org/openbravo/erpCommon/utility/ErrorTextParser_data.xsql
--- a/src/org/openbravo/erpCommon/utility/ErrorTextParser.java	Mon Nov 12 13:00:12 2018 +0100
+++ b/src/org/openbravo/erpCommon/utility/ErrorTextParser.java	Tue Nov 13 09:24:05 2018 +0100
@@ -11,7 +11,7 @@
  * under the License. 
  * The Original Code is Openbravo ERP. 
  * The Initial Developer of the Original Code is Openbravo SLU 
- * All portions are Copyright (C) 2001-2010 Openbravo SLU 
+ * All portions are Copyright (C) 2001-2018 Openbravo SLU 
  * All Rights Reserved. 
  * Contributor(s):  ______________________________________.
  ************************************************************************
@@ -156,7 +156,7 @@
   protected String getTableName(String tableName) {
     try {
       String pkColumnName = tableName + "_ID";
-      return ErrorTextParserData.selectColumnName(conn, language, pkColumnName);
+      return ErrorTextParserData.selectColumnName(conn, language, tableName, pkColumnName);
     } catch (ServletException e) {
       log4j.error(
           "Error while trying to name for table via ad_element for tablename: " + tableName, e);
@@ -168,14 +168,17 @@
    * Helper method to get a (slightly better) human-readable name for a database column based on its
    * name. Method uses AD_ELEMENT.name and AD_ELEMENT_TRL.NAME for this purpose
    * 
+   * @param tableName
+   *          table where the column is in
+   * 
    * @param columnName
-   *          name of a database column
+   *          name of the column to get its human readable name
    * @return translated, human-readable name
    */
-  protected String getColumnName(String columnName) {
+  protected String getColumnName(String tableName, String columnName) {
     String res;
     try {
-      res = ErrorTextParserData.selectColumnName(conn, language, columnName);
+      res = ErrorTextParserData.selectColumnName(conn, language, tableName, columnName);
       return res;
     } catch (ServletException e) {
       log4j.error("Error while trying to get name for ad_element.columnname: " + columnName, e);
@@ -236,7 +239,7 @@
           if (columns.length() > 0) {
             columns.append(", ");
           }
-          columns.append(getColumnName(column));
+          columns.append(getColumnName(constraintData[0].tableName, column));
         }
         String columnName;
         if (columnList.length > 1) {
@@ -300,7 +303,7 @@
           if (msgText != null) {
             String msgTemplate = msgText.getField("msgText");
             String tableName = getTableName(constraintData[0].tableName);
-            columnName = getColumnName(columnName);
+            columnName = getColumnName(constraintData[0].tableName, columnName);
             Map<String, String> replaceMap = new HashMap<String, String>();
             replaceMap.put("TABLE_NAME", tableName);
             replaceMap.put("COLUMN_NAME", columnName);
@@ -312,7 +315,7 @@
         } else if (searchCond.endsWith(" IN ('Y','N')") || searchCond.endsWith(" IN ('Y', 'N')")
             || searchCond.endsWith(" IN ('N','Y')") || searchCond.endsWith(" IN ('N', 'Y')")) {
           String columnName = searchCond.substring(0, searchCond.lastIndexOf(" IN (")).trim();
-          columnName = getColumnName(columnName);
+          columnName = getColumnName(constraintData[0].tableName, columnName);
 
           FieldProvider msgText = Utility.locateMessage(getConnection(), "NotYNError",
               getLanguage());
--- a/src/org/openbravo/erpCommon/utility/ErrorTextParserORACLE.java	Mon Nov 12 13:00:12 2018 +0100
+++ b/src/org/openbravo/erpCommon/utility/ErrorTextParserORACLE.java	Tue Nov 13 09:24:05 2018 +0100
@@ -11,7 +11,7 @@
  * under the License. 
  * The Original Code is Openbravo ERP. 
  * The Initial Developer of the Original Code is Openbravo SLU 
- * All portions are Copyright (C) 2001-2010 Openbravo SLU 
+ * All portions are Copyright (C) 2001-2018 Openbravo SLU 
  * All Rights Reserved. 
  * Contributor(s):  ______________________________________.
  ************************************************************************
@@ -184,8 +184,8 @@
               getLanguage());
           if (msgText != null) {
             String msgTemplate = msgText.getField("msgText");
+            columnName = getColumnName(tableName, columnName);
             tableName = getTableName(tableName);
-            columnName = getColumnName(columnName);
             Map<String, String> replaceMap = new HashMap<String, String>();
             replaceMap.put("TABLE_NAME", tableName);
             replaceMap.put("COLUMN_NAME", columnName);
--- a/src/org/openbravo/erpCommon/utility/ErrorTextParser_data.xsql	Mon Nov 12 13:00:12 2018 +0100
+++ b/src/org/openbravo/erpCommon/utility/ErrorTextParser_data.xsql	Tue Nov 13 09:24:05 2018 +0100
@@ -12,7 +12,7 @@
  * under the License. 
  * The Original Code is Openbravo ERP. 
  * The Initial Developer of the Original Code is Openbravo SLU
- * All portions are Copyright (C) 2001-2010 Openbravo SLU
+ * All portions are Copyright (C) 2001-2018 Openbravo SLU
  * All Rights Reserved. 
  * Contributor(s):  ______________________________________.
  ************************************************************************
@@ -38,12 +38,21 @@
   <SqlMethod name="selectColumnName" type="preparedStatement" return="String">
     <SqlMethodComment></SqlMethodComment>
     <Sql>
-      select coalesce(ad_element_trl.name, ad_element.name) as column_name
-      from ad_element left join ad_element_trl on ad_element.ad_element_id = ad_element_trl.ad_element_id and ad_element_trl.ad_language = ?
-      where upper(ad_element.columnname) = upper(?)
+        select coalesce(et.name, e.name, c.name) as column_name
+          from ad_table t,
+               ad_column c
+                left join ad_element e
+                       on c.ad_element_id = e.ad_element_id
+                left join ad_element_trl et
+                       on e.ad_element_id = et.ad_element_id
+                      and et.ad_language = ?
+         where t.ad_table_id = c.ad_table_id
+           and upper(t.tableName) = upper(?)
+           and upper(c.columnName) = upper(?)
     </Sql>
     <Parameter name="language"/>
-    <Parameter name="columnname"/>
+    <Parameter name="tableName"/>
+    <Parameter name="columnName"/>
   </SqlMethod>
 
   <SqlMethod name="selectColumnNamesForConstraint" type="preparedStatement" return="multiple">