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 08d2bb3a EMPIREDB-446 SelectInputControl: sync jakarta with javax
08d2bb3a is described below

commit 08d2bb3af917bf0c0bacbaec1042681a46d1c07b
Author: Rainer Döbele <[email protected]>
AuthorDate: Sun Nov 17 20:08:09 2024 +0100

    EMPIREDB-446
    SelectInputControl: sync jakarta with javax
---
 .../jakarta/controls/SelectInputControl.java       | 142 +++++++++++++++------
 .../empire/jakarta/utils/TagEncodingHelper.java    |  24 ++--
 .../empire/jsf2/utils/TagEncodingHelper.java       |   4 +
 3 files changed, 115 insertions(+), 55 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 f97e05d6..c75ebf5c 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
@@ -19,12 +19,15 @@
 package org.apache.empire.jakarta.controls;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.OptionEntry;
 import org.apache.empire.commons.Options;
+import org.apache.empire.commons.Options.OptionGroupResolver;
 import org.apache.empire.data.Column;
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.UnexpectedReturnValueException;
@@ -43,6 +46,7 @@ import jakarta.faces.component.html.HtmlSelectOneMenu;
 import jakarta.faces.context.FacesContext;
 import jakarta.faces.event.PhaseId;
 import jakarta.faces.model.SelectItem;
+import jakarta.faces.model.SelectItemGroup;
 
 public class SelectInputControl extends InputControl
 {
@@ -188,6 +192,30 @@ public class SelectInputControl extends InputControl
         return ObjectUtils.isEmpty(currentValue);
     }
 
+    /**
+     * SelectGroup
+     * helper class for building SelectItemGroups
+     */
+    protected static class SelectGroup
+    {
+        private final SelectItemGroup  selectItemGroup;
+        private final List<SelectItem> groupItemList;
+        public SelectGroup(SelectItemGroup  selectItemGroup)
+        {
+            this.selectItemGroup = selectItemGroup;
+            this.groupItemList = new ArrayList<SelectItem>();
+        }
+        public List<SelectItem> getItemList()
+        {
+            return groupItemList;
+        }
+        public void peg()
+        {
+            SelectItem[] items = ObjectUtils.listToArray(SelectItem[].class, 
groupItemList);
+            selectItemGroup.setSelectItems(items);
+        }
+    }
+    
     public void initOptions(UISelectOne input, TextResolver textResolver, 
InputInfo ii)
     {
         // get the options
@@ -200,25 +228,57 @@ public class SelectInputControl extends InputControl
                 log.warn("No options given for select tag {}", 
input.getClientId());
             options = new Options();
         }
+        // list and type
+        Class<?> exprType = 
(Class<?>)input.getAttributes().get(SelectInputControl.VALUE_EXPRESSION_TYPE);
+        List<SelectItem> selectItemList = getSelectItemList(input);
         // current 
         Object currentValue = ii.getValue(true);
         if (isEmptyEntryRequired(input, options, ii, currentValue))
         {   // Empty entry
-            addSelectItem(input, textResolver, new OptionEntry(null, 
getNullText(ii)));
+            addSelectItem(selectItemList, textResolver, new OptionEntry(null, 
getNullText(ii)), exprType);
         }
         if (options != null && options.size() > 0)
-        {   // Add options
+        {   // Option grouping?
+            OptionGroupResolver optionGroupResolver = 
options.getOptionGroupResolver();
+            Map<Object, SelectGroup> groupMap = (optionGroupResolver!=null ? 
new HashMap<Object, SelectGroup>() : null);
+            // Add options
             for (OptionEntry oe : options)
             {   // Option entries
                 if (oe.isActive() || ObjectUtils.compareEqual(oe.getValue(), 
currentValue))
-                {   // add active or current item   
-                    addSelectItem(input, textResolver, oe);
+                {   // add active or current item
+                    List<SelectItem> list = selectItemList; 
+                    if (optionGroupResolver!=null)
+                    {   // get the option group
+                        Object group = optionGroupResolver.getGroup(oe);
+                        if (group!=null)
+                        {   // We have a group
+                            SelectGroup selectGroup = groupMap.get(group);
+                            if (selectGroup==null)
+                            {   // Create a new group
+                                String groupLabel = (group!=null ? 
textResolver.resolveText(group.toString()) : null); 
+                                SelectItemGroup selectItemGroup = new 
SelectItemGroup(groupLabel);
+                                selectItemList.add(selectItemGroup);
+                                // add group to map
+                                selectGroup = new SelectGroup(selectItemGroup);
+                                groupMap.put(group, selectGroup);
+                            }
+                            list = selectGroup.getItemList();
+                        }
+                    }
+                    addSelectItem(list, textResolver, oe, exprType);
                 }
                 else if (log.isDebugEnabled())
                 {   // not active, ignore this one
                     log.debug("Select item {} is not active.", oe.getValue());
                 }
             }
+            // complete groups
+            if (groupMap!=null)
+            {   // Peg all SelectItemGroups
+                for (SelectGroup group : groupMap.values())
+                    group.peg();
+                groupMap.clear();
+            }
         }
     }
     
@@ -234,27 +294,28 @@ public class SelectInputControl extends InputControl
                 input.getChildren().clear();
             return;
         }
+        
+        // check grouping
+        OptionGroupResolver optionGroupResolver = 
options.getOptionGroupResolver();
+        if (optionGroupResolver!=null)
+        {   // not (yet) supported
+            log.debug("SyncOptions is not supported for grouped SelectItems 
for column {}", ii.getColumn().getName());
+            return;
+        }
+        
+        // list and type
+        Class<?> exprType = 
(Class<?>)input.getAttributes().get(SelectInputControl.VALUE_EXPRESSION_TYPE);
+        List<SelectItem> selectItemList = getSelectItemList(input);
+
+        // prepare
         Object currentValue = ii.getValue(true);
         boolean hasEmpty = isEmptyEntryRequired(input, options, ii, 
currentValue);
         // boolean isInsideUIData = ii.isInsideUIData();
         // Compare child-items with options
         Iterator<OptionEntry> ioe = options.iterator();
         OptionEntry oe = (ioe.hasNext() ? ioe.next() : null);
-
-        // get UISelectItems
-        List<UIComponent> childList = input.getChildren();
-        if (childList.isEmpty())
-            childList.add(new UISelectItems());
-        else if (childList.size()>1 && !(childList.get(1) instanceof 
UIParameter))
-            log.warn("Unexpected number of child items ({}) for 
SelectInputControl of column {}", childList.size(), ii.getColumn().getName());
-        UISelectItems items = (UISelectItems) childList.get(0);
-        // get SelectItem list
-        @SuppressWarnings("unchecked")
-        List<SelectItem> selectItemList = (List<SelectItem>) items.getValue();
-        if (selectItemList==null)
-        {   selectItemList = new ArrayList<SelectItem>();
-            items.setValue(selectItemList);
-        }
+        
+        // sync
         Iterator<SelectItem> ico = selectItemList.iterator();
         int lastIndex = 0;
         boolean emptyPresent = false;
@@ -294,13 +355,13 @@ public class SelectInputControl extends InputControl
             input.getChildren().clear();
             if (hasEmpty)
             {   // add empty entry
-                addSelectItem(input, textResolver, new OptionEntry("", 
getNullText(ii)));
+                addSelectItem(selectItemList, textResolver, new 
OptionEntry("", getNullText(ii)), exprType);
             }
             for (OptionEntry opt : options)
             { // Option entries
                 if (opt.isActive() || ObjectUtils.compareEqual(opt.getValue(), 
currentValue))
                 { // add active or current item
-                    addSelectItem(input, textResolver, opt);
+                    addSelectItem(selectItemList, textResolver, opt, exprType);
                 }
             }
             // done
@@ -309,41 +370,42 @@ public class SelectInputControl extends InputControl
         // check empty entry
         if (hasEmpty && !emptyPresent)
         { // add missing empty entry
-            addSelectItem(input, textResolver, new OptionEntry("", 
getNullText(ii)), 0);
+            addSelectItem(selectItemList, textResolver, new OptionEntry("", 
getNullText(ii)), exprType, 0);
         }
         // Are there any items left?
         while (oe != null)
         { // add missing item
             if (oe.isActive() || ObjectUtils.compareEqual(oe.getValue(), 
currentValue))
             { // add item
-                addSelectItem(input, textResolver, oe);
+                addSelectItem(selectItemList, textResolver, oe, exprType);
             }
             oe = (ioe.hasNext() ? ioe.next() : null);
         }
     }
     
-    @SuppressWarnings("unchecked")
-    public void addSelectItem(UIComponent input, TextResolver textResolver, 
OptionEntry oe, int pos)
+    protected List<SelectItem> getSelectItemList(UISelectOne input)
     {
         List<UIComponent> children = input.getChildren();
         // UISelectItems
-        UISelectItems items;
-        List<SelectItem> list;
         if (children.isEmpty())
-        {   // create and add UISelectItems
-            items = new UISelectItems();
-            children.add(items);
-            list = new ArrayList<SelectItem>();
-            items.setValue(list);
-        }
-        else
-        {   // use existing UISelectItems
-            items = ((UISelectItems) children.get(0));
-            list = ((List<SelectItem>) items.getValue());
+            children.add(new UISelectItems());
+        else if (children.size()>1 && !(children.get(1) instanceof 
UIParameter))
+            log.warn("Unexpected number of child items ({}) for 
SelectInputControl", children.size());
+        UISelectItems items = (UISelectItems) children.get(0);
+        // List<SelectItem>
+        @SuppressWarnings("unchecked")
+        List<SelectItem> selectItemList = (List<SelectItem>) items.getValue();
+        if (selectItemList==null)
+        {   selectItemList = new ArrayList<SelectItem>();
+            items.setValue(selectItemList);
         }
+        return selectItemList;
+    }
+    
+    public void addSelectItem(List<SelectItem> list, TextResolver 
textResolver, OptionEntry oe, Class<?> exprType, int pos)
+    {
         // set value
         Object value;
-        Class<?> exprType = 
(Class<?>)input.getAttributes().get(SelectInputControl.VALUE_EXPRESSION_TYPE);
         if (exprType!=null)
         { // Use formatted value
             value = formatInputValue(oe.getValue(), exprType);
@@ -364,9 +426,9 @@ public class SelectInputControl extends InputControl
             list.add(selectItem);
     }
 
-    public void addSelectItem(UIComponent input, TextResolver textResolver, 
OptionEntry e)
+    public void addSelectItem(List<SelectItem> list, TextResolver 
textResolver, OptionEntry e, Class<?> exprType)
     {
-        addSelectItem(input, textResolver, e, -1);
+        addSelectItem(list, textResolver, e, exprType, -1);
     }
     
     protected void setItemLabel(SelectItem si, TextResolver textResolver, 
OptionEntry oe)
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 8cf95f36..6a7d07ac 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
@@ -668,18 +668,8 @@ public class TagEncodingHelper implements NamingContainer
     public boolean hasColumn()
     {
         if (column == null)
-            column = findColumn();
-        /* removed 2024-06-03
-        if (column == null)
-        {   // @deprecated: for compatibility only!
-            if (getTagAttributeValue("column")!=null)
-                return false; // provided but not found
-            // find value
-            column = findColumnFromValue();  
-            if (column!=null)
-                log.warn("Providing the column as the value is deprecated. Use 
column attribute instead. This might be removed in future versions!");
-        }
-        */
+            setColumn(findColumn());
+        // has column?
         return (column != null);
     }
 
@@ -695,14 +685,14 @@ public class TagEncodingHelper implements NamingContainer
     {
         // don't use hasColumn() or getColumn() here!
         if (column==null)
-            column = findColumn(); 
+            setColumn(findColumn()); 
         return (column!=null ? column.getName() : StringUtils.NULL);
     }
     
     public String getColumnFullName()
     {
         if (column==null)
-            column = findColumn();
+            setColumn(findColumn());
         if (column==null)
             return StringUtils.NULL;
         // Find Entity
@@ -1441,6 +1431,10 @@ public class TagEncodingHelper implements NamingContainer
                     String prop = ttc.getBeanPropertyName();
                     value = getBeanPropertyValue(record, prop);
                 }
+                // resolve options
+                Options options = (value==null || value instanceof Enum) ? 
null : ttc.getOptions();
+                if (options!=null && !hasFormat("notitlelookup"))
+                    value = options.get(value);
                 // convert to display text
                 return getDisplayText(value);
             } 
@@ -1647,7 +1641,7 @@ public class TagEncodingHelper implements NamingContainer
                 if (input!=null && (input instanceof InputTag))
                 {   // Copy from InputTag
                     InputTag inputTag = ((InputTag)input);
-                    this.column = inputTag.getInputColumn();
+                    setColumn(inputTag.getInputColumn());
                     this.readOnly = (inputTag.isInputReadOnly() ? (byte)1 : 
(byte)0);
                     this.valueRequired = (inputTag.isInputRequired() ? (byte)1 
: (byte)0);
                 }
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 fdc228c1..1e16d6d4 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
@@ -1431,6 +1431,10 @@ public class TagEncodingHelper implements NamingContainer
                     String prop = ttc.getBeanPropertyName();
                     value = getBeanPropertyValue(record, prop);
                 }
+                // resolve options
+                Options options = (value==null || value instanceof Enum) ? 
null : ttc.getOptions();
+                if (options!=null && !hasFormat("notitlelookup"))
+                    value = options.get(value);
                 // convert to display text
                 return getDisplayText(value);
             } 

Reply via email to