You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2010/08/19 21:03:17 UTC

svn commit: r987269 - /myfaces/tomahawk/trunk/core12/src/main/java/org/apache/myfaces/component/html/ext/AbstractHtmlDataTable.java

Author: lu4242
Date: Thu Aug 19 19:03:17 2010
New Revision: 987269

URL: http://svn.apache.org/viewvc?rev=987269&view=rev
Log:
TOMAHAWK-1460 ClassCastException when testing Tomahawk 1.1.9 table demos when preserveDataModel="true"

Modified:
    myfaces/tomahawk/trunk/core12/src/main/java/org/apache/myfaces/component/html/ext/AbstractHtmlDataTable.java

Modified: myfaces/tomahawk/trunk/core12/src/main/java/org/apache/myfaces/component/html/ext/AbstractHtmlDataTable.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core12/src/main/java/org/apache/myfaces/component/html/ext/AbstractHtmlDataTable.java?rev=987269&r1=987268&r2=987269&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/core12/src/main/java/org/apache/myfaces/component/html/ext/AbstractHtmlDataTable.java (original)
+++ myfaces/tomahawk/trunk/core12/src/main/java/org/apache/myfaces/component/html/ext/AbstractHtmlDataTable.java Thu Aug 19 19:03:17 2010
@@ -18,17 +18,17 @@
  */
 package org.apache.myfaces.component.html.ext;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.myfaces.component.NewspaperTable;
-import org.apache.myfaces.component.UserRoleAware;
-import org.apache.myfaces.component.UserRoleUtils;
-import org.apache.myfaces.custom.column.HtmlSimpleColumn;
-import org.apache.myfaces.custom.crosstable.UIColumns;
-import org.apache.myfaces.custom.sortheader.HtmlCommandSortHeader;
-import org.apache.myfaces.renderkit.html.ext.HtmlTableRenderer;
-import org.apache.myfaces.renderkit.html.util.TableContext;
-import org.apache.myfaces.shared_tomahawk.renderkit.JSFAttr;
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
 
 import javax.faces.FacesException;
 import javax.faces.application.Application;
@@ -37,21 +37,23 @@ import javax.faces.component.EditableVal
 import javax.faces.component.NamingContainer;
 import javax.faces.component.UIColumn;
 import javax.faces.component.UIComponent;
+import javax.faces.component.UIComponentBase;
 import javax.faces.component.UINamingContainer;
 import javax.faces.context.FacesContext;
 import javax.faces.el.ValueBinding;
 import javax.faces.model.DataModel;
-import java.io.IOException;
-import java.sql.ResultSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.component.NewspaperTable;
+import org.apache.myfaces.component.UserRoleAware;
+import org.apache.myfaces.component.UserRoleUtils;
+import org.apache.myfaces.custom.column.HtmlSimpleColumn;
+import org.apache.myfaces.custom.crosstable.UIColumns;
+import org.apache.myfaces.custom.sortheader.HtmlCommandSortHeader;
+import org.apache.myfaces.renderkit.html.ext.HtmlTableRenderer;
+import org.apache.myfaces.renderkit.html.util.TableContext;
+import org.apache.myfaces.shared_tomahawk.renderkit.JSFAttr;
 
 /**
  * The MyFacesDataTable extends the standard JSF DataTable by two
@@ -106,7 +108,7 @@ public abstract class AbstractHtmlDataTa
 
     public static final String DETAIL_STAMP_FACET_NAME = "detailStamp";
 
-    private _SerializableDataModel _preservedDataModel;
+    private Map _preservedDataModel = new HashMap();
 
     private String _forceIdIndexFormula = null;
     private String _sortColumn = null;
@@ -655,7 +657,7 @@ public abstract class AbstractHtmlDataTa
                 }
             }
         }
-        _preservedDataModel = null;
+        setPreservedDataModel(null);
     }
 
     public void encodeBegin(FacesContext context) throws IOException
@@ -665,7 +667,7 @@ public abstract class AbstractHtmlDataTa
 
         if (_isValidChildren && !hasErrorMessages(context))
         {
-            _preservedDataModel = null;
+            setPreservedDataModel(null);
         }
 
         for (Iterator iter = getChildren().iterator(); iter.hasNext();)
@@ -865,6 +867,11 @@ public abstract class AbstractHtmlDataTa
                 ((UIColumns) component).encodeTableEnd(context);
             }
         }
+        
+        if (isPreserveDataModel())
+        {
+            setPreservedDataModel(getSerializableDataModel());
+        }
     }
 
     /**
@@ -874,10 +881,11 @@ public abstract class AbstractHtmlDataTa
      */
     public int getFirst()
     {
-        if (_preservedDataModel != null)
+        _SerializableDataModel pdm = getPreservedDataModel();
+        if (pdm != null)
         {
             //Rather get the currently restored DataModel attribute
-            return _preservedDataModel.getFirst();
+            return pdm.getFirst();
         }
         else
         {
@@ -887,10 +895,11 @@ public abstract class AbstractHtmlDataTa
 
     public void setFirst(int first)
     {
-        if (_preservedDataModel != null)
+        _SerializableDataModel pdm = getPreservedDataModel();
+        if (pdm != null)
         {
             //Also change the currently restored DataModel attribute
-            _preservedDataModel.setFirst(first);
+            pdm.setFirst(first);
         }
         super.setFirst(first);
     }
@@ -902,10 +911,11 @@ public abstract class AbstractHtmlDataTa
      */
     public int getRows()
     {
-        if (_preservedDataModel != null)
+        _SerializableDataModel pdm = getPreservedDataModel();
+        if (pdm != null)
         {
             //Rather get the currently restored DataModel attribute
-            return _preservedDataModel.getRows();
+            return pdm.getRows();
         }
         else
         {
@@ -915,10 +925,11 @@ public abstract class AbstractHtmlDataTa
 
     public void setRows(int rows)
     {
-        if (_preservedDataModel != null)
+        _SerializableDataModel pdm = getPreservedDataModel();
+        if (pdm != null)
         {
             //Also change the currently restored DataModel attribute
-            _preservedDataModel.setRows(rows);
+            pdm.setRows(rows);
         }
         super.setRows(rows);
     }
@@ -933,8 +944,23 @@ public abstract class AbstractHtmlDataTa
 
         if (isPreserveDataModel())
         {
-            _preservedDataModel = getSerializableDataModel();
-            values[2] = saveAttachedState(context, _preservedDataModel);
+            if (!_preservedDataModel.isEmpty())
+            {
+                int cnt = 0;
+                Object[] mapArr = new Object[_preservedDataModel.size() * 2];
+                for (Iterator it = _preservedDataModel.entrySet().iterator(); it.hasNext();)
+                {
+                    Map.Entry entry = (Map.Entry) it.next();
+                    mapArr[cnt] = (String) entry.getKey();
+                    mapArr[cnt + 1] = (_SerializableDataModel)saveAttachedState(context, entry.getValue());
+                    cnt += 2;
+                }
+                values[2] = mapArr;
+            }
+            else
+            {
+                values[2] = null;
+            }
         }
         else
         {
@@ -964,10 +990,11 @@ public abstract class AbstractHtmlDataTa
      */
     protected DataModel getDataModel()
     {
-        if (_preservedDataModel != null)
+        _SerializableDataModel pdm = getPreservedDataModel();
+        if (pdm != null)
         {
-            setDataModel(_preservedDataModel);
-            _preservedDataModel = null;
+            setDataModel(pdm);
+            setPreservedDataModel(null);
         }
 
         return super.getDataModel();
@@ -1027,11 +1054,26 @@ public abstract class AbstractHtmlDataTa
         _preserveDataModel = (Boolean) values[1];
         if (isPreserveDataModel())
         {
-            _preservedDataModel = (_SerializableDataModel) restoreAttachedState(context, values[2]);
+            if (!_preservedDataModel.isEmpty())
+            {
+                _preservedDataModel.clear();
+            }            
+            Object[] listAsMap = (Object[]) values[2];
+            if (listAsMap != null)
+            {
+                for (int cnt = 0; cnt < listAsMap.length; cnt += 2)
+                {
+                    _preservedDataModel.put((String) listAsMap[cnt], (_SerializableDataModel) UIComponentBase
+                            .restoreAttachedState(context, listAsMap[cnt + 1]));
+                }
+            }
         }
         else
         {
-            _preservedDataModel = null;
+            if (!_preservedDataModel.isEmpty())
+            {
+                _preservedDataModel.clear();
+            }
         }
         _preserveSort = (Boolean) values[3];
         _forceIdIndexFormula = (String) values[4];
@@ -1447,12 +1489,31 @@ public abstract class AbstractHtmlDataTa
 
     protected _SerializableDataModel getPreservedDataModel()
     {
-        return _preservedDataModel;
+        UIComponent parent = getParent();
+        String clientID = "";
+        if (parent != null) 
+        {
+            clientID = parent.getClientId(getFacesContext());
+        }
+        return (_SerializableDataModel) _preservedDataModel.get(clientID);
     }
 
-    protected void setPreservedDataModel(_SerializableDataModel preservedDataModel)
+    protected void setPreservedDataModel(_SerializableDataModel datamodel)
     {
-        _preservedDataModel = preservedDataModel;
+        UIComponent parent = getParent();
+        String clientID = "";
+        if(parent != null)
+        {
+            clientID = parent.getClientId(getFacesContext());
+        }
+        if (datamodel == null)
+        {
+            _preservedDataModel.remove(clientID);
+        }
+        else
+        {
+            _preservedDataModel.put(clientID, datamodel);
+        }
     }