/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.portal.action;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.Element;
import com.jinhe.tss.component.param.extend.ParamConfig;
import com.jinhe.tss.component.support.web.webwork.ProgressActionSupport;
import com.jinhe.tss.core.common.progress.FeedbackProgressable;
import com.jinhe.tss.core.common.progress.Progress;
import com.jinhe.tss.core.common.progress.ProgressManager;
import com.jinhe.tss.core.common.progress.ProgressPool;
import com.jinhe.tss.core.common.progress.Progressable;
import com.jinhe.tss.core.exception.BusinessException;
import com.jinhe.tss.core.util.XMLDocUtil;
import com.jinhe.tss.portal.PortalConstants;
import com.jinhe.tss.portal.engine.releasehtml.MagicRobot;
import com.jinhe.tss.portal.engine.releasehtml._FtpClient;
/**
* 门户静态发布
*/
public class PublishAction extends ProgressActionSupport {
private static final long serialVersionUID = 3993904803884580648L;
private Long id; // 需要发布的门户portalId
private Integer override; // 是否覆盖
private String pageUrl; // 需要单个发布的页面地址
/**
* 静态发布匿名访问的门户
* @return
*/
public String staticIssuePortal(){
//发布整个站点
MagicRobot robot = new MagicRobot(id);
// 此处总数是个估算值,如果是第一次发布,按5000计
// 以后则按上次发布个数 + 100来计(即假设每次发布新增页面不超过100个)。
int total = robot.getExsitFilesNum() <= 30 ? 5000 : robot.getExsitFilesNum() + 100;
ProgressManager manager = new ProgressManager((Progressable) robot, total, null);
String code = manager.execute();
ProgressPool.putFPObject(code, robot);
return printScheduleMessage(code);
}
/**
* 静态发布匿名访问的门户的某个页面以及该页面上的链接
* @return
*/
public String staticIssuePortalPage(){
//发布整个站点
MagicRobot robot = new MagicRobot(pageUrl);
// 此处总数是个估算值,按100计
ProgressManager manager = new ProgressManager((Progressable) robot, 100, null);
String code = manager.execute();
ProgressPool.putFPObject(code, robot);
return printScheduleMessage(code);
}
protected String printScheduleMessage(String code){
Progress progress = (Progress)ProgressPool.getSchedule(code);
if(!progress.isNormal()){
ProgressPool.removeSchedule(code);
Throwable t = progress.getException();
String errorMsg = "cause:" + t.getCause()+ t.getMessage() + ".\n位置:" + t.getLocalizedMessage();
throw new BusinessException(errorMsg);
}
if(progress.isConceal()) {
throw new BusinessException("取消进度成功");
}
Object[] info = progress.getProgressInfo();
StringBuffer progressInfo = new StringBuffer("<actionSet>");
progressInfo.append("<percent>"+ info[0] + "</percent>");
progressInfo.append("<delay>" + info[1] + "</delay>");
progressInfo.append("<estimateTime>" + info[2] + "</estimateTime>");
if(progress.isCompleted()){
FeedbackProgressable fpa = (FeedbackProgressable)ProgressPool.getFPObject(code);
String feedback = fpa.getFeedback();
// 以是否产生了反馈信息为进度结束标志,这点比较特殊,因为total个数是估算的,有可能小于实际数量
if(feedback != null){
ProgressPool.removeSchedule(code); //执行结束则将将进度对象从池中移除
ProgressPool.removeFPObject(code);
// 结束进度条 并且 返回发布反馈信息
progressInfo.append("<feedback><![CDATA[" + feedback + "]]></feedback>");
} else {
progressInfo = new StringBuffer("<actionSet>");
progressInfo.append("<percent>99</percent>");
progressInfo.append("<delay>2</delay>");
progressInfo.append("<estimateTime>10</estimateTime>");
}
}
progressInfo.append("<code>" + code + "</code>");
return print("ProgressInfo", progressInfo.append("</actionSet>"));
}
/**
* 将发布出来站点页面拷贝到远程机器上
* @return
*/
public String ftpUpload2RemoteServer(){
final boolean overrideTag = PortalConstants.TRUE.equals(override);
/*
* FTP服务器配置相关:
* 1、首先从系统参数模块读取配置信息,code:ftpConfig,参数化类型为普通参数,解析之;
* 2、如果系统参数中没有配置,则读取配置文件,路径为:WEB-INF/classes/META-INF/ftpConfig.xml
*/
Document doc;
String ftpConfigParam = ParamConfig.getAttribute("ftpConfig");
if(ftpConfigParam != null){
doc = XMLDocUtil.dataXml2Doc(ftpConfigParam);
} else {
doc = XMLDocUtil.createDoc("META-INF/ftpConfig.xml");
}
for (Iterator<?> it = doc.selectNodes("//ftpServer").iterator(); it.hasNext();) {
final Element element = (Element) it.next();
// 不使用多线程,暂时不带进度
_FtpClient _ftp = new _FtpClient(overrideTag);
_ftp.ftpUpload(element);
}
return printSuccessMessage("远程发布成功");
}
public void setId(Long id) {
this.id = id;
}
public void setOverride(Integer override) {
this.override = override;
}
public void setPageUrl(String pageUrl) {
this.pageUrl = pageUrl;
}
}