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:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to