You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lo...@apache.org on 2021/03/20 13:34:20 UTC

[myfaces-tobago] 03/04: chore: refactor ComponentUtils -> RendererBase

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

lofwyr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/myfaces-tobago.git

commit 72c311ddf4cd64a6ca3fa12e2a83a566f10f4755
Author: Udo Schnurpfeil <ud...@irian.eu>
AuthorDate: Fri Mar 19 18:39:58 2021 +0100

    chore: refactor ComponentUtils -> RendererBase
---
 .../renderer/SelectManyCheckboxRenderer.java       |  2 +-
 .../renderkit/renderer/SelectOneRadioRenderer.java |  2 +-
 .../tobago/internal/util/HtmlRendererUtils.java    | 86 ++--------------------
 .../myfaces/tobago/internal/util/RenderUtils.java  | 21 +-----
 .../myfaces/tobago/renderkit/RendererBase.java     | 19 ++++-
 .../apache/myfaces/tobago/util/ComponentUtils.java | 21 +++---
 6 files changed, 40 insertions(+), 111 deletions(-)

diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxRenderer.java
index c135bd3..6f031a8 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxRenderer.java
@@ -84,7 +84,7 @@ public class SelectManyCheckboxRenderer<T extends AbstractUISelectManyCheckbox>
         writer.startElement(HtmlElements.INPUT);
         writer.writeClassAttribute(BootstrapClass.FORM_CHECK_INPUT);
         writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.CHECKBOX);
-        final String formattedValue = ComponentUtils.getFormattedValue(facesContext, component, item.getValue());
+        final String formattedValue = getFormattedValue(facesContext, component, item.getValue());
         final boolean checked;
         if (submittedValues == null) {
           checked = ArrayUtils.contains(values, item.getValue());
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioRenderer.java
index 202838b..a657ed8 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioRenderer.java
@@ -84,7 +84,7 @@ public class SelectOneRadioRenderer<T extends AbstractUISelectOneRadio> extends
         writer.startElement(HtmlElements.INPUT);
         writer.writeClassAttribute(BootstrapClass.FORM_CHECK_INPUT);
         writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.RADIO);
-        final String formattedValue = ComponentUtils.getFormattedValue(facesContext, component, item.getValue());
+        final String formattedValue = getFormattedValue(facesContext, component, item.getValue());
         final boolean checked;
         if (submittedValue == null) {
           checked = ObjectUtils.equals(item.getValue(), value);
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/HtmlRendererUtils.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/HtmlRendererUtils.java
index 97fe57c..fb3f082 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/HtmlRendererUtils.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/HtmlRendererUtils.java
@@ -20,11 +20,6 @@
 package org.apache.myfaces.tobago.internal.util;
 
 import org.apache.myfaces.tobago.component.Attributes;
-import org.apache.myfaces.tobago.component.RendererTypes;
-import org.apache.myfaces.tobago.component.Tags;
-import org.apache.myfaces.tobago.component.Visual;
-import org.apache.myfaces.tobago.context.Markup;
-import org.apache.myfaces.tobago.internal.component.AbstractUIStyle;
 import org.apache.myfaces.tobago.renderkit.LabelWithAccessKey;
 import org.apache.myfaces.tobago.renderkit.RendererBase;
 import org.apache.myfaces.tobago.renderkit.css.FaIcons;
@@ -43,10 +38,8 @@ import javax.faces.component.UIComponent;
 import javax.faces.component.UIInput;
 import javax.faces.context.FacesContext;
 import javax.faces.model.SelectItem;
-import javax.faces.model.SelectItemGroup;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
-import java.util.Arrays;
 import java.util.Locale;
 import java.util.Map;
 
@@ -142,79 +135,14 @@ public final class HtmlRendererUtils {
       final Iterable<SelectItem> items, final Object[] values, final String[] submittedValues,
       final Boolean onlySelected, final TobagoResponseWriter writer, final FacesContext facesContext)
       throws IOException {
-
-    if (LOG.isDebugEnabled()) {
-      LOG.debug("component id = '{}'", component.getId());
-      LOG.debug("values = '{}'", Arrays.toString(values));
-      LOG.debug("submittedValues = '{}'", Arrays.toString(submittedValues));
-    }
-    for (final SelectItem item : items) {
-      if (item instanceof SelectItemGroup) {
-        writer.startElement(HtmlElements.OPTGROUP);
-        writer.writeAttribute(HtmlAttributes.LABEL, item.getLabel(), true);
-        if (item.isDisabled()) {
-          writer.writeAttribute(HtmlAttributes.DISABLED, true);
-        }
-        final SelectItem[] selectItems = ((SelectItemGroup) item).getSelectItems();
-        renderSelectItems(component, optionClass, Arrays.asList(selectItems), values, submittedValues,
-            onlySelected, writer, facesContext);
-        writer.endElement(HtmlElements.OPTGROUP);
-      } else {
-
-        Object itemValue = item.getValue();
-        // when using selectItem tag with a literal value: use the converted value
-        if (itemValue instanceof String && values != null && values.length > 0 && !(values[0] instanceof String)) {
-          itemValue = ComponentUtils.getConvertedValue(facesContext, component, (String) itemValue);
-        }
-        final String formattedValue = ComponentUtils.getFormattedValue(facesContext, component, itemValue);
-        final boolean contains;
-        if (submittedValues == null) {
-          contains = ArrayUtils.contains(values, itemValue);
-        } else {
-          contains = ArrayUtils.contains(submittedValues, formattedValue);
-        }
-        if (onlySelected != null) {
-          if (onlySelected) {
-            if (!contains) {
-              continue;
-            }
-          } else {
-            if (contains) {
-              continue;
-            }
-          }
-        }
-        writer.startElement(HtmlElements.OPTION);
-        writer.writeAttribute(HtmlAttributes.VALUE, formattedValue, true);
-        if (item instanceof org.apache.myfaces.tobago.model.SelectItem) {
-          final String image = ((org.apache.myfaces.tobago.model.SelectItem) item).getImage();
-          if (image != null) {
-            final AbstractUIStyle style = (AbstractUIStyle) facesContext.getApplication()
-                .createComponent(facesContext, Tags.style.componentType(), RendererTypes.Style.name());
-            style.setTransient(true);
-            style.setBackgroundImage(image);
-            style.setSelector(
-                StyleRenderUtils.encodeIdSelector(component.getClientId(facesContext))
-                    + " option[value=" + formattedValue + "]");
-            // XXX This works not in common browsers...
-            component.getChildren().add(style);
-          }
-        }
-        Markup markup = item instanceof Visual ? ((Visual) item).getMarkup() : Markup.NULL;
-        if (onlySelected == null && contains) {
-          writer.writeAttribute(HtmlAttributes.SELECTED, true);
-          markup = Markup.SELECTED.add(markup);
-        }
-        if (item.isDisabled()) {
-          writer.writeAttribute(HtmlAttributes.DISABLED, true);
-          markup = Markup.DISABLED.add(markup);
-        }
-        writer.writeClassAttribute(optionClass, optionClass != null ? optionClass.createMarkup(markup) : null);
-
-        writer.writeText(item.getLabel());
-        writer.endElement(HtmlElements.OPTION);
+    new RendererBase<UIComponent>() {
+      public void fake(final UIInput component, final TobagoClass optionClass,
+                       final Iterable<SelectItem> items, final Object[] values, final String[] submittedValues,
+                       final Boolean onlySelected, final TobagoResponseWriter writer, final FacesContext facesContext)
+          throws IOException {
+        renderSelectItems(component, optionClass, items, values, submittedValues, onlySelected, writer, facesContext);
       }
-    }
+    }.fake(component, optionClass, items, values, submittedValues, onlySelected, writer, facesContext);
   }
 
   public static void writeDataAttributes(
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/RenderUtils.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/RenderUtils.java
index 221b83b..261fc5a 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/RenderUtils.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/RenderUtils.java
@@ -38,11 +38,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.faces.application.ViewHandler;
-import javax.faces.component.EditableValueHolder;
 import javax.faces.component.UIComponent;
 import javax.faces.component.UIPanel;
 import javax.faces.component.UIParameter;
-import javax.faces.component.ValueHolder;
 import javax.faces.component.behavior.AjaxBehavior;
 import javax.faces.component.behavior.ClientBehavior;
 import javax.faces.component.behavior.ClientBehaviorBase;
@@ -142,22 +140,11 @@ public final class RenderUtils {
    */
   @Deprecated
   public static String currentValue(final UIComponent component) {
-    String currentValue = null;
-    if (component instanceof ValueHolder) {
-      Object value;
-      if (component instanceof EditableValueHolder) {
-        value = ((EditableValueHolder) component).getSubmittedValue();
-        if (value != null) {
-          return (String) value;
-        }
-      }
-
-      value = ((ValueHolder) component).getValue();
-      if (value != null) {
-        currentValue = ComponentUtils.getFormattedValue(FacesContext.getCurrentInstance(), component, value);
+    return new RendererBase<UIComponent>() {
+      public String fake(final UIComponent component) {
+        return getCurrentValue(FacesContext.getCurrentInstance(), component);
       }
-    }
-    return currentValue;
+    }.fake(component);
   }
 
   public static void decodedStateOfTreeData(final FacesContext facesContext, final AbstractUIData data) {
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/RendererBase.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/RendererBase.java
index df22260..2222a9a 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/RendererBase.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/RendererBase.java
@@ -154,7 +154,7 @@ public abstract class RendererBase<T extends UIComponent> extends Renderer {
       String currentValue = null;
       final Object result = ((ValueHolder) component).getValue();
       if (result != null) {
-        currentValue = ComponentUtils.getFormattedValue(facesContext, component, result);
+        currentValue = getFormattedValue(facesContext, component, result);
       }
       return currentValue;
     } else {
@@ -420,7 +420,7 @@ public abstract class RendererBase<T extends UIComponent> extends Renderer {
         if (itemValue instanceof String && values != null && values.length > 0 && !(values[0] instanceof String)) {
           itemValue = ComponentUtils.getConvertedValue(facesContext, component, (String) itemValue);
         }
-        final String formattedValue = ComponentUtils.getFormattedValue(facesContext, component, itemValue);
+        final String formattedValue = getFormattedValue(facesContext, component, itemValue);
         final boolean contains;
         if (submittedValues == null) {
           contains = ArrayUtils.contains(values, itemValue);
@@ -471,4 +471,19 @@ public abstract class RendererBase<T extends UIComponent> extends Renderer {
     }
   }
 
+  protected String getFormattedValue(
+      final FacesContext facesContext, final UIComponent component, final Object currentValue)
+      throws ConverterException {
+
+    if (currentValue == null) {
+      return "";
+    }
+
+    final Converter converter = ComponentUtils.getConverter(facesContext, component, currentValue);
+    if (converter != null) {
+      return converter.getAsString(facesContext, component, currentValue);
+    } else {
+      return currentValue.toString();
+    }
+  }
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/util/ComponentUtils.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/util/ComponentUtils.java
index 338265b..2159d94 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/util/ComponentUtils.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/util/ComponentUtils.java
@@ -873,20 +873,19 @@ public final class ComponentUtils {
     return converter;
   }
 
+  /**
+   * @deprecated since 5.0.0. Please use {@link RendererBase#getFormattedValue}
+   */
+  @Deprecated
   public static String getFormattedValue(
       final FacesContext facesContext, final UIComponent component, final Object currentValue)
       throws ConverterException {
-
-    if (currentValue == null) {
-      return "";
-    }
-
-    final Converter converter = ComponentUtils.getConverter(facesContext, component, currentValue);
-    if (converter != null) {
-      return converter.getAsString(facesContext, component, currentValue);
-    } else {
-      return currentValue.toString();
-    }
+    return new RendererBase<UIComponent>() {
+      public String fake(
+          final FacesContext facesContext, final UIComponent component, final Object currentValue) {
+        return getFormattedValue(facesContext, component, currentValue);
+      }
+    }.fake(facesContext, component, currentValue);
   }
 
   public static UIComponent createComponent(