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 2017/04/07 22:09:02 UTC

svn commit: r1790636 - in /myfaces/core/branches/2.3.x: api/src/main/java/javax/faces/component/UIData.java api/src/main/java/javax/faces/model/IterableDataModel.java impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java

Author: lu4242
Date: Fri Apr  7 22:09:02 2017
New Revision: 1790636

URL: http://svn.apache.org/viewvc?rev=1790636&view=rev
Log:
MYFACES-4110 Implement javax.faces.model.IterableDataModel

Added:
    myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/model/IterableDataModel.java
Modified:
    myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/UIData.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java

Modified: myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/UIData.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/UIData.java?rev=1790636&r1=1790635&r2=1790636&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/UIData.java (original)
+++ myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/UIData.java Fri Apr  7 22:09:02 2017
@@ -48,6 +48,7 @@ import javax.faces.event.PreValidateEven
 import javax.faces.model.ArrayDataModel;
 import javax.faces.model.CollectionDataModel;
 import javax.faces.model.DataModel;
+import javax.faces.model.IterableDataModel;
 import javax.faces.model.ListDataModel;
 import javax.faces.model.ResultDataModel;
 import javax.faces.model.ResultSetDataModel;
@@ -2157,6 +2158,14 @@ public class UIData extends UIComponentB
                 {
                     return new ResultDataModel((Result) value);
                 }
+                else if (value instanceof Iterable)
+                {
+                    return new IterableDataModel<>((Iterable<?>) value);
+                } 
+                else if (value instanceof Map) 
+                {
+                    return new IterableDataModel<>(((Map<?, ?>) value).entrySet());
+                }
                 else if (value instanceof Collection)
                 {
                     return new CollectionDataModel((Collection) value);

Added: myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/model/IterableDataModel.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/model/IterableDataModel.java?rev=1790636&view=auto
==============================================================================
--- myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/model/IterableDataModel.java (added)
+++ myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/model/IterableDataModel.java Fri Apr  7 22:09:02 2017
@@ -0,0 +1,181 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package javax.faces.model;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ *
+ * @since 2.3
+ */
+public class IterableDataModel<E> extends DataModel<E>
+{
+    private int _rowIndex = -1;
+    private Iterable<E> _iterable;
+    private List<E> _list;
+    private Iterator<E> _iterator;
+    private int _count = -1;
+
+    public IterableDataModel()
+    {
+    }
+
+    public IterableDataModel(Iterable<E> iterable)
+    {
+        if (iterable == null)
+        {
+            throw new NullPointerException("array");
+        }
+        setWrappedData(iterable);
+    }
+
+    @Override
+    public int getRowCount()
+    {
+        return _count;
+    }
+
+    @Override
+    public E getRowData()
+    {
+        if (_iterable == null)
+        {
+            return null;
+        }
+        if (!isRowAvailable())
+        {
+            throw new IllegalArgumentException("row is unavailable");
+        }
+        return _list.get(_rowIndex);
+    }
+
+    @Override
+    public int getRowIndex()
+    {
+        return _rowIndex;
+    }
+
+    @Override
+    public Object getWrappedData()
+    {
+        return _iterable;
+    }
+
+    @Override
+    public boolean isRowAvailable()
+    {
+        return _iterable != null && _rowIndex >= 0 && _rowIndex < _list.size();
+    }
+
+    @Override
+    public void setRowIndex(int rowIndex)
+    {
+        if (rowIndex < -1)
+        {
+            throw new IllegalArgumentException("illegal rowIndex " + rowIndex);
+        }
+        int oldRowIndex = _rowIndex;
+        
+        if (oldRowIndex < rowIndex)
+        {
+            //Move forward
+            for (int i = 0; i < (rowIndex - oldRowIndex); i++)
+            {
+                if (_list == null)
+                {
+                    _list = new ArrayList<E>();
+                }
+                if (_iterator == null)
+                {
+                    _iterator = _iterable.iterator();
+                }
+                if (_iterator.hasNext())
+                {
+                    _list.add(_iterator.next());
+                }
+                else
+                {
+                    // Trying to move to a non existent row
+                    continue;
+                }
+            }
+        }
+        else if (oldRowIndex == rowIndex)
+        {
+            // No change
+        }
+        else if (oldRowIndex > rowIndex)
+        {
+            // Retrieve it from cache
+        }
+        _rowIndex = rowIndex;
+        if (_iterable != null && oldRowIndex != _rowIndex)
+        {
+            Object data = isRowAvailable() ? getRowData() : null;
+            DataModelEvent event = new DataModelEvent(this, _rowIndex, data);
+            DataModelListener[] listeners = getDataModelListeners();
+            for (int i = 0; i < listeners.length; i++)
+            {
+                listeners[i].rowSelected(event);
+            }
+        }
+    }
+
+    @Override
+    public void setWrappedData(Object data)
+    {
+        if (data == null)
+        {
+            setRowIndex(-1);
+            _iterable = null;
+            _count = -1;
+        }
+        else
+        {
+            _iterable = (Iterable<E>)data;
+            _rowIndex = -1;
+            setRowIndex(0);
+            if (data instanceof Set)
+            {
+                _count = ((Set)data).size();
+            }
+            else if (data instanceof List)
+            {
+                _count = ((List)data).size();
+            }
+            else if (data instanceof Map)
+            {
+                _count = ((Map)data).size();
+            }
+            else if (data instanceof Collection)
+            {
+                _count = ((Collection)data).size();
+            }
+            else 
+            {
+                _count = -1;
+            }
+        }
+    }
+}

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java?rev=1790636&r1=1790635&r2=1790636&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java Fri Apr  7 22:09:02 2017
@@ -49,6 +49,7 @@ import javax.faces.event.PhaseId;
 import javax.faces.model.ArrayDataModel;
 import javax.faces.model.CollectionDataModel;
 import javax.faces.model.DataModel;
+import javax.faces.model.IterableDataModel;
 import javax.faces.model.ListDataModel;
 import javax.faces.model.ResultSetDataModel;
 import javax.faces.model.ScalarDataModel;
@@ -228,6 +229,14 @@ public class UIRepeat extends UIComponen
                 {
                     return new ResultSetDataModel((ResultSet) value);
                 }
+                else if (value instanceof Iterable)
+                {
+                    return new IterableDataModel<>((Iterable<?>) value);
+                } 
+                else if (value instanceof Map) 
+                {
+                    return new IterableDataModel<>(((Map<?, ?>) value).entrySet());
+                }
                 else if (value instanceof Collection)
                 {
                     return new CollectionDataModel((Collection) value);