net.sf.jxls.reader.BeanCellMapping Maven / Gradle / Ivy
package net.sf.jxls.reader;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.ss.util.CellReference;
/**
* @author Leonid Vysochyn
*/
public class BeanCellMapping {
protected final Log log = LogFactory.getLog(getClass());
int row;
short col;
String propertyName;
String beanKey;
String cell;
String type = null;
boolean nullAllowed = false;
static {
ReaderConfig.getInstance();
}
public BeanCellMapping(int rowNum, short cellNum, String fullPropertyName) {
this.row = rowNum;
this.col = cellNum;
this.beanKey = extractBeanName(fullPropertyName);
this.propertyName = extractPropertyName(fullPropertyName);
}
public BeanCellMapping(String cell, String fullPropertyName) {
setCell(cell);
this.beanKey = extractBeanName(fullPropertyName);
this.propertyName = extractPropertyName(fullPropertyName);
}
public BeanCellMapping(int rowNum, short cellNum, String beanKey, String propertyName) {
this.row = rowNum;
this.col = cellNum;
this.beanKey = beanKey;
this.propertyName = propertyName;
}
public BeanCellMapping(String cell, String beanKey, String propertyName) {
setCell(cell);
this.beanKey = beanKey;
this.propertyName = propertyName;
}
public BeanCellMapping() {
}
public String getBeanKey() {
return beanKey;
}
public void setBeanKey(String beanKey) {
this.beanKey = beanKey;
}
public String getFullPropertyName() {
return beanKey + "." + propertyName;
}
public void setFullPropertyName(String fullPropertyName) {
this.beanKey = extractBeanName(fullPropertyName);
this.propertyName = extractPropertyName(fullPropertyName);
}
private String extractPropertyName(String fullPropertyName) {
if (fullPropertyName == null) {
return null;
}
int dotIndex = fullPropertyName.indexOf('.');
if (dotIndex < 0) {
throw new IllegalArgumentException("Full property name must contain period. Can't extract bean property name from " + fullPropertyName);
} else {
return fullPropertyName.substring(dotIndex + 1);
}
}
private String extractBeanName(String fullPropertyName) {
if (fullPropertyName == null) {
return null;
}
int dotIndex = fullPropertyName.indexOf('.');
if (dotIndex < 0) {
throw new IllegalArgumentException("Full property name must contain period. Can't extract bean name from " + fullPropertyName);
} else {
return fullPropertyName.substring(0, dotIndex);
}
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public short getCol() {
return col;
}
public void setCol(short col) {
this.col = col;
}
public String getCell() {
return cell;
}
public void setCell(String cell) {
this.cell = cell;
CellReference cellRef = new CellReference(cell);
row = cellRef.getRow();
col = cellRef.getCol();
}
public String getPropertyName() {
return propertyName;
}
public void setPropertyName(String propertyName) {
this.propertyName = propertyName;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isNullAllowed() {
return nullAllowed;
}
public void setNullAllowed(boolean nullAllowed) {
this.nullAllowed = nullAllowed;
}
public void populateBean(String dataString, Map beans) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException {
Object bean;
if (beans.containsKey(beanKey)) {
bean = beans.get(beanKey);
Class dataType = getPropertyType(beans);
Object value = null;
if (!(nullAllowed && dataString == null)) { // set only if null is not allowed!
value = ConvertUtils.convert(dataString, dataType);
}
PropertyUtils.setProperty(bean, propertyName, value);
} else {
if (log.isWarnEnabled()) {
log.warn("Can't find bean under the key=" + beanKey);
}
}
}
// Added feature to set type by type-attribute in XML
public Class getPropertyType(Map beans) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, ClassNotFoundException {
Object bean;
if (beans.containsKey(beanKey)) {
bean = beans.get(beanKey);
// ZJ
if (type == null) {
return PropertyUtils.getPropertyType(bean, propertyName);
} else {
return Class.forName(type);
}
}
return Object.class;
}
public String getCellName() {
CellReference cellRef = new CellReference(row, col, false, false);
return cellRef.formatAsString();
}
public String toString() {
return beanKey + ":" + propertyName;
}
}