Author: konstantin.mishin
Date: 2008-06-05 08:23:40 -0400 (Thu, 05 Jun 2008)
New Revision: 8909
Added:
trunk/framework/impl/src/main/java/org/richfaces/model/AbstractModifiableModel.java
Modified:
trunk/framework/impl/src/main/java/org/richfaces/model/ModifiableModel.java
trunk/framework/impl/src/main/java/org/richfaces/model/impl/expressive/JavaBeanWrapper.java
trunk/framework/test/src/test/java/org/richfaces/model/ModifiableModelTest.java
trunk/ui/dataTable/src/test/java/org/richfaces/renderkit/SortableHeaderRenderingTest.java
Log:
RF-3012
Added:
trunk/framework/impl/src/main/java/org/richfaces/model/AbstractModifiableModel.java
===================================================================
--- trunk/framework/impl/src/main/java/org/richfaces/model/AbstractModifiableModel.java
(rev 0)
+++
trunk/framework/impl/src/main/java/org/richfaces/model/AbstractModifiableModel.java 2008-06-05
12:23:40 UTC (rev 8909)
@@ -0,0 +1,17 @@
+/**
+ *
+ */
+package org.richfaces.model;
+
+import java.util.List;
+
+import org.ajax4jsf.model.ExtendedDataModel;
+
+/**
+ * @author Konstantin Mishin
+ *
+ */
+public abstract class AbstractModifiableModel extends ExtendedDataModel{
+
+ public abstract void modify(List<FilterField> filterFields,
List<SortField2> sortFields);
+}
Modified: trunk/framework/impl/src/main/java/org/richfaces/model/ModifiableModel.java
===================================================================
--- trunk/framework/impl/src/main/java/org/richfaces/model/ModifiableModel.java 2008-06-05
12:22:07 UTC (rev 8908)
+++ trunk/framework/impl/src/main/java/org/richfaces/model/ModifiableModel.java 2008-06-05
12:23:40 UTC (rev 8909)
@@ -7,6 +7,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModelListener;
@@ -27,113 +28,162 @@
* @author Konstantin Mishin
*
*/
-public class ModifiableModel extends ExtendedDataModel{
+public class ModifiableModel extends AbstractModifiableModel{
+ private class RowKeyWrapperFactory extends ObjectWrapperFactory {
+
+ private class ExtendedJavaBeanWrapper extends JavaBeanWrapper {
+
+ private Object key;
+
+ public ExtendedJavaBeanWrapper(Object key, Object o, Map<String, Object> props)
{
+ super(o, props);
+ this.key = key;
+ }
+
+ public Object getKey() {
+ return key;
+ }
+ }
+
+ public RowKeyWrapperFactory(FacesContext context, String var,
+ List<? extends Field> sortOrder) {
+ super(context, var, sortOrder);
+ }
+
+ @Override
+ public JavaBeanWrapper wrapObject(Object key) {
+ originalModel.setRowKey(key);
+ JavaBeanWrapper wrapObject = super.wrapObject(originalModel.getRowData());
+ return new ExtendedJavaBeanWrapper(key, wrapObject.getWrappedObject(),
wrapObject.getProperties());
+ }
+
+ @Override
+ public Object unwrapObject(Object wrapper) {
+ return ((ExtendedJavaBeanWrapper) wrapper).getKey();
+ }
+ }
+
private static final Log log = LogFactory.getLog(ModifiableModel.class);
+
+ private List<Object> rowKeys;
- private ExtendedDataModel delegate;
-
private ExtendedDataModel originalModel;
- private ExtendedDataModel modifiedModel;
-
private String var;
- private List<FilterField> filterFields;
- private List<SortField2> sortFields;
-
- public ModifiableModel(ExtendedDataModel originalModel, String var,
- List<FilterField> filterFields, List<SortField2> sortFields) {
+ public ModifiableModel(ExtendedDataModel originalModel, String var) {
this.originalModel = originalModel;
- delegate = originalModel;
this.var = var;
- this.filterFields = filterFields;
- this.sortFields = sortFields;
}
+ @Override
public void addDataModelListener(DataModelListener listener) {
originalModel.addDataModelListener(listener);
}
+ @Override
public DataModelListener[] getDataModelListeners() {
return originalModel.getDataModelListeners();
}
- public int getRowCount() {
- return delegate.getRowCount();
+ @Override
+ public Object getRowKey() {
+ return rowKeys.indexOf(originalModel.getRowKey());
}
- public Object getRowData() {
- return delegate.getRowData();
+ @Override
+ public void setRowKey(Object key) {
+ Object originalKey = null;
+ if(key != null){
+ int i = (Integer)key;
+ if (i >= 0 && i < rowKeys.size()) {
+ originalKey = rowKeys.get(i);
+ }
+ }
+ originalModel.setRowKey(originalKey);
}
- public int getRowIndex() {
- return delegate.getRowIndex();
+ @Override
+ public void walk(FacesContext context, DataVisitor visitor, Range range,
+ Object argument) throws IOException {
+ final SequenceRange seqRange = (SequenceRange) range;
+ int rows = seqRange.getRows();
+ int rowCount = rowKeys !=null ? rowKeys.size() : -1;
+ int currentRow = seqRange.getFirstRow();
+ if(rows > 0){
+ rows += currentRow;
+ rows = Math.min(rows, rowCount);
+ } else {
+ rows = rowCount;
+ }
+ for (; currentRow < rows; currentRow++) {
+ visitor.process(context, rowKeys.get(currentRow), argument);
+ }
}
- public Object getRowKey() {
- return delegate.getRowKey();
+ @Override
+ public int getRowCount() {
+ if (rowKeys == null) {
+ return -1;
+ } else {
+ return rowKeys.size();
+ }
}
- public SerializableDataModel getSerializableModel(Range range) {
- return delegate.getSerializableModel(range);
+ @Override
+ public Object getRowData() {
+ return originalModel.getRowData();
}
+ @Override
+ public int getRowIndex() {
+ return rowKeys.indexOf(originalModel.getRowKey());
+ }
+
+ @Override
public Object getWrappedData() {
- return delegate.getWrappedData();
+ return originalModel.getWrappedData();
}
+ @Override
public boolean isRowAvailable() {
- return delegate.isRowAvailable();
+ return originalModel.isRowAvailable();
}
- public void removeDataModelListener(DataModelListener listener) {
- delegate.removeDataModelListener(listener);
- }
-
+ @Override
public void setRowIndex(int rowIndex) {
- delegate.setRowIndex(rowIndex);
+ Object originalKey = null;
+ if (rowIndex >= 0 && rowIndex < rowKeys.size()) {
+ originalKey = rowKeys.get(rowIndex);
+ }
+ originalModel.setRowKey(originalKey);
}
- public void setRowKey(Object key) {
- delegate.setRowKey(key);
- }
-
+ @Override
public void setWrappedData(Object data) {
- delegate.setWrappedData(data);
+ originalModel.setWrappedData(data);
}
-
- public void walk(FacesContext context, DataVisitor visitor, Range range,
- Object argument) throws IOException {
-
- if (shouldSort() || shouldFilter()) {
- if (modifiedModel == null) {
- modifiedModel = new ListSequenceDataModel(prepareCollection());
- }
- delegate = modifiedModel;
- } else {
- delegate = originalModel;
- }
-
- delegate.walk(context, visitor, range, argument);
- }
- private boolean shouldSort() {
- return sortFields != null && !sortFields.isEmpty();
+ @Override
+ public SerializableDataModel getSerializableModel(Range range) {
+ return originalModel.getSerializableModel(range);
}
-
- private boolean shouldFilter() {
- return filterFields != null && !filterFields.isEmpty();
+
+ @Override
+ public void removeDataModelListener(DataModelListener listener) {
+ originalModel.removeDataModelListener(listener);
}
-
- private List<?> prepareCollection() {
+
+
+ @Override
+ public void modify(List<FilterField> filterFields, List<SortField2>
sortFields) {
int rowCount = originalModel.getRowCount();
- final List<Object> collection;
if (rowCount > 0) {
- collection = new ArrayList<Object>(rowCount);
+ rowKeys = new ArrayList<Object>(rowCount);
} else {
- collection = new ArrayList<Object>();
+ rowKeys = new ArrayList<Object>();
}
FacesContext context = FacesContext.getCurrentInstance();
@@ -144,7 +194,7 @@
Object argument) throws IOException {
originalModel.setRowKey(rowKey);
if (originalModel.isRowAvailable()) {
- collection.add(originalModel.getRowData());
+ rowKeys.add(rowKey);
}
}
}, new SequenceRange(0, -1),
@@ -152,34 +202,40 @@
} catch (IOException e) {
log.error(e.getMessage(), e);
}
-
- List<Object> modifedcollection = collection;
-
- if (shouldFilter()) {
+
+ filter(filterFields);
+ sort(sortFields);
+
+ }
+
+ private List<Object> filter(List<FilterField> filterFields) {
+ if (filterFields != null && !filterFields.isEmpty()) {
+ FacesContext context = FacesContext.getCurrentInstance();
List <Object> filteredCollection = new ArrayList<Object>();
- ObjectWrapperFactory wrapperFactory = new ObjectWrapperFactory(
- context, var, filterFields);
+ ObjectWrapperFactory wrapperFactory = new RowKeyWrapperFactory(context, var,
filterFields);
WrappedBeanFilter wrappedBeanFilter = new WrappedBeanFilter(filterFields);
- wrapperFactory.wrapList(modifedcollection);
- for (Object object : modifedcollection) {
+ wrapperFactory.wrapList(rowKeys);
+ for (Object object : rowKeys) {
if(wrappedBeanFilter.accept((JavaBeanWrapper)object)) {
filteredCollection.add(object);
}
}
- modifedcollection = filteredCollection;
- wrapperFactory.unwrapList(modifedcollection);
+ rowKeys = filteredCollection;
+ wrapperFactory.unwrapList(rowKeys);
}
+ return rowKeys;
+ }
- if (shouldSort()) {
- ObjectWrapperFactory wrapperFactory = new ObjectWrapperFactory(
+ private void sort(List<SortField2> sortFields) {
+ if (sortFields != null && !sortFields.isEmpty()) {
+ FacesContext context = FacesContext.getCurrentInstance();
+ ObjectWrapperFactory wrapperFactory = new RowKeyWrapperFactory(
context, var, sortFields);
WrappedBeanComparator2 wrappedBeanComparator = new WrappedBeanComparator2(
sortFields);
- wrapperFactory.wrapList(modifedcollection);
- Collections.sort(modifedcollection, wrappedBeanComparator);
- wrapperFactory.unwrapList(modifedcollection);
+ wrapperFactory.wrapList(rowKeys);
+ Collections.sort(rowKeys, wrappedBeanComparator);
+ wrapperFactory.unwrapList(rowKeys);
}
- return modifedcollection;
-
}
}
Modified:
trunk/framework/impl/src/main/java/org/richfaces/model/impl/expressive/JavaBeanWrapper.java
===================================================================
---
trunk/framework/impl/src/main/java/org/richfaces/model/impl/expressive/JavaBeanWrapper.java 2008-06-05
12:22:07 UTC (rev 8908)
+++
trunk/framework/impl/src/main/java/org/richfaces/model/impl/expressive/JavaBeanWrapper.java 2008-06-05
12:23:40 UTC (rev 8909)
@@ -40,6 +40,10 @@
return properties.get(expression);
}
+ public Map<String, Object> getProperties() {
+ return properties;
+ }
+
public Object getWrappedObject() {
return wrappedObject;
}
Modified: trunk/framework/test/src/test/java/org/richfaces/model/ModifiableModelTest.java
===================================================================
---
trunk/framework/test/src/test/java/org/richfaces/model/ModifiableModelTest.java 2008-06-05
12:22:07 UTC (rev 8908)
+++
trunk/framework/test/src/test/java/org/richfaces/model/ModifiableModelTest.java 2008-06-05
12:23:40 UTC (rev 8909)
@@ -46,7 +46,8 @@
originalModel = new MockDataModel();
filterFields = new LinkedList<FilterField>();
sortFields = new LinkedList<SortField2>();
- model = new ModifiableModel(originalModel, var, filterFields, sortFields);
+ model = new ModifiableModel(originalModel, var);
+ model.modify(filterFields, sortFields);
}
/* (non-Javadoc)
@@ -144,7 +145,7 @@
* Test method for {@link
org.richfaces.model.ModifiableModel#ModifiableModel(org.ajax4jsf.model.ExtendedDataModel,
java.lang.String, java.util.List, java.util.List)}.
*/
public final void testModifiableModel() {
- ModifiableModel modifiableModel = new ModifiableModel(originalModel, var, filterFields,
sortFields);;
+ ModifiableModel modifiableModel = new ModifiableModel(originalModel, var);;
assertNotNull(modifiableModel);
}
Modified:
trunk/ui/dataTable/src/test/java/org/richfaces/renderkit/SortableHeaderRenderingTest.java
===================================================================
---
trunk/ui/dataTable/src/test/java/org/richfaces/renderkit/SortableHeaderRenderingTest.java 2008-06-05
12:22:07 UTC (rev 8908)
+++
trunk/ui/dataTable/src/test/java/org/richfaces/renderkit/SortableHeaderRenderingTest.java 2008-06-05
12:23:40 UTC (rev 8909)
@@ -61,6 +61,8 @@
javaScripts.add("scripts/utils.js");
}
+ ListDataModel model;
+
private UIDataTable dataTable;
private UIColumn column1;
@@ -98,7 +100,8 @@
for (int i = 0; i < ROWS_COUNT; i++) {
list.add(new Date((long) Math.random()));
}
- dataTable.setValue(new ListDataModel(list));
+ model = new ListDataModel(list);
+ dataTable.setValue(model);
dataTable.setVar("var");
column1 = (UIColumn)
application.createComponent("org.richfaces.Column");
@@ -134,6 +137,7 @@
@Override
public void tearDown() throws Exception {
+ model = null;
form = null;
column1 = null;
column2 = null;
@@ -313,7 +317,7 @@
@Override
public Object getValue(ELContext context) {
- return ((Date)dataTable.getRowData()).getTime();
+ return ((Date)model.getRowData()).getTime();
}
@Override
@@ -353,7 +357,7 @@
@Override
public Object getValue(ELContext context) {
- return ((Date)dataTable.getRowData()).getTimezoneOffset();
+ return ((Date)model.getRowData()).getTimezoneOffset();
}
}