Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ac71355e05 | |||
| e0ea4a4f5d | |||
| 82c7c2bc8c | |||
| d469fac2d7 | |||
| 2d3f659012 | |||
| 17f6df5068 | |||
| 0e40c71a9d | |||
| ae629d51e6 |
@@ -231,3 +231,6 @@ gradle-app.setting
|
||||
# End of https://www.gitignore.io/api/java,macos,gradle,intellij
|
||||
/EAISIMWeb/
|
||||
/.apt_generated_tests/
|
||||
|
||||
# 작업내역 문서
|
||||
작업내역_*.md
|
||||
|
||||
@@ -7,6 +7,7 @@ public class SystemKeys {
|
||||
public static final String TRANSFROMER_STRING_TRIMEND = "transformer.string.trimend";
|
||||
public static final String TRANSFROMER_VALIDATION = "transformer.validation";
|
||||
public static final String TRANSFROMER_DECIMALPOINT_ADD = "transformer.decimalpoint.add";
|
||||
public static final String TRANSFROMER_SCIENTIFIC_NORMALIZE = "transformer.scientific.normalize";
|
||||
|
||||
public static final String TRANSFROMER_LAYOUT_CACHE_INIT_ONSTARTUP = "transformer.layout.cache.init.onstartup";
|
||||
public static final String TRANSFROMER_LAYOUT_CACHE_SIZE = "transformer.layout.cache.size";
|
||||
@@ -30,6 +31,7 @@ public class SystemKeys {
|
||||
private static boolean stringTrimEnd = true;
|
||||
private static boolean validationEnabled = true;
|
||||
private static boolean addDecimalpoint = false;
|
||||
private static boolean scientificNormalize = true;
|
||||
|
||||
private static boolean layoutCacheOnStartup = false;
|
||||
|
||||
@@ -64,7 +66,14 @@ public class SystemKeys {
|
||||
} catch (Exception ex) {
|
||||
addDecimalpoint = false;
|
||||
}
|
||||
|
||||
|
||||
sBoolean = System.getProperty(TRANSFROMER_SCIENTIFIC_NORMALIZE, "false");
|
||||
try {
|
||||
scientificNormalize = Boolean.valueOf(sBoolean);
|
||||
} catch (Exception ex) {
|
||||
scientificNormalize = false;
|
||||
}
|
||||
|
||||
sBoolean = System.getProperty(TRANSFROMER_LAYOUT_CACHE_INIT_ONSTARTUP, "false");
|
||||
try {
|
||||
layoutCacheOnStartup = Boolean.valueOf(sBoolean);
|
||||
@@ -86,13 +95,17 @@ public class SystemKeys {
|
||||
}
|
||||
|
||||
public static boolean isValidationEnabled() {
|
||||
return false;
|
||||
return validationEnabled;
|
||||
}
|
||||
|
||||
public static boolean isAddDecimalPointEnabled() {
|
||||
return addDecimalpoint;
|
||||
}
|
||||
|
||||
public static boolean isScientificNormalizeEnabled() {
|
||||
return scientificNormalize;
|
||||
}
|
||||
|
||||
public static boolean isLayoutCacheOnStartup() {
|
||||
return layoutCacheOnStartup;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.eactive.eai.transformer.function.generic;
|
||||
|
||||
import java.util.Stack;
|
||||
|
||||
import org.nfunk.jep.ParseException;
|
||||
import org.nfunk.jep.function.PostfixMathCommand;
|
||||
|
||||
public class ConcatN extends PostfixMathCommand {
|
||||
public ConcatN() {
|
||||
numberOfParameters = -1;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void run(Stack inStack) throws ParseException {
|
||||
checkStack(inStack);
|
||||
|
||||
int n = curNumberOfParameters;
|
||||
if (n < 1) {
|
||||
throw new ParseException("concatN() requires at least 1 parameter");
|
||||
}
|
||||
|
||||
String[] params = new String[n];
|
||||
for (int i = n - 1; i >= 0; i--) {
|
||||
Object p = inStack.pop();
|
||||
if (!(p instanceof String)) {
|
||||
throw new ParseException("Invalid parameter type: parameter " + (i + 1) + " is not a string");
|
||||
}
|
||||
params[i] = (String) p;
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (String s : params) {
|
||||
sb.append(s);
|
||||
}
|
||||
|
||||
inStack.push(sb.toString());
|
||||
}
|
||||
}
|
||||
@@ -166,10 +166,12 @@ public class JSONMessage extends Message {
|
||||
throw new InvalidAccessException("The number of repetitions is different from the number of repetitions of the actual data. , " + item.getName(), item.getItemPath());
|
||||
}
|
||||
} // validation
|
||||
} catch(InvalidAccessException e) {
|
||||
throw e;
|
||||
} catch(Exception e) {
|
||||
throw new InvalidAccessException("setValue error", getItemPath(), null, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void doSetValue(JsonNode node, HashMap validationTargets, String parentPath) {
|
||||
Item item = null;
|
||||
@@ -255,34 +257,49 @@ public class JSONMessage extends Message {
|
||||
} else if(value == null || value.length() == 0) {
|
||||
setObject( itemPath, value );
|
||||
} else {
|
||||
int itemType = item.getDataTypeId();
|
||||
switch(itemType) {
|
||||
case Types.TYPE_INT :
|
||||
case Types.TYPE_SHORT :
|
||||
setInt( itemPath, new Integer(value) );
|
||||
break;
|
||||
case Types.TYPE_LONG :
|
||||
setLong( itemPath, new Long(value) );
|
||||
break;
|
||||
case Types.TYPE_BIGDECIMAL :
|
||||
setBigDecimal( itemPath, new BigDecimal(value) );
|
||||
break;
|
||||
case Types.TYPE_DOUBLE :
|
||||
setDouble( itemPath, new Double(value) );
|
||||
break;
|
||||
case Types.TYPE_FLOAT :
|
||||
setFloat( itemPath, new Float(value) );
|
||||
break;
|
||||
case Types.TYPE_BOOLEAN :
|
||||
setObject( itemPath, new Boolean(value) );
|
||||
break;
|
||||
case Types.TYPE_STRING :
|
||||
setString(itemPath, value);
|
||||
break;
|
||||
default :
|
||||
setString(itemPath, value);
|
||||
break;
|
||||
}
|
||||
int itemType = item.getDataTypeId();
|
||||
try {
|
||||
switch(itemType) {
|
||||
case Types.TYPE_INT :
|
||||
case Types.TYPE_SHORT :
|
||||
setInt( itemPath, new Integer(value) );
|
||||
break;
|
||||
case Types.TYPE_LONG :
|
||||
setLong( itemPath, new Long(value) );
|
||||
break;
|
||||
case Types.TYPE_BIGDECIMAL :
|
||||
if (SystemKeys.isValidationEnabled() && !isValid(value, item.getLength(), item.getDecimalPointLength())) {
|
||||
throw new InvalidAccessException(
|
||||
String.format("Invalid decimal point format Error value=%s,length=%d,pointLength=%d",
|
||||
value, item.getLength(), item.getDecimalPointLength()),
|
||||
itemPath);
|
||||
}
|
||||
setBigDecimal( itemPath, new BigDecimal(value) );
|
||||
break;
|
||||
case Types.TYPE_DOUBLE :
|
||||
setDouble( itemPath, new Double(value) );
|
||||
break;
|
||||
case Types.TYPE_FLOAT :
|
||||
setFloat( itemPath, new Float(value) );
|
||||
break;
|
||||
case Types.TYPE_BOOLEAN :
|
||||
setObject( itemPath, new Boolean(value) );
|
||||
break;
|
||||
case Types.TYPE_STRING :
|
||||
setString(itemPath, value);
|
||||
break;
|
||||
default :
|
||||
setString(itemPath, value);
|
||||
break;
|
||||
}
|
||||
} catch (InvalidAccessException e) {
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
throw new InvalidAccessException(
|
||||
String.format("Type mismatch: value='%s', field='%s', dataType=%s",
|
||||
value, itemPath, Types.getType(itemType)),
|
||||
itemPath, null, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -686,7 +703,15 @@ public class JSONMessage extends Message {
|
||||
}
|
||||
|
||||
private boolean isValid(String value,int length,int pointLength){
|
||||
String[] data = value.replaceAll(" ", "").split("[.]");
|
||||
String normalized = value.replaceAll(" ", "");
|
||||
if (SystemKeys.isScientificNormalizeEnabled()) {
|
||||
try {
|
||||
normalized = new BigDecimal(normalized).toPlainString();
|
||||
} catch (NumberFormatException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
String[] data = normalized.split("[.]");
|
||||
if (pointLength > 0 ){
|
||||
if (data.length ==1){
|
||||
if (data[0].length() > length - pointLength - 1 ){ //정수부 오류
|
||||
|
||||
@@ -0,0 +1,164 @@
|
||||
package com.eactive.eai.transformer;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.nfunk.jep.JEP;
|
||||
|
||||
import com.eactive.eai.transformer.function.generic.ConcatN;
|
||||
|
||||
@DisplayName("ConcatN 가변 파라미터 함수 테스트")
|
||||
class ConcatNFunctionTest {
|
||||
|
||||
private JEP jep;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
jep = new JEP();
|
||||
jep.addStandardFunctions();
|
||||
jep.addStandardConstants();
|
||||
jep.setAllowUndeclared(true);
|
||||
jep.addFunction("concatN", new ConcatN());
|
||||
}
|
||||
|
||||
private String eval(String expr) throws Exception {
|
||||
jep.parseExpression(expr);
|
||||
assertFalse(jep.hasError(), "파싱 오류: " + jep.getErrorInfo());
|
||||
Object result = jep.getValueAsObject();
|
||||
assertFalse(jep.hasError(), "평가 오류: " + jep.getErrorInfo());
|
||||
return (String) result;
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 파라미터 수 변화 테스트
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("파라미터 1개 — 입력값 그대로 반환")
|
||||
void testOneParam() throws Exception {
|
||||
jep.addVariable("a", "Hello");
|
||||
|
||||
String result = eval("concatN(a)");
|
||||
|
||||
assertEquals("Hello", result);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("파라미터 2개 — 기존 Concat 동작과 동일")
|
||||
void testTwoParams() throws Exception {
|
||||
jep.addVariable("a", "Hello");
|
||||
jep.addVariable("b", "World");
|
||||
|
||||
String result = eval("concatN(a, b)");
|
||||
|
||||
assertEquals("HelloWorld", result);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("파라미터 3개")
|
||||
void testThreeParams() throws Exception {
|
||||
jep.addVariable("a", "2024");
|
||||
jep.addVariable("sep", "-");
|
||||
jep.addVariable("b", "01");
|
||||
|
||||
String result = eval("concatN(a, sep, b)");
|
||||
|
||||
assertEquals("2024-01", result);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("파라미터 5개 — 날짜 + 시간 조합")
|
||||
void testFiveParams() throws Exception {
|
||||
jep.addVariable("year", "2024");
|
||||
jep.addVariable("dash", "-");
|
||||
jep.addVariable("month", "05");
|
||||
jep.addVariable("dash2", "-");
|
||||
jep.addVariable("day", "08");
|
||||
|
||||
String result = eval("concatN(year, dash, month, dash2, day)");
|
||||
|
||||
assertEquals("2024-05-08", result);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("파라미터 7개 — 날짜 + 공백 + 시간 조합")
|
||||
void testSevenParams() throws Exception {
|
||||
jep.addVariable("year", "2024");
|
||||
jep.addVariable("dash", "-");
|
||||
jep.addVariable("month", "05");
|
||||
jep.addVariable("day", "08");
|
||||
jep.addVariable("space", " ");
|
||||
jep.addVariable("hour", "14");
|
||||
jep.addVariable("minute", "30");
|
||||
|
||||
String result = eval("concatN(year, dash, month, dash, day, space, hour)");
|
||||
|
||||
assertEquals("2024-05-08 14", result);
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 변수 재할당 후 동일 표현식 재평가 — 파라미터 수 유지, 값만 변경
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("동일 표현식(3개), 변수 값만 변경하여 반복 평가")
|
||||
void testReuseExpressionWithDifferentValues() throws Exception {
|
||||
jep.parseExpression("concatN(code, dash, seq)");
|
||||
assertFalse(jep.hasError());
|
||||
|
||||
jep.addVariable("code", "KOR");
|
||||
jep.addVariable("dash", "-");
|
||||
jep.addVariable("seq", "001");
|
||||
assertEquals("KOR-001", (String) jep.getValueAsObject());
|
||||
|
||||
jep.addVariable("code", "USA");
|
||||
jep.addVariable("seq", "999");
|
||||
assertEquals("USA-999", (String) jep.getValueAsObject());
|
||||
|
||||
jep.addVariable("code", "JPN");
|
||||
jep.addVariable("seq", "042");
|
||||
assertEquals("JPN-042", (String) jep.getValueAsObject());
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 리터럴 / 혼합 사용
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("리터럴 문자열만 5개 사용")
|
||||
void testLiteralsOnly() throws Exception {
|
||||
String result = eval("concatN(\"A\", \"B\", \"C\", \"D\", \"E\")");
|
||||
|
||||
assertEquals("ABCDE", result);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("변수와 리터럴 혼합 — 괄호로 감싸기")
|
||||
void testMixedVariableAndLiteral() throws Exception {
|
||||
jep.addVariable("code", "KOR");
|
||||
jep.addVariable("seq", "001");
|
||||
|
||||
String result = eval("concatN(\"[\", code, \"-\", seq, \"]\")");
|
||||
|
||||
assertEquals("[KOR-001]", result);
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 오류 케이스
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("비문자열(숫자) 파라미터 포함 → 오류 발생")
|
||||
void testNonStringParamCausesError() {
|
||||
// JEP 는 정수 리터럴을 Double 로 처리하므로 평가 시 오류가 발생해야 함
|
||||
jep.parseExpression("concatN(\"A\", 123, \"C\")");
|
||||
if (!jep.hasError()) {
|
||||
jep.getValueAsObject();
|
||||
assertTrue(jep.hasError(), "비문자열 파라미터가 포함된 경우 오류가 발생해야 합니다");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
package com.eactive.eai.transformer;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import com.eactive.eai.transformer.engine.Parser;
|
||||
import com.eactive.eai.transformer.function.generic.ConcatN;
|
||||
|
||||
/**
|
||||
* ParserTest 스타일로 Parser 를 통해 concatN 함수를 검증한다.
|
||||
*
|
||||
* - 표현식은 parse() 한 번 → 변수값만 교체하며 반복 평가 (JEP 재사용 패턴)
|
||||
* - 변수 : parser.addVariable() 로 바인딩
|
||||
* - 상수 : 표현식 안에 "문자열" 리터럴로 직접 기입
|
||||
*/
|
||||
@DisplayName("ConcatN - Parser 변수/상수 혼합 테스트")
|
||||
class ConcatNParserTest {
|
||||
|
||||
private Parser parser;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
parser = new Parser();
|
||||
// DB 등록 전 테스트이므로 직접 등록
|
||||
parser.getJep().addFunction("concatn", new ConcatN());
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 1. 변수만 사용
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("변수 2개 — parse 1회, 값 교체 반복 평가")
|
||||
void testTwoVariables() throws Exception {
|
||||
parser.parse("concatn(a, b)");
|
||||
|
||||
parser.addVariable("a", "Hello");
|
||||
parser.addVariable("b", "World");
|
||||
assertEquals("HelloWorld", parser.getValueAsObject());
|
||||
|
||||
parser.addVariable("a", "foo");
|
||||
parser.addVariable("b", "bar");
|
||||
assertEquals("foobar", parser.getValueAsObject());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("변수 3개")
|
||||
void testThreeVariables() throws Exception {
|
||||
parser.parse("concatn(v1, v2, v3)");
|
||||
|
||||
parser.addVariable("v1", "AAA");
|
||||
parser.addVariable("v2", "BBB");
|
||||
parser.addVariable("v3", "CCC");
|
||||
assertEquals("AAABBBCCC", parser.getValueAsObject());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("변수 5개")
|
||||
void testFiveVariables() throws Exception {
|
||||
parser.parse("concatn(y, m, d, h, mi)");
|
||||
|
||||
parser.addVariable("y", "2024");
|
||||
parser.addVariable("m", "05");
|
||||
parser.addVariable("d", "08");
|
||||
parser.addVariable("h", "14");
|
||||
parser.addVariable("mi", "30");
|
||||
assertEquals("20240508" + "14" + "30", parser.getValueAsObject());
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 2. 변수 + 상수(리터럴) 혼합
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("날짜 구분자 '-' 상수 삽입 — 변수 교체 반복")
|
||||
void testDateWithSeparator() throws Exception {
|
||||
parser.parse("concatn(year, \"-\", month, \"-\", day)");
|
||||
|
||||
parser.addVariable("year", "2024");
|
||||
parser.addVariable("month", "01");
|
||||
parser.addVariable("day", "15");
|
||||
assertEquals("2024-01-15", parser.getValueAsObject());
|
||||
|
||||
parser.addVariable("year", "2025");
|
||||
parser.addVariable("month", "12");
|
||||
parser.addVariable("day", "31");
|
||||
assertEquals("2025-12-31", parser.getValueAsObject());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("접두·접미 상수로 감싸기")
|
||||
void testWrapWithConstants() throws Exception {
|
||||
parser.parse("concatn(\"[\", code, \"-\", seq, \"]\")");
|
||||
|
||||
parser.addVariable("code", "KOR");
|
||||
parser.addVariable("seq", "001");
|
||||
assertEquals("[KOR-001]", parser.getValueAsObject());
|
||||
|
||||
parser.addVariable("code", "USA");
|
||||
parser.addVariable("seq", "999");
|
||||
assertEquals("[USA-999]", parser.getValueAsObject());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("앞에 상수 접두어 + 변수 1개")
|
||||
void testConstantPrefix() throws Exception {
|
||||
parser.parse("concatn(\"REQ-\", txId)");
|
||||
|
||||
parser.addVariable("txId", "20240508001");
|
||||
assertEquals("REQ-20240508001", parser.getValueAsObject());
|
||||
|
||||
parser.addVariable("txId", "20240508002");
|
||||
assertEquals("REQ-20240508002", parser.getValueAsObject());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("변수 사이에 공백 상수 삽입")
|
||||
void testSpaceSeparator() throws Exception {
|
||||
parser.parse("concatn(firstName, \" \", lastName)");
|
||||
|
||||
parser.addVariable("firstName", "Gil-dong");
|
||||
parser.addVariable("lastName", "Hong");
|
||||
assertEquals("Gil-dong Hong", parser.getValueAsObject());
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 3. 성능 측정 (ParserTest 스타일)
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("100만 회 반복 평가 — parse 1회 재사용 성능")
|
||||
void testPerformance() throws Exception {
|
||||
String expr = "concatn(code, \"-\", seq)";
|
||||
parser.parse(expr);
|
||||
|
||||
Object result = null;
|
||||
long t = System.currentTimeMillis();
|
||||
for (int i = 0; i < 1_000_000; i++) {
|
||||
parser.addVariable("code", "KOR");
|
||||
parser.addVariable("seq", String.valueOf(i));
|
||||
result = parser.getValueAsObject();
|
||||
}
|
||||
long elapsed = System.currentTimeMillis() - t;
|
||||
|
||||
System.out.println(String.format("%s = %s %dms", expr, result, elapsed));
|
||||
|
||||
assertEquals("KOR-999999", result);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,470 @@
|
||||
package com.eactive.eai.transformer;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import static org.junit.jupiter.api.Assumptions.assumeTrue;
|
||||
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.jdbc.Sql;
|
||||
|
||||
import com.eactive.eai.transformer.engine.TransformEngine;
|
||||
import com.eactive.eai.transformer.function.jpa.TransformJPATestConfiguration;
|
||||
import com.eactive.eai.transformer.message.Message;
|
||||
import com.eactive.eai.transformer.message.MessageFactory;
|
||||
import com.eactive.eai.transformer.message.MessageSetDataException;
|
||||
|
||||
/**
|
||||
* JSONMessage 필드 validation 단위테스트
|
||||
*
|
||||
* 테스트 대상 레이아웃: EAI_UJSONTYPE_REQ1
|
||||
* - INT_VALUE : INT, length=5, decimal=0
|
||||
* - LONG_VALUE : LONG, length=10, decimal=0
|
||||
* - BIG_VALUE : BIGDECIMAL, length=10, decimal=5 → 정수부 최대 4자리
|
||||
* - BIG15_VALUE : BIGDECIMAL, length=15, decimal=0 → 정수부 최대 15자리
|
||||
* - STR_VALUE : STRING, length=20
|
||||
*
|
||||
* 검증 시나리오
|
||||
* 1-a) 타입 불일치(오류) — 숫자형 필드에 비숫자 문자열 입력 시 setData() 에서 즉시 오류
|
||||
* 1-b) 타입 불일치(정상) — 숫자형 필드에 숫자 문자열 입력 시 파싱 가능하면 정상 처리
|
||||
* 2-a) Java 타입 범위 초과 — INT/LONG 최대값 초과 시 NumberFormatException (validation 설정 무관)
|
||||
* 2-b) BigDecimal 자릿수 초과 (숫자 리터럴) — 정수부/소수부 자릿수 초과 시 즉시 오류
|
||||
* 2-c) BigDecimal 자릿수 초과 (문자열 형태) — JSON 문자열로 전달된 경우도 동일하게 검증
|
||||
* (2-b, 2-c 모두 SystemKeys.TRANSFROMER_VALIDATION=true 필요)
|
||||
* 3) 역방향 타입 — 문자열 필드에 JSON 숫자 입력 시 asText()로 자동 변환 → 오류 없음
|
||||
*/
|
||||
@DataJpaTest
|
||||
@ContextConfiguration(classes = { TransformJPATestConfiguration.class })
|
||||
@Sql({
|
||||
"/com/eactive/eai/transformer/init_tseaitr06.sql",
|
||||
"/com/eactive/eai/transformer/init_json_validation.sql"
|
||||
})
|
||||
@DisplayName("JSONMessage Validation 테스트")
|
||||
class JSONMessageValidationTest {
|
||||
|
||||
@Autowired
|
||||
TransformEngine engine;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
try {
|
||||
if (!engine.isStarted()) {
|
||||
engine.start();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
assumeTrue(false, "TransformEngine 시작 실패: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
void tearDown() {
|
||||
System.setProperty(SystemKeys.TRANSFROMER_VALIDATION, "false");
|
||||
System.setProperty(SystemKeys.TRANSFROMER_SCIENTIFIC_NORMALIZE, "false");
|
||||
SystemKeys.reload();
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 1. 타입 불일치 테스트 — setData() 시점에 오류 발생
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("INT 타입 필드에 비숫자 문자열 입력 → NumberFormatException")
|
||||
void testIntFieldTypeError() {
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"INT_VALUE\":\"abc\"}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsCause(ex, NumberFormatException.class),
|
||||
"원인이 NumberFormatException이어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("LONG 타입 필드에 비숫자 문자열 입력 → NumberFormatException")
|
||||
void testLongFieldTypeError() {
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"LONG_VALUE\":\"not_a_number\"}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsCause(ex, NumberFormatException.class),
|
||||
"원인이 NumberFormatException이어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BIGDECIMAL 타입 필드에 비숫자 문자열 입력 → NumberFormatException")
|
||||
void testBigDecimalFieldTypeError() {
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG_VALUE\":\"invalid_decimal\"}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsCause(ex, NumberFormatException.class),
|
||||
"원인이 NumberFormatException이어야 합니다");
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 1-b. 숫자형 필드에 숫자 문자열 입력 → 정상 처리
|
||||
// JSON 문자열 노드라도 파싱 가능한 숫자면 오류 없이 처리됨
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("INT 타입 필드에 숫자 문자열 입력 → 오류 없이 정상 처리")
|
||||
void testIntFieldWithNumericString() throws Exception {
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"INT_VALUE\":\"42\"}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
msg.setData(data);
|
||||
|
||||
String result = (String) msg.getData();
|
||||
assertNotNull(result, "결과값이 null이 아니어야 합니다");
|
||||
assertTrue(result.contains("\"INT_VALUE\":42"), "INT_VALUE가 숫자 42로 출력되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("LONG 타입 필드에 숫자 문자열 입력 → 오류 없이 정상 처리")
|
||||
void testLongFieldWithNumericString() throws Exception {
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"LONG_VALUE\":\"9876543210\"}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
msg.setData(data);
|
||||
|
||||
String result = (String) msg.getData();
|
||||
assertNotNull(result, "결과값이 null이 아니어야 합니다");
|
||||
assertTrue(result.contains("\"LONG_VALUE\":9876543210"), "LONG_VALUE가 숫자 9876543210으로 출력되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BIGDECIMAL 타입 필드에 숫자 문자열 입력 → 오류 없이 정상 처리")
|
||||
void testBigDecimalFieldWithNumericString() throws Exception {
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG_VALUE\":\"1234.12345\"}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
msg.setData(data);
|
||||
|
||||
String result = (String) msg.getData();
|
||||
assertNotNull(result, "결과값이 null이 아니어야 합니다");
|
||||
assertTrue(result.contains("\"BIG_VALUE\":1234.12345"), "BIG_VALUE가 숫자 1234.12345로 출력되어야 합니다");
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 2-a. INT/LONG Java 타입 범위 초과 — validation 설정 무관하게 NumberFormatException
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("INT 타입 필드에 Integer 최대값 초과 입력 → NumberFormatException")
|
||||
void testIntFieldJavaTypeOverflow() {
|
||||
// Integer.MAX_VALUE = 2147483647, 초과값 → new Integer() 파싱 실패
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"INT_VALUE\":\"2147483648\"}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsCause(ex, NumberFormatException.class),
|
||||
"원인이 NumberFormatException이어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("LONG 타입 필드에 Long 최대값 초과 입력 → NumberFormatException")
|
||||
void testLongFieldJavaTypeOverflow() {
|
||||
// Long.MAX_VALUE = 9223372036854775807, 초과값 → new Long() 파싱 실패
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"LONG_VALUE\":\"9223372036854775808\"}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsCause(ex, NumberFormatException.class),
|
||||
"원인이 NumberFormatException이어야 합니다");
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 2-b. BigDecimal 자릿수 초과 (JSON 숫자 리터럴) — transformer.validation=true 필요
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("BIG_VALUE 정수부 초과(5자리 > 4자리 제한) → MessageSetDataException")
|
||||
void testBigDecimalIntegerPartOverflow() {
|
||||
enableValidation();
|
||||
|
||||
// 정수부 5자리(12345) → 제한(4자리) 초과
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG_VALUE\":12345.12345}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsMessage(ex, "Invalid decimal point format"),
|
||||
"'Invalid decimal point format' 메시지가 포함되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BIG_VALUE 소수부 초과(6자리 > 5자리 제한) → MessageSetDataException")
|
||||
void testBigDecimalFractionalPartOverflow() {
|
||||
enableValidation();
|
||||
|
||||
// 소수부 6자리(123456) → 제한(5자리) 초과
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG_VALUE\":1234.123456}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsMessage(ex, "Invalid decimal point format"),
|
||||
"'Invalid decimal point format' 메시지가 포함되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BIG15_VALUE 정수부 초과(16자리 > 15자리 제한) → MessageSetDataException")
|
||||
void testBigDecimalIntegerOnlyOverflow() {
|
||||
enableValidation();
|
||||
|
||||
// 정수부 16자리 → 제한(15자리) 초과
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG15_VALUE\":1234567890123456}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsMessage(ex, "Invalid decimal point format"),
|
||||
"'Invalid decimal point format' 메시지가 포함되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BIG_VALUE 정상 범위(정수부 4자리 + 소수부 5자리) → 정상 처리")
|
||||
void testBigDecimalWithinBounds() throws Exception {
|
||||
enableValidation();
|
||||
|
||||
// 정수부 4자리 + 소수부 5자리 → 정상
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG_VALUE\":1234.12345}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
msg.setData(data);
|
||||
|
||||
String result = (String) msg.getData();
|
||||
assertNotNull(result, "결과값이 null이 아니어야 합니다");
|
||||
assertTrue(result.contains("BIG_VALUE"), "BIG_VALUE가 결과에 포함되어야 합니다");
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 2-c. BigDecimal 자릿수 초과 (JSON 문자열 형태) — transformer.validation=true 필요
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("BIG_VALUE 정수부 초과 문자열 입력(5자리 > 4자리 제한) → MessageSetDataException")
|
||||
void testBigDecimalIntegerPartOverflowFromString() {
|
||||
enableValidation();
|
||||
|
||||
// JSON 문자열 "12345.12345" → 정수부 5자리 초과
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG_VALUE\":\"12345.12345\"}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsMessage(ex, "Invalid decimal point format"),
|
||||
"'Invalid decimal point format' 메시지가 포함되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BIG_VALUE 소수부 초과 문자열 입력(6자리 > 5자리 제한) → MessageSetDataException")
|
||||
void testBigDecimalFractionalPartOverflowFromString() {
|
||||
enableValidation();
|
||||
|
||||
// JSON 문자열 "1234.123456" → 소수부 6자리 초과
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG_VALUE\":\"1234.123456\"}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsMessage(ex, "Invalid decimal point format"),
|
||||
"'Invalid decimal point format' 메시지가 포함되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BIG15_VALUE 정수부 초과 문자열 입력(16자리 > 15자리 제한) → MessageSetDataException")
|
||||
void testBigDecimalIntegerOnlyOverflowFromString() {
|
||||
enableValidation();
|
||||
|
||||
// JSON 문자열 "1234567890123456" → 정수부 16자리 초과
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG15_VALUE\":\"1234567890123456\"}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsMessage(ex, "Invalid decimal point format"),
|
||||
"'Invalid decimal point format' 메시지가 포함되어야 합니다");
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 3. 역방향 타입 테스트 — 문자열 필드에 숫자 입력 → 정상 처리
|
||||
// JSON 숫자 노드는 node.asText()로 문자열 변환되어 오류 없이 처리됨
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("STRING 타입 필드에 JSON 정수 입력 → 오류 없이 정상 처리")
|
||||
void testStringFieldWithIntegerValue() throws Exception {
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"STR_VALUE\":123}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
msg.setData(data);
|
||||
|
||||
String result = (String) msg.getData();
|
||||
assertNotNull(result, "결과값이 null이 아니어야 합니다");
|
||||
assertTrue(result.contains("STR_VALUE"), "STR_VALUE가 결과에 포함되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("STRING 타입 필드에 JSON 실수 입력 → 오류 없이 정상 처리")
|
||||
void testStringFieldWithDecimalValue() throws Exception {
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"STR_VALUE\":12.34}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
msg.setData(data);
|
||||
|
||||
String result = (String) msg.getData();
|
||||
assertNotNull(result, "결과값이 null이 아니어야 합니다");
|
||||
assertTrue(result.contains("STR_VALUE"), "STR_VALUE가 결과에 포함되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("STRING 타입 필드에 JSON 큰 정수 입력 → 오류 없이 정상 처리")
|
||||
void testStringFieldWithLargeIntegerValue() throws Exception {
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"STR_VALUE\":9876543210}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
msg.setData(data);
|
||||
|
||||
String result = (String) msg.getData();
|
||||
assertNotNull(result, "결과값이 null이 아니어야 합니다");
|
||||
assertTrue(result.contains("STR_VALUE"), "STR_VALUE가 결과에 포함되어야 합니다");
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 4. 지수 표현(Scientific Notation) 정규화 테스트
|
||||
// transformer.scientific.normalize=true 일 때만 적용
|
||||
// 4-a) 정규화 ON + validation ON
|
||||
// 4-b) 정규화 OFF → 기존 동작(false positive / false negative) 확인
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("[정규화 ON] 지수형 정수부 초과(1.23e5=123000 > 4자리 제한) → MessageSetDataException")
|
||||
void testScientificNotationIntegerOverflow_withNormalize() {
|
||||
enableValidation();
|
||||
enableScientificNormalize();
|
||||
|
||||
// 1.23e5 = 123000, 정수부 6자리 > 4자리 제한
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG_VALUE\":1.23e5}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsMessage(ex, "Invalid decimal point format"),
|
||||
"'Invalid decimal point format' 메시지가 포함되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("[정규화 ON] 지수형 문자열 정수부 초과(\"1.23e5\" > 4자리 제한) → MessageSetDataException")
|
||||
void testScientificNotationStringOverflow_withNormalize() {
|
||||
enableValidation();
|
||||
enableScientificNormalize();
|
||||
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG_VALUE\":\"1.23e5\"}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsMessage(ex, "Invalid decimal point format"),
|
||||
"'Invalid decimal point format' 메시지가 포함되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("[정규화 ON] 지수형 BIG15_VALUE 정상 범위(1.23e5=123000 ≤ 15자리) → 정상 처리")
|
||||
void testScientificNotationBig15Valid_withNormalize() throws Exception {
|
||||
enableValidation();
|
||||
enableScientificNormalize();
|
||||
|
||||
// 1.23e5 = 123000, 6자리 ≤ 15자리 제한 → 정상
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG15_VALUE\":1.23e5}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
msg.setData(data);
|
||||
|
||||
String result = (String) msg.getData();
|
||||
assertNotNull(result, "결과값이 null이 아니어야 합니다");
|
||||
assertTrue(result.contains("BIG15_VALUE"), "BIG15_VALUE가 결과에 포함되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("[정규화 OFF] 지수형 BIG15_VALUE 정상값(1.23e5)이 false negative로 거부됨 → MessageSetDataException")
|
||||
void testScientificNotationBig15Valid_withoutNormalize() {
|
||||
enableValidation();
|
||||
disableScientificNormalize();
|
||||
|
||||
// 1.23e5 = 123000, 유효값(6자리 ≤ 15자리)이지만 정규화 없이는 "1.23E+5".split(".")=[2개] → 거부
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG15_VALUE\":1.23e5}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
|
||||
assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data),
|
||||
"정규화 OFF 시 false negative로 예외가 발생해야 합니다"
|
||||
);
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 유틸 메서드
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
private void enableValidation() {
|
||||
System.setProperty(SystemKeys.TRANSFROMER_VALIDATION, "true");
|
||||
SystemKeys.reload();
|
||||
}
|
||||
|
||||
private void enableScientificNormalize() {
|
||||
System.setProperty(SystemKeys.TRANSFROMER_SCIENTIFIC_NORMALIZE, "true");
|
||||
SystemKeys.reload();
|
||||
}
|
||||
|
||||
private void disableScientificNormalize() {
|
||||
System.setProperty(SystemKeys.TRANSFROMER_SCIENTIFIC_NORMALIZE, "false");
|
||||
SystemKeys.reload();
|
||||
}
|
||||
|
||||
private boolean containsCause(Throwable e, Class<?> causeClass) {
|
||||
Throwable t = e;
|
||||
while (t != null) {
|
||||
if (causeClass.isInstance(t)) return true;
|
||||
t = t.getCause();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean containsMessage(Throwable e, String keyword) {
|
||||
Throwable t = e;
|
||||
while (t != null) {
|
||||
if (t.getMessage() != null && t.getMessage().contains(keyword)) return true;
|
||||
t = t.getCause();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
INSERT INTO tseaitr07 (loutname,loutptrnname,loutdesc,lastamndhms,eaibzwkdstcd,uapplname,sysintfacname,eaisevrdstcd,modfimgtstusdstcd,useyn,verinfo,author) VALUES
|
||||
('EAI_UJSONTYPE_REQ1', 'JSON', 'JSON 타입 검증 테스트', '2026042210000000', 'TST', ' ', ' ', 'E', ' ', '1', '00001', 'admin');
|
||||
|
||||
INSERT INTO TSEAITR08 (loutname,loutitemname,loutitemserno,loutitemidname,parntloutitemidname,loutitemdesc,loutitemnodeptrnidname,loutitemptrnidname,loutitempathname,loutitemlencnt,loutitemrefinfo,loutitemrefinfo2,loutitemoccurptrndstcd,loutitemmaxoccurnoitm,loutitemminoccurnoitm,loutitembascval,loutitemmskyn,loutdptcnt,decptlencnt,loutitemrefptrnidname,loutitemmasklength,multilang,loutitemmaskoffset) VALUES
|
||||
('EAI_UJSONTYPE_REQ1', 'EAI_UJSONTYPE_REQ1', 0, 9000, 0, 'JSON 타입 검증 테스트', 2201, 2100, NULL, 0, NULL, NULL, NULL, 0, 0, NULL, NULL, 1, 0, NULL, NULL, NULL, NULL),
|
||||
('EAI_UJSONTYPE_REQ1', 'INT_VALUE', 1, 9001, 9000, 'INT 타입 필드', 2203, 2102, NULL, 5, NULL, NULL, NULL, 1, 1, NULL, 'N', 2, 0, 'Integer', 0, NULL, NULL),
|
||||
('EAI_UJSONTYPE_REQ1', 'LONG_VALUE', 2, 9002, 9000, 'LONG 타입 필드', 2203, 2103, NULL, 10, NULL, NULL, NULL, 1, 1, NULL, 'N', 2, 0, 'Long', 0, NULL, NULL),
|
||||
('EAI_UJSONTYPE_REQ1', 'BIG_VALUE', 3, 9003, 9000, 'BIGDECIMAL length=10 decimal=5', 2203, 2118, NULL, 10, NULL, NULL, NULL, 1, 1, NULL, 'N', 2, 5, 'BigDecimal', 0, NULL, NULL),
|
||||
('EAI_UJSONTYPE_REQ1', 'BIG15_VALUE', 4, 9004, 9000, 'BIGDECIMAL length=15 decimal=0', 2203, 2118, NULL, 15, NULL, NULL, NULL, 1, 1, NULL, 'N', 2, 0, 'BigDecimal', 0, NULL, NULL),
|
||||
('EAI_UJSONTYPE_REQ1', 'STR_VALUE', 5, 9005, 9000, 'STRING 타입 필드', 2203, 2101, NULL, 20, NULL, NULL, NULL, 1, 1, NULL, 'N', 2, 0, 'String', 0, NULL, NULL);
|
||||
Reference in New Issue
Block a user