return (FutureBundleBean) query.uniqueResult();
}
@Override
public void persistFutureBundleBeans(final Date now, final FutureSecurityBean future) {
OperationTimer timer = new OperationTimer(s_logger, "persistFutureBundleBeans");
final Set<FutureBundleBean> beanBasket = future.getBasket();
final List<FutureBundleBean> dbBasket = getFutureBundleBeans(now, future);
if (now != null) {
// anything in the database (at this timestamp), but not in the basket must be "terminated" at this timestamp
boolean beansUpdated = false;
for (FutureBundleBean dbBundle : dbBasket) {
if (!beanBasket.contains(dbBundle)) {
dbBundle.setEndDate(now);
getSession().update(dbBundle);
beansUpdated = true;
}
}
if (beansUpdated) {
getSession().flush();
beansUpdated = false;
}
// anything not in the database (at this timestamp), but in the basket must be added:
for (FutureBundleBean beanBundle : beanBasket) {
if (!dbBasket.contains(beanBundle)) {
final FutureBundleBean next = nextFutureBundleBean(now, future);
if (next != null) {
beanBundle.setId(next.getId());
beanBundle.setEndDate(next.getEndDate());
next.setStartDate(now);
getSession().update(next);
} else {
beanBundle.setStartDate(now);
beanBundle.setEndDate(null);
if (beanBundle.getId() != null) {
getSession().update(beanBundle);
} else {
Long id = (Long) getSession().save(beanBundle);
beanBundle.setId(id);
}
}
beansUpdated = true;
}
}
if (beansUpdated) {
getSession().flush();
}
} else {
// anything in the database with any timestamp that isn't null/null must be deleted
// anything in the database, but not in the basket, must be deleted
boolean beansUpdated = false;
for (FutureBundleBean dbBundle : dbBasket) {
if (!beanBasket.contains(dbBundle)) {
getSession().delete(dbBundle);
beansUpdated = true;
} else if ((dbBundle.getStartDate() != null) || (dbBundle.getEndDate() != null)) {
dbBundle.setStartDate(null);
dbBundle.setEndDate(null);
getSession().update(dbBundle);
beansUpdated = true;
}
}
// anything not in the database, but in the basket, must be added (null/null)
for (FutureBundleBean beanBundle : beanBasket) {
if (!dbBasket.contains(beanBundle)) {
beanBundle.setStartDate(null);
beanBundle.setEndDate(null);
if (beanBundle.getId() != null) {
getSession().update(beanBundle);
} else {
Long id = (Long) getSession().save(beanBundle);
beanBundle.setId(id);
}
beansUpdated = true;
}
}
if (beansUpdated) {
getSession().flush();
}
}
timer.finished();
}