package com.jspxcms.core.service.impl; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import org.apache.commons.lang3.ArrayUtils; 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.Comment; 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.repository.CommentDao; import com.jspxcms.core.service.CommentService; import com.jspxcms.core.service.SiteService; import com.jspxcms.core.service.UserService; import com.jspxcms.core.support.Commentable; /** * CommentServiceImpl * * @author liufang * */ @Service @Transactional(readOnly = true) public class CommentServiceImpl implements CommentService, SiteDeleteListener, UserDeleteListener { public Page<Comment> findAll(Map<String, String[]> params, Pageable pageable) { return dao.findAll(spec(params), pageable); } public RowSide<Comment> findSide(Map<String, String[]> params, Comment bean, Integer position, Sort sort) { if (position == null) { return new RowSide<Comment>(); } Limitable limit = RowSide.limitable(position, sort); List<Comment> list = dao.findAll(spec(params), limit); return RowSide.create(list, bean); } private Specification<Comment> spec(Map<String, String[]> params) { Collection<SearchFilter> filters = SearchFilter.parse(params).values(); Specification<Comment> sp = SearchFilter.spec(filters, Comment.class); return sp; } public List<Comment> findList(String ftype, Integer fid, Integer[] status, Integer[] siteId, Limitable limitable) { return dao.findList(ftype, fid, status, siteId, limitable); } public Page<Comment> findPage(String ftype, Integer fid, Integer[] status, Integer[] siteId, Pageable pageable) { return dao.findPage(ftype, fid, status, siteId, pageable); } public Object getEntity(String entityName, Serializable id) { return dao.getEntity(entityName, id); } public Comment get(Integer id) { return dao.findOne(id); } @Transactional public Comment save(Comment bean, Integer userId, Integer siteId) { Site site = siteService.get(siteId); bean.setSite(site); User user = userService.get(userId); bean.setCreator(user); bean.applyDefaultValue(); bean = dao.save(bean); dao.flushAndRefresh(bean); if (bean.getStatus() == Comment.AUDITED) { Object anchor = bean.getAnchor(); if (anchor instanceof Commentable) { ((Commentable) anchor).addComments(1); } } return bean; } @Transactional public Comment update(Comment bean) { bean.applyDefaultValue(); bean = dao.save(bean); return bean; } @Transactional public Comment delete(Integer id) { Comment entity = dao.findOne(id); dao.delete(entity); return entity; } @Transactional public Comment[] delete(Integer[] ids) { Comment[] beans = new Comment[ids.length]; for (int i = 0; i < ids.length; i++) { beans[i] = delete(ids[i]); } return beans; } @Transactional public Comment[] audit(Integer[] ids) { Comment[] beans = new Comment[ids.length]; Comment bean; for (int i = 0; i < ids.length; i++) { bean = get(ids[i]); beans[i] = bean; if (bean.getStatus() == Comment.SAVED) { bean.setStatus(Comment.AUDITED); Object anchor = bean.getAnchor(); if (anchor instanceof Commentable) { ((Commentable) anchor).addComments(1); } } } return beans; } @Transactional public Comment[] unaudit(Integer[] ids) { Comment[] beans = new Comment[ids.length]; Comment bean; for (int i = 0; i < ids.length; i++) { bean = get(ids[i]); beans[i] = get(ids[i]); if (bean.getStatus() == Comment.AUDITED) { bean.setStatus(Comment.SAVED); Object anchor = bean.getAnchor(); if (anchor instanceof Commentable) { ((Commentable) anchor).addComments(-1); } } } return beans; } public void preSiteDelete(Integer[] ids) { if (ArrayUtils.isEmpty(ids)) { return; } dao.deleteBySiteId(Arrays.asList(ids)); } public void preUserDelete(Integer[] ids) { if (ArrayUtils.isEmpty(ids)) { return; } dao.deleteByCreatorId(Arrays.asList(ids)); dao.deleteByAuditorId(Arrays.asList(ids)); } private UserService userService; private SiteService siteService; @Autowired public void setUserService(UserService userService) { this.userService = userService; } @Autowired public void setSiteService(SiteService siteService) { this.siteService = siteService; } private CommentDao dao; @Autowired public void setDao(CommentDao dao) { this.dao = dao; } }