package com.jspxcms.core.service.impl; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; 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.apache.shiro.util.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; 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.Model; import com.jspxcms.core.domain.Site; import com.jspxcms.core.listener.ModelDeleteListener; import com.jspxcms.core.listener.SiteDeleteListener; import com.jspxcms.core.repository.ModelDao; import com.jspxcms.core.service.ModelService; import com.jspxcms.core.service.SiteService; import com.jspxcms.core.support.DeleteException; /** * ModelServiceImpl * * @author liufang * */ @Service @Transactional(readOnly = true) public class ModelServiceImpl implements ModelService, SiteDeleteListener { public List<Model> findList(String type, Map<String, String[]> params, Sort sort) { return dao.findAll(spec(type, params), sort); } public RowSide<Model> findSide(String type, Map<String, String[]> params, Model bean, Integer position, Sort sort) { if (position == null) { return new RowSide<Model>(); } Limitable limit = RowSide.limitable(position, sort); List<Model> list = dao.findAll(spec(type, params), limit); return RowSide.create(list, bean); } private Specification<Model> spec(final String type, Map<String, String[]> params) { Collection<SearchFilter> filters = SearchFilter.parse(params).values(); final Specification<Model> fs = SearchFilter.spec(filters, Model.class); Specification<Model> sp = new Specification<Model>() { public Predicate toPredicate(Root<Model> root, CriteriaQuery<?> query, CriteriaBuilder cb) { Predicate pred = fs.toPredicate(root, query, cb); if (StringUtils.isNotBlank(type)) { pred = cb.and(pred, cb.equal(root.get("type"), type)); } return pred; } }; return sp; } public List<Model> findList(Integer siteId, String type) { return dao.findList(siteId, type); } public Model findDefault(Integer siteId, String type) { return dao.findDefault(siteId, type); } public Model get(Integer id) { return dao.findOne(id); } @Transactional public Model save(Model bean, Integer siteId, Map<String, String> customs) { Site site = siteService.get(siteId); bean.setSite(site); bean.setCustoms(customs); bean.applyDefaultValue(); bean = dao.save(bean); return bean; } @Transactional public Model[] batchUpdate(Integer[] id, String[] name) { Map<String, Integer> seqMap = new HashMap<String, Integer>(); Model[] beans = new Model[id.length]; for (int i = 0, len = id.length; i < len; i++) { beans[i] = get(id[i]); String type = beans[i].getType(); Integer seq = seqMap.get(type); if (seq == null) { seq = 0; seqMap.put(type, seq); } else { seq++; seqMap.put(type, seq); } beans[i].setSeq(seq); beans[i].setName(name[i]); update(beans[i], null); } return beans; } @Transactional public Model update(Model bean, Map<String, String> customs) { if (customs != null) { bean.getCustoms().clear(); bean.getCustoms().putAll(customs); } bean.applyDefaultValue(); bean = dao.save(bean); return bean; } private Model doDelete(Integer id) { Model entity = dao.findOne(id); if (entity != null) { dao.delete(entity); } return entity; } @Transactional public Model delete(Integer id) { firePreDelete(new Integer[] { id }); return doDelete(id); } @Transactional public Model[] delete(Integer[] ids) { firePreDelete(ids); Model[] beans = new Model[ids.length]; for (int i = 0; i < ids.length; i++) { beans[i] = doDelete(ids[i]); } return beans; } public void preSiteDelete(Integer[] ids) { if (ArrayUtils.isNotEmpty(ids)) { if (dao.countBySiteId(Arrays.asList(ids)) > 0) { throw new DeleteException("model.management"); } } } private void firePreDelete(Integer[] ids) { if (!CollectionUtils.isEmpty(deleteListeners)) { for (ModelDeleteListener listener : deleteListeners) { listener.preModelDelete(ids); } } } private List<ModelDeleteListener> deleteListeners; @Autowired(required = false) public void setDeleteListeners(List<ModelDeleteListener> deleteListeners) { this.deleteListeners = deleteListeners; } private SiteService siteService; @Autowired public void setSiteService(SiteService siteService) { this.siteService = siteService; } private ModelDao dao; @Autowired public void setDao(ModelDao dao) { this.dao = dao; } }