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 18ddbf07 EMPIREDB-422 FormGridTag improvments
18ddbf07 is described below

commit 18ddbf073ab022b0460086717f02071ee000e14d
Author: Rainer Döbele <[email protected]>
AuthorDate: Fri May 17 11:56:46 2024 +0200

    EMPIREDB-422
    FormGridTag improvments
---
 .../apache/empire/jsf2/components/ControlTag.java  | 19 ++++-
 .../apache/empire/jsf2/components/FormGridTag.java | 24 +++++--
 .../apache/empire/jsf2/components/MenuItemTag.java |  2 +-
 .../apache/empire/jsf2/components/MenuListTag.java |  2 +-
 .../apache/empire/jsf2/components/TabViewTag.java  |  2 +-
 .../empire/jsf2/utils/ControlRenderInfo.java       |  8 +--
 .../empire/jsf2/utils/TagEncodingHelper.java       | 81 +++++++++++++++++-----
 7 files changed, 105 insertions(+), 33 deletions(-)

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 52887087..51d87cd6 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
@@ -329,7 +329,7 @@ public class ControlTag extends UIInput implements 
NamingContainer
             ResponseWriter writer = context.getResponseWriter();
             writer.startElement(renderInfo.CONTROL_TAG, this);
             // render id
-            helper.writeComponentId(writer, renderInfo.RENDER_AUTO_ID);
+            helper.writeComponentId(writer, false);
             // style class
             String controlClass = 
helper.getTagAttributeStringEx("controlClass"); 
             String styleClass   = helper.getControlContextStyleClass(); 
@@ -437,6 +437,23 @@ public class ControlTag extends UIInput implements 
NamingContainer
         super.setId(id);
     }
 
+    @Override
+    public void setParent(UIComponent parent)
+    {
+        super.setParent(parent);
+        // check
+        if (helper.hasComponentId())
+            return;
+        if (this.renderInfo==null) {
+            this.renderInfo=helper.getControlRenderInfo();
+            if (this.renderInfo!=null && 
this.renderInfo.AUTO_CONTROL_ID!=null) {
+                String compId = 
helper.completeInputTagId(this.renderInfo.AUTO_CONTROL_ID.toString());
+                log.warn("Auto-Setting compontent id for control to {}", 
compId);
+                super.setId(compId);
+            }
+        }
+    }
+
     @Override
     public String getId()
     {
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/FormGridTag.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/FormGridTag.java
index d7a98aa8..d75f7c7e 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/FormGridTag.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/FormGridTag.java
@@ -20,13 +20,12 @@ package org.apache.empire.jsf2.components;
 
 import java.io.IOException;
 
-import javax.faces.component.NamingContainer;
 import javax.faces.component.UINamingContainer;
 import javax.faces.component.UIOutput;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 
-import org.apache.empire.commons.ObjectUtils;
+import org.apache.empire.commons.StringUtils;
 import org.apache.empire.jsf2.controls.InputControl;
 import org.apache.empire.jsf2.utils.ControlRenderInfo;
 import org.apache.empire.jsf2.utils.TagEncodingHelper;
@@ -35,7 +34,7 @@ import org.apache.empire.jsf2.utils.TagStyleClass;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class FormGridTag extends UIOutput implements NamingContainer
+public class FormGridTag extends UIOutput // implements NamingContainer
 {
     // Logger
     private static final Logger log = 
LoggerFactory.getLogger(FormGridTag.class);
@@ -112,7 +111,7 @@ public class FormGridTag extends UIOutput implements 
NamingContainer
         ResponseWriter writer = context.getResponseWriter();
         writer.startElement(mode.GRID_TAG, this);
         // id
-        helper.writeComponentId(writer, getControlRenderInfo().RENDER_AUTO_ID);
+        helper.writeComponentId(writer);
         // style class
         helper.writeStyleClass(writer);
         helper.writeAttribute(writer, InputControl.HTML_ATTR_STYLE, 
helper.getTagAttributeString("style"));
@@ -150,10 +149,21 @@ public class FormGridTag extends UIOutput implements 
NamingContainer
         // check mode
         if (this.mode==null)
             this.mode = 
FormGridMode.detect(helper.getTagAttributeString("mode", 
FormGridMode.GRID.name())); 
-        // additional
-        boolean renderAutoId = 
ObjectUtils.getBoolean(helper.getTagAttributeString("renderAutoId"));
+        // autoControlId
+        Character autoControlId = null;
+        Object autoId = helper.getTagAttributeString("autoControlId");
+        if (autoId!=null)
+        {   // check
+            String id = autoId.toString();
+            if ("true".equalsIgnoreCase(id))
+                autoControlId = TagEncodingHelper.PH_COLUMN_SMART;
+            else if (id.length()==1 && StringUtils.indexOfAny(id, 
TagEncodingHelper.ALLOWED_COLUMN_PH)>=0)
+                autoControlId = id.charAt(0);
+            else if (!"false".equalsIgnoreCase(id))
+                log.warn("FormGridTag: Invalid value \"{}\" for attribute 
\"autoControlId\". Allowed values are *|@|&", id);
+        }
         // create control info
-        this.controlRenderInfo = new ControlRenderInfo(mode.CONTROL_TAG, 
mode.LABEL_TAG, mode.INPUT_TAG, renderAutoId);
+        this.controlRenderInfo = new ControlRenderInfo(mode.CONTROL_TAG, 
mode.LABEL_TAG, mode.INPUT_TAG, autoControlId);
         return controlRenderInfo;
     }
 }
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/MenuItemTag.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/MenuItemTag.java
index 3a35b721..1ea8fd36 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/MenuItemTag.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/MenuItemTag.java
@@ -109,7 +109,7 @@ public class MenuItemTag extends LinkTag
         writer.startElement("li", this);
         
         //Compoent-ID
-        helper.writeComponentId(writer, false);
+        helper.writeComponentId(writer);
         
         // Style Class
         helper.writeAttribute(writer, "class", getStyleClass());
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/MenuListTag.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/MenuListTag.java
index 709da792..24b75f98 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/MenuListTag.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/MenuListTag.java
@@ -82,7 +82,7 @@ public class MenuListTag extends UIOutput // implements 
NamingContainer
         writer.startElement("ul", this);
         
         //Compoent-ID
-        helper.writeComponentId(writer, false);
+        helper.writeComponentId(writer);
         
         // Style class and style
         helper.writeAttribute(writer, "class", getStyleClass());
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/TabViewTag.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/TabViewTag.java
index abaa3c50..7d19371b 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/TabViewTag.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/TabViewTag.java
@@ -211,7 +211,7 @@ public class TabViewTag extends UIOutput // implements 
NamingContainer
         // render components
         ResponseWriter writer = context.getResponseWriter();
         writer.startElement(InputControl.HTML_TAG_DIV, this);
-        helper.writeComponentId(writer, true);
+        helper.writeComponentId(writer);
         helper.writeStyleClass(writer);
         // style
         String style = this.helper.getTagAttributeString("style");
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/ControlRenderInfo.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/ControlRenderInfo.java
index b6ccaf57..733f158c 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/ControlRenderInfo.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/ControlRenderInfo.java
@@ -32,20 +32,20 @@ public class ControlRenderInfo
     {
         public DefaultControlRenderInfo()
         {
-            super(null, InputControl.HTML_TAG_TD, InputControl.HTML_TAG_TD, 
true);
+            super(null, InputControl.HTML_TAG_TD, InputControl.HTML_TAG_TD, 
null);
         }
     }
     
     public final String CONTROL_TAG;
     public final String LABEL_WRAPPER_TAG;
     public final String INPUT_WRAPPER_TAG;
-    public final boolean RENDER_AUTO_ID;
+    public final Character AUTO_CONTROL_ID;
     
-    public ControlRenderInfo(String controlTag, String labelTag, String 
inputTag, boolean renderAutoId)
+    public ControlRenderInfo(String controlTag, String labelTag, String 
inputTag, Character autoControlId)
     {
         this.CONTROL_TAG = StringUtils.nullIfEmpty(controlTag);
         this.LABEL_WRAPPER_TAG = StringUtils.nullIfEmpty(labelTag);
         this.INPUT_WRAPPER_TAG = StringUtils.nullIfEmpty(inputTag);
-        this.RENDER_AUTO_ID = renderAutoId;
+        this.AUTO_CONTROL_ID = autoControlId;
     }
 }
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 0edf2520..254a2038 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
@@ -20,6 +20,7 @@ package org.apache.empire.jsf2.utils;
 
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Locale;
 import java.util.Set;
@@ -50,9 +51,9 @@ import org.apache.empire.commons.Unwrappable;
 import org.apache.empire.data.Column;
 import org.apache.empire.data.ColumnExpr;
 import org.apache.empire.data.DataType;
+import org.apache.empire.data.EntityType;
 import org.apache.empire.data.Record;
 import org.apache.empire.data.RecordData;
-import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBRecordBase;
 import org.apache.empire.db.DBRowSet;
@@ -118,6 +119,13 @@ public class TagEncodingHelper implements NamingContainer
         {
             return expr.getEnumType();
         }
+        
+        @Override
+        public EntityType getEntityType()
+        {
+            Column column = getUpdateColumn();
+            return (column!=null ? column.getEntityType() : null);
+        }
 
         @Override
         public String getName()
@@ -494,31 +502,48 @@ public class TagEncodingHelper implements NamingContainer
         checkRecord();
     }
     
-    protected static final String PH_COLUMN_NAME = "@";  // placeholder for 
column name
-    protected static final String PH_COLUMN_FULL = "&";  // placeholder for 
column full name including table
+    public static final char PH_COLUMN_NAME  = '@';  // placeholder for column 
name
+    public static final char PH_COLUMN_FULL  = '$';  // placeholder for column 
full name including table
+    public static final char PH_COLUMN_SMART = '*';  // placeholder for column 
name smart mode
+    public static final char[] ALLOWED_COLUMN_PH = new char[] { 
PH_COLUMN_NAME, PH_COLUMN_FULL, PH_COLUMN_SMART };
+    public static final Set<String> SMART_COLUMN_NAME_SET;
+    static {
+        SMART_COLUMN_NAME_SET = new HashSet<String>();
+        SMART_COLUMN_NAME_SET.add("ID");
+        SMART_COLUMN_NAME_SET.add("NAME");
+        SMART_COLUMN_NAME_SET.add("STATUS");
+    }
 
     public String completeInputTagId(String id)
     {
         // EmptyString or AT
-        if (StringUtils.isEmpty(id) || PH_COLUMN_NAME.equals(id))
-            return getColumnName();
+        if (StringUtils.isEmpty(id))
+            id = "*"; // Smart
+        else if (id.startsWith(FACES_ID_PREFIX))
+            return id; // Faces-Auto-ID
         // replace placeholder
-        if (id.indexOf(PH_COLUMN_NAME)>=0)
+        int idx;
+        String name;
+        if ((idx=id.indexOf(PH_COLUMN_NAME))>=0)
         {   // column name only
-            id = id.replace(PH_COLUMN_NAME, getColumnName());
+            name = getColumnName();
         }
-        else if (id.indexOf(PH_COLUMN_FULL)>=0) 
+        else if ((idx=id.indexOf(PH_COLUMN_SMART))>=0)
+        {   // column name only
+            name = getColumnName();
+            if (SMART_COLUMN_NAME_SET.contains(name))
+                name= getColumnFullName();
+        }
+        else if ((idx=id.indexOf(PH_COLUMN_FULL))>=0) 
         {   // column full name including table
-            String name= null;
-            if (column==null)
-                column = findColumn();
-            if (column instanceof DBColumn)
-                name = ((DBColumn)column).getFullName().replace('.', '_');
-            else if (column!=null)
-                name = column.getName();
-            id = id.replace(PH_COLUMN_FULL, String.valueOf(name));
+            name= getColumnFullName();
+        }
+        else 
+        {   // No placeholder
+            return id;
         }
         // done 
+        id = (id.length()>1 ? StringUtils.concat(id.substring(0, idx), name, 
id.substring(idx+1)) : name); 
         return id;
     }
     
@@ -675,7 +700,21 @@ public class TagEncodingHelper implements NamingContainer
         // don't use hasColumn() or getColumn() here!
         if (column==null)
             column = findColumn(); 
-        return (column!=null ? column.getName() : "null");
+        return (column!=null ? column.getName() : StringUtils.NULL);
+    }
+    
+    public String getColumnFullName()
+    {
+        if (column==null)
+            column = findColumn();
+        if (column==null)
+            return StringUtils.NULL;
+        // Find Entity
+        EntityType entity = column.getEntityType();
+        if (entity!=null)
+            return StringUtils.concat(entity.getEntityName(), "_", 
column.getName());
+        // No Entity
+        return column.getName();
     }
 
     public void setColumn(Column column)
@@ -1547,6 +1586,12 @@ public class TagEncodingHelper implements NamingContainer
         if (renderAutoId || hasComponentId())
             writer.writeAttribute(InputControl.HTML_ATTR_ID, 
component.getClientId(), null);
     }
+    
+    public void writeComponentId(ResponseWriter writer)
+            throws IOException
+    {
+        writeComponentId(writer, (component instanceof NamingContainer));
+    }
 
     public void writeStyleClass(ResponseWriter writer, String... styleClasses)
         throws IOException
@@ -1581,7 +1626,7 @@ public class TagEncodingHelper implements NamingContainer
         writer.startElement(tagName, this.component);
         // render id
         if (renderId)
-            writeComponentId(writer, false);
+            writeComponentId(writer);
         // style class
         String wrapCtxClass = (renderValue ? "eWrapVal" : "eWrapInp");
         writeStyleClass(writer, wrapCtxClass, nullIf(wrapperClass, '-'));

Reply via email to