[richfaces-svn-commits] JBoss Rich Faces SVN: r11807 - in trunk: framework/api/src/main/java/org/richfaces/model and 3 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Tue Dec 16 08:28:07 EST 2008


Author: konstantin.mishin
Date: 2008-12-16 08:28:07 -0500 (Tue, 16 Dec 2008)
New Revision: 11807

Modified:
   trunk/framework/api/src/main/java/org/ajax4jsf/model/SequenceRange.java
   trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataModel.java
   trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataRange.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/component/UIScrollableDataTable.java
   trunk/ui/scrollableDataTable/src/main/java/org/richfaces/convert/rowkey/ScrollableDataTableRowKeyConverter.java
   trunk/ui/scrollableDataTable/src/test/java/org/richfaces/component/AbstractScrollableDataTableTestCase.java
Log:
RF-2644

Modified: trunk/framework/api/src/main/java/org/ajax4jsf/model/SequenceRange.java
===================================================================
--- trunk/framework/api/src/main/java/org/ajax4jsf/model/SequenceRange.java	2008-12-16 13:25:24 UTC (rev 11806)
+++ trunk/framework/api/src/main/java/org/ajax4jsf/model/SequenceRange.java	2008-12-16 13:28:07 UTC (rev 11807)
@@ -55,4 +55,12 @@
 		this.rows = rows;
 	}
 
+	protected void setFirstRow(int firstRow) {
+		this.firstRow = firstRow;
+	}
+
+	protected void setRows(int rows) {
+		this.rows = rows;
+	}
+
 }

Modified: trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataModel.java
===================================================================
--- trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataModel.java	2008-12-16 13:25:24 UTC (rev 11806)
+++ trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataModel.java	2008-12-16 13:28:07 UTC (rev 11807)
@@ -54,6 +54,8 @@
 	public static class SimpleRowKey extends Number implements Serializable{
 
 		private static final long serialVersionUID = 1L;
+		
+		public static final String PREFIX = "srk";
 		private int i;
 
 		public SimpleRowKey(int i) {
@@ -66,7 +68,7 @@
 		}
 		
 		public String toString() {
-			return String.valueOf(i);
+			return PREFIX + String.valueOf(i);
 		}
 
 		public int hashCode() {

Modified: trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataRange.java
===================================================================
--- trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataRange.java	2008-12-16 13:25:24 UTC (rev 11806)
+++ trunk/framework/api/src/main/java/org/richfaces/model/ScrollableTableDataRange.java	2008-12-16 13:28:07 UTC (rev 11807)
@@ -12,25 +12,21 @@
 
 import java.io.Serializable;
 
-import org.ajax4jsf.model.Range;
+import org.ajax4jsf.model.SequenceRange;
 
 /**
  * Iteration range for Scrollable Grid
  * @author Maksim Kaszynski
  * @modified by Anton Belevich
  */
-public class ScrollableTableDataRange implements Range, Serializable{
+public class ScrollableTableDataRange extends SequenceRange implements Serializable{
 	
 	private static final long serialVersionUID = -6675002421400464892L;
 	
-	private int first = 0;
-	private int last = 0;
 	private SortOrder sortOrder;
 	
 	public ScrollableTableDataRange(int first, int last, SortOrder sortOrder) {
-		super();
-		this.first = first;
-		this.last = last;
+		super(first, last > 0 ? last - first : -1);
 		this.sortOrder = sortOrder;
 	}
 
@@ -38,25 +34,25 @@
 	 * @return the bufferSize
 	 */
 	public int getLast() {
-		return last;
+		return getFirstRow() + getRows();
 	}
 	/**
 	 * @param bufferSize the bufferSize to set
 	 */
 	public void setLast(int lastRow) {
-		this.last = lastRow;
+		setRows(lastRow > 0 ? lastRow - getFirstRow() : -1);
 	}
 	/**
 	 * @return the first
 	 */
 	public int getFirst() {
-		return first;
+		return getFirstRow();
 	}
 	/**
 	 * @param first the first to set
 	 */
 	public void setFirst(int first) {
-		this.first = first;
+		setFirstRow(first);
 	}
 
 	public SortOrder getSortOrder() {
@@ -66,27 +62,36 @@
 	public void setSortOrder(SortOrder sortOrder) {
 		this.sortOrder = sortOrder;
 	}
-	
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + getFirstRow();
+		result = prime * result + getRows();
+		result = prime * result
+				+ ((sortOrder == null) ? 0 : sortOrder.hashCode());
+		return result;
+	}
+
+	@Override
 	public boolean equals(Object obj) {
-	
-		if(!(obj instanceof ScrollableTableDataRange)){
-			return super.equals(obj);
-		}
-		
-		ScrollableTableDataRange ref = (ScrollableTableDataRange)obj;
-		
-		boolean ret = (this.first == ref.first)&&(this.last == ref.last );
-		
-		if(this.sortOrder != null){
-			ret = ret && this.sortOrder.equals(ref.sortOrder);  
-		} else {
-			ret = (ret && (ref.sortOrder == null));
-		}
-				
-		return ret;
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		ScrollableTableDataRange other = (ScrollableTableDataRange) obj;
+		if (getFirstRow() != other.getFirstRow())
+			return false;
+		if (getRows() != other.getRows())
+			return false;
+		if (sortOrder == null) {
+			if (other.sortOrder != null)
+				return false;
+		} else if (!sortOrder.equals(other.sortOrder))
+			return false;
+		return true;
 	}
-	
-	public int hashCode() {
-		return super.hashCode();
-	}
 }

Modified: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/component/UIScrollableDataTable.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/component/UIScrollableDataTable.java	2008-12-16 13:25:24 UTC (rev 11806)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/component/UIScrollableDataTable.java	2008-12-16 13:28:07 UTC (rev 11807)
@@ -24,10 +24,15 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 
+import javax.el.ELContext;
+import javax.el.ExpressionFactory;
+import javax.el.ValueExpression;
 import javax.faces.component.UIColumn;
 import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
 import javax.faces.context.FacesContext;
 import javax.faces.convert.Converter;
 import javax.faces.event.AbortProcessingException;
@@ -35,13 +40,14 @@
 import javax.faces.event.PhaseId;
 
 import org.ajax4jsf.component.AjaxComponent;
-import org.ajax4jsf.component.UIDataAdaptor;
+import org.ajax4jsf.component.SequenceDataAdaptor;
 import org.ajax4jsf.context.AjaxContext;
 import org.ajax4jsf.event.AjaxEvent;
 import org.ajax4jsf.model.DataComponentState;
 import org.ajax4jsf.model.DataVisitor;
 import org.ajax4jsf.model.ExtendedDataModel;
 import org.ajax4jsf.model.Range;
+import org.ajax4jsf.util.ELUtils;
 import org.apache.commons.collections.iterators.IteratorChain;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -53,10 +59,14 @@
 import org.richfaces.event.sort.SortEvent;
 import org.richfaces.event.sort.SortListener;
 import org.richfaces.model.DataModelCache;
+import org.richfaces.model.Modifiable;
+import org.richfaces.model.ModifiableModel;
+import org.richfaces.model.Ordering;
 import org.richfaces.model.ScrollableTableDataModel;
 import org.richfaces.model.ScrollableTableDataRange;
+import org.richfaces.model.SortField;
+import org.richfaces.model.SortField2;
 import org.richfaces.model.SortOrder;
-import org.richfaces.model.internal.ComponentSortableDataModel;
 import org.richfaces.renderkit.html.ScrollableDataTableUtils;
 
 
@@ -65,7 +75,7 @@
  *
  */
 
-public abstract class UIScrollableDataTable extends UIDataAdaptor implements AjaxComponent, Sortable, Selectable, ScriptExportable{
+public abstract class UIScrollableDataTable extends SequenceDataAdaptor implements AjaxComponent, Sortable, Selectable, ScriptExportable{
 	
 	
 	public static final String COMPONENT_TYPE = "org.richfaces.component.ScrollableDataTable";
@@ -189,29 +199,29 @@
 	}
 	
 	protected ExtendedDataModel createDataModel() {
-		
-		Object value = getValue();
-		
-		ScrollableTableDataModel<?> model = null;
-		
-		if (value instanceof ScrollableTableDataModel) {
-			
-			if (log.isDebugEnabled()) {
-				log.debug("Found instanceof " + value.getClass() + " will use it unwrapped");
+		ExtendedDataModel model = super.createDataModel();
+		if (model instanceof ScrollableTableDataModel) {
+			if (isCacheable()) {
+				if (log.isDebugEnabled()) {
+					log.debug("Initializing cache of type "
+							+ DataModelCache.class);
+				}
+				model = new DataModelCache((ScrollableTableDataModel<?>) model);
 			}
-			model = (ScrollableTableDataModel<?>) value;
-		
 		} else {
-			model = new ComponentSortableDataModel(getVar(), value, this.getSortOrder());
-		}
-		
-		if (isCacheable()) {
-			
-			if (log.isDebugEnabled()) {
-				log.debug("Initializing cache of type " + DataModelCache.class);
+			List<SortField2> sortFields = getSortFields();
+			if (sortFields != null && !sortFields.isEmpty()) {
+				Modifiable modifiable = null;
+				if (model instanceof Modifiable) {
+					modifiable = (Modifiable) model;
+				} else {
+					ModifiableModel modifiableModel = new ModifiableModel(
+							model, getVar());
+					model = modifiableModel;
+					modifiable = modifiableModel;
+				}
+				modifiable.modify(null, sortFields);
 			}
-
-			model = new DataModelCache(model);
 		}
 		/*
 		 * TODO: Verify - do we really need it
@@ -220,7 +230,45 @@
 		return model;		
 	}
 	
-		
+	private List<SortField2> getSortFields() {
+		FacesContext context = FacesContext.getCurrentInstance();
+		ELContext eLContext= context.getELContext();
+		ExpressionFactory expressionFactory = context.getApplication().getExpressionFactory();
+		String var = getVar();
+		SortOrder sortOrder = getSortOrder();
+		List<SortField2> sortFields2 = null;
+		if (sortOrder != null) {
+			SortField[] sortFields = sortOrder.getFields();
+			sortFields2 = new LinkedList<SortField2>();
+			for (SortField sortField : sortFields) {
+				ValueExpression valueExpression = null;
+				String name = sortField.getName();
+				if (ELUtils.isValueReference(name)) {
+					valueExpression = expressionFactory.createValueExpression(
+							eLContext, name, Object.class);
+				} else if (!name.startsWith(UIViewRoot.UNIQUE_ID_PREFIX)) {
+					valueExpression = expressionFactory.createValueExpression(
+							eLContext, "#{" + var + "." + name + "}",
+							Object.class);
+				}
+				Ordering ordering = Ordering.UNSORTED;
+				Boolean ascending = sortField.getAscending();
+				if (ascending != null) {
+					if (ascending) {
+						ordering = Ordering.ASCENDING;
+					} else {
+						ordering = Ordering.DESCENDING;
+					}
+				}
+				if (valueExpression != null
+						&& !Ordering.UNSORTED.equals(ordering)) {
+					sortFields2.add(new SortField2(valueExpression, ordering));
+				}
+			}
+		}
+		return sortFields2;
+	}	
+	
 	public Object saveState(FacesContext context) {
 		
 		Object values[] = new Object[4];

Modified: trunk/ui/scrollableDataTable/src/main/java/org/richfaces/convert/rowkey/ScrollableDataTableRowKeyConverter.java
===================================================================
--- trunk/ui/scrollableDataTable/src/main/java/org/richfaces/convert/rowkey/ScrollableDataTableRowKeyConverter.java	2008-12-16 13:25:24 UTC (rev 11806)
+++ trunk/ui/scrollableDataTable/src/main/java/org/richfaces/convert/rowkey/ScrollableDataTableRowKeyConverter.java	2008-12-16 13:28:07 UTC (rev 11807)
@@ -43,8 +43,12 @@
 	public Object getAsObject(FacesContext context, UIComponent component,
 			String value) {
 		try {
-			int i = Integer.parseInt(value);
-			return new SimpleRowKey(i);
+			String prefix = SimpleRowKey.PREFIX;
+			if (value != null && value.startsWith(prefix)) {
+				int i = Integer.parseInt(value.substring(prefix.length()));
+				return new SimpleRowKey(i);
+			}
+			return new Integer(value);
 		} catch(Exception e) {
 			throw new ConverterException("Unable to convert value " + value + "to " + SimpleRowKey.class, e);
 		}
@@ -55,9 +59,8 @@
 	 */
 	public String getAsString(FacesContext context, UIComponent component,
 			Object value) {
-		if (value instanceof SimpleRowKey) {
-			SimpleRowKey key = (SimpleRowKey) value;
-			return key.toString();
+		if (value instanceof SimpleRowKey || value instanceof Integer) {
+			return value.toString();
 		}
 		throw new ConverterException("Value " + value + " is not supported by this converter");
 	}

Modified: trunk/ui/scrollableDataTable/src/test/java/org/richfaces/component/AbstractScrollableDataTableTestCase.java
===================================================================
--- trunk/ui/scrollableDataTable/src/test/java/org/richfaces/component/AbstractScrollableDataTableTestCase.java	2008-12-16 13:25:24 UTC (rev 11806)
+++ trunk/ui/scrollableDataTable/src/test/java/org/richfaces/component/AbstractScrollableDataTableTestCase.java	2008-12-16 13:28:07 UTC (rev 11807)
@@ -43,6 +43,7 @@
 import org.richfaces.model.DataModelCache;
 import org.richfaces.model.SortField;
 import org.richfaces.model.SortOrder;
+import org.richfaces.model.impl.ListDataModel;
 import org.richfaces.model.selection.Selection;
 import org.richfaces.model.selection.SimpleSelection;
 
@@ -202,7 +203,7 @@
 		
 		
 		
-		List l = Collections.singletonList("aaaa");
+		ListDataModel l = new ListDataModel(Collections.singletonList("aaaa"));
 		table.setValue(l);
 		ExtendedDataModel model = table.createDataModel();
 		
@@ -216,7 +217,7 @@
 		table.setValue(null);
 		model = table.createDataModel();
 		
-		assertTrue(model instanceof DataModelCache);
+		assertTrue(model instanceof ExtendedDataModel);
 		
 		assertEquals(0, model.getRowCount());
 		




More information about the richfaces-svn-commits mailing list