/* * 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 org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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; /** * Map, List 등으로 구성된 메시지와 Value Object 간의 변환을 수행하는 구현 * 클래스 * <p> * <b>NOTE:</b> Map, List 등으로 구성된 메시지와 Value Object 간의 * 변환을 수행하는 class이다. * @author 실행환경 개발팀 심상호 * @since 2009.06.01 * @version 1.0 * @see <pre> * == 개정이력(Modification Information) == * * 수정일 수정자 수정내용 * ------- -------- --------------------------- * 2009.06.01 심상호 최초 생성 * * </pre> */ public class MessageConverterImpl implements MessageConverter { private Log LOG = LogFactory.getLog(this.getClass()); /** 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 { LOG.debug("convertToValueObject(source = " + source + ", type = " + type + ")"); if (type instanceof PrimitiveType) { LOG.debug("Type is a Primitive Type"); return source; } else if (type instanceof ListType) { LOG.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) { LOG.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; } LOG.error("Type is invalid"); throw new InstantiationException(); } public Object convertToTypedObject(Object source, Type type) throws ClassNotFoundException, IllegalAccessException, NoSuchFieldException, InstantiationException { LOG.debug("convertToTypedObject(source = " + source + ", type = " + type + ")"); if (type instanceof PrimitiveType) { LOG.debug("Type is a Primitive Type"); return source; } else if (type instanceof ListType) { LOG.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) { LOG.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; } LOG.error("Type is invalid"); throw new InstantiationException(); } }