package org.aperteworkflow.util.vaadin;
import com.vaadin.ui.Table;
import java.util.HashMap;
import java.util.Map;
/**
* User: POlszewski
* Date: 2012-10-15
* Time: 16:58
*/
public class CachingTableColumnGenerator implements Table.ColumnGenerator {
private final Map<Object, Map<Object, Object>> cellContentsCache = new HashMap<Object, Map<Object, Object>>(); // columnId -> objectId -> component/string
private final Table.ColumnGenerator columnGenerator;
public CachingTableColumnGenerator(Table.ColumnGenerator columnGenerator) {
this.columnGenerator = columnGenerator;
}
@Override
public Object generateCell(Table source, Object itemId, Object columnId) {
Map<Object, Object> itemIdToCellContentMap = cellContentsCache.get(columnId);
Object cellContent;
if (itemIdToCellContentMap != null) {
cellContent = itemIdToCellContentMap.get(itemId);
if (cellContent != null) {
return cellContent;
}
}
else {
itemIdToCellContentMap = new HashMap<Object, Object>();
cellContentsCache.put(columnId, itemIdToCellContentMap);
}
cellContent = columnGenerator.generateCell(source, itemId, columnId);
itemIdToCellContentMap.put(itemId, cellContent);
return cellContent;
}
public void invalidate(Object itemId, Object propertyId) {
Map<Object, Object> itemIdToCellContentMap = cellContentsCache.get(propertyId);
if (itemIdToCellContentMap != null) {
itemIdToCellContentMap.remove(itemId);
}
}
public void invalidate(Object itemId) {
for (Map<Object, Object> itemIdToCellContentMap : cellContentsCache.values()) {
itemIdToCellContentMap.remove(itemId);
}
}
public void invalidateAll() {
for (Map<Object, Object> itemIdToCellContentMap : cellContentsCache.values()) {
itemIdToCellContentMap.clear();
}
}
}