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);