From ad3da7e33441801d7d247dc90f3f8ac43167aed6 Mon Sep 17 00:00:00 2001 From: Jeremy Grelle Date: Fri, 25 Jan 2008 23:42:09 +0000 Subject: [PATCH] SWF-370 - Add support for automatically adapting a returned list for display in a DataTable to a JSF DataModel. --- .../model/SerializableListDataModel.java | 12 ++++- .../model/converter/DataModelConverter.java | 29 ++++++++++++ .../converter/DataModelConverterTests.java | 47 +++++++++++++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 spring-faces/src/main/java/org/springframework/faces/model/converter/DataModelConverter.java create mode 100644 spring-faces/src/test/java/org/springframework/faces/model/converter/DataModelConverterTests.java diff --git a/spring-faces/src/main/java/org/springframework/faces/model/SerializableListDataModel.java b/spring-faces/src/main/java/org/springframework/faces/model/SerializableListDataModel.java index 1a05d03b..7be47aba 100644 --- a/spring-faces/src/main/java/org/springframework/faces/model/SerializableListDataModel.java +++ b/spring-faces/src/main/java/org/springframework/faces/model/SerializableListDataModel.java @@ -1,6 +1,7 @@ package org.springframework.faces.model; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; import javax.faces.model.DataModel; @@ -18,11 +19,18 @@ public class SerializableListDataModel extends DataModel implements Serializable private List data; + public SerializableListDataModel() { + this(new ArrayList()); + } + /** * Adapt the list to a data model; * @param list the list */ public SerializableListDataModel(List list) { + if (list == null) { + list = new ArrayList(); + } setWrappedData(list); } @@ -65,7 +73,9 @@ public class SerializableListDataModel extends DataModel implements Serializable } public void setWrappedData(Object data) { - Assert.notNull(data, "A non-null List is required for " + getClass()); + if (data == null) { + data = new ArrayList(); + } Assert.isInstanceOf(List.class, data, "The data object for " + getClass() + " must be a List"); this.data = (List) data; int newRowIndex = 0; diff --git a/spring-faces/src/main/java/org/springframework/faces/model/converter/DataModelConverter.java b/spring-faces/src/main/java/org/springframework/faces/model/converter/DataModelConverter.java new file mode 100644 index 00000000..7da09da9 --- /dev/null +++ b/spring-faces/src/main/java/org/springframework/faces/model/converter/DataModelConverter.java @@ -0,0 +1,29 @@ +package org.springframework.faces.model.converter; + +import java.lang.reflect.Constructor; +import java.util.List; + +import javax.faces.model.DataModel; + +import org.springframework.binding.convert.ConversionContext; +import org.springframework.binding.convert.support.AbstractConverter; +import org.springframework.util.ClassUtils; + +public class DataModelConverter extends AbstractConverter { + + protected Object doConvert(Object source, Class targetClass, ConversionContext context) throws Exception { + Constructor emptyConstructor = ClassUtils.getConstructorIfAvailable(targetClass, new Class[] {}); + DataModel model = (DataModel) emptyConstructor.newInstance(new Object[] {}); + model.setWrappedData(source); + return model; + } + + public Class[] getSourceClasses() { + return new Class[] { Object[].class, List.class, Object.class }; + } + + public Class[] getTargetClasses() { + return new Class[] { DataModel.class }; + } + +} diff --git a/spring-faces/src/test/java/org/springframework/faces/model/converter/DataModelConverterTests.java b/spring-faces/src/test/java/org/springframework/faces/model/converter/DataModelConverterTests.java new file mode 100644 index 00000000..5d9cb20b --- /dev/null +++ b/spring-faces/src/test/java/org/springframework/faces/model/converter/DataModelConverterTests.java @@ -0,0 +1,47 @@ +package org.springframework.faces.model.converter; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import javax.faces.model.DataModel; +import javax.faces.model.ListDataModel; + +import org.springframework.binding.convert.Converter; +import org.springframework.faces.model.SerializableListDataModel; + +import junit.framework.TestCase; + +public class DataModelConverterTests extends TestCase { + + Converter converter = new DataModelConverter(); + + public void testConvertListToListDataModel() { + List sourceList = new ArrayList(); + + DataModel resultModel = (DataModel) converter.convert(sourceList, ListDataModel.class, null); + + assertNotNull(resultModel); + assertSame(sourceList, resultModel.getWrappedData()); + } + + public void testConvertListToSerializableListDataModel() { + List sourceList = new ArrayList(); + + DataModel resultModel = (DataModel) converter.convert(sourceList, SerializableListDataModel.class, null); + + assertNotNull(resultModel); + assertSame(sourceList, resultModel.getWrappedData()); + assertTrue(resultModel instanceof Serializable); + } + + public void testConvertListToSerializableListDataModelNullSource() { + List sourceList = null; + + DataModel resultModel = (DataModel) converter.convert(sourceList, SerializableListDataModel.class, null); + + assertNotNull(resultModel); + assertTrue(resultModel instanceof Serializable); + assertEquals(0, resultModel.getRowCount()); + } +}