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.ArrayUtil; 032 033/** 034 * @author Franck WOLFF 035 */ 036public class Collection2Array extends Converter { 037 038 public Collection2Array(Converters converters) { 039 super(converters); 040 } 041 042 @Override 043 protected boolean internalCanConvert(Object value, Type targetType) { 044 Type targetComponentType = ArrayUtil.getComponentType(targetType); 045 046 if (targetComponentType == null) 047 return false; // not an array. 048 049 if (value == null) 050 return true; 051 052 if (!(value instanceof Collection<?>)) 053 return false; 054 055 if (targetComponentType.equals(Object.class)) 056 return true; 057 058 Converter itemConverter = null; 059 for (Object item : (Collection<?>)value) { 060 061 if (itemConverter == null) 062 itemConverter = converters.getConverter(item, targetComponentType); 063 else if (!itemConverter.canConvert(item, targetComponentType)) 064 itemConverter = converters.getConverter(item, targetComponentType); 065 066 if (itemConverter == null) 067 return false; 068 } 069 070 return true; 071 } 072 073 @Override 074 protected Object internalConvert(Object value, Type targetType) { 075 076 if (value == null) 077 return null; 078 079 if (value instanceof Collection<?>) { 080 Collection<?> c = (Collection<?>)value; 081 082 Type targetComponentType = ArrayUtil.getComponentType(targetType); 083 if (targetComponentType != null) { 084 Converter itemConverter = null; 085 final Object array = ArrayUtil.newArray(targetComponentType, c.size()); 086 int i = 0; 087 for (Object item : c) { 088 089 if (itemConverter == null) 090 itemConverter = converters.getConverter(item, targetComponentType); 091 else if (!itemConverter.canConvert(item, targetComponentType)) 092 itemConverter = converters.getConverter(item, targetComponentType); 093 094 if (itemConverter == null) 095 throw new IllegalConverterArgumentException(this, value, targetType); 096 097 Array.set(array, i++, itemConverter.convert(item, targetComponentType)); 098 } 099 return array; 100 } 101 } 102 103 throw new IllegalConverterArgumentException(this, value, targetType); 104 } 105}