/*
* Copyright 2009-2011 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jdal.vaadin.data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.vaadin.data.Container.ItemSetChangeEvent;
import com.vaadin.data.Item;
import com.vaadin.data.util.BeanItem;
/**
* Use Primary Keys as ItemId.
*
* @author Jose Luis Martin - (jlm@joseluismartin.info)
*/
@SuppressWarnings("rawtypes")
public class PkItemIdStrategy implements ItemIdStrategy {
Map<Serializable, Integer> indexes = new HashMap<Serializable, Integer>();
Map<Integer, Serializable> keys = new HashMap<Integer, Serializable>();
ContainerDataSource containerDataSource;
String identifierPropertyName = "id";
/**
* {@inheritDoc}
*/
public Object firstItemId() {
return getIdByIndex(0);
}
/**
* {@inheritDoc}
*/
public Object getIdByIndex(int index) {
Item item = containerDataSource.getItemByIndex(index);
return item != null ? getIdByItem(item) : null;
}
/**
* @param item
* @return
*/
private Serializable getIdByItem(Item item) {
return (Serializable) item.getItemProperty(identifierPropertyName).getValue();
}
/**
* {@inheritDoc}
*/
public Collection<?> getItemIds() {
List<Serializable> ids = containerDataSource.getKeys();
indexes.clear();
for (int i = 0; i < ids.size(); i++) {
indexes.put(ids.get(i), i);
}
return ids;
}
/**
* {@inheritDoc}
*/
public int indexOfId(Object itemId) {
if (!indexes.containsKey(itemId)) {
getItemIds();
}
return indexes.get(itemId);
}
/**
* {@inheritDoc}
*/
public Object lastItemId() {
Item item= containerDataSource.getItemByIndex(containerDataSource.size() - 1);
return item != null ? item.getItemProperty(identifierPropertyName): null;
}
/**
* {@inheritDoc}
*/
public void setContainerDataSource(ContainerDataSource<?> containerDataSource) {
this.containerDataSource = containerDataSource;
}
public Serializable getKey(Item item) {
return item.getItemProperty(identifierPropertyName);
}
/**
* {@inheritDoc}
*/
public void itemLoaded(int index, Item item) {
indexes.put(getIdByItem(item), index);
}
/**
* {@inheritDoc}
*/
public void containerItemSetChange(ItemSetChangeEvent event) {
getItemIds();
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked")
public Item getItem(Object itemId) {
return new BeanItem<Object>(containerDataSource.getService().get((Serializable) itemId));
}
/**
* {@inheritDoc}
*/
public boolean containsId(Object itemId) {
return indexes.containsKey(itemId);
}
@Override
public List<?> getItemIds(int startIndex, int numberOfItems) {
List<Object> ids = new ArrayList<Object>(numberOfItems);
for (int i = 0; i < numberOfItems; i++)
ids.add(getIdByIndex((startIndex + i)));
return ids;
}
}