package com.jspxcms.ext.service.impl;
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.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.listener.SiteDeleteListener;
import com.jspxcms.core.service.SiteService;
import com.jspxcms.core.support.DeleteException;
import com.jspxcms.ext.domain.Friendlink;
import com.jspxcms.ext.domain.FriendlinkType;
import com.jspxcms.ext.listener.FriendlinkTypeDeleteListener;
import com.jspxcms.ext.repository.FriendlinkDao;
import com.jspxcms.ext.service.FriendlinkService;
import com.jspxcms.ext.service.FriendlinkTypeService;
/**
* FriendlinkServiceImpl
*
* @author yangxing
*
*/
@Service
@Transactional(readOnly = true)
public class FriendlinkServiceImpl implements FriendlinkService,
FriendlinkTypeDeleteListener, SiteDeleteListener {
public List<Friendlink> findList(Integer siteId,
Map<String, String[]> params) {
return dao.findAll(spec(siteId, params), new Sort("seq", "id"));
}
public RowSide<Friendlink> findSide(Integer siteId,
Map<String, String[]> params, Friendlink bean, Integer position,
Sort sort) {
if (position == null) {
return new RowSide<Friendlink>();
}
Limitable limit = RowSide.limitable(position, sort);
List<Friendlink> list = dao.findAll(spec(siteId, params), limit);
return RowSide.create(list, bean);
}
private Specification<Friendlink> spec(final Integer siteId,
Map<String, String[]> params) {
Collection<SearchFilter> filters = SearchFilter.parse(params).values();
final Specification<Friendlink> fs = SearchFilter.spec(filters,
Friendlink.class);
Specification<Friendlink> sp = new Specification<Friendlink>() {
public Predicate toPredicate(Root<Friendlink> 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 List<Friendlink> findList(Integer[] siteId, String[] type,
Integer[] typeId, Boolean isWithLogo, Boolean isRecommend,
Integer[] status, Limitable limitable) {
return dao.findList(siteId, type, typeId, isWithLogo, isRecommend,
status, limitable);
}
public Friendlink get(Integer id) {
return dao.findOne(id);
}
@Transactional
public Friendlink save(Friendlink bean, Integer typeId, Integer siteId) {
FriendlinkType type = friendlinkTypeService.get(typeId);
bean.setType(type);
Site site = siteService.get(siteId);
bean.setSite(site);
if (StringUtils.isNotBlank(bean.getLogo())) {
bean.setWithLogo(true);
} else {
bean.setWithLogo(false);
}
bean.applyDefaultValue();
bean = dao.save(bean);
return bean;
}
@Transactional
public Friendlink update(Friendlink bean, Integer typeId) {
if (typeId != null) {
FriendlinkType type = friendlinkTypeService.get(typeId);
bean.setType(type);
}
if (StringUtils.isNotBlank(bean.getLogo())) {
bean.setWithLogo(true);
} else {
bean.setWithLogo(false);
}
bean.applyDefaultValue();
bean = dao.save(bean);
return bean;
}
@Transactional
public Friendlink[] batchUpdate(Integer[] id) {
Friendlink[] beans = new Friendlink[id.length];
for (int i = 0, len = id.length; i < len; i++) {
beans[i] = get(id[i]);
beans[i].setSeq(i);
beans[i] = dao.save(beans[i]);
}
return beans;
}
@Transactional
public Friendlink delete(Integer id) {
Friendlink entity = dao.findOne(id);
dao.delete(entity);
return entity;
}
@Transactional
public Friendlink[] delete(Integer[] ids) {
Friendlink[] beans = new Friendlink[ids.length];
for (int i = 0; i < ids.length; i++) {
beans[i] = delete(ids[i]);
}
return beans;
}
public void preSiteDelete(Integer[] ids) {
if (ArrayUtils.isNotEmpty(ids)) {
if (dao.countBySiteId(Arrays.asList(ids)) > 0) {
throw new DeleteException("friendlink.management");
}
}
}
public void preFriendlinkTypeDelete(Integer[] ids) {
if (ArrayUtils.isNotEmpty(ids)) {
if (dao.countByTypeId(Arrays.asList(ids)) > 0) {
throw new DeleteException("friendlink.management");
}
}
}
private SiteService siteService;
private FriendlinkTypeService friendlinkTypeService;
@Autowired
public void setSiteService(SiteService siteService) {
this.siteService = siteService;
}
@Autowired
public void setFriendlinkTypeService(
FriendlinkTypeService friendlinkTypeService) {
this.friendlinkTypeService = friendlinkTypeService;
}
private FriendlinkDao dao;
@Autowired
public void setDao(FriendlinkDao dao) {
this.dao = dao;
}
}