You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2024/07/03 17:28:16 UTC

(empire-db) branch master updated: EMPIREDB-430 Properly catch and handle value conversion errors.

This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/master by this push:
     new 5408f8ca EMPIREDB-430 Properly catch and handle value conversion errors.
5408f8ca is described below

commit 5408f8ca7837d9c2bfc58d958a12aec0ba97553d
Author: Rainer Döbele <do...@apache.org>
AuthorDate: Wed Jul 3 19:28:12 2024 +0200

    EMPIREDB-430
    Properly catch and handle value conversion errors.
---
 .../empire/jakarta/components/ControlTag.java      | 41 ++++++++++++----------
 .../apache/empire/jakarta/components/InputTag.java | 35 +++++++++---------
 .../empire/jakarta/utils/TagEncodingHelper.java    | 14 ++++++--
 .../apache/empire/jsf2/components/ControlTag.java  | 21 ++++++-----
 .../apache/empire/jsf2/components/InputTag.java    | 19 +++++-----
 .../empire/jsf2/utils/TagEncodingHelper.java       | 14 ++++++--
 6 files changed, 88 insertions(+), 56 deletions(-)

diff --git a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/ControlTag.java b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/ControlTag.java
index b84c9f70..938d136f 100644
--- a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/ControlTag.java
+++ b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/ControlTag.java
@@ -21,6 +21,17 @@ package org.apache.empire.jakarta.components;
 import java.io.IOException;
 import java.util.List;
 
+import org.apache.empire.commons.ObjectUtils;
+import org.apache.empire.data.Column;
+import org.apache.empire.jakarta.controls.InputControl;
+import org.apache.empire.jakarta.utils.ControlRenderInfo;
+import org.apache.empire.jakarta.utils.TagEncodingHelper;
+import org.apache.empire.jakarta.utils.TagEncodingHelperFactory;
+import org.apache.empire.jakarta.utils.TagStyleClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import jakarta.faces.application.FacesMessage;
 import jakarta.faces.component.NamingContainer;
 import jakarta.faces.component.UIComponent;
 import jakarta.faces.component.UIComponentBase;
@@ -33,18 +44,6 @@ import jakarta.faces.context.FacesContext;
 import jakarta.faces.context.ResponseWriter;
 import jakarta.faces.convert.ConverterException;
 
-import org.apache.empire.commons.ObjectUtils;
-import org.apache.empire.data.Column;
-import org.apache.empire.db.exceptions.FieldIllegalValueException;
-import org.apache.empire.exceptions.EmpireException;
-import org.apache.empire.jakarta.controls.InputControl;
-import org.apache.empire.jakarta.utils.ControlRenderInfo;
-import org.apache.empire.jakarta.utils.TagEncodingHelper;
-import org.apache.empire.jakarta.utils.TagEncodingHelperFactory;
-import org.apache.empire.jakarta.utils.TagStyleClass;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 public class ControlTag extends UIInput implements NamingContainer
 {
     /**
@@ -644,9 +643,16 @@ public class ControlTag extends UIInput implements NamingContainer
         // Get Input Tag
         if (getChildCount() <= 1)
             return null;
-        // get Input Value
-        ControlSeparatorComponent inputSepTag = (ControlSeparatorComponent) getChildren().get(1);
-        return this.control.getConvertedValue(inputSepTag, this.inpInfo, newSubmittedValue);
+        // convert value
+        try {
+            // parse and convert value
+            ControlSeparatorComponent inputSepTag = (ControlSeparatorComponent) getChildren().get(1);
+            return this.control.getConvertedValue(inputSepTag, this.inpInfo, newSubmittedValue);
+        } catch (Exception e) {
+            // Add error message
+            FacesMessage msg = helper.getFieldValueErrorMessage(context, e, newSubmittedValue);
+            throw new ConverterException(msg);
+        }
     }
 
     @Override
@@ -718,11 +724,8 @@ public class ControlTag extends UIInput implements NamingContainer
             // super.validateValue(context, value);
 
         } catch (Exception e) {
-            // Value is not valid
-            if (!(e instanceof EmpireException))
-                e = new FieldIllegalValueException(helper.getColumn(), "", e);
             // Add error message
-            helper.addErrorMessage(context, e);
+            helper.addFieldValueErrorMessage(context, e, value);
             setValid(false);
 
         } finally {
diff --git a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/InputTag.java b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/InputTag.java
index 5f56fafc..4460ce72 100644
--- a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/InputTag.java
+++ b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/InputTag.java
@@ -21,6 +21,15 @@ package org.apache.empire.jakarta.components;
 import java.io.IOException;
 import java.util.List;
 
+import org.apache.empire.data.Column;
+import org.apache.empire.jakarta.controls.InputControl;
+import org.apache.empire.jakarta.utils.TagEncodingHelper;
+import org.apache.empire.jakarta.utils.TagEncodingHelperFactory;
+import org.apache.empire.jakarta.utils.TagStyleClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import jakarta.faces.application.FacesMessage;
 import jakarta.faces.component.NamingContainer;
 import jakarta.faces.component.UIComponent;
 import jakarta.faces.component.UIInput;
@@ -31,16 +40,6 @@ import jakarta.faces.context.ResponseWriter;
 import jakarta.faces.convert.ConverterException;
 import jakarta.faces.view.AttachedObjectHandler;
 
-import org.apache.empire.data.Column;
-import org.apache.empire.db.exceptions.FieldIllegalValueException;
-import org.apache.empire.exceptions.EmpireException;
-import org.apache.empire.jakarta.controls.InputControl;
-import org.apache.empire.jakarta.utils.TagEncodingHelper;
-import org.apache.empire.jakarta.utils.TagEncodingHelperFactory;
-import org.apache.empire.jakarta.utils.TagStyleClass;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 public class InputTag extends UIInput implements NamingContainer
 {
     // Logger
@@ -257,8 +256,15 @@ public class InputTag extends UIInput implements NamingContainer
     {   // Check state
         if (control == null || inpInfo == null || helper.isReadOnly())
             return null;
-        // parse and convert value
-        return this.control.getConvertedValue(this, this.inpInfo, newSubmittedValue);
+        // convert value
+        try {
+            // parse and convert value
+            return this.control.getConvertedValue(this, this.inpInfo, newSubmittedValue);
+        } catch (Exception e) {
+            // Add error message
+            FacesMessage msg = helper.getFieldValueErrorMessage(context, e, newSubmittedValue);
+            throw new ConverterException(msg);
+        }
     }
 
     @Override
@@ -330,11 +336,8 @@ public class InputTag extends UIInput implements NamingContainer
             // super.validateValue(context, value);
 
         } catch (Exception e) {
-            // Value is not valid
-            if (!(e instanceof EmpireException))
-                e = new FieldIllegalValueException(helper.getColumn(), "", e);
             // Add error message
-            helper.addErrorMessage(context, e);
+            helper.addFieldValueErrorMessage(context, e, value);
             setValid(false);
 
         } finally {
diff --git a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/utils/TagEncodingHelper.java b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/utils/TagEncodingHelper.java
index 4ff8940e..5d201500 100644
--- a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/utils/TagEncodingHelper.java
+++ b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/utils/TagEncodingHelper.java
@@ -57,9 +57,11 @@ import org.apache.empire.data.RecordData;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBRecordBase;
 import org.apache.empire.db.DBRowSet;
+import org.apache.empire.db.exceptions.FieldIllegalValueException;
 import org.apache.empire.db.exceptions.FieldNotNullException;
 import org.apache.empire.exceptions.BeanPropertyGetException;
 import org.apache.empire.exceptions.BeanPropertySetException;
+import org.apache.empire.exceptions.EmpireException;
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.InvalidPropertyException;
 import org.apache.empire.exceptions.NotSupportedException;
@@ -1478,10 +1480,18 @@ public class TagEncodingHelper implements NamingContainer
         return false;
     }
     
-    public void addErrorMessage(FacesContext context, Exception e)
+    public FacesMessage getFieldValueErrorMessage(FacesContext context, Exception e, Object value)
     {
+        if (!(e instanceof EmpireException))
+            e = new FieldIllegalValueException(getColumn(), StringUtils.valueOf(value), e);
+        // create faces message
         String msgText = getTextResolver(context).getExceptionMessage(e);
-        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, msgText, msgText);
+        return new FacesMessage(FacesMessage.SEVERITY_ERROR, msgText, msgText);
+    }
+    
+    public void addFieldValueErrorMessage(FacesContext context, Exception e, Object value)
+    {
+        FacesMessage msg = getFieldValueErrorMessage(context, e, value);
         context.addMessage(component.getClientId(), msg);
     }
 
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/ControlTag.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/ControlTag.java
index 93d723b2..b8facc77 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/ControlTag.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/ControlTag.java
@@ -21,6 +21,7 @@ package org.apache.empire.jsf2.components;
 import java.io.IOException;
 import java.util.List;
 
+import javax.faces.application.FacesMessage;
 import javax.faces.component.NamingContainer;
 import javax.faces.component.UIComponent;
 import javax.faces.component.UIComponentBase;
@@ -35,8 +36,6 @@ import javax.faces.convert.ConverterException;
 
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.data.Column;
-import org.apache.empire.db.exceptions.FieldIllegalValueException;
-import org.apache.empire.exceptions.EmpireException;
 import org.apache.empire.jsf2.controls.InputControl;
 import org.apache.empire.jsf2.utils.ControlRenderInfo;
 import org.apache.empire.jsf2.utils.TagEncodingHelper;
@@ -644,9 +643,16 @@ public class ControlTag extends UIInput implements NamingContainer
         // Get Input Tag
         if (getChildCount() <= 1)
             return null;
-        // get Input Value
-        ControlSeparatorComponent inputSepTag = (ControlSeparatorComponent) getChildren().get(1);
-        return this.control.getConvertedValue(inputSepTag, this.inpInfo, newSubmittedValue);
+        // convert value
+        try {
+            // parse and convert value
+            ControlSeparatorComponent inputSepTag = (ControlSeparatorComponent) getChildren().get(1);
+            return this.control.getConvertedValue(inputSepTag, this.inpInfo, newSubmittedValue);
+        } catch (Exception e) {
+            // Add error message
+            FacesMessage msg = helper.getFieldValueErrorMessage(context, e, newSubmittedValue);
+            throw new ConverterException(msg);
+        }
     }
 
     @Override
@@ -718,11 +724,8 @@ public class ControlTag extends UIInput implements NamingContainer
             // super.validateValue(context, value);
 
         } catch (Exception e) {
-            // Value is not valid
-            if (!(e instanceof EmpireException))
-                e = new FieldIllegalValueException(helper.getColumn(), "", e);
             // Add error message
-            helper.addErrorMessage(context, e);
+            helper.addFieldValueErrorMessage(context, e, value);
             setValid(false);
 
         } finally {
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/InputTag.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/InputTag.java
index 6427fc0d..c9d32df5 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/InputTag.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/InputTag.java
@@ -21,6 +21,7 @@ package org.apache.empire.jsf2.components;
 import java.io.IOException;
 import java.util.List;
 
+import javax.faces.application.FacesMessage;
 import javax.faces.component.NamingContainer;
 import javax.faces.component.UIComponent;
 import javax.faces.component.UIInput;
@@ -32,8 +33,6 @@ import javax.faces.convert.ConverterException;
 import javax.faces.view.AttachedObjectHandler;
 
 import org.apache.empire.data.Column;
-import org.apache.empire.db.exceptions.FieldIllegalValueException;
-import org.apache.empire.exceptions.EmpireException;
 import org.apache.empire.jsf2.controls.InputControl;
 import org.apache.empire.jsf2.utils.TagEncodingHelper;
 import org.apache.empire.jsf2.utils.TagEncodingHelperFactory;
@@ -257,8 +256,15 @@ public class InputTag extends UIInput implements NamingContainer
     {   // Check state
         if (control == null || inpInfo == null || helper.isReadOnly())
             return null;
-        // parse and convert value
-        return this.control.getConvertedValue(this, this.inpInfo, newSubmittedValue);
+        // convert value
+        try {
+            // parse and convert value
+            return this.control.getConvertedValue(this, this.inpInfo, newSubmittedValue);
+        } catch (Exception e) {
+            // Add error message
+            FacesMessage msg = helper.getFieldValueErrorMessage(context, e, newSubmittedValue);
+            throw new ConverterException(msg);
+        }
     }
 
     @Override
@@ -330,11 +336,8 @@ public class InputTag extends UIInput implements NamingContainer
             // super.validateValue(context, value);
 
         } catch (Exception e) {
-            // Value is not valid
-            if (!(e instanceof EmpireException))
-                e = new FieldIllegalValueException(helper.getColumn(), "", e);
             // Add error message
-            helper.addErrorMessage(context, e);
+            helper.addFieldValueErrorMessage(context, e, value);
             setValid(false);
 
         } finally {
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
index 27710768..e7067b6c 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
@@ -57,9 +57,11 @@ import org.apache.empire.data.RecordData;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBRecordBase;
 import org.apache.empire.db.DBRowSet;
+import org.apache.empire.db.exceptions.FieldIllegalValueException;
 import org.apache.empire.db.exceptions.FieldNotNullException;
 import org.apache.empire.exceptions.BeanPropertyGetException;
 import org.apache.empire.exceptions.BeanPropertySetException;
+import org.apache.empire.exceptions.EmpireException;
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.InvalidPropertyException;
 import org.apache.empire.exceptions.NotSupportedException;
@@ -1478,10 +1480,18 @@ public class TagEncodingHelper implements NamingContainer
         return false;
     }
     
-    public void addErrorMessage(FacesContext context, Exception e)
+    public FacesMessage getFieldValueErrorMessage(FacesContext context, Exception e, Object value)
     {
+        if (!(e instanceof EmpireException))
+            e = new FieldIllegalValueException(getColumn(), StringUtils.valueOf(value), e);
+        // create faces message
         String msgText = getTextResolver(context).getExceptionMessage(e);
-        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, msgText, msgText);
+        return new FacesMessage(FacesMessage.SEVERITY_ERROR, msgText, msgText);
+    }
+    
+    public void addFieldValueErrorMessage(FacesContext context, Exception e, Object value)
+    {
+        FacesMessage msg = getFieldValueErrorMessage(context, e, value);
         context.addMessage(component.getClientId(), msg);
     }