/*
* Copyright [duowan.com]
* Web Site: http://www.duowan.com
* Since 2005 - 2012
*/
package com.fpcms.service.impl;
import static com.github.rapid.common.util.holder.BeanValidatorHolder.validateWithException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import com.github.rapid.common.util.page.Page;
import com.github.rapid.common.util.tree.NodeWrapper;
import com.fpcms.common.util.Constants;
import com.fpcms.dao.CmsChannelDao;
import com.fpcms.model.CmsChannel;
import com.fpcms.query.CmsChannelQuery;
import com.fpcms.service.CmsChannelService;
import com.fpcms.service.CmsSiteService;
/**
* [CmsChannel] 的业务操作实现类
*
* @author badqiu email:badqiu(a)gmail.com
* @version 1.0
* @since 1.0
*/
@Service("cmsChannelService")
public class CmsChannelServiceImpl implements CmsChannelService {
protected static final Logger log = LoggerFactory.getLogger(CmsChannelServiceImpl.class);
//
// 请删除无用的方法,代码生成器只是为你生成一个架子
//
private CmsSiteService cmsSiteService;
private CmsChannelDao cmsChannelDao;
/**增加setXXXX()方法,spring就可以通过autowire自动设置对象属性,请注意大小写*/
public void setCmsChannelDao(CmsChannelDao dao) {
this.cmsChannelDao = dao;
}
/**
* 创建CmsChannel
**/
public CmsChannel create(CmsChannel cmsChannel) {
Assert.notNull(cmsChannel,"'cmsChannel' must be not null");
initDefaultValuesForCreate(cmsChannel);
new CmsChannelChecker().checkCreateCmsChannel(cmsChannel);
cmsChannel.setId(System.currentTimeMillis());
cmsChannelDao.insert(cmsChannel);
return cmsChannel;
}
/**
* 更新CmsChannel
**/
public CmsChannel update(CmsChannel cmsChannel) {
Assert.notNull(cmsChannel,"'cmsChannel' must be not null");
new CmsChannelChecker().checkUpdateCmsChannel(cmsChannel);
cmsChannelDao.update(cmsChannel);
return cmsChannel;
}
/**
* 删除CmsChannel
**/
public void removeById(String site,long id) {
cmsChannelDao.deleteById(site,id);
}
/**
* 根据ID得到CmsChannel
**/
public CmsChannel getById(String site,long id) {
return cmsChannelDao.getById(site,id);
}
/**
* 分页查询: CmsChannel
**/
@Transactional(readOnly=true)
public Page<CmsChannel> findPage(CmsChannelQuery query) {
Assert.notNull(query,"'query' must be not null");
return cmsChannelDao.findPage(query);
}
/**
* 为创建时初始化相关默认值
**/
public void initDefaultValuesForCreate(CmsChannel cmsChannel) {
}
/**
* CmsChannel的属性检查类,根据自己需要编写自定义检查
**/
public class CmsChannelChecker {
/**可以在此检查只有更新才需要的特殊检查 */
public void checkUpdateCmsChannel(CmsChannel cmsChannel) {
checkCmsChannel(cmsChannel);
}
/**可以在此检查只有创建才需要的特殊检查 */
public void checkCreateCmsChannel(CmsChannel cmsChannel) {
checkCmsChannel(cmsChannel);
}
/** 检查到有错误请直接抛异常,不要使用 return errorCode的方式 */
public void checkCmsChannel(CmsChannel cmsChannel) {
// Bean Validator检查,属性检查失败将抛异常
validateWithException(cmsChannel);
//复杂的属性的检查一般需要分开写几个方法,如 checkProperty1(v),checkProperty2(v)
}
}
public NodeWrapper<CmsChannel> createTree(String site,long rootNodeId) {
List<CmsChannel> list = cmsChannelDao.findBySite(site);
return CmsChannel.createTree(list, rootNodeId);
}
@Override
public String createTreeXmlString(String site) {
createDefaultChannelsIfRequired(site);
try {
NodeWrapper<CmsChannel> root = createTree(site,Constants.TREE_ROOT_ID);
StringBuilder sb = new StringBuilder();
sb.append("<?xml version='1.0' encoding='UTF-8'?>");
sb.append("<tree id='0'>");
appendNodeXml(root, sb);
sb.append("</tree>");
return sb.toString();
}catch(Exception e) {
log.error("createTree error for site:"+site,e);
return "";
}
}
public boolean createDefaultChannelsIfRequired(String site) {
long count = cmsChannelDao.countBySite(site);
if (count <= 0) {
new DefaultChannelCreator(site).createDefaultChannels();
return true;
}
return false;
}
public class DefaultChannelCreator {
private String site;
public DefaultChannelCreator(String site) {
super();
Assert.hasText(site,"site must be not empty");
this.site = site;
}
public void createDefaultChannels() {
newChannel(CmsChannel.ROOT);
newChannel(CmsChannel.HOME);
newChannel(CmsChannel.NEWS);
newChannel(CmsChannel.NAV);
for(CmsChannel item : CmsChannel.NAV_SUB_CHANNELS) {
newChannel(item);
}
}
private CmsChannel newChannel(CmsChannel template) {
CmsChannel target = template.clone(site);
cmsChannelDao.insert(target);
return target;
}
}
private void appendNodeXml(NodeWrapper<CmsChannel> root, StringBuilder sb) {
sb.append(String.format("<item text='%s' id='%s'>",root.getNode().getChannelName(),root.getNode().getId()));
sb.append(String.format("<userdata name='channelCode'>%s</userdata>",root.getNode().getChannelCode()));
sb.append(String.format("<userdata name='site'>%s</userdata>",root.getNode().getSite()));
for(NodeWrapper<CmsChannel> child : root.getChilds()) {
appendNodeXml(child,sb);
}
sb.append("</item>");
}
@Override
public Map<String, Long> getChannelMapping(String site) {
List<CmsChannel> list = cmsChannelDao.findBySite(site);
Map<String,Long> result = new HashMap<String,Long>();
for(CmsChannel item : list) {
result.put(item.getChannelCode(), item.getId());
}
return result;
}
public List<CmsChannel> findChildsByChannelId(String site,long channelId) {
return cmsChannelDao.findChildsByChannelId(site,channelId);
}
public List<CmsChannel> findChildsByChannelCode(String site,String channelCode) {
Long channelId = getChannelId(site,channelCode);
Assert.notNull(channelId,"not found channelId by channelCode:"+channelCode);
return cmsChannelDao.findChildsByChannelId(site,channelId);
}
@Override
public CmsChannel findByChannelCode(String site,String channelCode) {
long channelId = getChannelId(site,channelCode);
return cmsChannelDao.getById(site,channelId);
}
private Long getChannelId(String site,String channelCode) {
Long result = getChannelMapping(site).get(channelCode);
if(result == null) throw new IllegalArgumentException("not found channelId by channelCode:"+channelCode);
return result;
}
}