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 658bae96 EMPIREDB-431 SelectInputControl: check target type and some 
code cleanup
658bae96 is described below

commit 658bae96da18d8aee284c300c97278b1792072b8
Author: Rainer Döbele <[email protected]>
AuthorDate: Mon Oct 21 19:12:54 2024 +0200

    EMPIREDB-431
    SelectInputControl: check target type
    and some code cleanup
---
 .../jakarta/controls/SelectInputControl.java       | 48 ++++++++-------
 .../empire/jakarta/pages/PageDefinition.java       | 71 ++++++++++------------
 .../apache/empire/jakarta/utils/ParameterMap.java  | 19 ++++--
 .../empire/jakarta/utils/TagEncodingHelper.java    | 18 +++---
 .../empire/jsf2/controls/SelectInputControl.java   | 26 ++++----
 .../apache/empire/jsf2/pages/PageDefinition.java   | 60 ++++++++----------
 .../empire/jsf2/utils/TagEncodingHelper.java       | 18 +++---
 7 files changed, 134 insertions(+), 126 deletions(-)

diff --git 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/controls/SelectInputControl.java
 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/controls/SelectInputControl.java
index 326cb75c..af925718 100644
--- 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/controls/SelectInputControl.java
+++ 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/controls/SelectInputControl.java
@@ -22,17 +22,6 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import jakarta.el.ValueExpression;
-import jakarta.faces.component.UIComponent;
-import jakarta.faces.component.UIParameter;
-import jakarta.faces.component.UISelectItems;
-import jakarta.faces.component.UISelectOne;
-import jakarta.faces.component.html.HtmlSelectOneListbox;
-import jakarta.faces.component.html.HtmlSelectOneMenu;
-import jakarta.faces.context.FacesContext;
-import jakarta.faces.event.PhaseId;
-import jakarta.faces.model.SelectItem;
-
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.OptionEntry;
 import org.apache.empire.commons.Options;
@@ -44,13 +33,24 @@ import org.apache.empire.jakarta.utils.TagStyleClass;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import jakarta.el.ValueExpression;
+import jakarta.faces.component.UIComponent;
+import jakarta.faces.component.UIParameter;
+import jakarta.faces.component.UISelectItems;
+import jakarta.faces.component.UISelectOne;
+import jakarta.faces.component.html.HtmlSelectOneListbox;
+import jakarta.faces.component.html.HtmlSelectOneMenu;
+import jakarta.faces.context.FacesContext;
+import jakarta.faces.event.PhaseId;
+import jakarta.faces.model.SelectItem;
+
 public class SelectInputControl extends InputControl
 {
     private static final Logger log                   = 
LoggerFactory.getLogger(SelectInputControl.class);
 
     public static final String  COLATTR_ABBR_OPTIONS  = "ABBR_OPTIONS";        
                           // Option list for abbreviations
 
-    public static final String  VALUE_EXPRESSION_FLAG = 
"VALUE_EXPRESSION_FLAG";
+    public static final String  VALUE_EXPRESSION_TYPE = 
"VALUE_EXPRESSION_TYPE";
 
     public static final String  FORMAT_SIZE           = "size:";
 
@@ -101,9 +101,13 @@ public class SelectInputControl extends InputControl
         // create list or menu
         Object formatSize = getFormatOption(ii, FORMAT_SIZE, FORMAT_SIZE_ATTR);
         UISelectOne input = createSelectComponent(parent, context, formatSize);
-        // setValueExpressionFlag
+        // set ValueExpressionType
         Object value = ii.getValue(false);
-        input.getAttributes().put(SelectInputControl.VALUE_EXPRESSION_FLAG, 
(value instanceof ValueExpression));
+        if (value instanceof ValueExpression)
+        {   // Set target class
+            Class<?> exprType = 
((ValueExpression)value).getType(context.getELContext());
+            
input.getAttributes().put(SelectInputControl.VALUE_EXPRESSION_TYPE, exprType);
+        }
         // copy Attributes
         copyAttributes(parent, ii, input);
         // disabled
@@ -129,9 +133,9 @@ public class SelectInputControl extends InputControl
         }
         UISelectOne input = (UISelectOne)comp;
         // required
-       addRemoveStyle(input, TagStyleClass.INPUT_REQ, ii.isRequired());
+        addRemoveStyle(input, TagStyleClass.INPUT_REQ, ii.isRequired());
         // disabled
-       boolean disabled = setDisabled(input, ii);
+        boolean disabled = setDisabled(input, ii);
         // check phase
         if (phaseId!=PhaseId.APPLY_REQUEST_VALUES)
         {   // Options (sync)
@@ -339,10 +343,10 @@ public class SelectInputControl extends InputControl
         }
         // set value
         Object value;
-        Object valueExpressionFlag = 
input.getAttributes().get(SelectInputControl.VALUE_EXPRESSION_FLAG);
-        if (ObjectUtils.getBoolean(valueExpressionFlag))
+        Class<?> exprType = 
(Class<?>)input.getAttributes().get(SelectInputControl.VALUE_EXPRESSION_TYPE);
+        if (exprType!=null)
         { // Use formatted value
-            value = formatInputValue(oe.getValue());
+            value = formatInputValue(oe.getValue(), exprType);
         }
         else
         { // Convert to String
@@ -423,13 +427,13 @@ public class SelectInputControl extends InputControl
             } 
         }
         // the value
-        return formatInputValue(value);
+        return formatInputValue(value, Object.class);
     }
 
-    protected Object formatInputValue(Object value)
+    protected Object formatInputValue(Object value, Class<?> targetClass)
     {
         // the enum Value
-        if (value instanceof Enum<?>)
+        if ((value instanceof Enum<?>) && !targetClass.isEnum())
             return ((Enum<?>) value).name();
         // the value
         return value;
diff --git 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/pages/PageDefinition.java
 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/pages/PageDefinition.java
index 65d512ab..f155ebbd 100644
--- 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/pages/PageDefinition.java
+++ 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/pages/PageDefinition.java
@@ -28,48 +28,39 @@ import org.slf4j.LoggerFactory;
 
 public class PageDefinition // *Deprecated* implements Serializable
 {
-       // *Deprecated* private static final long serialVersionUID = 1L;
+    // *Deprecated* private static final long serialVersionUID = 1L;
 
-       private static final Logger log = 
LoggerFactory.getLogger(PageDefinitions.class);
+    private static final Logger log = 
LoggerFactory.getLogger(PageDefinitions.class);
 
     private static final String ACTION_PARAMETER_TYPE = "ACTION";
+    private static final String ACTION_PARAMETER_NAME = "action";
     
     private final String path;
     private final String fileExtension;
 
-       private final String pageBeanName;
+    private final String pageBeanName;
     private final Class<? extends Page> pageBeanClass;
     private final PageDefinition parent;
 
-    /*
-    private static Hashtable<String, String> actionCodeMap = new 
Hashtable<String, String>();
-    
-    private static Hashtable<String, String> actionMap = new Hashtable<String, 
String>();
-
-    private static String encodeActionParam(String action)
-    {
-        String param = ParameterMap.encodeString(action);
-        actionMap.put(param, action);
-        return param;
-    }
-    
-    public static String decodeActionParam(String param)
-    {
-        String action = actionMap.get(param);
-        if (action==null)
-            log.warn("no action available for param {}.", param);
-        return action;
-    }
-    */
-
-    private static String encodeActionParam(String action)
+    /**
+     * Encodes a page action method into a MD5 code and puts it on the 
session's action list.
+     * @param pageDef the page for which the action is provided
+     * @param action the name of the action method
+     * @return the encoded action
+     */
+    private static String encodeActionParam(PageDefinition pageDef, String 
action)
     {
         ParameterMap pm = FacesUtils.getParameterMap(FacesUtils.getContext());
         if (pm==null)
             return action;
-        return pm.put(ACTION_PARAMETER_TYPE, action, true);
+        return pm.put(ACTION_PARAMETER_TYPE, 
StringUtils.concat(pageDef.getPageBeanName(), ":", action), action, true);
     }
-    
+
+    /**
+     * Decodes a page action method from a MD5 code. 
+     * @param param the MD5 code for a page action method
+     * @return the action method name
+     */
     public static String decodeActionParam(String param)
     {
         ParameterMap pm = FacesUtils.getParameterMap(FacesUtils.getContext());
@@ -83,7 +74,7 @@ public class PageDefinition // *Deprecated* implements 
Serializable
     
     /**
      * Constructs a page definition
-     * @param path     the path of the view associated with this page
+     * @param path  the path of the view associated with this page
      * @param pageBeanClass the page bean class associated with this page
      * @param parent the parent page (if any). May be null
      * @param pageBeanName the page bean name. If null this will be calculated 
from the path
@@ -98,16 +89,16 @@ public class PageDefinition // *Deprecated* implements 
Serializable
         fileExtension = (ext>0) ? path.substring(ext) : null;
         // beanName
         if (pageBeanName==null) 
-               this.pageBeanName = getPageBeanNameFromPath(path, 
fileExtension);
+            this.pageBeanName = getPageBeanNameFromPath(path, fileExtension);
         else
-               this.pageBeanName = pageBeanName;
+            this.pageBeanName = pageBeanName;
         // add this view
         PageDefinitions.registerPage(this);
     }
 
     /**
      * Constructs a page definition
-     * @param path     the path of the view associated with this page
+     * @param path  the path of the view associated with this page
      * @param pageBeanClass the page bean class associated with this page
      * @param pageBeanName the page bean name. If null this will be calculated 
from the path
      */
@@ -118,7 +109,7 @@ public class PageDefinition // *Deprecated* implements 
Serializable
 
     /**
      * Constructs a page definition
-     * @param path     the path of the view associated with this page
+     * @param path  the path of the view associated with this page
      * @param pageBeanClass the page bean class associated with this page
      * @param parent the parent page (if any). May be null
      */
@@ -129,7 +120,7 @@ public class PageDefinition // *Deprecated* implements 
Serializable
 
     /**
      * Constructs a page definition
-     * @param path     the path of the view associated with this page
+     * @param path  the path of the view associated with this page
      * @param pageBeanClass the page bean class associated with this page
      */
     public PageDefinition(String path, Class<? extends Page> pageBeanClass)
@@ -143,7 +134,7 @@ public class PageDefinition // *Deprecated* implements 
Serializable
         int lastSlash = path.lastIndexOf('/');
         String name = path.substring(lastSlash + 1);
         if (extension!=null)
-               name = name.substring(0,(name.length()-extension.length()));
+            name = name.substring(0,(name.length()-extension.length()));
         return name;
     }
     
@@ -154,8 +145,8 @@ public class PageDefinition // *Deprecated* implements 
Serializable
 
     public String getFileExtension() 
     {
-               return fileExtension;
-       }
+        return fileExtension;
+    }
     
     public String getPageBeanName()
     {
@@ -176,7 +167,7 @@ public class PageDefinition // *Deprecated* implements 
Serializable
     
     public PageOutcome getOutcome()
     {
-       String uri = PageDefinitions.getInstance().getPageUri(this);
+        String uri = PageDefinitions.getInstance().getPageUri(this);
         return new PageOutcome(uri);
     }
     
@@ -184,7 +175,7 @@ public class PageDefinition // *Deprecated* implements 
Serializable
     {
         PageOutcome outcome = getOutcome();
         if (StringUtils.isNotEmpty(action))
-            outcome = outcome.addParam("action", encodeActionParam(action));
+            outcome = outcome.addParam(ACTION_PARAMETER_NAME, 
encodeActionParam(this, action));
         return outcome;
     }
     
@@ -199,7 +190,7 @@ public class PageDefinition // *Deprecated* implements 
Serializable
     {   
         PageOutcome outcome = getRedirect();
         if (StringUtils.isNotEmpty(action))
-            outcome = outcome.addParam("action", encodeActionParam(action));
+            outcome = outcome.addParam(ACTION_PARAMETER_NAME, 
encodeActionParam(this, action));
         return outcome;
     }
     
@@ -214,7 +205,7 @@ public class PageDefinition // *Deprecated* implements 
Serializable
     {
         PageOutcome outcome = getRedirectWithViewParams();
         if (StringUtils.isNotEmpty(action))
-            outcome = outcome.addParam("action", encodeActionParam(action));
+            outcome = outcome.addParam(ACTION_PARAMETER_NAME, 
encodeActionParam(this, action));
         return outcome;
     }
 
diff --git 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/utils/ParameterMap.java
 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/utils/ParameterMap.java
index 18a9b3ec..cc8ad303 100644
--- 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/utils/ParameterMap.java
+++ 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/utils/ParameterMap.java
@@ -173,10 +173,10 @@ public class ParameterMap // *Deprecated* implements 
Serializable
      * @param useCache true if the keys should be cached
      * @return the encoded key
      */
-    public String put(String type, String key, boolean useCache)
+    public String put(String type, String key, String value, boolean useCache)
     {
         // Generate id and put in map
-        return encodeAndStore(type, key, key, useCache);
+        return encodeAndStore(type, key, value, useCache);
     }
 
     public Object get(String type, String id)
@@ -195,9 +195,10 @@ public class ParameterMap // *Deprecated* implements 
Serializable
     /**
      * Puts an object into the paramter map that implements the 
ParameterObject interface  
      * @param paramObject the param object
+     * @param useCache flag whether to cache the objectKey
      * @return the encoded object
      */
-    public String put(ParameterObject paramObject)
+    public String put(ParameterObject paramObject, boolean useCache)
     {
         String objectKey;
         // check param
@@ -205,7 +206,17 @@ public class ParameterMap // *Deprecated* implements 
Serializable
             throw new InvalidArgumentException("paramObject", paramObject);
         // Generate id and put in map
         String type = paramObject.getClass().getName();
-        return encodeAndStore(type, objectKey, paramObject, false);
+        return encodeAndStore(type, objectKey, paramObject, useCache);
+    }
+    
+    /**
+     * Puts an object into the paramter map that implements the 
ParameterObject interface  
+     * @param paramObject the param object
+     * @return the encoded object
+     */
+    public String put(ParameterObject paramObject)
+    {
+        return put(paramObject, false);
     }
 
     /**
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 91628e3f..1aabb1b8 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
@@ -924,9 +924,13 @@ public class TagEncodingHelper implements NamingContainer
             if (!(record instanceof Record))
                 return true;
         }
-        else if (!hasValueExpression())
-        {   // No Value expression given
-            return true;
+        else 
+        {   // Value expression required
+            if (!hasValueExpression())
+                return true; // No Value expression given
+            // check attribute
+            Object val = getTagAttributeValue("readonly");
+            return ObjectUtils.getBoolean(val);
         }
         // check attribute
         Object val = getTagAttributeValue("readonly");
@@ -1018,15 +1022,15 @@ public class TagEncodingHelper implements 
NamingContainer
         // Check Read-Only first
         if (isReadOnly())
             return false;
+        // Check Value Attribute
+        if (hasValueExpression())
+            return false;
         // Check Record
         if ((getRecord() instanceof Record))
         {   // Ask Record
             Record r = (Record) record;
             return r.isValid() && r.isFieldRequired(getColumn());
         }
-        // Check Value Attribute
-        if (hasValueExpression())
-            return false;
         // Required
         return getColumn().isRequired();
     }
@@ -1211,7 +1215,7 @@ public class TagEncodingHelper implements NamingContainer
             return rec;
         // Value expression
         if (hasValueExpression())
-        {   // See if the record is in value
+        {   // Value expression is provided instead. 
             return null;
         }       
         // if parent is a record tag, get the record from there
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
index 4223dc6f..ab04e73b 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
@@ -50,7 +50,7 @@ public class SelectInputControl extends InputControl
 
     public static final String  COLATTR_ABBR_OPTIONS  = "ABBR_OPTIONS";        
                           // Option list for abbreviations
 
-    public static final String  VALUE_EXPRESSION_FLAG = 
"VALUE_EXPRESSION_FLAG";
+    public static final String  VALUE_EXPRESSION_TYPE = 
"VALUE_EXPRESSION_TYPE";
 
     public static final String  FORMAT_SIZE           = "size:";
 
@@ -101,9 +101,13 @@ public class SelectInputControl extends InputControl
         // create list or menu
         Object formatSize = getFormatOption(ii, FORMAT_SIZE, FORMAT_SIZE_ATTR);
         UISelectOne input = createSelectComponent(parent, context, formatSize);
-        // setValueExpressionFlag
+        // set ValueExpressionType
         Object value = ii.getValue(false);
-        input.getAttributes().put(SelectInputControl.VALUE_EXPRESSION_FLAG, 
(value instanceof ValueExpression));
+        if (value instanceof ValueExpression)
+        {   // Set target class
+            Class<?> exprType = 
((ValueExpression)value).getType(context.getELContext());
+            
input.getAttributes().put(SelectInputControl.VALUE_EXPRESSION_TYPE, exprType);
+        }
         // copy Attributes
         copyAttributes(parent, ii, input);
         // disabled
@@ -129,9 +133,9 @@ public class SelectInputControl extends InputControl
         }
         UISelectOne input = (UISelectOne)comp;
         // required
-       addRemoveStyle(input, TagStyleClass.INPUT_REQ, ii.isRequired());
+        addRemoveStyle(input, TagStyleClass.INPUT_REQ, ii.isRequired());
         // disabled
-       boolean disabled = setDisabled(input, ii);
+        boolean disabled = setDisabled(input, ii);
         // check phase
         if (phaseId!=PhaseId.APPLY_REQUEST_VALUES)
         {   // Options (sync)
@@ -339,10 +343,10 @@ public class SelectInputControl extends InputControl
         }
         // set value
         Object value;
-        Object valueExpressionFlag = 
input.getAttributes().get(SelectInputControl.VALUE_EXPRESSION_FLAG);
-        if (ObjectUtils.getBoolean(valueExpressionFlag))
+        Class<?> exprType = 
(Class<?>)input.getAttributes().get(SelectInputControl.VALUE_EXPRESSION_TYPE);
+        if (exprType!=null)
         { // Use formatted value
-            value = formatInputValue(oe.getValue());
+            value = formatInputValue(oe.getValue(), exprType);
         }
         else
         { // Convert to String
@@ -423,13 +427,13 @@ public class SelectInputControl extends InputControl
             } 
         }
         // the value
-        return formatInputValue(value);
+        return formatInputValue(value, Object.class);
     }
 
-    protected Object formatInputValue(Object value)
+    protected Object formatInputValue(Object value, Class<?> targetClass)
     {
         // the enum Value
-        if (value instanceof Enum<?>)
+        if ((value instanceof Enum<?>) && !targetClass.isEnum())
             return ((Enum<?>) value).name();
         // the value
         return value;
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pages/PageDefinition.java 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pages/PageDefinition.java
index 1a559b99..59b28440 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pages/PageDefinition.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pages/PageDefinition.java
@@ -28,9 +28,9 @@ import org.slf4j.LoggerFactory;
 
 public class PageDefinition // *Deprecated* implements Serializable
 {
-       // *Deprecated* private static final long serialVersionUID = 1L;
+    // *Deprecated* private static final long serialVersionUID = 1L;
 
-       private static final Logger log = 
LoggerFactory.getLogger(PageDefinitions.class);
+    private static final Logger log = 
LoggerFactory.getLogger(PageDefinitions.class);
 
     private static final String ACTION_PARAMETER_TYPE = "ACTION";
     private static final String ACTION_PARAMETER_NAME = "action";
@@ -38,31 +38,16 @@ public class PageDefinition // *Deprecated* implements 
Serializable
     private final String path;
     private final String fileExtension;
 
-       private final String pageBeanName;
+    private final String pageBeanName;
     private final Class<? extends Page> pageBeanClass;
     private final PageDefinition parent;
 
-    /*
-    private static Hashtable<String, String> actionCodeMap = new 
Hashtable<String, String>();
-    
-    private static Hashtable<String, String> actionMap = new Hashtable<String, 
String>();
-
-    private static String encodeActionParam(String action)
-    {
-        String param = ParameterMap.encodeString(action);
-        actionMap.put(param, action);
-        return param;
-    }
-    
-    public static String decodeActionParam(String param)
-    {
-        String action = actionMap.get(param);
-        if (action==null)
-            log.warn("no action available for param {}.", param);
-        return action;
-    }
-    */
-
+    /**
+     * Encodes a page action method into a MD5 code and puts it on the 
session's action list.
+     * @param pageDef the page for which the action is provided
+     * @param action the name of the action method
+     * @return the encoded action
+     */
     private static String encodeActionParam(PageDefinition pageDef, String 
action)
     {
         ParameterMap pm = FacesUtils.getParameterMap(FacesUtils.getContext());
@@ -70,7 +55,12 @@ public class PageDefinition // *Deprecated* implements 
Serializable
             return action;
         return pm.put(ACTION_PARAMETER_TYPE, 
StringUtils.concat(pageDef.getPageBeanName(), ":", action), action, true);
     }
-    
+
+    /**
+     * Decodes a page action method from a MD5 code. 
+     * @param param the MD5 code for a page action method
+     * @return the action method name
+     */
     public static String decodeActionParam(String param)
     {
         ParameterMap pm = FacesUtils.getParameterMap(FacesUtils.getContext());
@@ -84,7 +74,7 @@ public class PageDefinition // *Deprecated* implements 
Serializable
     
     /**
      * Constructs a page definition
-     * @param path     the path of the view associated with this page
+     * @param path  the path of the view associated with this page
      * @param pageBeanClass the page bean class associated with this page
      * @param parent the parent page (if any). May be null
      * @param pageBeanName the page bean name. If null this will be calculated 
from the path
@@ -99,16 +89,16 @@ public class PageDefinition // *Deprecated* implements 
Serializable
         fileExtension = (ext>0) ? path.substring(ext) : null;
         // beanName
         if (pageBeanName==null) 
-               this.pageBeanName = getPageBeanNameFromPath(path, 
fileExtension);
+            this.pageBeanName = getPageBeanNameFromPath(path, fileExtension);
         else
-               this.pageBeanName = pageBeanName;
+            this.pageBeanName = pageBeanName;
         // add this view
         PageDefinitions.registerPage(this);
     }
 
     /**
      * Constructs a page definition
-     * @param path     the path of the view associated with this page
+     * @param path  the path of the view associated with this page
      * @param pageBeanClass the page bean class associated with this page
      * @param pageBeanName the page bean name. If null this will be calculated 
from the path
      */
@@ -119,7 +109,7 @@ public class PageDefinition // *Deprecated* implements 
Serializable
 
     /**
      * Constructs a page definition
-     * @param path     the path of the view associated with this page
+     * @param path  the path of the view associated with this page
      * @param pageBeanClass the page bean class associated with this page
      * @param parent the parent page (if any). May be null
      */
@@ -130,7 +120,7 @@ public class PageDefinition // *Deprecated* implements 
Serializable
 
     /**
      * Constructs a page definition
-     * @param path     the path of the view associated with this page
+     * @param path  the path of the view associated with this page
      * @param pageBeanClass the page bean class associated with this page
      */
     public PageDefinition(String path, Class<? extends Page> pageBeanClass)
@@ -144,7 +134,7 @@ public class PageDefinition // *Deprecated* implements 
Serializable
         int lastSlash = path.lastIndexOf('/');
         String name = path.substring(lastSlash + 1);
         if (extension!=null)
-               name = name.substring(0,(name.length()-extension.length()));
+            name = name.substring(0,(name.length()-extension.length()));
         return name;
     }
     
@@ -155,8 +145,8 @@ public class PageDefinition // *Deprecated* implements 
Serializable
 
     public String getFileExtension() 
     {
-               return fileExtension;
-       }
+        return fileExtension;
+    }
     
     public String getPageBeanName()
     {
@@ -177,7 +167,7 @@ public class PageDefinition // *Deprecated* implements 
Serializable
     
     public PageOutcome getOutcome()
     {
-       String uri = PageDefinitions.getInstance().getPageUri(this);
+        String uri = PageDefinitions.getInstance().getPageUri(this);
         return new PageOutcome(uri);
     }
     
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 d7e370c4..933db2bf 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
@@ -924,9 +924,13 @@ public class TagEncodingHelper implements NamingContainer
             if (!(record instanceof Record))
                 return true;
         }
-        else if (!hasValueExpression())
-        {   // No Value expression given
-            return true;
+        else 
+        {   // Value expression required
+            if (!hasValueExpression())
+                return true; // No Value expression given
+            // check attribute
+            Object val = getTagAttributeValue("readonly");
+            return ObjectUtils.getBoolean(val);
         }
         // check attribute
         Object val = getTagAttributeValue("readonly");
@@ -1018,15 +1022,15 @@ public class TagEncodingHelper implements 
NamingContainer
         // Check Read-Only first
         if (isReadOnly())
             return false;
+        // Check Value Attribute
+        if (hasValueExpression())
+            return false;
         // Check Record
         if ((getRecord() instanceof Record))
         {   // Ask Record
             Record r = (Record) record;
             return r.isValid() && r.isFieldRequired(getColumn());
         }
-        // Check Value Attribute
-        if (hasValueExpression())
-            return false;
         // Required
         return getColumn().isRequired();
     }
@@ -1211,7 +1215,7 @@ public class TagEncodingHelper implements NamingContainer
             return rec;
         // Value expression
         if (hasValueExpression())
-        {   // See if the record is in value
+        {   // Value expression is provided instead. 
             return null;
         }       
         // if parent is a record tag, get the record from there

Reply via email to