package org.jboss.seam.test.integration.databinding; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.NotSerializableException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.faces.model.DataModel; import javax.faces.model.ListDataModel; import org.jboss.seam.faces.DataModels; import org.jboss.seam.jsf.ArrayDataModel; import org.jboss.seam.jsf.MapDataModel; import org.jboss.seam.jsf.SetDataModel; import org.jboss.seam.mock.SeamTest; import org.jboss.seam.test.integration.Foo; import org.jboss.seam.test.integration.Person; import org.testng.annotations.Test; public class DataModelTest extends SeamTest { @Test public void testDataModels() throws Exception { new FacesRequest() { @Override protected void invokeApplication() throws Exception { DataModels dataModels = DataModels.instance(); assert dataModels.getDataModel(new ArrayList()) instanceof ListDataModel; assert dataModels.getDataModel(new HashMap()) instanceof MapDataModel; assert dataModels.getDataModel(new HashSet()) instanceof SetDataModel; assert dataModels.getDataModel(new Object[0]) instanceof ArrayDataModel; // TODO assert dataModels.getDataModel(query) instanceof ListDataModel; boolean failed = false; try { dataModels.getDataModel(new Foo()); } catch (IllegalArgumentException e) { failed = true; } assert failed; } }.run(); } @Test public void testArrayDataModelSerialization() throws Exception { String[] array = {"Seam", "Hibernate"}; javax.faces.model.ArrayDataModel arrayDataModel = new ArrayDataModel(array); arrayDataModel.setRowIndex(1); Object object = null; try { object = serialize(arrayDataModel); } catch (NotSerializableException e) { assert false; } assert object instanceof javax.faces.model.ArrayDataModel; javax.faces.model.ArrayDataModel serializedArrayDataModel = (javax.faces.model.ArrayDataModel) object; assert serializedArrayDataModel.getRowIndex() == 1; String[] serializedArray = (String[]) serializedArrayDataModel.getWrappedData(); assert array[0].equals(serializedArray[0]); assert array[1].equals(serializedArray[1]); } // Utility to serialize an object private Object serialize(Object object) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(object); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); } @Test public void testListDataModelSerialization() throws Exception { List<String> list = Arrays.asList("Seam", "Hibernate"); javax.faces.model.ListDataModel listDataModel = new org.jboss.seam.jsf.ListDataModel(list); listDataModel.setRowIndex(1); Object object = null; try { object = serialize(listDataModel); } catch (NotSerializableException e) { assert false; } assert object instanceof javax.faces.model.ListDataModel; javax.faces.model.ListDataModel serializedListDataModel = (javax.faces.model.ListDataModel) object; List<String> serializedList = (List<String>) serializedListDataModel.getWrappedData(); assert serializedListDataModel.getRowIndex() == 1; assert list.get(0).equals(serializedList.get(0)); assert list.get(1).equals(serializedList.get(1)); } @Test public void testMapDataModel() throws IOException, ClassNotFoundException { Map<String, Person> map = new HashMap<String, Person>(); map.put("0", new Person("Gavin")); map.put("1", new Person("Tom")); javax.faces.model.DataModel mapDataModel = new MapDataModel(); assert mapDataModel.getRowCount() == -1; assert mapDataModel.getRowData() == null; assert !mapDataModel.isRowAvailable(); mapDataModel = new MapDataModel(map); assert mapDataModel.getWrappedData() instanceof Map; assert map.get("0").equals(((Map) mapDataModel.getWrappedData()).get("0")); assert map.get("1").equals(((Map) mapDataModel.getWrappedData()).get("1")); mapDataModel.setRowIndex(10); assert !mapDataModel.isRowAvailable(); boolean failed = false; try { mapDataModel.getRowData(); } catch (IllegalArgumentException e) { failed = true; } assert failed; mapDataModel.setRowIndex(1); assert mapDataModel.isRowAvailable(); assert mapDataModel.getRowIndex() == 1; assert mapDataModel.getRowCount() == 2; // JBSEAM-1660 try { mapDataModel.setWrappedData(null); } catch (NullPointerException e) { // Spec allows passing null assert false; } } /** * JBSEAM-1659 */ @Test public void testMapDataModelSerialization() throws Exception { Map<String, Person> map = new HashMap<String, Person>(); map.put("0", new Person("Gavin")); map.put("1", new Person("Tom")); javax.faces.model.DataModel mapDataModel = new MapDataModel(map); mapDataModel.setRowIndex(1); Object object = null; try { object = serialize(mapDataModel); } catch (NotSerializableException e) { assert false; } assert object instanceof javax.faces.model.DataModel; javax.faces.model.DataModel serializedMapDataModel = (javax.faces.model.DataModel) object; Map<String, Person> serializedMap = (Map<String, Person>) serializedMapDataModel.getWrappedData(); assert serializedMapDataModel.getRowIndex() == 1; assert map.get("0").equals(serializedMap.get("0")); assert map.get("1").equals(serializedMap.get("1")); } @Test public void testSetDataModel() throws IOException, ClassNotFoundException { Person gavin = new Person("Gavin"); Person tom = new Person("Tom"); Set<Person> set = new HashSet<Person>(); set.add(gavin); set.add(tom); javax.faces.model.DataModel setDataModel = new SetDataModel(); assert setDataModel.getRowCount() == -1; assert setDataModel.getRowData() == null; assert !setDataModel.isRowAvailable(); setDataModel = new SetDataModel(set); assert setDataModel.getWrappedData() instanceof Set; assert set.contains(gavin); assert set.contains(tom); setDataModel.setRowIndex(10); assert !setDataModel.isRowAvailable(); boolean failed = false; try { setDataModel.getRowData(); } catch (IllegalArgumentException e) { failed = true; } assert failed; setDataModel.setRowIndex(1); assert setDataModel.isRowAvailable(); assert setDataModel.getRowIndex() == 1; assert setDataModel.getRowCount() == 2; // JBSEAM-1660 try { setDataModel.setWrappedData(null); } catch (NullPointerException e) { // Spec allows passing null assert false; } } @Test public void testSetDataModelSerialization() throws Exception { Person gavin = new Person("Gavin"); Person tom = new Person("Tom"); Set<Person> set = new HashSet<Person>(); set.add(gavin); set.add(tom); javax.faces.model.DataModel setDataModel = new SetDataModel(set); setDataModel.setRowIndex(1); Object object = null; try { object = serialize(setDataModel); } catch (NotSerializableException e) { assert false; } assert object instanceof javax.faces.model.DataModel; javax.faces.model.DataModel serializedSetDataModel = (javax.faces.model.DataModel) object; Set<Person> serializedSet = (Set<Person>) serializedSetDataModel.getWrappedData(); assert serializedSetDataModel.getRowIndex() == 1; assert serializedSet.contains(gavin); assert serializedSet.contains(tom); } @Test public void testDataModelOutjection() throws Exception { new FacesRequest() { @Override protected void renderResponse() throws Exception { Object people = getValue("#{peopleList}"); assert people instanceof DataModel; DataModel dataModel = (DataModel) people; assert dataModel.getRowCount() == 4; dataModel.setRowIndex(1); } }.run(); } }