1 22 package net.sf.anupam.csv; 23 24 import net.sf.anupam.csv.formatters.CSVFieldFormatter; 25 import net.sf.anupam.csv.mapping.CSVBeanMapping; 26 import net.sf.anupam.csv.mapping.CSVFieldMapping; 27 import org.apache.commons.beanutils.BeanUtils; 28 import org.apache.commons.lang.builder.ToStringBuilder; 29 import org.apache.commons.logging.Log; 30 import org.apache.commons.logging.LogFactory; 31 32 import java.lang.reflect.InvocationTargetException ; 33 import java.util.Iterator ; 34 import java.util.List ; 35 36 59 public class CSVParser implements Iterable <Object > { 60 61 64 private static final Log LOG = LogFactory.getLog(CSVParser.class); 65 66 69 private CSVReader reader; 70 71 74 private CSVBeanMapping rootBeanMapping; 75 76 85 public CSVParser(final CSVBeanMapping rootBeanMapping, 86 final CSVReader reader) { 87 super(); 88 this.rootBeanMapping = rootBeanMapping; 89 this.reader = reader; 90 } 91 92 99 @Override 100 public String toString() { 101 return new ToStringBuilder(this).append("beanMapping", rootBeanMapping) 102 .toString(); 103 } 104 105 111 @Override 112 protected void finalize() throws Throwable { 113 super.finalize(); 114 if (reader != null) { 115 reader.close(); 116 reader = null; 117 } 118 rootBeanMapping = null; 119 } 120 121 124 private final class MappedObjectIterator implements Iterator <Object > { 125 126 129 private Iterator <List <String >> csvLineIter; 130 131 136 MappedObjectIterator(final Iterator <List <String >> csvLineIter) { 137 super(); 138 this.csvLineIter = csvLineIter; 139 } 140 141 147 @Override 148 protected final void finalize() throws Throwable { 149 super.finalize(); 150 csvLineIter = null; 151 } 152 153 159 public final boolean hasNext() { 160 return csvLineIter.hasNext(); 161 } 162 163 171 public Object next() { 172 final List <String > csvLine = csvLineIter.next(); 173 return getMappedBean(csvLine, getRootBeanMapping()); 174 } 175 176 181 public final void remove() { 182 csvLineIter.remove(); 183 } 184 185 192 private String formatValue(final String csvFieldValue, 193 final CSVFieldMapping fieldMapping) { 194 final CSVFieldFormatter formatter = fieldMapping.getFormatter(); 195 if (formatter == null) { 196 return csvFieldValue; 197 } 198 199 return formatter.format(csvFieldValue); 200 } 201 202 209 private Object getMappedBean(final List <String > csvLine, 210 final CSVBeanMapping beanMap) { 211 212 try { 213 final Object bean = Class.forName(beanMap.getBeanClass()) 214 .newInstance(); 215 216 for (CSVFieldMapping fieldMapping : beanMap) { 217 final Object formattedFieldValue; 218 219 if (fieldMapping.getBeanReferenceName().equals("none")) { 220 formattedFieldValue = getMappedField(csvLine, 221 fieldMapping); 222 223 } else { 224 formattedFieldValue = getMappedBean(csvLine, 226 fieldMapping.getBeanReference()); 227 } 228 229 try { 230 BeanUtils.setProperty(bean, fieldMapping 231 .getAttributeName(), formattedFieldValue); 232 } catch (final IllegalAccessException e) { 233 LOG.warn(e); 234 } catch (final InvocationTargetException e) { 235 LOG.warn(e); 236 } 237 } 238 return bean; 239 240 } catch (final ClassNotFoundException e) { 241 LOG.warn("The Bean for class: " + beanMap.getClass() 242 + " could not be instantiated", e); 243 return null; 244 245 } catch (final IllegalAccessException e) { 246 LOG.warn("The Bean for class: " + beanMap.getClass() 247 + " could not be instantiated", e); 248 return null; 249 } catch (final InstantiationException e) { 250 LOG.warn("The Bean for class: " + beanMap.getClass() 251 + " could not be instantiated", e); 252 return null; 253 } 254 } 255 256 263 private Object getMappedField(final List <String > csvLine, 264 final CSVFieldMapping fieldMapping) { 265 266 final String csvFieldValue = csvLine.get(fieldMapping 267 .getFieldPosition()); 268 return formatValue(csvFieldValue, fieldMapping); 269 270 } 271 272 } 273 274 280 public Iterator <Object > iterator() { 281 282 return new MappedObjectIterator(reader.iterator()); 283 } 284 285 293 private CSVBeanMapping getRootBeanMapping() { 294 return this.rootBeanMapping; 295 } 296 297 } 298 | Popular Tags |