/*
* 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.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.comparators.ReverseComparator;
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.beanutils.BeanUtils;
import com.github.rapid.common.util.page.Page;
import com.fpcms.common.util.Constants;
import com.fpcms.common.util.HttpStatusCheckUtil;
import com.fpcms.common.util.IpUtil;
import com.fpcms.common.util.KeywordUtil;
import com.fpcms.common.util.MapUtil;
import com.fpcms.common.util.SearchEngineUtil;
import com.fpcms.dao.CmsSiteDao;
import com.fpcms.model.CmsSite;
import com.fpcms.model.CmsSitePropertyEnum;
import com.fpcms.query.CmsSiteQuery;
import com.fpcms.service.CmsChannelService;
import com.fpcms.service.CmsPropertyService;
import com.fpcms.service.CmsSiteService;
/**
* [CmsSite] 的业务操作实现类
*
* @author badqiu email:badqiu(a)gmail.com
* @version 1.0
* @since 1.0
*/
@Service("cmsSiteService")
public class CmsSiteServiceImpl implements CmsSiteService {
protected static final Logger log = LoggerFactory.getLogger(CmsSiteServiceImpl.class);
//
// 请删除无用的方法,代码生成器只是为你生成一个架子
//
private CmsSiteDao cmsSiteDao;
private CmsPropertyService cmsPropertyService;
private CmsChannelService cmsChannelService;
/**增加setXXXX()方法,spring就可以通过autowire自动设置对象属性,请注意大小写*/
public void setCmsSiteDao(CmsSiteDao dao) {
this.cmsSiteDao = dao;
}
public void setCmsPropertyService(CmsPropertyService cmsPropertyService) {
this.cmsPropertyService = cmsPropertyService;
}
public void setCmsChannelService(CmsChannelService cmsChannelService) {
this.cmsChannelService = cmsChannelService;
}
/**
* 创建CmsSite
**/
public CmsSite create(CmsSite cmsSite) {
Assert.notNull(cmsSite,"'cmsSite' must be not null");
initDefaultValuesForCreate(cmsSite);
new CmsSiteChecker().checkCreateCmsSite(cmsSite);
cmsSiteDao.insert(cmsSite);
cmsChannelService.createDefaultChannelsIfRequired(cmsSite.getSiteDomain());
return cmsSite;
}
/**
* 更新CmsSite
**/
public CmsSite update(CmsSite cmsSite) {
Assert.notNull(cmsSite,"'cmsSite' must be not null");
new CmsSiteChecker().checkUpdateCmsSite(cmsSite);
cmsSiteDao.update(cmsSite);
return cmsSite;
}
/**
* 删除CmsSite
**/
public void removeById(String siteDomain) {
cmsSiteDao.deleteById(siteDomain);
}
/**
* 根据ID得到CmsSite
**/
public CmsSite getById(String siteDomain) {
return cmsSiteDao.getById(siteDomain);
}
/**
* 分页查询: CmsSite
**/
@Transactional(readOnly=true)
public Page<CmsSite> findPage(CmsSiteQuery query) {
Assert.notNull(query,"'query' must be not null");
return cmsSiteDao.findPage(query);
}
/**
* 为创建时初始化相关默认值
**/
public void initDefaultValuesForCreate(CmsSite cmsSite) {
}
/**
* CmsSite的属性检查类,根据自己需要编写自定义检查
**/
public class CmsSiteChecker {
/**可以在此检查只有更新才需要的特殊检查 */
public void checkUpdateCmsSite(CmsSite cmsSite) {
checkCmsSite(cmsSite);
}
/**可以在此检查只有创建才需要的特殊检查 */
public void checkCreateCmsSite(CmsSite cmsSite) {
checkCmsSite(cmsSite);
}
/** 检查到有错误请直接抛异常,不要使用 return errorCode的方式 */
public void checkCmsSite(CmsSite cmsSite) {
// Bean Validator检查,属性检查失败将抛异常
validateWithException(cmsSite);
//复杂的属性的检查一般需要分开写几个方法,如 checkProperty1(v),checkProperty2(v)
}
}
@Override
public Map<String,String> getSiteProperties(String site) {
CmsSite cmsSite = getById(site);
if(site == null) {
throw new RuntimeException("not found CmsSite by site:"+site);
}
Map<String,String> localhostProps = cmsPropertyService.findByGroup(Constants.PROPERTY_DEFAULT_GROUP);
Map<String,String> siteProps = cmsPropertyService.findByGroup(site);
Map<String,String> cmsSiteMap = BeanUtils.describe(cmsSite);
Map<String,String> result = new HashMap<String,String>();
result.putAll(cmsSiteMap);
MapUtil.mergeWithDefaultMap(result,siteProps);
MapUtil.mergeWithDefaultMap(result,localhostProps);
return result;
}
@Override
public List<CmsSite> findAll() {
return cmsSiteDao.findAll();
}
@Override
public List<CmsSite> initAllSiteDefaultChannels() {
List<CmsSite> list = new ArrayList<CmsSite>();
for(CmsSite site : cmsSiteDao.findAll()) {
if(cmsChannelService.createDefaultChannelsIfRequired(site.getSiteDomain())) {
list.add(site);
}
}
return list;
}
@Override
public void updateHttpStatus(){
List<CmsSite> list = findAll();
Collections.sort(list,new ReverseComparator(new BeanComparator("recordBaidu")));
for(CmsSite site : list) {
try {
String status = HttpStatusCheckUtil.getHttpStatus(site.getSiteDomain());
site.setHttpStatus(status);
site.setIp(IpUtil.getIp(site.getSiteDomain()));
update(site);
}catch(Exception e) {
log.error("error on update CmsSite httpStatus:"+site.getSiteDomain(),e);
}
}
}
public List<CmsSite> updateSearchEngineRecord() {
log.info("START updateSearchEngineRecord");
List<CmsSite> updatedSiteList = new ArrayList<CmsSite>();
List<CmsSite> list = findAll();
Collections.sort(list,new ReverseComparator(new BeanComparator("recordBaidu")));
for(CmsSite site : list) {
try {
int recordBaidu = SearchEngineUtil.baiduSiteCount(site.getSiteDomain());
if(recordBaidu != site.getRecordBaidu()) {
updatedSiteList.add(site);
site.setRecordBaidu(recordBaidu);
update(site);
}
}catch(Exception e) {
log.error("error updateSearchEngineRecord on :"+site.getSiteDomain(),e);
}
}
return updatedSiteList;
}
public synchronized List<CmsSite> updateSearchEngineKeywordMaxRank() {
return new UpdateSearchEngineKeywordMaxRank().updateSearchEngineKeywordMaxRank();
}
public class UpdateSearchEngineKeywordMaxRank {
public synchronized List<CmsSite> updateSearchEngineKeywordMaxRank() {
log.info("START updateSearchEngineKeywordMaxRank");
List<CmsSite> updatedSiteList = new ArrayList<CmsSite>();
List<CmsSite> list = findAll();
Collections.sort(list,new ReverseComparator(new BeanComparator("rankBaidu")));
for(CmsSite site :list) {
try{
Map<String,Integer> rankMap = SearchEngineUtil.baiduKeywordsRank(site.getKeyword(), site.getSiteDomain());
int max = KeywordUtil.getMaxRank(site.getKeyword(),site.getSiteDomain());
if(max != site.getRankBaidu()) {
updatedSiteList.add(site);
site.setRankBaidu(max);
}
site.setProperty(CmsSitePropertyEnum.PROP_KEYWORDS_RANK_BAIDU.getCode(), rankMap.toString());
update(site);
}catch(Exception e) {
log.error("error updateSearchEngineKeywordMaxRank on :"+site.getSiteDomain(),e);
}
}
return updatedSiteList;
}
}
@Override
public List<CmsSite> findSubSites(String domain) {
return cmsSiteDao.findSubSites(domain);
}
@Override
public void batchUpdateProperty(String[] sites, String key, String value) {
for(String site : sites) {
CmsSite cmsSite = getById(site);
cmsSite.setProperty(key, value);
update(cmsSite);
}
}
}