package egovframework.rte.itl.integration.type.support; import java.util.HashMap; import java.util.Map; import egovframework.rte.itl.integration.metadata.RecordTypeDefinition; import egovframework.rte.itl.integration.metadata.RecordTypeFieldDefinition; import egovframework.rte.itl.integration.metadata.dao.RecordTypeDefinitionDao; import egovframework.rte.itl.integration.type.CircularInheritanceException; import egovframework.rte.itl.integration.type.ListType; import egovframework.rte.itl.integration.type.NoSuchTypeException; import egovframework.rte.itl.integration.type.PrimitiveType; import egovframework.rte.itl.integration.type.RecordType; import egovframework.rte.itl.integration.type.Type; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class TypeLoaderUsingMetadataTest { private static TypeLoaderUsingMetadata typeLoader; @BeforeClass public static void beforeClass() throws Exception { RecordTypeDefinitionDao recordTypeDefinitionDao = new RecordTypeDefinitionDao() { private final RecordTypeDefinition header = new RecordTypeDefinition("header", "header", null, new HashMap<String, RecordTypeFieldDefinition>() { /** * serialVersion UID */ private static final long serialVersionUID = -7181896004770582181L; { put("serviceId", new RecordTypeFieldDefinition("string")); } }); private final RecordTypeDefinition recordJuminCheck = new RecordTypeDefinition("recordJuminCheck", "recordJuminCheck", null, new HashMap<String, RecordTypeFieldDefinition>() { /** * serialVersion UID */ private static final long serialVersionUID = 5773848040359641226L; { put("juminNo", new RecordTypeFieldDefinition("string")); put("name", new RecordTypeFieldDefinition("string")); put("children", new RecordTypeFieldDefinition("recordJuminCheckList")); } }); private final RecordTypeDefinition recordJuminCheckList = new RecordTypeDefinition("recordJuminCheckList", "recordJuminCheckList", null, new HashMap<String, RecordTypeFieldDefinition>() { /** * serialVersion UID */ private static final long serialVersionUID = -8731641108089143386L; { // put("list", new RecordTypeFieldDefinition("list", "recordJuminCheck[]")); put("list", new RecordTypeFieldDefinition("recordJuminCheck[]")); } }); private final RecordTypeDefinition messageJuminCheck = new RecordTypeDefinition("messageJuminCheck", "messageJuminCheck", header, new HashMap<String, RecordTypeFieldDefinition>() { /** * serialVersion UID */ private static final long serialVersionUID = -6827218667391768161L; { // put("body", new RecordTypeFieldDefinition("body", "recordJuminCheck")); put("body", new RecordTypeFieldDefinition("recordJuminCheck")); } }); private final RecordTypeDefinition messageJuminCheckList = new RecordTypeDefinition("messageJuminCheckList", "messageJuminChecklist", header, new HashMap<String, RecordTypeFieldDefinition>() { /** * serialVersion UID */ private static final long serialVersionUID = -8701473491681953372L; { // put("serviceId", new RecordTypeFieldDefinition("serviceId", "integer")); // put("body", new RecordTypeFieldDefinition("body", "recordJuminCheckList")); put("serviceId", new RecordTypeFieldDefinition("integer")); put("body", new RecordTypeFieldDefinition("recordJuminCheckList")); } }); private final RecordTypeDefinition messageCircularA = new RecordTypeDefinition("messageCircularA", "messageCircularA", null, new HashMap<String, RecordTypeFieldDefinition>() { /** * serialVersion UID */ private static final long serialVersionUID = -3390525326521171121L; { // put("data", new RecordTypeFieldDefinition("data", "integer")); put("data", new RecordTypeFieldDefinition("integer")); } }); private final RecordTypeDefinition messageCircularB = new RecordTypeDefinition("messageCircularB", "messageCircularB", messageCircularA, new HashMap<String, RecordTypeFieldDefinition>() { /** * serialVersion UID */ private static final long serialVersionUID = -4010838890333553878L; { // put("data", new RecordTypeFieldDefinition("data", "integer")); put("data", new RecordTypeFieldDefinition("integer")); } }); private final RecordTypeDefinition messageCircularC = new RecordTypeDefinition("messageCircularC", "messageCircularC", messageCircularA, new HashMap<String, RecordTypeFieldDefinition>() { /** * serialVersion UID */ private static final long serialVersionUID = -1370456063910326717L; { // put("data", new RecordTypeFieldDefinition("data", "integer")); put("data", new RecordTypeFieldDefinition("integer")); } }); private final Map<String, RecordTypeDefinition> map = new HashMap<String, RecordTypeDefinition>() { /** * serialVersion UID */ private static final long serialVersionUID = 3173940718644980847L; { put(header.getId(), header); put(recordJuminCheck.getId(), recordJuminCheck); put(recordJuminCheckList.getId(), recordJuminCheckList); put(messageJuminCheck.getId(), messageJuminCheck); put(messageJuminCheckList.getId(), messageJuminCheckList); messageCircularA.setParent(messageCircularC); put(messageCircularA.getId(), messageCircularA); put(messageCircularB.getId(), messageCircularB); put(messageCircularC.getId(), messageCircularC); } }; public RecordTypeDefinition getRecordTypeDefinition(String id) { return map.get(id); } }; typeLoader = new TypeLoaderUsingMetadata(); typeLoader.setRecordTypeDefinitionDao(recordTypeDefinitionDao); } @Test public void testPrimitiveType() { Assert.assertEquals(PrimitiveType.BOOLEAN, typeLoader.getType("boolean")); Assert.assertEquals(PrimitiveType.STRING, typeLoader.getType("string")); Assert.assertEquals(PrimitiveType.BYTE, typeLoader.getType("byte")); Assert.assertEquals(PrimitiveType.SHORT, typeLoader.getType("short")); Assert.assertEquals(PrimitiveType.INTEGER, typeLoader.getType("integer")); Assert.assertEquals(PrimitiveType.LONG, typeLoader.getType("long")); Assert.assertEquals(PrimitiveType.BIGINTEGER, typeLoader.getType("biginteger")); Assert.assertEquals(PrimitiveType.FLOAT, typeLoader.getType("float")); Assert.assertEquals(PrimitiveType.DOUBLE, typeLoader.getType("double")); Assert.assertEquals(PrimitiveType.BIGDECIMAL, typeLoader.getType("bigdecimal")); Assert.assertEquals(PrimitiveType.CALENDAR, typeLoader.getType("calendar")); } @Test public void testSimpleRecord() { String id = "header"; Type type = typeLoader.getType(id); Assert.assertEquals(id, type.getId()); Assert.assertEquals(RecordType.class, type.getClass()); Assert.assertEquals(PrimitiveType.STRING, ((RecordType) type).getFieldType("serviceId")); } @Test public void testComplexRecord() { String id = "messageJuminCheck"; Type type = typeLoader.getType(id); Assert.assertEquals(id, type.getId()); Assert.assertEquals(RecordType.class, type.getClass()); RecordType recordType = (RecordType) type; Assert.assertEquals(PrimitiveType.STRING, recordType.getFieldType("serviceId")); Assert.assertEquals(typeLoader.getType("recordJuminCheck"), recordType.getFieldType("body")); } @Test public void testInheritance() { String id = "messageJuminCheckList"; Type type = typeLoader.getType(id); Assert.assertEquals(id, type.getId()); Assert.assertEquals(RecordType.class, type.getClass()); RecordType recordType = (RecordType) type; Assert.assertEquals(PrimitiveType.INTEGER, recordType.getFieldType("serviceId")); } @Test public void testCircularReference() { String id = "messageJuminCheckList"; Type type = typeLoader.getType(id); Assert.assertEquals(id, type.getId()); Assert.assertEquals(RecordType.class, type.getClass()); RecordType recordType = (RecordType) type; Type bodyFieldType = recordType.getFieldType("body"); Assert.assertEquals(RecordType.class, bodyFieldType.getClass()); RecordType bodyRecordType = (RecordType) bodyFieldType; Type listFieldType = bodyRecordType.getFieldType("list"); Assert.assertEquals(ListType.class, listFieldType.getClass()); Assert.assertEquals(typeLoader.getType("recordJuminCheck"), ((ListType) listFieldType).getElementType()); Type elementType = ((ListType) listFieldType).getElementType(); Assert.assertEquals(RecordType.class, elementType.getClass()); RecordType elementRecordType = (RecordType) elementType; Assert.assertEquals(bodyFieldType, elementRecordType.getFieldType("children")); } @Test public void testNoSuchTypeException() { try { typeLoader.getType("noMessage"); Assert.fail(); } catch (NoSuchTypeException e) { // Success } catch (Exception e) { Assert.fail(); } } @Test public void testCircularInheritanceException() { try { typeLoader.getType("messageCircularA"); Assert.fail(); } catch (CircularInheritanceException e) { // Success } catch (Exception e) { Assert.fail(); } } }