package foundation.persist;
|
|
import java.util.List;
|
import java.util.Set;
|
|
import foundation.callable.Callable;
|
import foundation.callable.NewObjectWriter;
|
import foundation.config.Configer;
|
import foundation.data.Entity;
|
import foundation.data.EntitySet;
|
import foundation.data.Page;
|
import foundation.persist.sql.NamedSQL;
|
import foundation.persist.sql.Result;
|
import foundation.persist.sql.ReturnType;
|
import foundation.persist.sql.SQLRunner;
|
import foundation.server.Sysparam;
|
import foundation.variant.VariantSegment;
|
|
public class DataObject extends Callable {
|
|
private static NewObjectWriter newObjectWriter = new NewObjectWriter();
|
private String data;
|
private String operator;
|
|
protected void doReceive(String[] paths) throws Exception {
|
try {
|
if (paths.length >= 3) {
|
data = paths[1];
|
operator = paths[2];
|
|
if ("procedure".equalsIgnoreCase(data)) {
|
execProcedure();
|
resultPool.success();
|
}
|
else {
|
if ("getDataSet".equalsIgnoreCase(operator)) {
|
try {
|
String filter = getFilter(data);
|
String orderby = getOrderBy();
|
EntitySet entitySet = DataHandler.getDataSet(data, filter, orderby);
|
|
resultPool.addValue(entitySet);
|
}
|
catch (Exception e) {
|
e.printStackTrace();
|
throw e;
|
}
|
}
|
else if ("getSetByPage".equalsIgnoreCase(operator)) {
|
String filter = getFilter(data);
|
int totalCount = DataHandler.getCount(data, filter);
|
String orderby = getOrderBy();
|
Page page = getPage(totalCount);
|
EntitySet entitySet = DataHandler.getDataSetByPage(data, filter, page, orderby);
|
|
resultPool.addValue("page", page);
|
resultPool.addValue(entitySet);
|
}
|
else if ("getComboboxDataSet".equalsIgnoreCase(operator)) {
|
String filter = getFilter(data);
|
String orderby = getOrderBy();
|
EntitySet entitySet = DataHandler.getDataSet(data, filter, orderby);
|
resultPool.addValue(entitySet);
|
}
|
else if ("getLine".equalsIgnoreCase(operator)) {
|
String id = getId();
|
Entity entity = DataHandler.getLine(data, id);
|
resultPool.addValue(entity);
|
}
|
else if ("deleteById".equalsIgnoreCase(operator)) {
|
String id = getId();
|
DataHandler.deleteById(data, id);
|
resultPool.success();
|
}
|
else if ("deleteByPrimaryKey".equalsIgnoreCase(operator)) {
|
deleteByPrimaryKey();
|
}
|
else if ("updateByPrimaryKey".equalsIgnoreCase(operator)) {
|
updateByPrimaryKey();
|
}
|
else if ("newObject".equalsIgnoreCase(operator)) {
|
resultPool.addValue("line", newObjectWriter);
|
}
|
else if ("addLine".equalsIgnoreCase(operator)) {
|
Entity entity = new Entity(data);
|
getEntity(entity);
|
|
DataHandler.addLine(entity);
|
resultPool.success();
|
}
|
else if ("saveLine".equalsIgnoreCase(operator)) {
|
Entity entity = new Entity(data);
|
getEntity(entity);
|
|
DataHandler.saveLine(entity);
|
resultPool.success();
|
}
|
else if ("getCount".equalsIgnoreCase(operator)) {
|
String filter = getFilter(data);
|
int totalCount = DataHandler.getCount(data, filter);
|
resultPool.addValue(totalCount);
|
}
|
else if ("getSysparams".equalsIgnoreCase(operator)) {
|
List<Sysparam> list = Configer.getClientSysparams();
|
resultPool.addValue(list);
|
}
|
}
|
}
|
else {
|
writer.ReplyError("bad data message path:" + fullPath);
|
}
|
}
|
catch (Exception e) {
|
logger.error("execute dataobject error: " + fullPath);
|
throw e;
|
}
|
}
|
|
private void updateByPrimaryKey() {
|
|
}
|
|
private void deleteByPrimaryKey() throws Exception {
|
String key = request.getParameter("key");
|
String value = request.getParameter("value");
|
String filter = key + "=" + value;
|
EntitySet dataSet = DataHandler.getDataSet(data, filter);
|
Entity first = dataSet.next();
|
DataHandler.deleteLine(first);
|
|
}
|
|
private void execProcedure() throws Exception {
|
ReturnType returnType = ReturnType.EntitySet;
|
if (paths.length > 3) {
|
returnType = ReturnType.valueOfString(paths[3]);
|
}
|
|
NamedSQL namedSQL = NamedSQL.getInstance(operator);
|
namedSQL.setReturnType(returnType);
|
|
boolean reset = false;
|
Set<String> pageVariants = Page.getVarinatNameSet();
|
|
//set parameter for first time
|
for (VariantSegment variant : namedSQL) {
|
String name = variant.getName();
|
|
if (pageVariants.contains(name.toLowerCase())) {
|
reset = true;
|
continue;
|
}
|
|
String value = locateSQLVariant(name);
|
|
if (value == null) {
|
logger.error("execute procedure error, empty param: " + name);
|
return;
|
}
|
|
variant.setValue(value);
|
}
|
|
//set parameter for second time
|
Page page = null;
|
if (reset) {
|
int count = getTotalCount(namedSQL);
|
page = getPage(count);
|
|
for (VariantSegment variant : namedSQL) {
|
String name = variant.getName();
|
|
if (!pageVariants.contains(name.toLowerCase())) {
|
continue;
|
}
|
|
String value = page.getStringValue(name);
|
|
if (value == null) {
|
logger.error("execute procedure error, empty param: " + name);
|
return;
|
}
|
|
variant.setValue(value);
|
}
|
}
|
|
Result result = namedSQL.exec();
|
resultPool.addValue("rows",result.getObject());
|
|
if (page != null) {
|
resultPool.addValue("page", page);
|
resultPool.addValue("total", page.getRecordCount());
|
}
|
|
if (ReturnType.None == returnType) {
|
resultPool.success();
|
}
|
}
|
|
private int getTotalCount(NamedSQL namedSQL) throws Exception {
|
String sql = namedSQL.getCountSQL();
|
/* if (sql.contains("@{filter}")) {
|
int filterIndex = sql.indexOf("@{filter}");
|
sql = sql.substring(0,filterIndex)+" 1=1 "+sql.substring(filterIndex+"@{filter}".length());
|
}*/
|
|
namedSQL = new NamedSQL("getCount", sql, false);
|
|
for (VariantSegment variant : namedSQL) {
|
String name = variant.getName();
|
String value = request.getParameter(name);
|
|
if (value == null) {
|
logger.error("execute procedure error, empty param: " + name);
|
}
|
if (name.equalsIgnoreCase("filter") && value == null) {
|
value = "1=1";
|
}
|
variant.setValue(value);
|
}
|
|
int count = SQLRunner.getInteger(namedSQL);
|
|
return count;
|
}
|
}
|