package com.jspxcms.core.service.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; 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.Site; import com.jspxcms.core.domain.Special; import com.jspxcms.core.domain.SpecialCategory; import com.jspxcms.core.domain.User; import com.jspxcms.core.listener.SiteDeleteListener; import com.jspxcms.core.listener.SpecialCategoryDeleteListener; import com.jspxcms.core.listener.UserDeleteListener; import com.jspxcms.core.repository.SpecialDao; import com.jspxcms.core.service.InfoSpecialService; import com.jspxcms.core.service.SiteService; import com.jspxcms.core.service.SpecialCategoryService; import com.jspxcms.core.service.SpecialService; import com.jspxcms.core.service.UserService; import com.jspxcms.core.support.DeleteException; /** * SpecialServiceImpl * * @author liufang * */ @Service @Transactional(readOnly = true) public class SpecialServiceImpl implements SpecialService, UserDeleteListener, SiteDeleteListener, SpecialCategoryDeleteListener { public Page<Special> findAll(Map<String, String[]> params, Pageable pageable) { return dao.findAll(spec(params), pageable); } public RowSide<Special> findSide(Map<String, String[]> params, Special bean, Integer position, Sort sort) { if (position == null) { return new RowSide<Special>(); } Limitable limit = RowSide.limitable(position, sort); List<Special> list = dao.findAll(spec(params), limit); return RowSide.create(list, bean); } private Specification<Special> spec(Map<String, String[]> params) { Collection<SearchFilter> filters = SearchFilter.parse(params).values(); Specification<Special> sp = SearchFilter.spec(filters, Special.class); return sp; } public List<Special> findList(Integer[] siteId, Integer[] categoryId, Date startDate, Date endDate, Boolean isWithImage, Boolean isRecommend, Limitable limitable) { return dao.findList(siteId, categoryId, startDate, endDate, isWithImage, isRecommend, limitable); } public Page<Special> findPage(Integer[] siteId, Integer[] categoryId, Date startDate, Date endDate, Boolean isWithImage, Boolean isRecommend, Pageable pageable) { return dao.findPage(siteId, categoryId, startDate, endDate, isWithImage, isRecommend, pageable); } public Special get(Integer id) { return dao.findOne(id); } @Transactional public Special save(Special bean, Integer categoryId, Integer creatorId, Integer siteId) { SpecialCategory category = specialCategoryService.get(categoryId); bean.setCategory(category); User creator = userService.get(creatorId); bean.setCreator(creator); Site site = siteService.get(siteId); bean.setSite(site); bean.applyDefaultValue(); bean = dao.save(bean); return bean; } @Transactional public Special update(Special bean, Integer categoryId) { if (categoryId != null) { SpecialCategory category = specialCategoryService.get(categoryId); bean.setCategory(category); } bean.applyDefaultValue(); bean = dao.save(bean); return bean; } @Transactional public Special delete(Integer id) { Special entity = dao.findOne(id); infoSpecialService.deleteBySpecialId(id); dao.delete(entity); return entity; } @Transactional public Special[] delete(Integer[] ids) { Special[] beans = new Special[ids.length]; for (int i = 0; i < ids.length; i++) { beans[i] = delete(ids[i]); } return beans; } @Transactional public Special refer(Integer beanId) { Special bean = get(beanId); bean.setRefers(bean.getRefers() + 1); return bean; } @Transactional public List<Special> refer(Integer[] beanIds) { if (ArrayUtils.isEmpty(beanIds)) { return Collections.emptyList(); } Set<Integer> beanIdSet = new HashSet<Integer>(); List<Special> beans = new ArrayList<Special>(beanIds.length); for (Integer beanId : beanIds) { if (!beanIdSet.contains(beanId)) { beans.add(refer(beanId)); beanIdSet.add(beanId); } } return beans; } @Transactional public void derefer(Special bean) { bean.setRefers(bean.getRefers() - 1); } @Transactional public void derefer(Collection<Special> beans) { for (Special bean : beans) { derefer(bean); } } public void preSiteDelete(Integer[] ids) { if (ArrayUtils.isNotEmpty(ids)) { if (dao.countBySiteId(Arrays.asList(ids)) > 0) { throw new DeleteException("special.management"); } } } public void preSpecialCategoryDelete(Integer[] ids) { if (ArrayUtils.isNotEmpty(ids)) { if (dao.countByCategoryId(Arrays.asList(ids)) > 0) { throw new DeleteException("special.management"); } } } public void preUserDelete(Integer[] ids) { if (ArrayUtils.isNotEmpty(ids)) { if (dao.countByCreatorId(Arrays.asList(ids)) > 0) { throw new DeleteException("special.management"); } } } private SiteService siteService; private UserService userService; private SpecialCategoryService specialCategoryService; private InfoSpecialService infoSpecialService; @Autowired public void setSiteService(SiteService siteService) { this.siteService = siteService; } @Autowired public void setUserService(UserService userService) { this.userService = userService; } @Autowired public void setSpecialCategoryService( SpecialCategoryService specialCategoryService) { this.specialCategoryService = specialCategoryService; } @Autowired public void setInfoSpecialService(InfoSpecialService infoSpecialService) { this.infoSpecialService = infoSpecialService; } private SpecialDao dao; @Autowired public void setDao(SpecialDao dao) { this.dao = dao; } }