001 /* 002 * CSVFieldMapping.java 003 * 004 * Copyright (C) 2005 Anupam Sengupta ([email protected]) 005 * 006 * This program is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU General Public License 008 * as published by the Free Software Foundation; either version 2 009 * of the License, or (at your option) any later version. 010 * 011 * This program is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 014 * GNU General Public License for more details. 015 * 016 * You should have received a copy of the GNU General Public License 017 * along with this program; if not, write to the Free Software 018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 019 * 020 * Version: $Revision: 1.3 $ 021 */ 022 package net.sf.anupam.csv.mapping; 023 024 import net.sf.anupam.csv.formatters.CSVFieldFormatter; 025 026 import org.apache.commons.lang.StringUtils; 027 import org.apache.commons.lang.builder.EqualsBuilder; 028 import org.apache.commons.lang.builder.ToStringBuilder; 029 import org.apache.commons.lang.builder.HashCodeBuilder; 030 import org.apache.commons.lang.builder.CompareToBuilder; 031 032 /** 033 * Represents a single CSV field to Java Bean attribute mapping. The mapping can 034 * be for basic data types, or point to other referenced CSV bean mappings for 035 * representing nested beans. 036 * 037 * @author Anupam Sengupta 038 * @version $Revision: 1.3 $ 039 * @see CSVBeanMapping 040 * @since 1.5 041 */ 042 public class CSVFieldMapping implements Comparable<CSVFieldMapping> { 043 044 /** 045 * user defined name of CSV field being mapped. 046 */ 047 private String fieldName; 048 049 /** 050 * Fully qualified class name of the field being mapped. 051 */ 052 private String fieldType; 053 054 /** 055 * The CSV field position (starting at 0). 056 */ 057 private int fieldPosition; 058 059 /** 060 * Name of the bean's attribute. 061 */ 062 private String attributeName; 063 064 /** 065 * The CSV field formatter to use for this field. 066 */ 067 private CSVFieldFormatter formatter; 068 069 /** 070 * Declarative name of the CSV field formatter to use. 071 */ 072 private String reformatterName; 073 074 /** 075 * Declarative bean name of the being being referenced by this field 076 * mapping. 077 */ 078 private String beanReferenceName; 079 080 /** 081 * The CSV bean mapping referenced by this field mapping. 082 */ 083 private CSVBeanMapping beanReference; 084 085 /** 086 * Constructor for CSVFieldMapping. 087 */ 088 public CSVFieldMapping() { 089 super(); 090 } 091 092 /** 093 * Returns the hash code for this field mapping. The hash code is based on the 094 * field name and the field position. 095 * 096 * @return the hash code 097 * @see Object#hashCode() 098 */ 099 @Override 100 public int hashCode() { 101 return new HashCodeBuilder().append(fieldName).append(fieldPosition) 102 .toHashCode(); 103 } 104 105 /** 106 * Compares this field mapping with another for equality. Field mappings are compared 107 * for the name and the field position. 108 * 109 * @param other the other field mapping to compare against 110 * @return <code>true</code> if equal, <code>false</code> otherwise 111 * @see Object#equals(Object) 112 */ 113 @Override 114 public boolean equals(final Object other) { 115 if (this == other) { 116 return true; 117 } 118 if (!(other instanceof CSVFieldMapping)) { 119 return false; 120 } 121 final CSVFieldMapping castOther = (CSVFieldMapping) other; 122 return new EqualsBuilder().append(fieldName, castOther.fieldName) 123 .append(fieldPosition, castOther.fieldPosition).isEquals(); 124 } 125 126 /** 127 * Dumps the contents of this field mapping as a string. This is meant for 128 * <strong>debugging</strong> only. 129 * 130 * @return the string representation 131 * @see Object#toString() 132 */ 133 @Override 134 public String toString() { 135 final ToStringBuilder strBuilder = new ToStringBuilder(this); 136 strBuilder.append("fieldName", fieldName) 137 .append("fieldType", fieldType).append("fieldPosition", 138 fieldPosition).append("attributeName", attributeName) 139 .append("reformatterName", reformatterName); 140 141 strBuilder.append("FormatterClass", (formatter != null ? formatter 142 .getClass() : "None")); 143 strBuilder.append("beanReferenceName", beanReferenceName); 144 strBuilder 145 .append("Bean Reference Class", 146 (beanReference != null) ? beanReference.getBeanClass() 147 : "None"); 148 return strBuilder.toString(); 149 } 150 151 /** 152 * Compares this field mapping to another mapping. The comparision is based on 153 * the field position. 154 * 155 * @param other the other field mapping to compare to 156 * @return <code>0</code> if the two field mappings are equal, <code>-1</code> if this 157 * field mapping position is less than the other's, and <code>+1</code> if this field mapping 158 * position is higher than the others. 159 * @see Comparable#compareTo 160 */ 161 public int compareTo(final CSVFieldMapping other) { 162 if (this.equals(other)) { 163 return 0; 164 } else { 165 return new CompareToBuilder().append(this.getFieldName(), other.getFieldName()) 166 .append(this.getFieldPosition(), other.getFieldPosition()).toComparison(); 167 168 169 } 170 171 } 172 173 /** 174 * Returns the mapped POJO bean's attribute name corresponding to this field. 175 * 176 * @return Returns the mapped POJO attribute name 177 */ 178 public String getAttributeName() { 179 return this.attributeName; 180 } 181 182 /** 183 * Sets the mapped POJO's attribute name corresponding to this field. The name has to <strong>exactly</strong> 184 * match the attribute name (including the case). 185 * 186 * @param attributeName The mapped POJO' attribute name 187 */ 188 public void setAttributeName(final String attributeName) { 189 this.attributeName = StringUtils.trim(attributeName); 190 } 191 192 /** 193 * Returns the user defined name of this field. 194 * 195 * @return Returns the name of this field. 196 */ 197 public String getFieldName() { 198 return this.fieldName; 199 } 200 201 /** 202 * Sets the user defined name of this field. This need not be same 203 * as the CSV field name (if defined on the CSV header row). 204 * 205 * @param fieldName The name of this field 206 */ 207 public void setFieldName(final String fieldName) { 208 this.fieldName = StringUtils.trim(fieldName); 209 } 210 211 /** 212 * Returns this field's position in the CSV line. Field positions 213 * start at 0. 214 * 215 * @return Returns the field's position 216 */ 217 public int getFieldPosition() { 218 return this.fieldPosition; 219 } 220 221 /** 222 * Sets this field's position in the CSV line. Field positions start 223 * at 0. 224 * 225 * @param fieldPosition The field's position in the CSV line 226 */ 227 public void setFieldPosition(final int fieldPosition) { 228 this.fieldPosition = fieldPosition; 229 } 230 231 /** 232 * Returns the fully qualified Java type name of this field. 233 * 234 * @return Returns the Java type name of this field 235 */ 236 public String getFieldType() { 237 return this.fieldType; 238 } 239 240 /** 241 * Sets the fully qualified Java type name of this field. 242 * 243 * @param fieldType The Java type name of this field 244 */ 245 public void setFieldType(final String fieldType) { 246 this.fieldType = StringUtils.trim(fieldType); 247 } 248 249 /** 250 * Returns the CSV formatter attached to this field. 251 * 252 * @return Returns the formatter 253 */ 254 public CSVFieldFormatter getFormatter() { 255 return this.formatter; 256 } 257 258 /** 259 * Sets the formatter attached to this field. 260 * 261 * @param formatter The formatter to set 262 */ 263 public void setFormatter(final CSVFieldFormatter formatter) { 264 this.formatter = formatter; 265 } 266 267 /** 268 * Returns the declarative name of the formatter attached to this field. 269 * 270 * @return Returns the declarative formatter name 271 */ 272 public String getReformatterName() { 273 return this.reformatterName; 274 } 275 276 /** 277 * Sets the declarative name of the formatter attached to this field. 278 * 279 * @param reformatterName The declarative formatter name to set 280 */ 281 public void setReformatterName(final String reformatterName) { 282 this.reformatterName = reformatterName; 283 } 284 285 /** 286 * Returns the declarative name of the referenced bean mapping for this field, or 287 * <code>null</code> if no bean mapping if referenced by this field. 288 * 289 * @return Returns name of the referenced bean mapping 290 */ 291 public String getBeanReferenceName() { 292 return this.beanReferenceName; 293 } 294 295 /** 296 * Sets the declarative name of a referenced bean mapping for this 297 * field. 298 * 299 * @param beanReferenceName The declarative name of the referenced bean 300 */ 301 public void setBeanReferenceName(final String beanReferenceName) { 302 this.beanReferenceName = beanReferenceName; 303 } 304 305 /** 306 * Sets the referenced bean mapping for this field. 307 * 308 * @param beanReference The bean mapping reference to set 309 */ 310 public void setBeanReference(final CSVBeanMapping beanReference) { 311 this.beanReference = beanReference; 312 } 313 314 /** 315 * Returns the referenced bean mapping, if one is present. Returns 316 * <code>null</code> if this field does not have any bean reference. 317 * 318 * @return Returns the bean mapping reference 319 */ 320 public CSVBeanMapping getBeanReference() { 321 return this.beanReference; 322 } 323 324 }