/** * Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved. * EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * http://www.ewcms.com */ package com.ewcms.publication.task.impl; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.ewcms.content.document.model.Article; import com.ewcms.content.document.model.Article.Status; import com.ewcms.core.site.model.Channel; import com.ewcms.core.site.model.Site; import com.ewcms.core.site.model.Template; import com.ewcms.publication.freemarker.generator.DetailGenerator; import com.ewcms.publication.generator.Generatorable; import com.ewcms.publication.service.ArticlePublishServiceable; import com.ewcms.publication.service.ResourcePublishServiceable; import com.ewcms.publication.service.TemplateSourcePublishServiceable; import com.ewcms.publication.task.Taskable; import com.ewcms.publication.task.impl.event.DetailEvent; import com.ewcms.publication.task.impl.process.GeneratorProcess; import com.ewcms.publication.task.impl.process.TaskProcessable; import com.ewcms.publication.uri.UriRuleable; import com.ewcms.publication.uri.UriRules; import freemarker.template.Configuration; /** * 发布Detail(文章)页面任务 * * @author wangwei */ public class DetailTask extends TaskBase{ private final static Logger logger = LoggerFactory.getLogger(DetailTask.class); private final static int MAX_PUBLISH_SIZE = 50000; public static class Builder extends BaseBuilder<Builder>{ private final Configuration cfg; private final TemplateSourcePublishServiceable templateSourceService; private final ResourcePublishServiceable resourceService; private final ArticlePublishServiceable articleService; private final Channel channel; private final Template template; private long[] publishIds; private UriRuleable uriRule= UriRules.newDetail() ; public Builder(Configuration cfg, TemplateSourcePublishServiceable templateSourceService, ResourcePublishServiceable resourceService, ArticlePublishServiceable articleService, Site site,Channel channel,Template template){ super(site); this.cfg = cfg; this.templateSourceService = templateSourceService; this.resourceService = resourceService; this.articleService = articleService; this.channel = channel; this.template = template; if(StringUtils.isNotBlank(template.getUriPattern())){ uriRule = UriRules.newUriRuleBy(template.getUriPattern()); } } public Builder setPublishIds(long[] ids){ this.publishIds = ids; return this; } @Override protected String getDescription() { return String.format("%s文章发布", template.getName()) ; } private void dependenceResourceAndTemplateSource(List<Taskable> dependences){ dependences.add( new TemplateSourceTask .Builder(templateSourceService,site) .setUsername(username) .build()); dependences.add( new ResourceTask .Builder(resourceService,site) .setUsername(username) .build()); } protected List<Taskable> getDependenceTasks(){ List<Taskable> dependences = new ArrayList<Taskable>(); if(!dependence){ dependenceResourceAndTemplateSource(dependences); } return dependences; } /** * 判断是否有指定的文章 * * @return */ private boolean hasPublishIds(){ return publishIds != null && publishIds.length > 0; } /** * 得到频道发布文章 * * @return 文章列表 */ private List<Article> getArticleOfChannel(){ return articleService.findPublishArticles(channel.getId(), again, MAX_PUBLISH_SIZE); } /** * 是否需要发布 * * @param status 文章状态 * @return true 需要发布 */ private boolean isPublish(Status status){ return (status == Status.PRERELEASE) || (status==Status.RELEASE ); } /** * 得到指定编号的文章列表 * * @return */ private List<Article> getArticleOfPublishIds(){ List<Article> articles = new ArrayList<Article>(); for(Long id : publishIds){ Article article = articleService.getArticle(id); if(article != null){ if(isPublish(article.getStatus())){ articles.add(article); } }else{ logger.warn("Article get by {} is null", id); } } return articles; } @Override protected List<TaskProcessable> getTaskProcesses() { List<TaskProcessable> processes = new ArrayList<TaskProcessable>(); List<Article> articles = (hasPublishIds() ? getArticleOfPublishIds() : getArticleOfChannel()); for(Article article : articles){ Integer total = article.getContentTotal(); if(total == null || total.intValue() == 0){ continue; } Generatorable[] generators = new Generatorable[total]; for(int page = 0 ; page < total ; page++ ){ generators[page] = new DetailGenerator(cfg,site,channel,uriRule,article,page); } TaskProcessable process = new GeneratorProcess(generators,template.getUniquePath()); process.registerEvent(new DetailEvent(complete,articleService,article)); processes.add(process); } return processes; } } public DetailTask(String id,Builder builder){ super(id,builder); } }