package org.springframework.data.simpledb.core;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.data.simpledb.attributeutil.SimpleDbAttributeValueSplitter;
import org.springframework.data.simpledb.core.entity.EntityWrapper;
import org.springframework.data.simpledb.repository.support.entityinformation.SimpleDbEntityInformation;
import com.amazonaws.services.simpledb.model.Attribute;
import com.amazonaws.services.simpledb.model.Item;
import com.amazonaws.services.simpledb.model.SelectResult;
public class DomainItemBuilder<T> {
public List<T> populateDomainItems(SimpleDbEntityInformation<T, ?> entityInformation, SelectResult selectResult) {
final List<T> allItems = new ArrayList<T>();
for(Item item : selectResult.getItems()) {
allItems.add(populateDomainItem(entityInformation, item));
}
return allItems;
}
/**
* Used during deserialization process, each item being populated based on attributes retrieved from DB
* @param entityInformation
* @param item
* @return T the Item Instance
*/
public T populateDomainItem(SimpleDbEntityInformation<T, ?> entityInformation, Item item) {
return buildDomainItem(entityInformation, item);
}
private T buildDomainItem(SimpleDbEntityInformation<T, ?> entityInformation, Item item) {
EntityWrapper<T, ?> entity = new EntityWrapper<T, Serializable>(entityInformation);
entity.setId(item.getName());
final Map<String, String> attributes = convertSimpleDbAttributes(item.getAttributes());
entity.deserialize(attributes);
return entity.getItem();
}
private Map<String, String> convertSimpleDbAttributes(List<Attribute> simpleDbAttributes) {
final Map<String, List<String>> multiValueAttributes = new HashMap<String, List<String>>();
for (Attribute attr : simpleDbAttributes) {
if (!multiValueAttributes.containsKey(attr.getName())) {
multiValueAttributes.put(attr.getName(), new ArrayList<String>());
}
multiValueAttributes.get(attr.getName()).add(attr.getValue());
}
return SimpleDbAttributeValueSplitter.combineAttributeValuesWithExceedingLengths(multiValueAttributes);
}
}