001 package liquibase.util.csv.opencsv.bean; 002 003 /** 004 * Copyright 2007 Kyle Miller. 005 * 006 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 012 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 013 * specific language governing permissions and limitations under the License. 014 */ 015 016 import liquibase.util.csv.opencsv.CSVReader; 017 018 import java.beans.IntrospectionException; 019 import java.beans.PropertyDescriptor; 020 import java.beans.PropertyEditor; 021 import java.beans.PropertyEditorManager; 022 import java.io.Reader; 023 import java.lang.reflect.InvocationTargetException; 024 import java.util.ArrayList; 025 import java.util.List; 026 027 public class CsvToBean { 028 029 public CsvToBean() { 030 } 031 032 public List parse(MappingStrategy mapper, Reader reader) { 033 try { 034 CSVReader csv = new CSVReader(reader); 035 mapper.captureHeader(csv); 036 String[] line; 037 List list = new ArrayList(); 038 while (null != (line = csv.readNext())) { 039 Object obj = processLine(mapper, line); 040 list.add(obj); 041 } 042 return list; 043 } catch (Exception e) { 044 throw new RuntimeException("Error parsing CSV!", e); 045 } 046 } 047 048 protected Object processLine(MappingStrategy mapper, String[] line) throws IllegalAccessException, 049 InvocationTargetException, InstantiationException, IntrospectionException { 050 Object bean = mapper.createBean(); 051 for (int col = 0; col < line.length; col++) { 052 String value = line[col]; 053 PropertyDescriptor prop = mapper.findDescriptor(col); 054 if (null != prop) { 055 Object obj = convertValue(value, prop); 056 prop.getWriteMethod().invoke(bean, new Object[] { obj }); 057 } 058 } 059 return bean; 060 } 061 062 protected Object convertValue(String value, PropertyDescriptor prop) throws InstantiationException, 063 IllegalAccessException { 064 PropertyEditor editor = getPropertyEditor(prop); 065 Object obj = value; 066 if (null != editor) { 067 editor.setAsText(value); 068 obj = editor.getValue(); 069 } 070 return obj; 071 } 072 073 /* 074 * Attempt to find custom property editor on descriptor first, else try the propery editor manager. 075 */ 076 protected PropertyEditor getPropertyEditor(PropertyDescriptor desc) throws InstantiationException, 077 IllegalAccessException { 078 Class cls = desc.getPropertyEditorClass(); 079 if (null != cls) 080 return (PropertyEditor) cls.newInstance(); 081 return PropertyEditorManager.findEditor(desc.getPropertyType()); 082 } 083 084 }