001: /*
002: *
003: * JMoney - A Personal Finance Manager
004: * Copyright (c) 2004 Nigel Westbury <westbury@users.sourceforge.net>
005: *
006: *
007: * This program is free software; you can redistribute it and/or modify
008: * it under the terms of the GNU General Public License as published by
009: * the Free Software Foundation; either version 2 of the License, or
010: * (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
020: *
021: */
022:
023: package net.sf.jmoney.reconciliation;
024:
025: import java.text.DateFormat;
026: import java.text.SimpleDateFormat;
027: import java.util.Calendar;
028: import java.util.Date;
029:
030: import org.eclipse.core.runtime.Assert;
031:
032: import net.sf.jmoney.JMoneyPlugin;
033: import net.sf.jmoney.VerySimpleDateFormat;
034:
035: /**
036: * @author Nigel
037: *
038: * TODO To change the template for this generated type comment go to
039: * Window - Preferences - Java - Code Style - Code Templates
040: */
041: public class BankStatement implements Comparable<BankStatement> {
042:
043: /**
044: * Date format used for dates in this file format:
045: * yyyy.MM.dd
046: */
047: private static SimpleDateFormat dateFormat = (SimpleDateFormat) DateFormat
048: .getDateInstance();
049: static {
050: dateFormat.applyPattern("yyyy.MM.dd");
051: }
052:
053: private int statementNumber = 0;
054: private Date statementDate = null;
055:
056: public BankStatement(String s) {
057: if (s.length() != 0) {
058: String numbers[] = s.split("\\.");
059: if (numbers.length == 1) {
060: statementNumber = Integer.parseInt(numbers[0]);
061: } else if (numbers.length == 3) {
062: int year = Integer.parseInt(numbers[0]);
063: int month = Integer.parseInt(numbers[1]);
064: int day = Integer.parseInt(numbers[2]);
065: Calendar cal = Calendar.getInstance();
066:
067: /*
068: * First reset all fields. Otherwise differences in the time
069: * part, even if the difference is only milliseconds, will cause
070: * the date comparisons to fail.
071: *
072: * Note also it is critical that whatever is done here is exactly the
073: * same as that done in VerySimpleDateFormat, otherwise dates will not
074: * match. For example, if you replace clear() here with setTimeInMillis(0)
075: * then we get a different object (because data other than the date and time
076: * such as time zone information will be different).
077: */
078: cal.clear();
079:
080: cal.set(year, month - 1, day);
081: statementDate = cal.getTime();
082: }
083: }
084: }
085:
086: /**
087: * @param statementDate
088: */
089: public BankStatement(Date statementDate) {
090: this .statementNumber = 0;
091: this .statementDate = statementDate;
092: }
093:
094: @Override
095: public String toString() {
096: if (statementNumber != 0) {
097: return Integer.toString(statementNumber);
098: } else if (statementDate != null) {
099: return dateFormat.format(statementDate);
100: } else {
101: return "";
102: }
103: }
104:
105: @Override
106: public boolean equals(Object other) {
107: if (other == null)
108: return false;
109: BankStatement otherStatement = (BankStatement) other;
110: return this .statementNumber == otherStatement.statementNumber
111: && JMoneyPlugin.areEqual(this .statementDate,
112: otherStatement.statementDate);
113: }
114:
115: @Override
116: public int hashCode() {
117: return statementDate == null ? statementNumber : statementDate
118: .hashCode();
119: }
120:
121: /*
122: * The Comparable interface does not need to be implemented by all simple
123: * datastore objects. However, we do want to be able to sort
124: * statements into order.
125: */
126: public int compareTo(BankStatement otherStatement) {
127: if (this .statementDate == null
128: && otherStatement.statementDate == null) {
129: return this .statementNumber
130: - otherStatement.statementNumber;
131: } else if (this .statementDate != null
132: && otherStatement.statementDate != null) {
133: return this .statementDate
134: .compareTo(otherStatement.statementDate);
135: } else {
136: throw new RuntimeException("mixed statement types!!!");
137: }
138: }
139:
140: /**
141: * @return
142: */
143: public String toLocalizedString() {
144: if (statementDate == null) {
145: return Integer.toString(statementNumber);
146: } else {
147: VerySimpleDateFormat fDateFormat = new VerySimpleDateFormat(
148: JMoneyPlugin.getDefault().getDateFormat());
149: return fDateFormat.format(statementDate);
150: }
151: }
152:
153: /**
154: * @return
155: */
156: public boolean isNumber() {
157: return statementDate == null;
158: }
159:
160: /**
161: * @return
162: */
163: public int getNumber() {
164: Assert.isTrue(isNumber());
165: return statementNumber;
166: }
167:
168: /**
169: * @return
170: */
171: public Date getStatementDate() {
172: Assert.isTrue(!isNumber());
173: return statementDate;
174: }
175:
176: }
|