//$Id: AbstractImporter.java,v 1.1 2007-3-24 下午12:46:57 chaostone Exp $
/*
* Copyright c 2005-2009
* Licensed under GNU LESSER General Public License, Version 3.
* http://www.gnu.org/licenses
*
*/
/********************************************************************************
* @author chaostone
*
* MODIFICATION DESCRIPTION
*
* Name Date Description
* ============ ============ ============
*chaostone 2007-3-24 Created
*
********************************************************************************/
package org.beanfuse.transfer.importer;
import java.util.Iterator;
import java.util.Locale;
import java.util.Vector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.beanfuse.transfer.Transfer;
import org.beanfuse.transfer.TransferListener;
import org.beanfuse.transfer.TransferResult;
import org.beanfuse.transfer.importer.reader.Reader;
/**
* 导入的抽象和缺省实现
*
* @author chaostone
*
*/
public abstract class AbstractImporter implements Importer {
/**
* Commons Logging instance.
*/
protected static Logger logger = LoggerFactory.getLogger(AbstractImporter.class);
/**
* 数据读取对象
*/
protected Reader reader;
/**
* 转换结果
*/
protected TransferResult transferResult;
/**
* 监听器列表
*/
protected Vector listeners = new Vector();
/**
* 成功记录数
*/
protected int success = 0;
/**
* 失败记录数
*/
protected int fail = 0;
/**
* 下一个要读取的位置
*/
protected int index = 0;
/**
* 进行转换
*/
public void transfer(TransferResult tr) {
this.transferResult = tr;
this.transferResult.setTransfer(this);
long transferStartAt = System.currentTimeMillis();
try {
beforeImport();
} catch (Exception e) {
// 预导入发生位置错误,错误信息已经记录在tr了
return;
}
for (Iterator iter = listeners.iterator(); iter.hasNext();) {
TransferListener listener = (TransferListener) iter.next();
listener.startTransfer(tr);
}
while (read()) {
long transferItemStart = System.currentTimeMillis();
index++;
beforeImportItem();
if (!isDataValid())
continue;
int errors = tr.errors();
// 实体转换开始
for (Iterator iter = listeners.iterator(); iter.hasNext();) {
TransferListener listener = (TransferListener) iter.next();
listener.startTransferItem(tr);
}
// 如果转换前已经存在错误,则不进行转换
if (tr.errors() > errors) {
continue;
}
// 进行转换
transferItem();
// 实体转换结束
for (Iterator iter = listeners.iterator(); iter.hasNext();) {
TransferListener listener = (TransferListener) iter.next();
listener.endTransferItem(tr);
}
// 如果导入过程中没有错误,将成功记录数增一
if (tr.errors() == errors) {
this.success++;
} else {
this.fail++;
}
if (logger.isDebugEnabled()) {
logger.debug("importer item:" + getTranferIndex() + " take time:"
+ (System.currentTimeMillis() - transferItemStart));
}
}
for (Iterator iter = listeners.iterator(); iter.hasNext();) {
TransferListener listener = (TransferListener) iter.next();
listener.endTransfer(tr);
}
if (logger.isDebugEnabled()) {
logger.debug("importer elapse:" + (System.currentTimeMillis() - transferStartAt));
}
}
public int getFail() {
return fail;
}
public int getSuccess() {
return success;
}
public Reader getReader() {
return reader;
}
public void setReader(Reader reader) {
this.reader = reader;
}
public boolean ignoreNull() {
return true;
}
public Locale getLocale() {
return Locale.getDefault();
}
public String getFormat() {
return reader.getFormat();
}
public int getTranferIndex() {
return index;
}
public Transfer addListener(TransferListener listener) {
listeners.add(listener);
listener.setTransfer(this);
return this;
}
}