package org.sculptor.simplecqrs.query.serviceimpl;
import org.sculptor.framework.event.DynamicMethodDispatcher;
import org.sculptor.framework.event.Event;
import org.sculptor.simplecqrs.command.domain.InventoryItemCreated;
import org.sculptor.simplecqrs.command.domain.InventoryItemDeactivated;
import org.sculptor.simplecqrs.command.domain.InventoryItemRenamed;
import org.sculptor.simplecqrs.command.domain.ItemsCheckedInToInventory;
import org.sculptor.simplecqrs.command.domain.ItemsRemovedFromInventory;
import org.sculptor.simplecqrs.query.domain.InventoryItemDetails;
import org.sculptor.simplecqrs.query.exception.InventoryItemDetailsNotFoundException;
import org.springframework.stereotype.Service;
/**
* Implementation of InventoryItemDetailView.
*/
@Service("inventoryItemDetailView")
public class InventoryItemDetailViewImpl extends InventoryItemDetailViewImplBase {
public InventoryItemDetailViewImpl() {
}
public void receive(Event event) {
DynamicMethodDispatcher.dispatch(this, event, "handle");
}
public void handle(InventoryItemCreated event) {
getInventoryItemDetailsRepository().save(new InventoryItemDetails(event.getItemId(), event.getName()));
}
public void handle(InventoryItemRenamed event) {
InventoryItemDetails item = tryGetItem(event.getItemId());
item.setName(event.getNewName());
getInventoryItemDetailsRepository().save(item);
}
public void handle(InventoryItemDeactivated event) {
InventoryItemDetails item = tryGetItem(event.getItemId());
getInventoryItemDetailsRepository().delete(item);
}
public void handle(ItemsCheckedInToInventory event) {
InventoryItemDetails item = tryGetItem(event.getItemId());
item.setCurrentCount(item.getCurrentCount() + event.getCountChange());
getInventoryItemDetailsRepository().save(item);
}
public void handle(ItemsRemovedFromInventory event) {
InventoryItemDetails item = tryGetItem(event.getItemId());
item.setCurrentCount(item.getCurrentCount() - event.getCountChange());
getInventoryItemDetailsRepository().save(item);
}
private InventoryItemDetails tryGetItem(String itemId) {
try {
return getInventoryItemDetailsRepository().findByKey(itemId);
} catch (InventoryItemDetailsNotFoundException e) {
throw new IllegalStateException("Unknown item: " + itemId);
}
}
}