package org.sculptor.dddsample.cargo.repositoryimpl;
import java.util.UUID;
import org.sculptor.dddsample.cargo.domain.Cargo;
import org.sculptor.dddsample.cargo.domain.CargoProperties;
import org.sculptor.dddsample.cargo.domain.CargoRepository;
import org.sculptor.dddsample.cargo.domain.TrackingId;
import org.sculptor.dddsample.cargo.exception.CargoNotFoundException;
import org.sculptor.framework.domain.AssociationSpecification;
import org.springframework.stereotype.Repository;
/**
* Repository implementation for Cargo
*/
@Repository("cargoRepository")
public class CargoRepositoryImpl extends CargoRepositoryBase implements CargoRepository {
public CargoRepositoryImpl() {
}
@Override
public TrackingId nextTrackingId() {
final String random = UUID.randomUUID().toString().toUpperCase();
return new TrackingId(random.substring(0, random.indexOf("-")));
}
@Override
public Cargo find(TrackingId trackingId, boolean loadDeliveryHistory) throws CargoNotFoundException {
Cargo result = find(trackingId);
if (loadDeliveryHistory) {
result = populateAssociations(result, new AssociationSpecification(CargoProperties.events().toString()));
}
return result;
}
@Override
public Cargo save(Cargo entity) {
Cargo result = super.save(entity);
deleteOrphanItinerary();
return result;
}
@Override
public void detachItineray(Cargo cargo) {
try {
Long id = cargo.getId();
Cargo storedCargo = findById(id);
storedCargo.detachItinerary();
save(storedCargo);
} catch (CargoNotFoundException e) {
throw new RuntimeException(e);
}
}
}