/**
* 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.web;
import com.ewcms.web.util.JSONUtil;
import com.ewcms.web.util.Struts2Util;
import java.util.ArrayList;
import java.util.List;
/**
* Struts2中典型CRUD Action的抽象基类.
*
* @author wangwei
*/
public abstract class CrudBaseAction<T, PK> extends EwcmsBaseAction {
private static final long serialVersionUID = -7851825457853088626L;
public static final String INDEX = "index";
protected T vo;
protected List<PK> operatorPK = new ArrayList<PK>();
private String addFunction = "parent.queryNews";
private String updFunction = "parent.queryReload";
protected OperatorState operatorState = OperatorState.INIT;
public enum OperatorState {
INIT, ADD, UPDATE;
}
protected void setVo(T vo) {
this.vo = vo;
}
protected T getVo() {
return this.vo;
}
public void setOperatorPK(List<PK> operatorPK) {
this.operatorPK = operatorPK;
}
public List<PK> getOperatorPK() {
return operatorPK;
}
/**
* 设置调用javascript名称
*
* @param addFunction
* 添加执行方法名称
* @param updFunction
* 修改执行方法名称
*/
protected void setJavaScriptFunction(String addFunction, String updFunction) {
this.addFunction = addFunction;
this.updFunction = updFunction;
}
/**
* 生成页面执行JavaScript语句
*
* @return javascript语句
*/
public String getJavaScript() {
if (operatorState == OperatorState.ADD) {
return addJavaScriptFunction();
}
if (operatorState == OperatorState.UPDATE) {
return updateJavaScriptFunction();
}
return "";
}
/**
* 添加javascript语句
*
* @return
*/
protected String addJavaScriptFunction() {
StringBuilder builder = new StringBuilder("");
builder.append(addFunction);
builder.append("(");
builder.append(JSONUtil.toJSON(operatorPK));
builder.append(");");
return builder.toString();
}
/**
* 修改javascript语句
*
* @return
*/
protected String updateJavaScriptFunction() {
if (operatorPK.isEmpty()) {
return updFunction + "(true);";
}
return updFunction + "();";
}
/**
* vo中的pk值
*
* @param vo
* 保持同父类一致
* @return
*/
protected abstract PK getPK(T vo);
/**
* Action函数,显示Index界面.
*
* @return
* @throws Exception
*/
public String index() throws Exception {
return INDEX;
}
/**
* Action函数,显示新增或修改Entity界面.
*
* @return
* @throws Exception
*/
@Override
public String input() throws Exception {
vo = operatorPK.isEmpty() ? constructVo(createEmptyVo())
: constructVo(getOperator(operatorPK.get(0)));
return super.input();
}
/**
* 构造VO显示
*
* @return
*/
protected T constructVo(T vo) {
return vo;
}
/**
* 得到值对象
*
* @param pk
* 键值
* @return
*/
protected abstract T getOperator(PK pk);
/**
* Action函数,删除Entity.
*
* @return
* @throws Exception
*/
public String delete() throws Exception {
for (PK pk : operatorPK) {
deleteOperator(pk);
}
Struts2Util.renderText(SUCCESS);
return NONE;
}
/**
* 删除操作
*
* @param pk
* 键值
*/
protected abstract void deleteOperator(PK pk);
/**
* Action函数,保存新增或修改Entity.
*
* @return
* @throws Exception
*/
public String save() throws Exception {
if (isUpdateOperator()) {
operatorState = OperatorState.UPDATE;
saveOperator(vo, true);
operatorPK.remove(0);
} else {
operatorState = OperatorState.ADD;
PK id = saveOperator(vo, false);
operatorPK.add(id);
}
saveAfter();
return SUCCESS;
}
/**
* 判断是否是添加操作
*
* @return
*/
protected boolean isUpdateOperator(){
return getPK(vo) != null;
}
protected void saveAfter() {
if (operatorState == OperatorState.UPDATE && !operatorPK.isEmpty()) {
vo = constructVo(getOperator(operatorPK.get(0)));
} else {
vo = constructVo(createEmptyVo());
}
}
/**
* 保存操作
*
* @param vo
* 保持同父类一致
* @param isUpdate
* 是否修改操作
* @return
*/
protected abstract PK saveOperator(T vo, boolean isUpdate);
/**
* 创建一个空的vo
*
* @return vo
*/
protected abstract T createEmptyVo();
}