package org.sculptor.simplecqrs.command.repositoryimpl;
import java.util.ArrayList;
import java.util.List;
import org.sculptor.simplecqrs.command.domain.InventoryItem;
import org.sculptor.simplecqrs.command.domain.InventoryItemEvent;
import org.sculptor.simplecqrs.command.exception.InventoryItemNotFoundException;
import org.springframework.stereotype.Repository;
/**
* Repository implementation for InventoryItem
*/
@Repository("inventoryItemRepository")
public class InventoryItemRepositoryImpl extends InventoryItemRepositoryBase {
public InventoryItemRepositoryImpl() {
}
@Override
public InventoryItem save(InventoryItem entity) {
InventoryItem saved = super.save(entity);
List<InventoryItemEvent> changes = entity.getUncommittedChanges();
changes = applyVersionToChanges(changes, saved.getVersion());
for (InventoryItemEvent each : changes) {
getInventoryItemEventRepository().save(each);
}
entity.markChangesAsCommitted();
return saved;
}
private List<InventoryItemEvent> applyVersionToChanges(List<InventoryItemEvent> changes, long version) {
List<InventoryItemEvent> result = new ArrayList<InventoryItemEvent>();
long sequence = version * 1000;
for (InventoryItemEvent each : changes) {
result.add(each.withAggregateVersion(version).withChangeSequence(sequence));
sequence++;
}
return result;
}
@Override
public InventoryItem findByKey(String itemId) throws InventoryItemNotFoundException {
InventoryItem result = super.findByKey(itemId);
loadFromHistory(result);
return result;
}
private void loadFromHistory(InventoryItem entity) {
List<InventoryItemEvent> history = getInventoryItemEventRepository().findAllForItem(entity.getItemId());
entity.loadFromHistory(history);
}
}