/* * Copyright 2008-2009 MOPAS(Ministry of Public Administration and Security). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package egovframework.rte.itl.webservice.service.impl; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import egovframework.rte.itl.integration.type.ListType; import egovframework.rte.itl.integration.type.PrimitiveType; import egovframework.rte.itl.integration.type.RecordType; import egovframework.rte.itl.integration.type.Type; import egovframework.rte.itl.webservice.service.EgovWebServiceClassLoader; import egovframework.rte.itl.webservice.service.MessageConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Map, List 등으로 구성된 메시지와 Value Object 간의 변환을 수행하는 구현 클래스 * <p> * <b>NOTE:</b> Map, List 등으로 구성된 메시지와 Value Object 간의 변환을 수행하는 class이다. </p> * * @author 실행환경 개발팀 심상호 * @since 2009.06.01 * @version 1.0 * @see <pre> * == 개정이력(Modification Information) == * * 수정일 수정자 수정내용 * ------- -------- --------------------------- * 2009.06.01 심상호 최초 생성 * * </pre> */ public class MessageConverterImpl implements MessageConverter { private static final Logger LOGGER = LoggerFactory .getLogger(MessageConverterImpl.class); /** EgovWebServiceClassLoader */ private EgovWebServiceClassLoader classLoader; /** * Constructor * * @param classLoader * EgovWebServiceClassLoader * @throws IllegalArgumentException * <code>classLoader</code> 값이 <code>null</code>인 경우 */ public MessageConverterImpl(EgovWebServiceClassLoader classLoader) { super(); if (classLoader == null) { throw new IllegalArgumentException(); } this.classLoader = classLoader; } @SuppressWarnings("unchecked") public Object convertToValueObject(Object source, Type type) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException { LOGGER.debug("convertToValueObject(source = {}, type = {})", source, type); if (type instanceof PrimitiveType) { LOGGER.debug("Type is a Primitive Type"); return source; } else if (type instanceof ListType) { LOGGER.debug("Type is a List Type"); ListType listType = (ListType) type; Object[] components = ((Collection<?>) source).toArray(); Class<?> arrayClass = classLoader.loadClass(listType); Object array = Array.newInstance(arrayClass.getComponentType(), components.length); for (int i = 0; i < components.length; i++) { Array.set( array, i, convertToValueObject(components[i], listType.getElementType())); } return array; } else if (type instanceof RecordType) { LOGGER.debug("Type is a Record(Map) Type"); RecordType recordType = (RecordType) type; Map<String, Object> map = (Map<String, Object>) source; Class<?> recordClass = classLoader.loadClass(recordType); Object record = recordClass.newInstance(); for (Entry<String, Object> entry : map.entrySet()) { Object fieldValue = convertToValueObject(entry.getValue(), recordType.getFieldType(entry.getKey())); recordClass.getField(entry.getKey()).set(record, fieldValue); } return record; } LOGGER.error("Type is invalid"); throw new InstantiationException(); } public Object convertToTypedObject(Object source, Type type) throws ClassNotFoundException, IllegalAccessException, NoSuchFieldException, InstantiationException { LOGGER.debug("convertToTypedObject(source = {}, type = {})", source, type); if (type instanceof PrimitiveType) { LOGGER.debug("Type is a Primitive Type"); return source; } else if (type instanceof ListType) { LOGGER.debug("Type is a List Type"); ListType listType = (ListType) type; Object[] components = (Object[]) source; List<Object> list = new ArrayList<Object>(); for (Object component : components) { list.add(convertToTypedObject(component, listType.getElementType())); } return list; } else if (type instanceof RecordType) { LOGGER.debug("Type is a Record(Map) Type"); RecordType recordType = (RecordType) type; Class<?> recordClass = classLoader.loadClass(recordType); Map<String, Object> map = new HashMap<String, Object>(); for (Entry<String, Type> entry : recordType.getFieldTypes() .entrySet()) { Object fieldValue = recordClass.getField(entry.getKey()).get( source); map.put(entry.getKey(), convertToTypedObject(fieldValue, entry.getValue())); } return map; } LOGGER.error("Type is invalid"); throw new InstantiationException(); } }