package com.nfwork.dbfound.model.bean;
import java.io.File;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.fileupload.FileItem;
import org.dom4j.Element;
import com.nfwork.dbfound.core.Context;
import com.nfwork.dbfound.exception.ParamNotFoundException;
import com.nfwork.dbfound.model.base.Entity;
import com.nfwork.dbfound.util.LogUtil;
import com.nfwork.dbfound.util.UUIDUtil;
import com.nfwork.dbfound.web.file.FileUtil;
public abstract class SqlEntity extends Sqls {
private static final long serialVersionUID = 3035666882993092230L;
String sql;
protected static String replaceString = "\\$\\{\\@[ a-zA-Z_0-9\u4E00-\u9FA5]*\\}";
@Override
public void run(){
Entity entity = getParent();
if (entity instanceof Sqls) {
Sqls sqls = (Sqls) entity;
sqls.sqlList.add(this);
}
}
@Override
public void init(Element element){
sql = element.getTextTrim();
super.init(element);
}
public abstract void execute(Context context, Map<String, Param> params,
String provideName) ;
/**
* 得到最后执行的sql语句
*
* @return
*/
public String getExecuteSql(String sql, Map<String, Param> params) {
String executeSqlString = sql;
// 转化执行的sql
executeSqlString = executeSqlString.replaceAll(replaceString, "?");
return executeSqlString;
}
/**
* 参数设定 sql为原生sql语句,用来寻找参数的位置
*
* @throws SQLException
* @throws NumberFormatException
*/
public void initParam(PreparedStatement statement, String sql,
Map<String, Param> params) throws NumberFormatException,
SQLException {
String paramValue;
String paramDataType;
// 设定参数
Pattern p = Pattern.compile(replaceString);
Matcher m = p.matcher(sql);
int cursor = 1; // 游标记录参数的位置
while (m.find()) {
String param = m.group();
String pn = param.substring(3, param.length() - 1);
Param nfParam = params.get(pn.trim());
if (nfParam == null) {
throw new ParamNotFoundException("param: " + pn + " 没有定义");
}
if ("true".equals(nfParam.getUUID())) {
paramValue = UUIDUtil.getUUID();
nfParam.setValue(paramValue);
} else {
paramValue = nfParam.getStringValue();
}
paramDataType = nfParam.getDataType();
if (paramValue == null) {
statement.setString(cursor, null);
} else if (paramDataType.equals("varchar")) {
statement.setString(cursor, paramValue);
} else if (paramDataType.equals("number")) {
if ("".equals(paramValue.trim())) {
statement.setString(cursor, null);
} else if (paramValue.indexOf(".") == -1) {
statement.setLong(cursor, Long.parseLong(paramValue));
} else if (paramValue.endsWith(".0")) {
paramValue = paramValue.substring(0,
paramValue.length() - 2);
nfParam.setValue(paramValue);
statement.setLong(cursor, Long.parseLong(paramValue));
} else {
statement.setDouble(cursor, Double.parseDouble(paramValue));
}
} else if (paramDataType.equals("file")) {
FileItem item = null;
try {
String saveType = nfParam.getFileSaveType();
Object o = nfParam.getValue();
if (o != null) {
item = (FileItem) o;
if ("db".equals(saveType)) {
statement.setBinaryStream(cursor, item
.getInputStream(), (int) item.getSize());
} else {
String filename = UUIDUtil.getUUID() + ".uf";
String fileFoldName = FileUtil
.getUploadFolderName();
item.write(new File(FileUtil
.getUploadFolder(fileFoldName), filename));
statement.setString(cursor, fileFoldName + "/"
+ filename);
}
}
} catch (Exception e) {
LogUtil.error(e.getMessage(), e);
}
} else {
statement.setString(cursor, paramValue);
}
cursor++;
}
}
public void log(String sql, Map<String, Param> params) {
LogUtil.log(sql, params);
}
public void setSql(String sql) {
this.sql = sql;
}
public String getSql() {
return sql;
}
public List<SqlEntity> getSqlList() {
return sqlList;
}
public void setSqlList(List<SqlEntity> sqlList) {
this.sqlList = sqlList;
}
}