package org.sculptor.shipping.core.repositoryimpl; import java.util.ArrayList; import java.util.List; import org.sculptor.shipping.core.domain.Ship; import org.sculptor.shipping.core.domain.ShipEvent; import org.sculptor.shipping.core.domain.ShipId; import org.sculptor.shipping.core.exception.ShipNotFoundException; import org.springframework.stereotype.Repository; /** * Repository implementation for Ship */ @Repository("shipRepository") public class ShipRepositoryImpl extends ShipRepositoryBase { public ShipRepositoryImpl() { } @Override public Ship save(Ship entity) { Ship saved = super.save(entity); List<ShipEvent> changes = entity.getUncommittedChanges(); changes = applyVersionToChanges(changes, saved.getVersion()); for (ShipEvent each : changes) { getShipEventRepository().save(each); } entity.markChangesAsCommitted(); return saved; } private List<ShipEvent> applyVersionToChanges(List<ShipEvent> changes, long version) { List<ShipEvent> result = new ArrayList<ShipEvent>(); long sequence = version * 1000; for (ShipEvent each : changes) { result.add(each.withAggregateVersion(version).withChangeSequence( sequence)); sequence++; } return result; } @Override public Ship findByKey(ShipId shipId) throws ShipNotFoundException { Ship result = super.findByKey(shipId); loadFromHistory(result); return result; } private void loadFromHistory(Ship entity) { List<ShipEvent> history = getShipEventRepository().findAllForShip( entity.getShipId()); entity.loadFromHistory(history); } }