Commit 65af3d93 by s_guodong

init

parents
/be-transform.iml
/.idea/
/out/
File added
#############COMMON################
#编码方式(必须设置一个,ELCS为UTF-8)
charset=UTF-8
#############签名相关配置#############
#on:开启加签、验签;off:关闭加签、验签、加密、解密
sign_switch=off
#签名自定义实现类
signature_imp=com.brilliance.jnwb.framework.signature.DefaultSignature
#signature_imp=com.brilliance.pack.DefaultSignature
#############自定义xsd文件所在目录的路径【相对路径或绝对路径】(默认在classpath的cfg/xsd/目录下)#############
#schema_location=cfg/xsd/
\ No newline at end of file
json2bean=com.brilliance.jnwb.framework.filter.Json2DocumentFilter
packdocument=com.brilliance.jnwb.framework.filter.PackDocumentFilter
packmsgheader=com.brilliance.jnwb.framework.filter.PackMsgHeaderFilter
packsignature=com.brilliance.jnwb.framework.filter.PackSignatureFilter
validatedocument=com.brilliance.jnwb.framework.filter.ValidateDocumentFilter
unpackcom=com.brilliance.jnwb.framework.filter.UnPackComFilter
destroyres=com.brilliance.jnwb.framework.filter.DestoryFilter
\ No newline at end of file
package com.brilliance;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Description
* @Author s_guodong
* @Date 2022/4/26
*/
public class DateUtil {
private static final String ZONE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ssXXX";
private static final String TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss";
private static final String DATE_PATTERN = "yyyy-MM-dd";
/**
* 格式化
*
* @param date
* @param dateFormat
* @return
*/
public static String formatDate(Date date, String dateFormat) {
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
return sdf.format(date);
}
public static String formatDate(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);
return sdf.format(date);
}
public static String formatZoneTime(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat(ZONE_TIME_PATTERN);
return sdf.format(date);
}
public static String formatTime(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat(TIME_PATTERN);
return sdf.format(date);
}
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat(ZONE_TIME_PATTERN);
Date date = null;
try {
date = sdf.parse("2020-09-08T21:00:00+02:00");
} catch (ParseException e) {
}
System.out.println(formatZoneTime(date));
System.out.println(formatTime(date));
System.out.println(formatDate(date));
}
}
package com.brilliance;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
/**
* @Description
* @Author s_guodong
* @Date 2022/4/25
*/
public class MappingUtil {
private static final String NAME_SYMBOL = "name";
private static final String CIPS_ROOT_MODEL_SYMBOL = "rootModel";
private static final String MODEL_MAPPING_FILE_PATH = "/model-mapping.xlsx";
private static List<Map<String, Object>> readAll;
static {
InputStream resourceAsStream = MappingUtil.class.getResourceAsStream(MODEL_MAPPING_FILE_PATH);
ExcelReader reader = ExcelUtil.getReader(resourceAsStream, 0);
readAll = reader.readAll();
}
public static List<Map<String, Object>> getModelMapping(String msgType) {
for (Map<String, Object> map : readAll) {
String name = map.get(NAME_SYMBOL).toString();
if (msgType.equals(name)) {
InputStream resourceAsStream = MappingUtil.class.getResourceAsStream(MODEL_MAPPING_FILE_PATH);
ExcelReader reader = ExcelUtil.getReader(resourceAsStream, name);
List<Map<String, Object>> content = reader.readAll();
return content;
}
}
return null;
}
/**
* 获取根model
*
* @param msgType
* @return
*/
public static String getRootModel(String msgType) {
for (Map<String, Object> map : readAll) {
String name = map.get(NAME_SYMBOL).toString();
if (msgType.equals(name)) {
return map.get(CIPS_ROOT_MODEL_SYMBOL).toString();
}
}
return null;
}
}
package com.brilliance;
import java.util.HashMap;
import java.util.Map;
/**
* @Description
* @Author s_guodong
* @Date 2022/4/26
*/
public class Mt2CipsMapping {
public static final Map<String, String> MSG_TYPE_MAPPING = new HashMap<>();
static {
MSG_TYPE_MAPPING.put("pacs.008.001", "cips.111.001.02");
MSG_TYPE_MAPPING.put("pacs.009.001", "cips.112.001.02");
}
}
package com.brilliance;
import com.alibaba.fastjson.JSONObject;
import com.brilliance.jnwb.framework.Result;
import com.brilliance.jnwb.framework.exception.ConstructException;
import com.brilliance.jnwb.utils.MsgUtil;
import com.brilliance.swift.SwiftTransfer;
import com.brilliance.swift.vo.SwiftDto;
import com.google.gson.Gson;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @Description
* @Author s_guodong
* @Date 2022/4/22
*/
public class Mt2CipsUtil {
private static final String MAPPING_SYMBOL = "mapping";
private static final String SPLIT_SYMBOL = ":";
private static final String CIPS_MODEL_BASE_PACKAGE = "com.brilliance.jnwb.packet.model.";
private static final String MT_MODEL_BASE_PACKAGE = "com.brilliance.swift.vo.";
/**
* @param filePath mt报文的文件路径
* @param charset 字符编码
* @return
*/
public static String mt2Cips(String filePath, String charset) {
try {
File file = new File(filePath);
return mt2Cips(FileUtils.readFileToString(file, charset));
} catch (IOException e) {
}
return "";
}
/**
* @param file mt报文文件
* @param charset 字符编码
* @return
*/
public static String mt2Cips(File file, String charset) {
try {
return mt2Cips(FileUtils.readFileToString(file, charset));
} catch (IOException e) {
}
return "";
}
/**
* @param mtMsg mt报文字节数组
* @param charset 字符编码
* @return
*/
public static String mt2Cips(byte[] mtMsg, String charset) {
try {
if (mtMsg == null || mtMsg.length == 0) {
throw new ConstructException("字节数组不能为空");
}
return mt2Cips(new String(mtMsg, charset));
} catch (IOException e) {
}
return "";
}
/**
* @param mtMsg mt报文串
* @return
*/
public static String mt2Cips(String mtMsg) {
try {
if (StringUtils.isBlank(mtMsg)) {
throw new ConstructException("mt报文不能为空");
}
// 将报文映射到Mt的model中
SwiftDto swiftDto = new SwiftTransfer().mt2SwiftDto(mtMsg, null, null);
// 获取报文类型
String messageType = swiftDto.getMessageType();
// 读取mt和cips映射文件
List<Map<String, Object>> modelMapping = MappingUtil.getModelMapping(messageType);
// 实例化根节点
String rootModel = MappingUtil.getRootModel(messageType);
String[] rootArr = rootModel.split(SPLIT_SYMBOL);
Class<?> cipsClazz = Class.forName(CIPS_MODEL_BASE_PACKAGE + rootArr[0]);
Object cipsObject = cipsClazz.newInstance();
String swiftJson = JSONObject.toJSONString(swiftDto);
Class<?> mtClazz = Class.forName(MT_MODEL_BASE_PACKAGE + rootArr[1]);
Object mtObject = JSONObject.parseObject(swiftJson, mtClazz);
// 根据模型映射组装cips模型
setProperty(modelMapping, cipsObject, mtObject);
// 转换公共属性
setCommonProperty(cipsObject, swiftDto);
// 组装cips报文
Gson gson = new Gson();
String s = gson.toJson(cipsObject);
Result result = MsgUtil.packMessage(s);
return result.getMessage();
} catch (Exception e) {
}
return "";
}
/**
* 转换公共属性
*
* @param cipsObject
* @param swiftDto
*/
private static void setCommonProperty(Object cipsObject, SwiftDto swiftDto) {
Date time = swiftDto.getCreateDate();
ReflectionUtil.setSuperFieldValue(cipsObject, "MesgID", swiftDto.getMessageId());
ReflectionUtil.setSuperFieldValue(cipsObject, "OrigSender", swiftDto.getSenderBic());
ReflectionUtil.setSuperFieldValue(cipsObject, "OrigReceiver", swiftDto.getReceiverBic());
ReflectionUtil.setSuperFieldValue(cipsObject, "MesgDirection", "U");
ReflectionUtil.setSuperFieldValue(cipsObject, "OrigSendDate", DateUtil.formatDate(time, "yyyyMMdd"));
ReflectionUtil.setSuperFieldValue(cipsObject, "OrigSendTime", DateUtil.formatDate(time, "HHmmss"));
ReflectionUtil.setSuperFieldValue(cipsObject, "MesgType", Mt2CipsMapping.MSG_TYPE_MAPPING.get(swiftDto.getMessageType()));
}
/**
* 支持多种配置 a.b.c:d a.b.c:d#f a.b.c#f a.b.c:super.d#f
* 支持数据格式 Date--->String; String--->String; T--->String; List<String>--->List<String>;
* List<String>--->String; String--->List<String>; String--->List<T>
*
* @param modelMapping
* @param cipsObject
* @param mtObject
*/
private static void setProperty(List<Map<String, Object>> modelMapping, Object cipsObject, Object mtObject) {
for (Map<String, Object> map : modelMapping) {
Object mappingObject = map.get(MAPPING_SYMBOL);
if (mappingObject != null) {
String[] splitStr = mappingObject.toString().split("#");
String[] split = splitStr[0].split(SPLIT_SYMBOL);
Object fieldValue;
if (split.length == 2) {
String s = split[1];
if (s.contains("super.")) {
String superFieldName = s.substring(6);
fieldValue = ReflectionUtil.getSuperFieldValue(mtObject, superFieldName);
} else {
fieldValue = ReflectionUtil.getFieldValue(mtObject, s);
}
if (fieldValue == null) {
if (splitStr.length >= 2) {
fieldValue = splitStr[1];
} else {
fieldValue = ReflectionUtil.getFieldValue(mtObject, s);
}
}
ReflectionUtil.setFieldValue(cipsObject, split[0], fieldValue);
} else {
ReflectionUtil.setFieldValue(cipsObject, splitStr[0], splitStr[1]);
}
}
}
}
}
package com.brilliance;
import com.brilliance.strategy.FieldValueStrategy;
import com.brilliance.strategy.StrategyFactory;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
/**
* @Description
* @Author s_guodong
* @Date 2022/4/24
*/
public class ReflectionUtil {
/**
* @param object 对象
* @param propertyName 属性名称
*/
private static Object getSimpleFieldValue(Object object, String propertyName) {
try {
if (object instanceof List) {
List list = (List) object;
object = list.get(list.size() - 1);
Field field = object.getClass().getDeclaredField(propertyName);
field.setAccessible(true);
if (field.get(object) != null) {
object = object.getClass().newInstance();
list.add(object);
}
}
Field field = object.getClass().getDeclaredField(propertyName);
field.setAccessible(true);
return field.get(object);
} catch (Exception e) {
return null;
}
}
/**
* CdtTrfTxInf.PmtTpInf.CtgyPurp.Prtry
**/
public static Object getFieldValue(Object object, String propertyName) {
String[] filedNames = propertyName.split("\\.");
try {
for (int i = 0; i < filedNames.length; i++) {
String subField = filedNames[i];
object = ReflectionUtil.getSimpleFieldValue(object, subField);
if (object == null) {
return null;
}
}
return object;
} catch (Exception e) {
return null;
}
}
/**
* @param object 对象
* @param propertyName 属性名称
* @param propertyValue 属性值
*/
private static void setSimpleFieldValue(Object object, String propertyName, Object propertyValue) {
try {
Field field = object.getClass().getDeclaredField(propertyName);
String type = field.getGenericType().getTypeName();
// 策略模式根据field类型和property类型转换 propertyValue
FieldValueStrategy strategy = StrategyFactory.getStrategy(type, propertyName, propertyValue);
propertyValue = strategy.formatValue(propertyValue);
field.setAccessible(true);
field.set(object, propertyValue);
} catch (Exception e) {
}
}
/**
* CdtTrfTxInf.PmtTpInf.CtgyPurp.Prtry
**/
public static void setFieldValue(Object object, String propertyName, Object propertyValue) {
if (propertyValue == null) {
return;
}
if (propertyValue instanceof List) {
List list = ((List) propertyValue);
if (list.size() == 0) {
return;
}
}
Object preObject;
String[] filedNames = propertyName.split("\\.");
try {
for (int i = 0; i < filedNames.length - 1; i++) {
preObject = object;
String subField = filedNames[i];
object = ReflectionUtil.getSimpleFieldValue(preObject, subField);
if (object == null) {
object = ReflectionUtil.setField(preObject, subField);
}
}
} catch (Exception e) {
return;
}
ReflectionUtil.setSimpleFieldValue(object, filedNames[filedNames.length - 1], propertyValue);
}
/**
* 设置字段
*
* @param preObject
* @param subField
* @return
*/
private static Object setField(Object preObject, String subField) {
if (preObject instanceof List) {
List list = (List) preObject;
preObject = list.get(list.size() - 1);
}
Object object = null;
try {
Field field = preObject.getClass().getDeclaredField(subField);
field.setAccessible(true);
Type genericType = field.getGenericType();
if (genericType instanceof ParameterizedType) {
ParameterizedType t = (ParameterizedType) genericType;
String typeName = t.getActualTypeArguments()[0].getTypeName();
object = Class.forName(typeName).newInstance();
List<Object> curEleList = new ArrayList<>();
curEleList.add(object);
field.set(preObject, curEleList);
} else {
object = Class.forName(genericType.getTypeName()).newInstance();
field.set(preObject, object);
}
} catch (Exception e) {
}
return object;
}
public static void setSuperFieldValue(Object object, String propertyName, Object propertyValue) {
try {
Field field = object.getClass().getSuperclass().getDeclaredField(propertyName);
field.setAccessible(true);
field.set(object, propertyValue);
} catch (Exception e) {
}
}
public static Object getSuperFieldValue(Object object, String propertyName) {
try {
Field field = object.getClass().getSuperclass().getDeclaredField(propertyName);
field.setAccessible(true);
return field.get(object);
} catch (Exception e) {
}
return null;
}
}
package com.brilliance.strategy;
import com.brilliance.DateUtil;
import java.util.Date;
/**
* @Description 日期转换为String
* @Author s_guodong
* @Date 2022/4/29
*/
public class Date2StringFieldValueStrategy implements FieldValueStrategy {
@Override
public String formatValue(Object propertyValue) {
Date date = (Date) propertyValue;
return DateUtil.formatDate(date);
}
@Override
public boolean checkStrategyType(String fieldType, String fieldName, Object propertyValue) {
return propertyValue instanceof Date && "java.lang.String".equals(fieldType) && fieldName.endsWith("Dt");
}
}
package com.brilliance.strategy;
/**
* @Description
* @Author s_guodong
* @Date 2022/4/29
*/
public interface FieldValueStrategy {
/**
* 格式化数据类型
*
* @param propertyValue
* @return
*/
Object formatValue(Object propertyValue);
/**
* 支持的数据类型
*
* @param fieldType
* @param fieldName
* @param propertyValue
* @return
*/
boolean checkStrategyType(String fieldType, String fieldName, Object propertyValue);
}
package com.brilliance.strategy;
import java.util.List;
/**
* @Description list转换成list
* @Author s_guodong
* @Date 2022/4/29
*/
public class List2ListFieldValueStrategy implements FieldValueStrategy {
@Override
public List formatValue(Object propertyValue) {
return (List) propertyValue;
}
@Override
public boolean checkStrategyType(String fieldType, String fieldName, Object propertyValue) {
return fieldType.startsWith("java.util.List") && propertyValue instanceof List;
}
}
package com.brilliance.strategy;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
/**
* @Description List转换成String
* @Author s_guodong
* @Date 2022/4/29
*/
public class List2StringFieldValueStrategy implements FieldValueStrategy {
@Override
public String formatValue(Object propertyValue) {
List list = (List) propertyValue;
return StringUtils.join(list, "\r\n");
}
@Override
public boolean checkStrategyType(String fieldType, String fieldName, Object propertyValue) {
return "java.lang.String".equals(fieldType) && propertyValue instanceof List;
}
}
package com.brilliance.strategy;
/**
* @Description
* @Author s_guodong
* @Date 2022/4/29
*/
public class Object2StringFieldValueStrategy implements FieldValueStrategy {
@Override
public String formatValue(Object propertyValue) {
return propertyValue.toString();
}
@Override
public boolean checkStrategyType(String fieldType, String fieldName, Object propertyValue) {
return "java.lang.String".equals(fieldType);
}
}
package com.brilliance.strategy;
import java.util.ArrayList;
import java.util.List;
/**
* @Description 策略工厂
* @Author s_guodong
* @Date 2022/4/29
*/
public class StrategyFactory {
private static final List<FieldValueStrategy> strategies = new ArrayList() {
{
this.add(new Date2StringFieldValueStrategy());
this.add(new Time2StringFieldValueStrategy());
this.add(new List2StringFieldValueStrategy());
this.add(new List2ListFieldValueStrategy());
this.add(new Object2StringFieldValueStrategy());
}
};
public static FieldValueStrategy getStrategy(String fieldType, String fieldName, Object propertyValue) {
for (FieldValueStrategy strategy : strategies) {
boolean b = strategy.checkStrategyType(fieldType, fieldName, propertyValue);
if (b) {
return strategy;
}
}
return null;
}
}
package com.brilliance.strategy;
import com.brilliance.DateUtil;
import java.util.Date;
/**
* @Description 时间转换为String
* @Author s_guodong
* @Date 2022/4/29
*/
public class Time2StringFieldValueStrategy implements FieldValueStrategy {
@Override
public String formatValue(Object propertyValue) {
Date date = (Date) propertyValue;
return DateUtil.formatTime(date);
}
@Override
public boolean checkStrategyType(String fieldType, String fieldName, Object propertyValue) {
return propertyValue instanceof Date && "java.lang.String".equals(fieldType) && fieldName.endsWith("Tm");
}
}
package com.brilliance.strategy;
import com.brilliance.DateUtil;
import java.util.Date;
/**
* @Description 时间转换为String
* @Author s_guodong
* @Date 2022/4/29
*/
public class ZoneTime2StringFieldValueStrategy implements FieldValueStrategy {
@Override
public String formatValue(Object propertyValue) {
Date date = (Date) propertyValue;
return DateUtil.formatZoneTime(date);
}
@Override
public boolean checkStrategyType(String fieldType, String fieldName, Object propertyValue) {
return propertyValue instanceof Date && "java.lang.String".equals(fieldType) && fieldName.contains("(zoneTime)");
}
}
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