1 /* 2 * Copyright 2003-2004 The Apache Software Foundation 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package org.apache.commons.convert1.array; 17 18 import java.lang.reflect.Array; 19 import java.util.List; 20 import java.util.Iterator; 21 22 import org.apache.commons.convert1.ConversionException; 23 import org.apache.commons.convert1.Converter; 24 25 import org.apache.commons.convert1.ConvertRegistry; 26 27 28 /** 29 * <p>Standard {@link Converter} implementation that converts an incoming 30 * comma delimited String into a known Java class via another Converter. 31 * 32 * @author Henri Yandell 33 * @version $Id: ArrayConverter.java 155441 2005-02-26 13:19:22Z dirkv $ 34 * @since 0.1 35 */ 36 public class ArrayConverter implements Converter { 37 38 private ConvertRegistry registry; 39 private Converter converter; 40 41 /** 42 * Handles multiple types of sub-type by reusing a 43 * particular registry for the sub-elements. 44 */ 45 public ArrayConverter(ConvertRegistry registry) { 46 this.registry = registry; 47 } 48 49 /** 50 * Handles only one type of element converter. 51 */ 52 public ArrayConverter(Converter converter) { 53 this.converter = converter; 54 } 55 56 /** 57 * Convert the specified input object into an output object of the 58 * specified type. 59 * 60 * @param type Data type to which this value should be converted 61 * @param value The input value to be converted 62 * 63 * @exception ConversionException if conversion cannot be performed 64 * successfully 65 */ 66 public Object convert(Class toClass, Object value) { 67 68 if (value == null) { 69 return null; // ignore defaults for the moment 70 } 71 72 // parse the comma delimitation. 73 //H? can we abstract this somehow? 74 // An ElementProvider? 75 List elements = StringArrayParser.parseElements(value.toString()); 76 77 // assume that toClass is an array?? 78 if( toClass.isArray() ) { 79 toClass = toClass.getComponentType(); 80 } 81 Object array = Array.newInstance( toClass, elements.size() ); 82 83 if(registry != null) { 84 converter = this.registry.lookup( String.class, toClass ); 85 } 86 87 Iterator itr = elements.iterator(); 88 int idx = 0; 89 while(itr.hasNext()) { 90 Array.set( array, idx, converter.convert( toClass, itr.next() ) ); 91 idx++; 92 } 93 94 return array; 95 } 96 97 }