package frame.file; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import frame.file.office.IOMappingItemRuntime; import frame.persist.NamedSQL; import frame.util.Util; public class FileIOContext implements IFileContext { private List paramNames; private Map paramMap; private FileIOItem ioItem; public FileIOContext(FileIOItem fileIoItem) { paramMap = new HashMap(); ioItem = fileIoItem; initParamNames(); } public void setParametersTo(NamedSQL namedSQL) { for (String name : paramNames) { if (namedSQL.containsData(name)) { String value = getParameter(name); if (value == null) { continue; } namedSQL.setParam(name, value); } } } public String getParameter(String name) { if (Util.isEmptyStr(name)) { return name; } name = name.toLowerCase(); if ("@totable".equalsIgnoreCase(name)) { return ioItem.getToName(); } else if ("@fromtable".equalsIgnoreCase(name)) { return ioItem.getFromName(); } else if ("@distinct".equalsIgnoreCase(name)) { return ioItem.isDistinctSelect() ? "distinct" : ""; } else if ("@updatefieldpairs".equalsIgnoreCase(name)) { return getUpdateFieldPairs(); } else if ("@updatefromfieldnames".equalsIgnoreCase(name)) { return getUpdateFromFieldNames(); } else if ("@inserttofieldnames".equalsIgnoreCase(name)) { return getInsertToFieldNames(); } else if ("@insertfromfieldnames".equalsIgnoreCase(name)) { return getInsertFromFieldNames(); } else if ("@filterfieldvalues".equalsIgnoreCase(name)) { return getFilterFieldValues(); } else if ("@keyfieldpairs".equalsIgnoreCase(name)) { return getKeyFieldPairs(); } if (paramMap.containsKey(name)) { return paramMap.get(name); } return null; } private String getUpdateFieldPairs() { StringBuilder result = new StringBuilder(", "); List runtimeList = ioItem.getUpdateMappingRuntime(); String toTable = ioItem.getToName(); String fromTable = ioItem.getFromName(); for (IOMappingItemRuntime itemRuntime : runtimeList) { result.append(toTable + "." + itemRuntime.getToField() + " = " + fromTable + "." + itemRuntime.getFromField()); } return result.toString(); } public void addParameters(Map paramsMap) { if (paramsMap == null) { return; } Set keySet = paramsMap.keySet(); for (String key : keySet) { key = key.toLowerCase(); if (!"@".equals(key.charAt(0))) { key = "@" + key; } paramsMap.put(key, paramsMap.get(key)); paramNames.add(key); } } private String getUpdateFromFieldNames() { return getMappingRuntimeList2String("update", true); } //TODO INSERT UPDATE ?? private String getInsertFromFieldNames() { return getMappingRuntimeList2String("insert", true); } private String getInsertToFieldNames() { return getMappingRuntimeList2String("insert", false); } private String getMappingRuntimeList2String (String type, boolean isfromField) { StringBuilder builder = new StringBuilder(", "); List dataList = null; if ("insert".equalsIgnoreCase(type)) { dataList = ioItem.getInsertMappingRuntime(); } else if ("update".equalsIgnoreCase(type)) { dataList = ioItem.getUpdateMappingRuntime(); } for (IOMappingItemRuntime ioMappingItemRuntime : dataList) { String field = null; if (isfromField) { field = ioMappingItemRuntime.getFromField(); } else { field = ioMappingItemRuntime.getToField(); } builder.append(field); } return builder.toString(); } private String getFilterFieldValues() { String andPair = getAndPair("filter"); return andPair; } private String getKeyFieldPairs() { String andPair = getAndPair("key"); return andPair; } private String getAndPair(String type) { String[] fields = null; if ("key".equalsIgnoreCase(type)) { fields = ioItem.getKeyFieldPairs(); if (fields == null || fields.length == 0) { return ioItem.getFromName() + ".id = " + ioItem.getToName() + ".id"; } } else if ("filter".equalsIgnoreCase(type)) { String[] filterFieldValues = ioItem.getFilterFieldValues(); if (filterFieldValues == null || filterFieldValues.length == 0) { return "1=1"; } } // if define StringBuilder result = new StringBuilder(" and "); for (String fieldPair : fields) { String keyFieldPair = setParametersTo(fieldPair); result.append(keyFieldPair); } return result.toString(); } public String setParametersTo(String segment) { if (segment == null) { return segment; } segment = segment.toLowerCase(); for (String name : paramNames) { if (segment.indexOf(name) >= 0) { String value = getParameter(name); if (value == null) { continue; } segment = segment.replace(name, value); } } return segment; } private void initParamNames() { paramNames = new ArrayList(); paramNames.add("@taskid"); paramNames.add("@typecode"); paramNames.add("@totable"); paramNames.add("@fromtable"); paramNames.add("@distinct"); paramNames.add("@keyfieldpairs"); paramNames.add("@updatefieldpairs"); paramNames.add("@filterFieldValues"); paramNames.add("@fieldnames"); paramNames.add("@inserttofieldnames"); paramNames.add("@insertfromfieldnames"); paramNames.add("@updatefromfieldnames"); } }