I am trying to run a mail merge with regions using a custom data source. I put some debug code into my class that implements IMailMergeDataSource to track what method is being run and getValue is never called. Here’s everything that gets called:
DEBUG 27 Jun 2011 10:30:04 com.goengineer.agile.CustomMailMergeDataSource:: Table Records to process: 6
DEBUG 27 Jun 2011 10:30:28 com.goengineer.agile.CustomMailMergeDataSource:: Returning table name: Workflow
DEBUG 27 Jun 2011 10:30:28 com.goengineer.agile.CustomMailMergeDataSource:: Move Next called. Before call record index: -1. Table size: 6
It’s just these three methods: instantiation, getTableName(), and moveNext(). Why would getValue not be called?
Here’s the code for the custom class and I have attached the Word template:
public class CustomMailMergeDataSource implements IMailMergeDataSource
{
private Logger log = Logger.getLogger(CustomMailMergeDataSource.class);
private String tableName;
private int mRecordIndex;
private ArrayList <HashMap <String, String>> mTableRecords;
/*
* tableName = The name of the region in Word for the merge.
*/
public CustomMailMergeDataSource(ArrayList <HashMap <String, String>> tableRecords, String tableName)
{
this.mTableRecords = tableRecords;
this.tableName = tableName;
this.mRecordIndex = -1;
log.debug("Table Records to process: " + this.mTableRecords.size());
}
public String getTableName() throws Exception
{
log.debug("Returning table name: " + this.tableName);
return this.tableName;
}
public boolean getValue(String fieldName, Object[] fieldValue) throws Exception
{
log.debug("Mail Merge getting field: " + fieldName);
HashMap <String, String> temp = this.mTableRecords.get(this.mRecordIndex);
if (!temp.containsKey(fieldName))
{
fieldValue[0] = null;
return false;
}
fieldValue[0] = temp.get(fieldName);
return true;
}
public boolean moveNext() throws Exception
{
log.debug("Move Next called. Before call record index: " + this.mRecordIndex + ". Table size: " + mTableRecords.size());
if (mRecordIndex>= mTableRecords.size())
{
return false;
}
mRecordIndex++;
return mRecordIndex>= mTableRecords.size();
}
public IMailMergeDataSource getChildDataSource(String tableName) throws Exception
{
return null;
}
}