You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by GitBox <gi...@apache.org> on 2018/02/28 19:24:56 UTC

[GitHub] bohmber closed pull request #2: Tobago 1589

bohmber closed pull request #2: Tobago 1589
URL: https://github.com/apache/myfaces-tobago/pull/2
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/PageRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/PageRenderer.java
index 78cd3d84d..2b459ffa3 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/PageRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/PageRenderer.java
@@ -419,6 +419,7 @@ public boolean getRendersChildren() {
             .createComponent(facesContext, UIMeta.COMPONENT_TYPE, RendererTypes.Meta.name());
         viewportMeta.setName("viewport");
         viewportMeta.setContent("width=device-width, initial-scale=1.0");
+        viewportMeta.setTransient(true);
         metas.add(0, viewportMeta);
       }
 
@@ -426,6 +427,7 @@ public boolean getRendersChildren() {
         final UIMeta charsetMeta = (UIMeta) facesContext.getApplication()
             .createComponent(facesContext, UIMeta.COMPONENT_TYPE, RendererTypes.Meta.name());
         charsetMeta.setCharset(charset);
+        charsetMeta.setTransient(true);
         metas.add(0, charsetMeta);
       }
     }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetPageCommandRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetPageCommandRenderer.java
index 4b9707f26..bbc15b160 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetPageCommandRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetPageCommandRenderer.java
@@ -19,71 +19,11 @@
 
 package org.apache.myfaces.tobago.internal.renderkit.renderer;
 
-import org.apache.myfaces.tobago.component.Attributes;
-import org.apache.myfaces.tobago.event.SheetAction;
-import org.apache.myfaces.tobago.event.PageActionEvent;
-import org.apache.myfaces.tobago.event.SortActionEvent;
-import org.apache.myfaces.tobago.util.ComponentUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.faces.component.UIColumn;
-import javax.faces.component.UIComponent;
-import javax.faces.component.UIData;
-import javax.faces.context.FacesContext;
-import javax.faces.event.ActionEvent;
-import java.util.Map;
-
 public class SheetPageCommandRenderer extends LinkRenderer {
 
   private static final Logger LOG = LoggerFactory.getLogger(SheetPageCommandRenderer.class);
 
-  @Override
-  public void decode(final FacesContext facesContext, final UIComponent component) {
-    final String sourceId = facesContext.getExternalContext().getRequestParameterMap().get("javax.faces.source");
-    final String clientId = component.getClientId(facesContext);
-    if (LOG.isDebugEnabled()) {
-      LOG.debug("sourceId = '{}'", sourceId);
-      LOG.debug("clientId = '{}'", clientId);
-    }
-
-    if (clientId.equals(sourceId)) {
-
-      final SheetAction action = (SheetAction) ComponentUtils.getAttribute(component, Attributes.sheetAction);
-      ActionEvent event = null;
-
-      switch (action) {
-        case first:
-        case prev:
-        case next:
-        case last:
-          event = new PageActionEvent(component.getParent(), action);
-          break;
-        case toPage:
-        case toRow:
-          event = new PageActionEvent(component.getParent(), action);
-          Integer target = (Integer) ComponentUtils.getAttribute(component, Attributes.pagingTarget);
-          if (target == null) {
-            final Map map = facesContext.getExternalContext().getRequestParameterMap();
-            final Object value = map.get(clientId);
-            try {
-              target = Integer.parseInt((String) value);
-            } catch (final NumberFormatException e) {
-              LOG.error("Can't parse integer value for action " + action.name() + ": " + value);
-              break;
-            }
-          }
-          ((PageActionEvent) event).setValue(target);
-          break;
-        case sort:
-          final UIColumn column = (UIColumn) component.getParent();
-          final UIData data = (UIData) column.getParent();
-          event = new SortActionEvent(data, column);
-          break;
-        default:
-          LOG.error("Unknown action '{}' found!", action);
-      }
-      component.queueEvent(event);
-    }
-  }
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java
index c6235cec3..22f84e38d 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java
@@ -31,7 +31,9 @@
 import org.apache.myfaces.tobago.component.UISheet;
 import org.apache.myfaces.tobago.context.Markup;
 import org.apache.myfaces.tobago.context.TobagoResourceBundle;
+import org.apache.myfaces.tobago.event.PageActionEvent;
 import org.apache.myfaces.tobago.event.SheetAction;
+import org.apache.myfaces.tobago.event.SortActionEvent;
 import org.apache.myfaces.tobago.internal.component.AbstractUIColumn;
 import org.apache.myfaces.tobago.internal.component.AbstractUIColumnBase;
 import org.apache.myfaces.tobago.internal.component.AbstractUIData;
@@ -72,10 +74,14 @@
 import javax.faces.application.Application;
 import javax.faces.component.UIColumn;
 import javax.faces.component.UIComponent;
+import javax.faces.component.UIData;
+import javax.faces.component.UINamingContainer;
 import javax.faces.component.behavior.AjaxBehavior;
 import javax.faces.component.behavior.ClientBehavior;
 import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.context.FacesContext;
+import javax.faces.event.ActionEvent;
+
 import java.io.IOException;
 import java.text.MessageFormat;
 import java.util.ArrayList;
@@ -92,6 +98,7 @@
   private static final String SUFFIX_COLUMN_RENDERED = ComponentUtils.SUB_SEPARATOR + "rendered";
   private static final String SUFFIX_SCROLL_POSITION = ComponentUtils.SUB_SEPARATOR + "scrollPosition";
   private static final String SUFFIX_SELECTED = ComponentUtils.SUB_SEPARATOR + "selected";
+  private static final String SUFFIX_PAGE_ACTION = "pageAction";
 
   @Override
   public void decode(final FacesContext facesContext, final UIComponent component) {
@@ -132,6 +139,8 @@ public void decode(final FacesContext facesContext, final UIComponent component)
     }
     RenderUtils.decodedStateOfTreeData(facesContext, sheet);
 
+    decodeSheetAction(facesContext, sheet);
+    decodeColumnAction(facesContext, columns);
 /* this will be done by the javax.faces.component.UIData.processDecodes() because these are facets.
     for (UIComponent facet : sheet.getFacets().values()) {
       facet.decode(facesContext);
@@ -139,6 +148,78 @@ public void decode(final FacesContext facesContext, final UIComponent component)
 */
   }
 
+  private void decodeColumnAction(final FacesContext facesContext, final List<AbstractUIColumnBase> columns) {
+    for (final AbstractUIColumnBase column : columns) {
+      final boolean sortable = ComponentUtils.getBooleanAttribute(column, Attributes.sortable);
+      if (sortable) {
+        final String sourceId = facesContext.getExternalContext().getRequestParameterMap().get("javax.faces.source");
+        final String columnId = column.getClientId(facesContext);
+        final String sorterId = columnId + "_" + UISheet.SORTER_ID;
+
+        if (sorterId.equals(sourceId)) {
+          final UIData data = (UIData) column.getParent();
+          data.queueEvent(new SortActionEvent(data, column));
+        }
+      }
+    }
+  }
+
+
+  private void decodeSheetAction(final FacesContext facesContext, final UISheet component) {
+    final String sourceId = facesContext.getExternalContext().getRequestParameterMap().get("javax.faces.source");
+
+    final String clientId = component.getClientId(facesContext);
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("sourceId = '{}'", sourceId);
+      LOG.debug("clientId = '{}'", clientId);
+    }
+
+    final String sheetClientIdWithAction =
+            clientId + UINamingContainer.getSeparatorChar(facesContext) + SUFFIX_PAGE_ACTION;
+    if (sourceId != null && sourceId.startsWith(sheetClientIdWithAction)) {
+      String actionString  = sourceId.substring(sheetClientIdWithAction.length());
+      int index = actionString.indexOf('-');
+      SheetAction action;
+      if (index != -1) {
+        action = SheetAction.valueOf(actionString.substring(0, index));
+      } else {
+        action = SheetAction.valueOf(actionString);
+      }
+      ActionEvent event = null;
+      switch (action) {
+        case first:
+        case prev:
+        case next:
+        case last:
+          event = new PageActionEvent(component, action);
+          break;
+        case toPage:
+        case toRow:
+          event = new PageActionEvent(component, action);
+          Integer target = null;
+          Object value = null;
+          if (index == -1) {
+            final Map map = facesContext.getExternalContext().getRequestParameterMap();
+            value = map.get(sourceId);
+          } else {
+            value = actionString.substring(index+1);
+          }
+          try {
+            target = Integer.parseInt((String) value);
+          } catch (final NumberFormatException e) {
+            LOG.error("Can't parse integer value for action " + action.name() + ": " + value);
+            break;
+          }
+          ((PageActionEvent) event).setValue(target);
+          break;
+        default:
+      }
+      if (event != null) {
+        component.queueEvent(event);
+      }
+    }
+  }
+
   @Override
   public void encodeBegin(final FacesContext facesContext, final UIComponent component) throws IOException {
 
@@ -150,6 +231,7 @@ public void encodeBegin(final FacesContext facesContext, final UIComponent compo
     UIComponent header = sheet.getHeader();
     if (header == null) {
       header = ComponentUtils.createComponent(facesContext, UIPanel.COMPONENT_TYPE, null, "_header");
+      header.setTransient(true);
       final List<AbstractUIColumnBase> columns = sheet.getAllColumns();
       int i = 0;
       for (final AbstractUIColumnBase column : columns) {
@@ -157,6 +239,7 @@ public void encodeBegin(final FacesContext facesContext, final UIComponent compo
           final AbstractUIOut out = (AbstractUIOut) ComponentUtils.createComponent(
               facesContext, UIOut.COMPONENT_TYPE, RendererTypes.Out, "_col" + i);
 //        out.setValue(column.getLabel());
+          out.setTransient(true);
           ValueExpression valueExpression = column.getValueExpression(Attributes.label.getName());
           if (valueExpression != null) {
             out.setValueExpression(Attributes.value.getName(), valueExpression);
@@ -281,7 +364,7 @@ public void encodeEnd(final FacesContext facesContext, final UIComponent uiCompo
       final Markup showRowRange = markupForLeftCenterRight(sheet.getShowRowRange());
       if (showRowRange != Markup.NULL) {
         final UILink command
-            = ensurePagingCommand(application, sheet, Facets.pagerRow.name(), SheetAction.toRow, false);
+            = ensurePagingCommand(facesContext, sheet, Facets.pagerRow.name(), SheetAction.toRow.name(), false);
         final String pagerCommandId = command.getClientId(facesContext);
 
         writer.startElement(HtmlElements.UL);
@@ -343,6 +426,7 @@ public void encodeEnd(final FacesContext facesContext, final UIComponent uiCompo
         } else {
           writer.write(TobagoResourceBundle.getString(facesContext, "sheetPagingInfoEmptyRow"));
         }
+        ComponentUtils.removeFacet(sheet, Facets.pagerRow);
         writer.endElement(HtmlElements.SPAN);
         writer.endElement(HtmlElements.LI);
         writer.endElement(HtmlElements.UL);
@@ -373,7 +457,7 @@ public void encodeEnd(final FacesContext facesContext, final UIComponent uiCompo
       final Markup showPageRange = markupForLeftCenterRight(sheet.getShowPageRange());
       if (showPageRange != Markup.NULL) {
         final UILink command
-            = ensurePagingCommand(application, sheet, Facets.pagerPage.name(), SheetAction.toPage, false);
+            = ensurePagingCommand(facesContext, sheet, Facets.pagerPage.name(), SheetAction.toPage.name(), false);
         final String pagerCommandId = command.getClientId(facesContext);
 
         writer.startElement(HtmlElements.UL);
@@ -438,6 +522,7 @@ public void encodeEnd(final FacesContext facesContext, final UIComponent uiCompo
         } else {
           writer.writeText(TobagoResourceBundle.getString(facesContext, "sheetPagingInfoEmptyPage"));
         }
+        ComponentUtils.removeFacet(sheet, Facets.pagerPage);
         writer.endElement(HtmlElements.SPAN);
         writer.endElement(HtmlElements.LI);
         if (sheet.isShowPageRangeArrows()) {
@@ -464,6 +549,10 @@ public void encodeEnd(final FacesContext facesContext, final UIComponent uiCompo
     }
 
     writer.endElement(HtmlElements.DIV);
+    UIComponent header = sheet.getHeader();
+    if (header.isTransient()) {
+      sheet.getFacets().remove("header");
+    }
   }
 
   private void encodeTableBody(
@@ -823,20 +912,20 @@ private void encodeHeaderRows(
               if (sortable) {
                 UILink sortCommand = (UILink) ComponentUtils.getFacet(column, Facets.sorter);
                 if (sortCommand == null) {
-                  final String columnId = column.getClientId(facesContext);
-                  final String sorterId = columnId.substring(columnId.lastIndexOf(":") + 1) + "_" + UISheet.SORTER_ID;
+                  // assign id to column
+                  column.getClientId(facesContext);
+                  final String sorterId = column.getId() + "_" + UISheet.SORTER_ID;
                   sortCommand = (UILink) ComponentUtils.createComponent(
-                      facesContext, UILink.COMPONENT_TYPE, RendererTypes.Link, sorterId);
+                          facesContext, UILink.COMPONENT_TYPE, RendererTypes.Link, sorterId);
+                  sortCommand.setTransient(true);
                   final AjaxBehavior reloadBehavior = createReloadBehavior(sheet);
                   sortCommand.addClientBehavior("click", reloadBehavior);
-                  sortCommand.setRendererType(RendererTypes.SHEET_PAGE_COMMAND);
-                  ComponentUtils.setAttribute(sortCommand, Attributes.sheetAction, SheetAction.sort);
                   ComponentUtils.setFacet(column, Facets.sorter, sortCommand);
                 }
                 writer.writeIdAttribute(sortCommand.getClientId(facesContext));
                 writer.writeCommandMapAttribute(
                     JsonUtils.encode(RenderUtils.getBehaviorCommands(facesContext, sortCommand)));
-
+                ComponentUtils.removeFacet(column, Facets.sorter);
                 if (tip == null) {
                   tip = "";
                 } else {
@@ -978,7 +1067,7 @@ private void encodeLink(
     final String facet = action == SheetAction.toPage || action == SheetAction.toRow
         ? action.name() + "-" + target
         : action.name();
-    final UILink command = ensurePagingCommand(application, data, facet, action, disabled);
+    final UILink command = ensurePagingCommand(facesContext, data, facet, facet, disabled);
     if (target != null) {
       ComponentUtils.setAttribute(command, Attributes.pagingTarget, target);
     }
@@ -1007,6 +1096,7 @@ private void encodeLink(
     } else {
       writer.writeText(String.valueOf(target));
     }
+    data.getFacets().remove(facet);
     writer.endElement(HtmlElements.A);
     writer.endElement(HtmlElements.LI);
   }
@@ -1028,8 +1118,6 @@ private void encodeDirectPagingLinks(
       final FacesContext facesContext, final Application application, final UISheet sheet)
       throws IOException {
 
-    final UILink command
-        = ensurePagingCommand(application, sheet, Facets.PAGER_PAGE_DIRECT, SheetAction.toPage, false);
     int linkCount = ComponentUtils.getIntAttribute(sheet, Attributes.directLinkCount);
     linkCount--;  // current page needs no link
     final ArrayList<Integer> prevs = new ArrayList<>(linkCount);
@@ -1100,18 +1188,18 @@ private void encodeDirectPagingLinks(
   }
 
   private UILink ensurePagingCommand(
-      final Application application, final UISheet sheet, final String facet, final SheetAction action,
+      final FacesContext facesContext, final UISheet sheet, final String facet, final String id,
       final boolean disabled) {
 
     final Map<String, UIComponent> facets = sheet.getFacets();
     UILink command = (UILink) facets.get(facet);
     if (command == null) {
-      command = (UILink) application.createComponent(UILink.COMPONENT_TYPE);
-      command.setRendererType(RendererTypes.SHEET_PAGE_COMMAND);
-//      command.addActionListener(new SheetActionListener()); XXX to activate: remove RendererType
+      command =
+              (UILink) ComponentUtils.createComponent(facesContext, UILink.COMPONENT_TYPE,
+                      RendererTypes.Link, SUFFIX_PAGE_ACTION + id);
       command.setRendered(true);
-      ComponentUtils.setAttribute(command, Attributes.sheetAction, action);
       command.setDisabled(disabled);
+      command.setTransient(true);
       facets.put(facet, command);
 
       // add AjaxBehavior
@@ -1140,6 +1228,7 @@ private AjaxBehavior createReloadBehavior(final UISheet sheet) {
     final AjaxBehavior behavior = new AjaxBehavior();
     behavior.setExecute(executeIds);
     behavior.setRender(renderIds);
+    behavior.setTransient(true);
     return behavior;
   }
 
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 af6cac94f..ad83ddb28 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
@@ -531,6 +531,10 @@ public static void setFacet(final UIComponent component, final Facets facet, fin
     component.getFacets().put(facet.name(), child);
   }
 
+  public static void removeFacet(final UIComponent component, final Facets facet) {
+    component.getFacets().remove(facet.name());
+  }
+
   public static boolean isFacetOf(final UIComponent component, final UIComponent parent) {
     for (final Object o : parent.getFacets().keySet()) {
       final UIComponent facet = parent.getFacet((String) o);
diff --git a/tobago-tool/tobago-tool-apt/src/main/resources/org/apache/myfaces/tobago/apt/component.stg b/tobago-tool/tobago-tool-apt/src/main/resources/org/apache/myfaces/tobago/apt/component.stg
index 854788eff..882541ac5 100644
--- a/tobago-tool/tobago-tool-apt/src/main/resources/org/apache/myfaces/tobago/apt/component.stg
+++ b/tobago-tool/tobago-tool-apt/src/main/resources/org/apache/myfaces/tobago/apt/component.stg
@@ -116,6 +116,13 @@ public class <componentInfo.className>
   }
   <endif>
 
+  @Override
+  public void restoreState(FacesContext context, Object state) {
+    pushComponentToEL(context, this);
+    super.restoreState(context, state);
+    popComponentFromEL(context);
+  }
+
 }
 >>
 


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services