📄 ofxbankstatementhandler.java
字号:
}
/**
* Method getStmtAmt
* @return BigDecimal
*/
public BigDecimal getStmtAmt()
{
return m_line.stmtAmt;
}
/**
* Method getTrxAmt
* @return Transaction Amount
*/
public BigDecimal getTrxAmt()
{
/* assume total amount = transaction amount
* todo: detect interest & charge amount
*/
return m_line.stmtAmt;
}
/**
* Method getInterestAmount
* @return Interest Amount
*/
public BigDecimal getInterestAmt()
{
return Env.ZERO;
}
/**
* Method getMemo
* @return String
*/
public String getMemo()
{
return m_line.memo;
}
/**
* Method getChargeName
* @return String
*/
public String getChargeName()
{
return m_line.chargeName;
}
/**
* Method getChargeAmt
* @return BigDecimal
*/
public BigDecimal getChargeAmt()
{
return m_line.chargeAmt;
}
/**
* Method getTrxID
* @return String
*/
public String getTrxID()
{
return m_line.trxID;
}
/**
* Method getPayeeAccountNo
* @return String
*/
public String getPayeeAccountNo()
{
return m_line.payeeAccountNo;
}
/**
* Method getPayeeName
* @return String
*/
public String getPayeeName()
{
return m_line.payeeName;
}
/**
* Method getCheckNo
* @return String
*/
public String getCheckNo()
{
return m_line.checkNo;
}
/**
* New XML element detected. The XML nesting
* structure is saved on the m_context stack.
* @param uri String
* @param localName String
* @param qName String
* @param attributes Attributes
* @throws org.xml.sax.SAXException
* @see org.xml.sax.ContentHandler#startElement(String, String, String, Attributes)
*/
public void startElement (String uri, String localName, String qName, Attributes attributes)
throws org.xml.sax.SAXException
{
boolean validOFX = true;
/*
* Currently no validating is being done, valid OFX structure is assumed.
*/
if (validOFX)
{
m_context.push(qName);
}
else
{
m_errorDescription = "Invalid OFX syntax: " + qName;
throw new SAXException("Invalid OFX syntax: " + qName);
}
if (qName.equals(XML_STMTTRN_TAG))
{
m_line = new StatementLine(routingNo, bankAccountNo, currency);
}
} // startElement
/**
* Characters read from XML are assigned to a variable, based on the current m_context.
* No checks are being done, it is assumed that the context is correct.
* @param ch char[]
* @param start int
* @param length int
* @throws SAXException
* @see org.xml.sax.ContentHandler#characters(char[], int, int)
**/
public void characters (char ch[], int start, int length) throws SAXException
{
String XML_TAG = (String)m_context.peek();
String value = new StringBuffer().append(ch, start, length).toString();
try
{
//Read statment level data
/*
* Default currency for this set of statement lines
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>
*/
if (XML_TAG.equals(XML_CURDEF_TAG))
{
currency = value;
}
/* Routing Number (or SWIFT Code) for this set of statement lines
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>-<BANKACCTFROM>
*/
else if (XML_TAG.equals(XML_BANKID_TAG))
{
routingNo = value;
}
/*
* Bank Account Number for this set of bank statement lines
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>-<BANKACCTFROM>
*/
else if (XML_TAG.equals(XML_ACCTID_TAG))
{
bankAccountNo = value;
}
/*
* Last date for this set of statement lines
* This is the date that should be specified as the <DTSTART>
* for the next batch of statement lines, in order not to miss any
* transactions.
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>-<BANKTRANLIST>
*/
else if (XML_TAG.equals(XML_DTEND_TAG))
{
dateLastRun = parseOfxDate(value);
}
/*
*
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>-<AVAILBAL>
*/
else if (XML_TAG.equals(XML_DTASOF_TAG))
{
statementDate = parseOfxDate(value);
}
//Read statement line level data
/*
* Transaction type, e.g. DEBIT, CREDIT, SRVCHG
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>-<BANKTRANLIST><STMTTRN>
*/
else if (XML_TAG.equals(XML_TRNTYPE_TAG))
{
m_line.trxType = value;
}
/*
* Statement line date
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>-<BANKTRANLIST><STMTTRN>
*/
else if (XML_TAG.equals(XML_DTPOSTED_TAG))
{
m_line.statementLineDate = parseOfxDate(value);
}
/*
* Valuta date
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>-<BANKTRANLIST><STMTTRN>
*/
else if (XML_TAG.equals(XML_DTAVAIL_TAG))
{
m_line.valutaDate = parseOfxDate(value);
}
/*
* Total statement line amount
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>-<BANKTRANLIST><STMTTRN>
*/
else if (XML_TAG.equals(XML_TRNAMT_TAG))
{
m_line.stmtAmt = new BigDecimal(value);
}
/*
* Transaction Identification
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>-<BANKTRANLIST><STMTTRN>
*/
else if (XML_TAG.equals(XML_FITID_TAG))
{
m_line.trxID = value;
}
/*
* Check number for check transactions
* CHECKNUM for generic OFX, CHKNUM for MS-Money OFC
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>-<BANKTRANLIST><STMTTRN>
*/
else if ((XML_TAG.equals(XML_CHECKNUM_TAG)) || (XML_TAG.equals(XML_CHKNUM_TAG)))
{
m_line.checkNo = value;
}
/*
* Statement line reference
* Additional transaction reference information
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>-<BANKTRANLIST><STMTTRN>
*/
else if (XML_TAG.equals(XML_REFNUM_TAG))
{
m_line.reference = value;
}
/*
* Transaction memo
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>-<BANKTRANLIST><STMTTRN>
*/
else if (XML_TAG.equals(XML_MEMO_TAG))
{
m_line.memo = value;
}
/*
* Payee Name
* <OFX>-<BANKMSGSRSV2>-<STMTTRNRS>-<STMTRS>-<BANKTRANLIST><STMTTRN>
*/
else if (XML_TAG.equals(XML_NAME_TAG))
{
m_line.payeeName = value;
}
}
catch(Exception e)
{
m_errorDescription = "Invalid data: " + value + " <-> " + e.getMessage();
throw new SAXException("Invalid data: " + value);
}
} // characters
/**
* Check for valid XML structure. (all tags are properly ended).
* The statements are passed to ImportController when the statement end (</STMTTRN>)
* is detected.
* @param uri String
* @param localName String
* @param qName String
* @throws SAXException
* @see org.xml.sax.ContentHandler#endElement(String, String, String)
*/
public void endElement (String uri, String localName, String qName) throws SAXException
{
if (qName.equals(m_context.peek()))
{
m_context.pop();
}
else
{
m_errorDescription = "Invalid XML syntax: " + qName;
throw new SAXException("Invalid XML syntax: " + qName);
}
if (qName.equals(XML_STMTTRN_TAG))
{
if (!test)
{
if (!m_controller.saveLine())
{
m_errorMessage = m_controller.getErrorMessage();
m_errorDescription = m_controller.getErrorDescription();
throw new SAXException(m_errorMessage);
}
}
}
} // endElement
/**
* Method parseOfxDate
* @param value String
* @return Timestamp
* @throws ParseException
*/
private Timestamp parseOfxDate(String value) throws ParseException
{
try
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.setLenient(false);
return new Timestamp (sdf.parse(value).getTime());
}
catch(Exception e)
{
throw new ParseException("Error parsing date: " + value, 0);
}
} //parseOfxDate
/**
* Method getLastErrorMessage
* @return String
*/
public String getLastErrorMessage()
{
return m_errorMessage;
}
/**
* Method getLastErrorDescription
* @return String
*/
public String getLastErrorDescription()
{
return m_errorDescription;
}
/**
* @author ET
* @version $Id: OFXBankStatementHandler.java,v 1.6 2005/09/29 22:01:56 jjanke Exp $
*/
class StatementLine
{
protected String routingNo = null;
protected String bankAccountNo = null;
protected String statementReference = null;
protected Timestamp statementLineDate = null;
protected String reference = null;
protected Timestamp valutaDate;
protected String trxType = null;
protected boolean isReversal = false;
protected String currency = null;
protected BigDecimal stmtAmt = null;
protected String memo = null;
protected String chargeName = null;
protected BigDecimal chargeAmt = null;
protected String payeeAccountNo = null;
protected String payeeName = null;
protected String trxID = null;
protected String checkNo = null;
/**
* Constructor for StatementLine
* @param routingNo String
* @param bankAccountNo String
* @param currency String
*/
public StatementLine(String routingNo, String bankAccountNo, String currency)
{
this.bankAccountNo = bankAccountNo;
this.routingNo = routingNo;
this.currency = currency;
}
}
} //OFXBankStatementHandler
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -