package com.jspxcms.ext.service.impl;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jspxcms.common.orm.Limitable;
import com.jspxcms.common.orm.SearchFilter;
import com.jspxcms.common.util.RowSide;
import com.jspxcms.core.domain.Site;
import com.jspxcms.core.domain.User;
import com.jspxcms.core.listener.SiteDeleteListener;
import com.jspxcms.core.listener.UserDeleteListener;
import com.jspxcms.core.service.SiteService;
import com.jspxcms.core.service.UserService;
import com.jspxcms.core.support.DeleteException;
import com.jspxcms.ext.domain.Guestbook;
import com.jspxcms.ext.domain.GuestbookType;
import com.jspxcms.ext.listener.GuestbookTypeDeleteListener;
import com.jspxcms.ext.repository.GuestbookDao;
import com.jspxcms.ext.service.GuestbookService;
import com.jspxcms.ext.service.GuestbookTypeService;
/**
* GuestbookServiceImpl
*
* @author yangxing
*
*/
@Service
@Transactional(readOnly = true)
public class GuestbookServiceImpl implements GuestbookService,
SiteDeleteListener, UserDeleteListener, GuestbookTypeDeleteListener {
public Page<Guestbook> findAll(Map<String, String[]> params,
Pageable pageable, Integer siteId) {
return dao.findAll(spec(siteId, params), pageable);
}
public List<Guestbook> findList(Integer[] siteId, String[] type,
Integer[] typeId, Boolean isRecommend, Integer[] status,
Limitable limitable) {
return dao.findList(siteId, type, typeId, isRecommend, status,
limitable);
}
public RowSide<Guestbook> findSide(Map<String, String[]> params,
Integer siteId, Guestbook bean, Integer position, Sort sort) {
if (position == null) {
return new RowSide<Guestbook>();
}
Limitable limit = RowSide.limitable(position, sort);
List<Guestbook> list = dao.findAll(spec(siteId, params), limit);
return RowSide.create(list, bean);
}
private Specification<Guestbook> spec(final Integer siteId,
Map<String, String[]> params) {
Collection<SearchFilter> filters = SearchFilter.parse(params).values();
final Specification<Guestbook> fs = SearchFilter.spec(filters,
Guestbook.class);
Specification<Guestbook> sp = new Specification<Guestbook>() {
public Predicate toPredicate(Root<Guestbook> root,
CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate pred = fs.toPredicate(root, query, cb);
if (siteId != null) {
pred = cb.and(pred,
cb.equal(root.get("site").get("id"), siteId));
}
return pred;
}
};
return sp;
}
public Guestbook get(Integer id) {
return dao.findOne(id);
}
@Transactional
public Guestbook save(Guestbook bean, Integer userId, Integer typeId,
String ip, Integer siteId) {
Site site = siteService.get(siteId);
User user = userService.get(userId);
bean.setSite(site);
bean.setCreator(user);
GuestbookType type = guestbookTypeService.get(typeId);
if (StringUtils.isBlank(bean.getCreationIp())) {
bean.setCreationIp(ip);
}
bean.setType(type);
if (StringUtils.isBlank(bean.getReplyText())) {
bean.setReplyer(null);
bean.setReplyIp(null);
bean.setReplyDate(null);
bean.setReply(false);
} else {
bean.setReplyer(user);
bean.setReplyIp(ip);
bean.setReplyDate(new Timestamp(System.currentTimeMillis()));
bean.setReply(true);
}
bean.applyDefaultValue();
bean = dao.save(bean);
return bean;
}
@Transactional
public Guestbook update(Guestbook bean, Integer userId, Integer typeId,
String ip) {
User user = userService.get(userId);
if (StringUtils.isBlank(bean.getCreationIp())) {
bean.setCreationIp(ip);
}
if (bean.getCreationDate() == null) {
bean.setCreationDate(new Timestamp(System.currentTimeMillis()));
}
if (StringUtils.isBlank(bean.getReplyText())) {
bean.setReplyer(null);
bean.setReplyIp(null);
bean.setReplyDate(null);
bean.setReply(false);
} else {
if (bean.getReplyer() == null) {
bean.setReplyer(user);
}
if (StringUtils.isBlank(bean.getReplyIp())) {
bean.setReplyIp(ip);
}
if (bean.getReplyDate() == null) {
bean.setReplyDate(new Timestamp(System.currentTimeMillis()));
}
bean.setReply(true);
}
bean = dao.save(bean);
return bean;
}
@Transactional
public Guestbook delete(Integer id) {
Guestbook entity = dao.findOne(id);
dao.delete(entity);
return entity;
}
@Transactional
public Guestbook[] delete(Integer[] ids) {
Guestbook[] beans = new Guestbook[ids.length];
for (int i = 0; i < ids.length; i++) {
beans[i] = delete(ids[i]);
}
return beans;
}
public void preGuestbookTypeDelete(Integer[] ids) {
if (ArrayUtils.isNotEmpty(ids)) {
if (dao.countByTypeId(Arrays.asList(ids)) > 0) {
throw new DeleteException("guestbook.management");
}
}
}
public void preSiteDelete(Integer[] ids) {
if (ArrayUtils.isNotEmpty(ids)) {
if (dao.countBySiteId(Arrays.asList(ids)) > 0) {
throw new DeleteException("guestbook.management");
}
}
}
public void preUserDelete(Integer[] ids) {
if (ArrayUtils.isNotEmpty(ids)) {
if (dao.countByCreatorId(Arrays.asList(ids)) > 0
&& dao.countByReplyerId(Arrays.asList(ids)) > 0) {
throw new DeleteException("guestbook.management");
}
}
}
@Autowired
private SiteService siteService;
@Autowired
private GuestbookTypeService guestbookTypeService;
@Autowired
private UserService userService;
@Autowired
private GuestbookDao dao;
}