package org.sculptor.simplecqrs.command.domain;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.sculptor.framework.event.DynamicMethodDispatcher;
/**
* Entity representing InventoryItem.
* <p>
* This class is responsible for the domain object related business logic for
* InventoryItem. Properties and associations are implemented in the generated
* base class {@link org.sample.simplecqrs.command.domain.InventoryItemBase}.
*/
public class InventoryItem extends InventoryItemBase {
private static final long serialVersionUID = 1L;
protected InventoryItem() {
}
/**
* Use {@link #createNew(String, String)} for constructing new InventoryItem
* instances. This constructor is needed for persistence mapper.
*/
public InventoryItem(String itemId) {
super(itemId);
}
public static InventoryItem createNew(String itemId, String name) {
InventoryItem result = new InventoryItem(itemId);
result.applyChange(new InventoryItemCreated(new Date(), itemId, name));
return result;
}
public void rename(String newName) {
if (StringUtils.isEmpty(newName))
throw new IllegalArgumentException("newName");
applyChange(new InventoryItemRenamed(new Date(), getItemId(), newName));
}
public void deactivate() {
if (!isActivated())
throw new IllegalStateException("already deactivated");
applyChange(new InventoryItemDeactivated(new Date(), getItemId()));
}
public void checkIn(int some) {
if (some <= 0)
throw new IllegalArgumentException("must have a count greater than 0 to add to inventory");
applyChange(new ItemsCheckedInToInventory(new Date(), getItemId(), some));
}
public void remove(int some) {
if (some <= 0)
throw new IllegalArgumentException("cant remove negative count from inventory");
applyChange(new ItemsRemovedFromInventory(new Date(), getItemId(), some));
}
public void apply(InventoryItemCreated event) {
setActivated(true);
}
public void apply(InventoryItemDeactivated event) {
setActivated(false);
}
public void apply(Object other) {
// ignore
}
private final List<InventoryItemEvent> changes = new ArrayList<InventoryItemEvent>();
public List<InventoryItemEvent> getUncommittedChanges() {
return changes;
}
public void markChangesAsCommitted() {
changes.clear();
}
private void applyChange(InventoryItemEvent event, boolean isNew) {
DynamicMethodDispatcher.dispatch(this, event, "apply");
if (isNew) {
changes.add(event);
} else {
setVersion(event.getAggregateVersion());
}
}
private void applyChange(InventoryItemEvent event) {
applyChange(event, true);
}
public void loadFromHistory(List<InventoryItemEvent> history) {
for (InventoryItemEvent each : history) {
applyChange(each, false);
}
}
}