Commit 04562783 by WeiCong

增加通用API为具体域填充值

parent f9e08bdc
......@@ -13,6 +13,8 @@ import java.io.Writer;
import java.util.*;
import java.util.regex.Pattern;
import static java.util.Arrays.asList;
public class SWFMessage extends AbstractMessageArea {
final Pattern CHECKPATH = Pattern.compile("^\\d+(\\.\\d)?$");
Map<String, Object> genericCache = new HashMap<>();
......@@ -276,9 +278,9 @@ public class SWFMessage extends AbstractMessageArea {
}
/**
* 根据指定域名(.域块号),填充具体域或者域块的值
* 根据指定域名(.域块号)表达式,填充具体域或者域块的值
*
* @param tagExp 域名(.域块号)
* @param tagExp 域名(.域块号)表达式
* @param val 待填充得数据
* 待填充的数据类型有三种:<br/>
* 1.填充唯一域数据类型是String<br/>
......@@ -342,6 +344,98 @@ public class SWFMessage extends AbstractMessageArea {
return false;
}
/**
* 根据指定域名(.域块号)表达式和索引,进行值得填充
*
* @param tagExp 域名(.域块号)表达式
* @param val 待填充的值
* @param indexes 索引
*/
public void setGenericByTag(String tagExp, String val, Integer... indexes) {
Assert.notNull(tagExp, "域名(.域块号)表达式不能为空");
Assert.notNull(val, "待填充的值不能为空");
Object item = findMessageAreaByTag(tagExp, indexes);
if (item instanceof TagLine) {
TagLine tmp = (TagLine) item;
tmp.setValue(val);
} else {
TagCell tmp = (TagCell) item;
tmp.setValue(val);
}
}
/**
* 根据指定域名(.域块号)和索引,获取指定的域或域块对象
*
* @param tagExp 域名(.域块号)表达式
* @param indexes 索引
* @return 域或域块对象
*/
public Object findMessageAreaByTag(String tagExp, Integer... indexes) {
String path = checkTag(tagExp);
int index = tagExp.indexOf(".");
return findMessageArea(path, index == -1 ? tagExp : tagExp.substring(0, index), indexes);
}
private Object findMessageArea(String path, String tagName, Integer... indexes) {
checkPath(path);
int index = path.indexOf(".");
TagLine tagLine = this.flatModel.get(index != -1 ? Integer.valueOf(path.substring(0, index)) : Integer.valueOf(path));
Assert.notNull(tagLine, "不存在[" + tagName + "]对应的域");
Object rs = null;
if (tagLine.parent != null) {
rs = findTagLine((AbstractMessageArea) tagLine.parent, tagLine.getTno(), asList(indexes), tagName, 0);
}
if (index != -1) {
int part = Integer.parseInt(path.substring(index + 1)) + 1;
tagLine = (TagLine) rs;
for (TagCell cell : tagLine.cellList) {
if (cell.cnt == part) {
rs = cell;
break;
}
}
}
return rs;
}
private TagLine findTagLine(AbstractMessageArea parent, int ano, List<Integer> cntLst, String tagName, int num) {
if (parent.getType() == MessageArea.CYC || parent.getType() == MessageArea.SEQ) {
for (int i = 0; i < parent.getFields().size(); i++) {
MessageArea item = parent.getFields().get(i);
if (item.getType() == MessageArea.TAG) {
if (((TagLine) item).getTno() == ano) {
checkTagLine((TagLine) item, tagName);
return (TagLine) item;
}
} else {
if ((item.getType() == MessageArea.CYCLIST || item.getType() == MessageArea.SEQLIST) && !((AbstractMessageArea) item).withIn(ano)) {
continue;
}
return findTagLine((AbstractMessageArea) item, ano, cntLst, tagName, num);
}
}
} else if (parent.getType() == MessageArea.CYCLIST || parent.getType() == MessageArea.SEQLIST) {
if (((AbstractMessageArea) parent).withIn(ano)) {
Integer cnt = cntLst.get(num++);
if(parent.getType() == MessageArea.SEQLIST && ((SEQList) parent).getCyc() == 0){
Assert.state(cnt==0,"不能从非循环型Sequence获取索引大于0的对象");
}
MessageArea cp = null;
for (int i = 0; i <= cnt; i++) {
try {
cp = ((AbstractMessageArea) parent).getFields().get(i);
} catch (Exception e) {
cp = ((AbstractMessageArea) parent).getPattern().clone();
parent.addSubArea(cp);
}
}
return findTagLine((AbstractMessageArea) cp, ano, cntLst, tagName, num);
}
}
return null;
}
private void checkTagLine(TagLine tag, String tagName) {
if (tag.getName().endsWith("a")) {
Assert.notNull(tagName, "多选报文域[" + tag.getName() + "]需要提供指定域选项");
......@@ -554,7 +648,7 @@ public class SWFMessage extends AbstractMessageArea {
sb.write(getLogicalTerminalAddress(rcvbic, "2"));
sb.write("N");
sb.write("}");
if(mtType.endsWith("COV")){
if (mtType.endsWith("COV")) {
sb.write("{3:{119:COV}}");
}
sb.write("{4:");
......@@ -596,7 +690,7 @@ public class SWFMessage extends AbstractMessageArea {
return bic;
}
throw new IllegalStateException("第"+field+"部分的bic码["+bic+"]不符合规范,需满足8、11或12位长度");
throw new IllegalStateException("第" + field + "部分的bic码[" + bic + "]不符合规范,需满足8、11或12位长度");
}
private void printMsgBody(AbstractMessageArea ma, SwtBufferedWriter sb) throws IOException {
......
......@@ -316,4 +316,35 @@ public class ParseSwiftTest extends TestCase {
System.out.println(swf.getMsg());
System.out.println("结束生成101报文");
}
public void testSetGenericByTagAdv() {
SWFMessage swf = MessageFormat.getSWFMessage("101");
swf.setGenericByTag("20", "STMMDL129058636E");
swf.setGenericByTag("28D.0", "1");
swf.setGenericByTag("28D.1", "10");
swf.setGenericByTag("30", "191111");
swf.setGenericByTag("21", "101651ATT000005W",0);
swf.setGenericByTag("21", "321651ATT000005Z",1);
swf.setGenericByTag("23E", "CHQB/HELLO",0,0);
swf.setGenericByTag("23E", "CHQB/WORLD",0,1);
swf.setGenericByTag("23E", "CHQB/MY",1,0);
swf.setGenericByTag("23E", "CHQB/NAME",1,1);
swf.setGenericByTag("23E", "CHQB/IS",1,2);
swf.setGenericByTag("32B.0", "USD",0);
swf.setGenericByTag("32B.0", "USD",1);
swf.setGenericByTag("32B.1", "80000",0);
swf.setGenericByTag("32B.1", "12322.11",1);
swf.setGenericByTag("59.0", "/22222222222",0);
swf.setGenericByTag("59.0", "/11111111111",1);
swf.setGenericByTag("59.1", "STRIX LIMITED\r\nFORREST HOUSE RONALDSWAY BALLASALLA\r\nISLE OF MAN UK",0);
swf.setGenericByTag("59.1", "HOLLW LSHIUHIWA\r\nWZDESSS HOUSE WAWAZDR\r\nDEDFFF OF EE ZK",1);
swf.setGenericByTag("71A", "BEN",0);
swf.setGenericByTag("71A", "OUR",1);
//设置收发报行
swf.setSndbic("NYCBCNSH");
swf.setRcvbic("ICBKGB2LAAAA");
System.out.println("开始生成101报文");
System.out.println(swf.getMsg());
System.out.println("结束生成101报文");
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment