/**
* 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;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.jpa.JpaCallback;
import org.springframework.orm.jpa.JpaTemplate;
import com.ewcms.content.document.model.Article;
import com.ewcms.content.resource.model.Resource;
import com.ewcms.publication.task.Taskable;
/**
* 发布服务测试,该测试主要测试集成后发布是否成功和性能。
*
* 该测试涉及到多线程测试,而junit对多线程测试不支持,所以使用了应用程序测试。
*
* @author wangwei
*/
public class PublishIntegratedTest {
private final static Logger logger = LoggerFactory.getLogger(PublishIntegratedTest.class);
private final static ApplicationContext context;
private static String SPACE;
static{
context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
SPACE = "";
for(int i = 0 ; i < 10 ; i ++){
SPACE = SPACE + "----------";
}
}
private JpaTemplate createJpaTemplate() {
EntityManagerFactory entityManagerFactory = (EntityManagerFactory)context.getBean("entityManagerFactory");
return new JpaTemplate(entityManagerFactory);
}
private PublishServiceable getPublishService(){
return (PublishServiceable)context.getBean("publishService");
}
private void updateTemplateSourceStutas(){
JpaTemplate template = createJpaTemplate();
template.execute(new JpaCallback<Object>() {
@Override
public Object doInJpa(EntityManager em) throws PersistenceException {
em.getTransaction().begin();
String hql = "Update TemplateSource o Set o.release= ?1 Where o.release = ?2";
Query query = em.createQuery(hql);
query.setParameter(1, Boolean.FALSE);
query.setParameter(2, Boolean.TRUE);
query.executeUpdate();
em.getTransaction().commit();
return null;
}
});
}
private void updateResourceStutas(){
JpaTemplate template = createJpaTemplate();
template.execute(new JpaCallback<Object>() {
@Override
public Object doInJpa(EntityManager em) throws PersistenceException {
em.getTransaction().begin();
String hql = "Update Resource o Set o.status= ?1 Where o.status = ?2";
Query query = em.createQuery(hql);
query.setParameter(1, Resource.Status.NORMAL);
query.setParameter(2, Resource.Status.RELEASED);
query.executeUpdate();
em.getTransaction().commit();
return null;
}
});
}
private void updateArticleStutas(){
JpaTemplate template = createJpaTemplate();
template.execute(new JpaCallback<Object>() {
@Override
public Object doInJpa(EntityManager em) throws PersistenceException {
em.getTransaction().begin();
String hql = "Update Article o Set o.status=?1 Where o.status = ?2";
Query query = em.createQuery(hql);
query.setParameter(1, Article.Status.PRERELEASE);
query.setParameter(2, Article.Status.RELEASE);
query.executeUpdate();
em.getTransaction().commit();
return null;
}
});
}
private void writerDepender(FileWriter writer,Taskable task,int level)throws IOException{
String space = SPACE.substring(0,level*2);
int progress = task.getProgress();
if(progress != -1){
String info = String.format("%s%s,完成 %d",space,task.getDescription(),progress);
writer.append(info).append("\n");
writer.flush();
}
List<Taskable> children = task.getDependenceTasks();
level = level + 1;
for(Taskable child : children){
writerDepender(writer,child,level);
}
level=level -1;
}
public void runPublishSite()throws Exception{
// updateTemplateSourceStutas();
// updateResourceStutas();
// updateArticleStutas();
PublishServiceable publishService = getPublishService();
publishService.publishSite(-2, true, "admin");
int seq = 0;
File file = new File("/tmp/progress/");
FileUtils.deleteQuietly(file);
file.mkdir();
while(true){
FileWriter writer = new FileWriter("/tmp/progress/"+String.valueOf(seq)+".txt");
List<Taskable> tasks = publishService.getSitePublishTasks(-2);
if(tasks.isEmpty()){
publishService.closeSitePublish(-2);
}
for(Taskable task : tasks){
writerDepender(writer,task,0);
}
writer.flush();
writer.close();
seq++;
Thread.sleep(1000*60);
}
}
public static void main(String[] args){
try{
PublishIntegratedTest test = new PublishIntegratedTest();
test.runPublishSite();
}catch(Exception e){
logger.error(e.getMessage());
}
}
@Test
public void testPublish(){
logger.info("测试程序使用了多线程,请使用main运行方式。");
}
}