Author: pgolawski
Date: 2008-10-10 08:45:38 -0400 (Fri, 10 Oct 2008)
New Revision: 10716
Modified:
trunk/framework/impl/src/main/java/org/richfaces/model/ExtendedTableDataModel.java
Log:
cache internal data to do not load data from provider every time
Modified:
trunk/framework/impl/src/main/java/org/richfaces/model/ExtendedTableDataModel.java
===================================================================
---
trunk/framework/impl/src/main/java/org/richfaces/model/ExtendedTableDataModel.java 2008-10-10
12:44:41 UTC (rev 10715)
+++
trunk/framework/impl/src/main/java/org/richfaces/model/ExtendedTableDataModel.java 2008-10-10
12:45:38 UTC (rev 10716)
@@ -12,9 +12,9 @@
import javax.faces.context.FacesContext;
import org.ajax4jsf.model.DataVisitor;
+import org.ajax4jsf.model.ExtendedDataModel;
import org.ajax4jsf.model.Range;
import org.ajax4jsf.model.SequenceRange;
-import org.ajax4jsf.model.SerializableDataModel;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -22,115 +22,23 @@
* Data model class for table components.<br>
* Usage:
* <pre>
- * G3TableDataModel<SomeDataType> dataModel = new
G3TableDataModel<SomeDataType>(new G3DataProvider
<SomeDataType>());
+ * ExtendedTableDataModel<SomeDataType> dataModel = new
ExtendedTableDataModel<SomeDataType>(new DataProvider
<SomeDataType>());
* </pre>
* @author pawelgo
*
*/
-public class ExtendedTableDataModel<T> extends SerializableDataModel {
+public class ExtendedTableDataModel<T> extends ExtendedDataModel {
-// /**
-// * Cache container for data presented in data model.
-// * It prevents load the same data many times.
-// * @author pawelgo
-// *
-// * @param <T> data type
-// */
-// private static class DataCache<T> implements Serializable {
-// private static final long serialVersionUID = 8409239905346930920L;
-// private int startRow;
-// private int endRow;
-// //private SortOrder sortOrder;
-// private List<T> loadedData;
-//
-// public DataCache(int startRow, int endRow,
-// List<T> loadedData) {
-// super();
-// this.startRow = startRow;
-// this.endRow = endRow;
-// //this.sortOrder = deepCopy(sortOrder);
-// this.loadedData = loadedData;
-// }
-//
-// /**
-// * Returns a deep copy of an object
-// */
-// @SuppressWarnings("unused")
-// private SortOrder deepCopy(SortOrder sortOrder) {
-// if (sortOrder == null)
-// return null;
-// SortOrder order = new SortOrder();
-// if (sortOrder.getFields() != null) {
-// SortField[] fields = new SortField[sortOrder.getFields().length];
-// for (int i = 0; i < sortOrder.getFields().length; i++) {
-// SortField f = sortOrder.getFields()[i];
-// fields[i] = new SortField(f.getName(), f.getIndex(), f
-// .getAscending());
-// }//for
-// order.setFields(fields);
-// }//if
-// return order;
-// }//deepCopy
-//
-// /**
-// * Returns a deep copy of an object using serialization.
-// */
-// static public Object deepCopy(Object oldObj) throws Exception {
-// ObjectOutputStream oos = null;
-// ObjectInputStream ois = null;
-// try {
-// ByteArrayOutputStream bos = new ByteArrayOutputStream();
-// oos = new ObjectOutputStream(bos);
-// // serialize and pass the object
-// oos.writeObject(oldObj);
-// oos.flush();
-// ByteArrayInputStream bin = new ByteArrayInputStream(bos
-// .toByteArray());
-// ois = new ObjectInputStream(bin);
-// // return the new object
-// return ois.readObject();
-// } catch (Exception e) {
-// if (log.isErrorEnabled())
-// log.error("Exception in ObjectCloner = " + e);
-// throw (e);
-// } finally {
-// oos.close();
-// ois.close();
-// }
-// }//deepCopy
-//
-// public boolean match(int s, int e) {
-// return s == startRow && e == endRow;
-// //&& sortOrdersMatch(sortOrder, this.sortOrder);
-// }//match
-//
-// @SuppressWarnings("unused")
-// private boolean sortOrdersMatch(SortOrder sortOrder1,
-// SortOrder sortOrder2) {
-// boolean result = sortOrder1 == sortOrder2;
-//
-// if (sortOrder1 != null && sortOrder2 != null) {
-// result = sortOrder1.equals(sortOrder2);
-// }
-//
-// return result;
-// }//sortOrdersMatch
-//
-// }//DataCache
-
private static final long serialVersionUID = 7374505108088114161L;
private static final Log log = LogFactory.getLog(ExtendedTableDataModel.class);
private DataProvider<T> dataProvider;
private Object rowKey;
- //private Map<Object,T> wrappedData = new HashMap<Object,T>();
private List<Object> wrappedKeys = null;
- private boolean detached = false;
+ //private boolean detached = false;
private Map<Object, T> wrappedData = new HashMap<Object, T>();
- //private DataCache<T> dataCache;
-
public ExtendedTableDataModel(DataProvider<T> dataProvider) {
this.dataProvider = dataProvider;
}
@@ -138,9 +46,9 @@
/* (non-Javadoc)
* @see org.ajax4jsf.model.SerializableDataModel#update()
*/
- public void update() {
- ;
- }
+// public void update() {
+// ;
+// }
/**
* This method never called from framework.
@@ -173,7 +81,7 @@
if (numberOfRows <= 0) {
numberOfRows = rowC;
}
- if (detached) { // Is this serialized model
+ if (wrappedKeys != null) { // Is this serialized model
// Here we just ignore current Rage and use whatever data was saved in serialized
model.
// Such approach uses much more getByPk() operations, instead of just one request by
range.
// Concrete case may be different from that, so you can just load data from data
provider by range.
@@ -216,17 +124,9 @@
endRow = rowCount;
throw new IllegalArgumentException("Illegal end index value: " + endRow);
}
- /*
- if (dataCache == null || !dataCache.match(startRow, endRow)) {
- if (log.isDebugEnabled())
- log.debug("load and store in cache");
- List<T> data = dataProvider.getItemsByRange(startRow, endRow);
- dataCache = new DataCache<T>(startRow, endRow, data);
- }
- return dataCache.loadedData;
- */
//load all from provider and get sublist
- return dataProvider.getItemsByRange(0, rowCount).subList(startRow, endRow);
+ return dataProvider.getItemsByRange(startRow, endRow);
+ //return dataProvider.getItemsByRange(0, rowCount).subList(startRow, endRow);
}//loadData
/**
@@ -331,15 +231,27 @@
* complicated cases we may need to transform data to actually serialized
* form.
*/
- public SerializableDataModel getSerializableModel(Range range) {
- if (wrappedKeys != null) {
- detached = true;
- // Some activity to detach persistent data from wrappedData map may be taken here.
- // In that specific case we are doing nothing.
- return this;
- } else {
- return null;
- }
+// public SerializableDataModel getSerializableModel(Range range) {
+// if (wrappedKeys != null) {
+// detached = true;
+// // Some activity to detach persistent data from wrappedData map may be taken here.
+// // In that specific case we are doing nothing.
+// return this;
+// } else {
+// return null;
+// }
+// }
+
+ /**
+ * Resets internal cached data. Call this method to reload data from data
+ * provider on first access for data.
+ */
+ public void reset(){
+ wrappedKeys = null;
+ wrappedData.clear();
+ rowCount = null;
+ rowIndex = -1;
+ rowKey = null;
}
public DataProvider<T> getDataProvider() {
Show replies by date