001/** 002 * GRANITE DATA SERVICES 003 * Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S. 004 * 005 * This file is part of the Granite Data Services Platform. 006 * 007 * Granite Data Services is free software; you can redistribute it and/or 008 * modify it under the terms of the GNU Lesser General Public 009 * License as published by the Free Software Foundation; either 010 * version 2.1 of the License, or (at your option) any later version. 011 * 012 * Granite Data Services is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 015 * General Public License for more details. 016 * 017 * You should have received a copy of the GNU Lesser General Public 018 * License along with this library; if not, write to the Free Software 019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 020 * USA, or see <http://www.gnu.org/licenses/>. 021 */ 022package org.granite.messaging.amf.io.convert.impl; 023 024import java.lang.reflect.Array; 025import java.lang.reflect.Type; 026import java.util.Collection; 027 028import org.granite.messaging.amf.io.convert.Converter; 029import org.granite.messaging.amf.io.convert.Converters; 030import org.granite.messaging.amf.io.convert.IllegalConverterArgumentException; 031import org.granite.util.TypeUtil; 032import org.granite.util.CollectionUtil; 033 034/** 035 * @author Franck WOLFF 036 */ 037public class Array2Collection extends Converter { 038 039 public Array2Collection(Converters converters) { 040 super(converters); 041 } 042 043 @Override 044 protected boolean internalCanConvert(Object value, Type targetType) { 045 046 Type targetComponentType = CollectionUtil.getComponentType(targetType); 047 if (targetComponentType == null) 048 return false; // not a collection. 049 050 if (value == null) 051 return true; 052 053 if (!value.getClass().isArray()) 054 return false; 055 056 Class<?> oComponentClass = value.getClass().getComponentType(); 057 if (targetComponentType.equals(oComponentClass)) 058 return true; 059 060 Converter itemConverter = null; 061 final int length = Array.getLength(value); 062 for (int i = 0; i < length; i++) { 063 Object item = Array.get(value, i); 064 065 if (itemConverter == null) 066 itemConverter = converters.getConverter(item, targetComponentType); 067 else if (!itemConverter.canConvert(item, targetComponentType)) 068 itemConverter = converters.getConverter(item, targetComponentType); 069 070 if (itemConverter == null) 071 return false; 072 } 073 074 return true; 075 } 076 077 @Override 078 protected Object internalConvert(Object value, Type targetType) { 079 080 if (value == null) 081 return null; 082 083 if (value.getClass().isArray()) { 084 Type targetComponentType = CollectionUtil.getComponentType(targetType); 085 086 if (targetComponentType != null) { 087 final int length = Array.getLength(value); 088 Class<?> targetClass = TypeUtil.classOfType(targetType); 089 090 Collection<Object> targetInstance = null; 091 try { 092 targetInstance = CollectionUtil.newCollection(targetClass, Array.getLength(value)); 093 } catch (Exception e) { 094 throw new IllegalConverterArgumentException(this, value, targetType, e); 095 } 096 097 Converter itemConverter = null; 098 for (int i = 0; i < length; i++) { 099 Object item = Array.get(value, i); 100 101 if (itemConverter == null) 102 itemConverter = converters.getConverter(item, targetComponentType); 103 else if (!itemConverter.canConvert(item, targetComponentType)) 104 itemConverter = converters.getConverter(item, targetComponentType); 105 106 if (itemConverter == null) 107 throw new IllegalConverterArgumentException(this, value, targetType); 108 109 targetInstance.add(itemConverter.convert(item, targetComponentType)); 110 } 111 112 return targetInstance; 113 } 114 } 115 116 throw new IllegalConverterArgumentException(this, value, targetType); 117 } 118}