Commit 6b723a62 by chengzhuoshen

MX转MT无用节点添加到转换报告中

parent 5e90966d
......@@ -59,8 +59,6 @@ public class Mx2MtConstants {
public static final String MX_XML_DOCUMENT = "xmlDocument";
public static final String MT_TYPE = "mtType";
public static final String MT_IO_TYPE = "mtIOType";
public static final String MT_IO_TYPE_INPUT = "I";
......@@ -145,6 +143,8 @@ public class Mx2MtConstants {
public static final String BLOCK5_PDE = "Block5_PDE";
public static final String MT_TYPE = "MtType";
public static final String YES = "Y";
public static final String NO = "N";
......
......@@ -15,17 +15,18 @@ import com.prowidesoftware.swift.io.IConversionService;
import com.prowidesoftware.swift.io.writer.SwiftWriter;
import com.prowidesoftware.swift.model.*;
import com.prowidesoftware.swift.model.field.*;
import com.prowidesoftware.swift.model.mx.AbstractMX;
import org.apache.commons.lang3.Validate;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.*;
public abstract class AbstractMx2MtCreator implements Mx2MtCreator {
......@@ -39,7 +40,6 @@ public abstract class AbstractMx2MtCreator implements Mx2MtCreator {
this.context = context;
}
/**
* 封装报文转换详细报告
* @param errorCode
......@@ -126,7 +126,14 @@ public abstract class AbstractMx2MtCreator implements Mx2MtCreator {
if (StringUtil.isNotEmpty(parentPath)) {
path = parentPath + "." + path;
}
return XmlUtil.getXmlNodeValue(document, path);
String value = XmlUtil.getXmlNodeValue(document, path);
if (StringUtil.isNotEmpty(value)) {
Mx2MtListener mx2MtListener = (Mx2MtListener)context.get(Mx2MtContextIdentifier.MX_TO_MT_LISTENER_CLASS, true);
if (mx2MtListener != null) {
mx2MtListener.process(path); //如果存在监听器且得到的值不为空,则执行监听操作
}
}
return value;
}
protected int getXmlNodeCounts(String parentPath, Document document, String path) {
......@@ -136,6 +143,53 @@ public abstract class AbstractMx2MtCreator implements Mx2MtCreator {
return XmlUtil.getChildrenCount(document, path, null);
}
/**
* 将xml所有节点全路径放在list里面
* 除了AppHdr以外
* @param list
* @param element
* @param path
*/
public static void parseDocument(List<String> list, Element element, String path) {
if (element != null) {
if (element.isTextOnly()) {
list.add(path);
List<Attribute> attributes = element.attributes();
if (attributes != null && attributes.size() > 0) {
for (Attribute attribute : attributes) {
list.add(path + "@" + attribute.getName());
}
}
} else {
List<Element> elementList = element.elements();
Map<String, List<Element>> maps = new LinkedHashMap<>();
for (Element e : elementList) {
if (maps.containsKey(e.getName())) {
List<Element> eList = maps.get(e.getName());
eList.add(e);
} else {
List<Element> eList = new ArrayList<>();
eList.add(e);
maps.put(e.getName(), eList);
}
}
for (List<Element> eList : maps.values()) {
if (eList.size() == 1) {
parseDocument(list, eList.get(0), path + "." + eList.get(0).getName());
} else {
for (int i=0; i<eList.size(); i++) {
if (i == 0) {
parseDocument(list, eList.get(i), path + "." + eList.get(i).getName()); //第一条的数据不带下标
} else {
parseDocument(list, eList.get(i), path + "." + eList.get(i).getName() + "(" + i + ")");
}
}
}
}
}
}
}
public abstract List<Mx2MtTagsGenerate> getGenerateTagList();
protected abstract String getMtType();
......@@ -151,15 +205,19 @@ public abstract class AbstractMx2MtCreator implements Mx2MtCreator {
@Override
public void withBlock1() throws SwiftException {
SwiftBlock1 block1 = new SwiftBlock1();
AbstractMX abstractMX = (AbstractMX)context.get(Mx2MtContextIdentifier.MX_OBJ, true);
Document document = (Document)context.get(Mx2MtContextIdentifier.MX_XMl_DOCUMENT, true);
String appHdrParentPath = (String)context.get(Mx2MtContextIdentifier.APPHDR_PARENT_ELEMENT_NAME, true);
String senderBic = (String)context.get(Mx2MtConstants.SENDERS_ADDRESS, true);
if (StringUtil.isEmpty(senderBic) && abstractMX.getAppHdr() != null) {
senderBic = abstractMX.getAppHdr().from();
if (StringUtil.isEmpty(senderBic)) {
senderBic = getXmlNodeValue(appHdrParentPath, document, "AppHdr.Fr.FIId.FinInstnId.BICFI");
}
context.set(Mx2MtContextIdentifier.MX_SENDER_BIC, senderBic);
String receiverBic = (String)context.get(Mx2MtConstants.RECEIVERS_ADDRESS, true);
if (StringUtil.isEmpty(receiverBic) && abstractMX.getAppHdr() != null) {
receiverBic = abstractMX.getAppHdr().to();
if (StringUtil.isEmpty(receiverBic)) {
receiverBic = getXmlNodeValue(appHdrParentPath, document, "AppHdr.To.FIId.FinInstnId.BICFI");
}
context.set(Mx2MtContextIdentifier.MX_RECEIVER_BIC, receiverBic);
String applicationMode = (String)context.get(Mx2MtConstants.APPLICATION_MODE, true);
if ("O".equalsIgnoreCase(applicationMode)) {
block1.setLogicalTerminal(processBicCode(receiverBic));
......@@ -173,27 +231,26 @@ public abstract class AbstractMx2MtCreator implements Mx2MtCreator {
@Override
public void withBlock2() throws SwiftException {
AbstractMX abstractMX = (AbstractMX)context.get(Mx2MtContextIdentifier.MX_OBJ, true);
String senderBic = (String)context.get(Mx2MtConstants.SENDERS_ADDRESS, true);
if (StringUtil.isEmpty(senderBic) && abstractMX.getAppHdr() != null) {
senderBic = abstractMX.getAppHdr().from();
}
context.set(Mx2MtContextIdentifier.MX_SENDER_BIC, senderBic);
String receiverBic = (String)context.get(Mx2MtConstants.RECEIVERS_ADDRESS, true);
if (StringUtil.isEmpty(receiverBic) && abstractMX.getAppHdr() != null) {
receiverBic = abstractMX.getAppHdr().to();
}
context.set(Mx2MtContextIdentifier.MX_RECEIVER_BIC, receiverBic);
Document document = (Document)context.get(Mx2MtContextIdentifier.MX_XMl_DOCUMENT, true);
String appHdrParentPath = (String)context.get(Mx2MtContextIdentifier.APPHDR_PARENT_ELEMENT_NAME, true);
String senderBic = (String)context.get(Mx2MtContextIdentifier.MX_SENDER_BIC, true);
String receiverBic = (String)context.get(Mx2MtContextIdentifier.MX_RECEIVER_BIC, true);
String messagePriority = (String)context.get(Mx2MtConstants.MESSAGE_PRIORITY, true);
if (StringUtil.isEmpty(messagePriority)) {
Document document = (Document)context.get(Mx2MtContextIdentifier.MX_XMl_DOCUMENT, true);
String appHdrParentPath = (String)context.get(Mx2MtContextIdentifier.APPHDR_PARENT_ELEMENT_NAME, true);
String xmlMessagePriority = getXmlNodeValue(appHdrParentPath, document, "AppHdr.Prty");
messagePriority = MessagePriority.HIGH.equals(xmlMessagePriority) ? "U" : "N";
}
Date inputDate = (Date)context.get(Mx2MtConstants.INTPUT_DATE, true);
if (inputDate == null && abstractMX.getAppHdr() != null) {
inputDate = DateUtil.parseDate(abstractMX.getAppHdr().creationDate());
if (inputDate == null) {
String createDateStr = getXmlNodeValue(appHdrParentPath, document, "AppHdr.CreDt");
if (StringUtil.isNotEmpty(createDateStr)) {
try {
XMLGregorianCalendar createDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(createDateStr);
inputDate = DateUtil.parseDate(createDate);
} catch (DatatypeConfigurationException e) {
throw new SwiftException(e.getMessage());
}
}
}
Date outputDate = (Date)context.get(Mx2MtConstants.OUTPUT_DATE, true);
if (outputDate == null) {
......@@ -307,6 +364,25 @@ public abstract class AbstractMx2MtCreator implements Mx2MtCreator {
if (StringUtil.isNotEmpty(outputFilePath)) {
write(swiftMessage, new File(outputFilePath));
}
//处理没翻译节点值的警告信息
Mx2MtListener mx2MtListener = (Mx2MtListener)context.get(Mx2MtContextIdentifier.MX_TO_MT_LISTENER_CLASS, true);
if (mx2MtListener != null) {
Map<String, Boolean> maps = mx2MtListener.getMaps();
List<String> pathList = new ArrayList<>();
Document document = (Document)context.get(Mx2MtContextIdentifier.MX_XMl_DOCUMENT, true);
parseDocument(pathList, document.getRootElement(), document.getRootElement().getName());
if (pathList.size() > 0) {
for(String path : pathList) {
if (!maps.containsKey(path)) {
String originalValue = XmlUtil.getXmlNodeValue(document, path);
if (StringUtil.isNotEmpty(originalValue)) {
buildSTErrorInfo(ERROR.T0000M, path, originalValue);
}
}
}
}
}
}
public void write(SwiftMessage swiftMessage, File file) throws SwiftException {
......
......@@ -39,6 +39,7 @@ public class Mx2MtCreatorManager {
.trim();
Mx2MtContext context = new Mx2MtContext();
Document document = DocumentHelper.parseText(xml);
context.set(Mx2MtContextIdentifier.MX_TO_MT_LISTENER_CLASS, new Mx2MtListener()); //注册监听器
context.set(Mx2MtContextIdentifier.MX_XMl_DOCUMENT, document);
context.set(Mx2MtContextIdentifier.MX_TO_MT_OUTPUT_FILE_PATH, fileOutputPath);
context.set(Mx2MtContextIdentifier.MX_OBJ, abstractMX);
......
......@@ -24,6 +24,7 @@ public class Mx2MtListener {
* @param usedPath
*/
public void process(String usedPath) {
usedPath = usedPath.replace("(0)", ""); //第一条的数据不带下标
if (!maps.containsKey(usedPath)) {
maps.put(usedPath, true);
}
......
......@@ -89,7 +89,12 @@ public class Mx2Mt202Creator extends AbstractMx2MtCreator {
@Override
protected String getMtType() {
return Mx2MtConstants.MT_TYPE_202;
String mtType = (String)context.get(Mx2MtConstants.MT_TYPE, true);
if (StringUtil.isNotEmpty(mtType)) {
return mtType;
} else {
return Mx2MtConstants.MT_TYPE_202;
}
}
}
\ No newline at end of file
......@@ -33,6 +33,9 @@ public class Field32AGenerate extends AbstractMx2MtTagsGenerate {
String intrBkSttlmccy = "";
String intrBkSttlmDtValue = getXmlNodeValue(bodyHdrParentElementName, document, "Ntfctn.Ntry.ValDt.Dt");
if (StringUtil.isEmpty(intrBkSttlmDtValue)) {
intrBkSttlmDtValue = getXmlNodeValue(bodyHdrParentElementName, document, "Ntfctn.Ntry.ValDt.DtTm");
}
if (StringUtil.isEmpty(intrBkSttlmDtValue)) {
intrBkSttlmDtValue = getXmlNodeValue(bodyHdrParentElementName, document, "Ntfctn.Ntry.NtryDtls.TxDtls.RltdDts.IntrBkSttlmDt");
}
if (StringUtil.isNotEmpty(intrBkSttlmDtValue)) {
......
......@@ -87,7 +87,10 @@ public class Field52aFor900Generate extends AbstractMx2MtTagsGenerate {
} else if (StringUtil.isNotEmpty(name)) {
mtNameAddress = mx_to_mtFinancialInstitutionNameAndUnstructuredAddress(bodyHdrParentElementName+ ".Ntfctn.Ntry.NtryDtls.TxDtls.RltdPties.Dbtr.Agt.FinInstnId");
}
if (StringUtil.isEmpty(mtNameAddress)) return;//如果name和地址不存在,返回。
if (StringUtil.isEmpty(mtNameAddress)) {
buildSTErrorInfo(ERROR.T20064, "Block4/52a", null);
return;
}
if (StringUtil.isNotEmpty(account)) {
value = account + Mx2MtConstants.NEW_LINE + mtNameAddress;
} else {
......
......@@ -52,7 +52,12 @@ public class Field52aFor910Generate extends AbstractMx2MtTagsGenerate {
} else if (StringUtil.isNotEmpty(name)) {
mtNameAddress = mx_to_mtFinancialInstitutionNameAndUnstructuredAddress(agtPath + ".FinInstnId");
}
if (StringUtil.isEmpty(mtNameAddress)) return;//如果name和地址不存在,返回。
if (StringUtil.isEmpty(mtNameAddress)) {
if (exist50a(tags)) {
buildSTErrorInfo(ERROR.T20064, "Block4/52a", null);
}
return;
}
if (StringUtil.isNotEmpty(mtClearSystemId)) {
value = mtClearSystemId + Mx2MtConstants.NEW_LINE + mtNameAddress;
} else {
......
......@@ -46,11 +46,17 @@ public class Field61Generate extends AbstractMx2MtTagsGenerate {
for (int i = 0; i < entryCount; i++) {
String value = "";
String valueDateStr = getXmlNodeValue(bodyHdrParentElementName, document, "Rpt.Ntry(" + i + ").ValDt.Dt");
if (StringUtil.isEmpty(valueDateStr)) {
valueDateStr = getXmlNodeValue(bodyHdrParentElementName, document, "Rpt.Ntry(" + i + ").ValDt.DtTm");
}
if (StringUtil.isNotEmpty(valueDateStr)) {
XMLGregorianCalendar valueDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(valueDateStr);
value += DateUtil.format(valueDate, "yyMMdd");
}
String bookDateStr = getXmlNodeValue(bodyHdrParentElementName, document, "Rpt.Ntry(" + i + ").BookgDt.Dt");
if (StringUtil.isEmpty(bookDateStr)) {
bookDateStr = getXmlNodeValue(bodyHdrParentElementName, document, "Rpt.Ntry(" + i + ").BookgDt.DtTm");
}
if (StringUtil.isNotEmpty(bookDateStr)) {
XMLGregorianCalendar bookDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(bookDateStr);
value += DateUtil.format(bookDate, "MMdd");
......
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