001/*
002 *  jDTAUS Banking API
003 *  Copyright (C) 2005 Christian Schulte
004 *  <cs@schulte.it>
005 *
006 *  This library is free software; you can redistribute it and/or
007 *  modify it under the terms of the GNU Lesser General Public
008 *  License as published by the Free Software Foundation; either
009 *  version 2.1 of the License, or any later version.
010 *
011 *  This library is distributed in the hope that it will be useful,
012 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
013 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014 *  Lesser General Public License for more details.
015 *
016 *  You should have received a copy of the GNU Lesser General Public
017 *  License along with this library; if not, write to the Free Software
018 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
019 *
020 */
021package org.jdtaus.banking.dtaus;
022
023import java.io.Serializable;
024import java.util.Calendar;
025import java.util.Currency;
026import java.util.Date;
027import org.jdtaus.banking.AlphaNumericText27;
028import org.jdtaus.banking.Bankleitzahl;
029import org.jdtaus.banking.Kontonummer;
030import org.jdtaus.banking.Referenznummer10;
031
032/**
033 * "A" record.
034 *
035 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
036 * @version $JDTAUS: Header.java 8661 2012-09-27 11:29:58Z schulte $
037 */
038public class Header implements Cloneable, Serializable
039{
040
041    /** Constant for the name of property {@code customer}. */
042    public static final String PROP_CUSTOMER = "org.jdtaus.banking.dtaus.Header.PROP_CUSTOMER";
043
044    /** Constant for the name of property {@code account}. */
045    public static final String PROP_ACCOUNT = "org.jdtaus.banking.dtaus.Header.PROP_ACCOUNT";
046
047    /** Constant for the name of property {@code bank}. */
048    public static final String PROP_BANK = "org.jdtaus.banking.dtaus.Header.PROP_BANK";
049
050    /** Constant for the name of property {@code type}. */
051    public static final String PROP_TYPE = "org.jdtaus.banking.dtaus.Header.PROP_TYPE";
052
053    /** Constant for the name of property {@code currency}. */
054    public static final String PROP_CURRENCY = "org.jdtaus.banking.dtaus.Header.PROP_CURRENCY";
055
056    /** Constant for the name of property {@code reference}. */
057    public static final String PROP_REFERENCE = "org.jdtaus.banking.dtaus.Header.PROP_REFERENCE";
058
059    /** Constant for the name of property {@code bankData}. */
060    public static final String PROP_BANKDATA = "org.jdtaus.banking.dtaus.Header.PROP_BANKDATA";
061
062    /** Constant for the name of property {@code createDate}. */
063    public static final String PROP_CREATEDATE = "org.jdtaus.banking.dtaus.Header.PROP_CREATEDATE";
064
065    /** Constant for the name of property {@code executionDate}. */
066    public static final String PROP_EXECUTIONDATE = "org.jdtaus.banking.dtaus.Header.PROP_EXECUTIONDATE";
067
068    /** Serial version UID for backwards compatibility with 1.0.x classes. */
069    private static final long serialVersionUID = -5704199858711059732L;
070
071    /**
072     * Name of the customer a logical file belongs to.
073     * @serial
074     */
075    private AlphaNumericText27 customer;
076
077    /**
078     * Code of the account a logical file belongs to.
079     * @serial
080     */
081    private Kontonummer account;
082
083    /**
084     * Code of the bank a logical file belongs to.
085     * @serial
086     */
087    private Bankleitzahl bank;
088
089    /**
090     * Type of a logical file.
091     * @serial
092     */
093    private LogicalFileType type;
094
095    /**
096     * Currency of a logical file.
097     * @serial
098     */
099    private Currency currency;
100
101    /**
102     * Reference code of a logical file.
103     * @serial
104     */
105    private Referenznummer10 reference;
106
107    /**
108     * Create date of a logical file.
109     * @serial
110     */
111    private Date createDate;
112
113    /**
114     * Execution date of a logical file.
115     * @serial
116     */
117    private Date executionDate;
118
119    /**
120     * Bank internal data.
121     * @serial
122     */
123    private Bankleitzahl bankData;
124
125    /** Cached hash code. */
126    private transient int hashCode = NO_HASHCODE;
127    private static final int NO_HASHCODE = Integer.MIN_VALUE;
128
129    /** Creates a new {@code Header} instance. */
130    public Header()
131    {
132        super();
133    }
134
135    /**
136     * Getter for property {@code customer}.
137     *
138     * @return Name of the customer a logical file belongs to.
139     */
140    public AlphaNumericText27 getCustomer()
141    {
142        return this.customer;
143    }
144
145    /**
146     * Setter for property {@code customer}.
147     *
148     * @param value Name of the customer a logical file belongs to.
149     */
150    public void setCustomer( final AlphaNumericText27 value )
151    {
152        this.customer = value;
153        this.hashCode = NO_HASHCODE;
154    }
155
156    /**
157     * Getter for property {@code account}.
158     *
159     * @return Code of the account a logical file belongs to.
160     */
161    public Kontonummer getAccount()
162    {
163        return this.account;
164    }
165
166    /**
167     * Setter for property {@code account}.
168     *
169     * @param value Code of the account a logical file belongs to.
170     */
171    public void setAccount( final Kontonummer value )
172    {
173        this.account = value;
174        this.hashCode = NO_HASHCODE;
175    }
176
177    /**
178     * Getter for property {@code bank}.
179     *
180     * @return Code of the bank a logical file belongs to.
181     */
182    public Bankleitzahl getBank()
183    {
184        return this.bank;
185    }
186
187    /**
188     * Setter for property {@code bank}.
189     *
190     * @param value Code of the bank a logical file belongs to.
191     */
192    public void setBank( final Bankleitzahl value )
193    {
194        this.bank = value;
195        this.hashCode = NO_HASHCODE;
196    }
197
198    /**
199     * Getter for property {@code type}.
200     *
201     * @return The type of a logical file.
202     */
203    public LogicalFileType getType()
204    {
205        return this.type;
206    }
207
208    /**
209     * Setter for property {@code type}.
210     *
211     * @param value The type of a logical file.
212     */
213    public void setType( final LogicalFileType value )
214    {
215        this.type = value;
216        this.hashCode = NO_HASHCODE;
217    }
218
219    /**
220     * Getter for property {@code currency}.
221     *
222     * @return Currency of a logical file.
223     */
224    public Currency getCurrency()
225    {
226        return this.currency;
227    }
228
229    /**
230     * Setter for property {@code currency}.
231     *
232     * @param value Currency for a logical file.
233     */
234    public void setCurrency( final Currency value )
235    {
236        this.currency = value;
237        this.hashCode = NO_HASHCODE;
238    }
239
240    /**
241     * Getter for property {@code reference}.
242     *
243     * @return Reference code of a logical file or {@code null}.
244     */
245    public Referenznummer10 getReference()
246    {
247        return this.reference;
248    }
249
250    /**
251     * Setter for property {@code reference}.
252     *
253     * @param value Reference code of a logical file or {@code null}.
254     */
255    public void setReference( final Referenznummer10 value )
256    {
257        this.reference = value;
258        this.hashCode = NO_HASHCODE;
259    }
260
261    /**
262     * Getter for property {@code createDate}.
263     *
264     * @return Create date of a logical file.
265     */
266    public Date getCreateDate()
267    {
268        return this.createDate != null ? (Date) this.createDate.clone() : null;
269    }
270
271    /**
272     * Setter for property {@code createDate}.
273     *
274     * @param value Create date of a logical file.
275     */
276    public void setCreateDate( final Date value )
277    {
278        this.createDate = null;
279        this.hashCode = NO_HASHCODE;
280
281        if ( value != null )
282        {
283            final Calendar cal = Calendar.getInstance();
284            cal.setTime( value );
285            cal.clear( Calendar.HOUR_OF_DAY );
286            cal.clear( Calendar.MINUTE );
287            cal.clear( Calendar.SECOND );
288            cal.clear( Calendar.MILLISECOND );
289            this.createDate = cal.getTime();
290        }
291    }
292
293    /**
294     * Getter for property {@code executionDate}.
295     *
296     * @return Execution date of a logical file or {@code null}.
297     */
298    public Date getExecutionDate()
299    {
300        return this.executionDate != null ? (Date) this.executionDate.clone() : null;
301    }
302
303    /**
304     * Setter for property {@code executionDate}.
305     *
306     * @param value Execution date of a logical file or {@code null}.
307     */
308    public void setExecutionDate( final Date value )
309    {
310        this.executionDate = null;
311        this.hashCode = NO_HASHCODE;
312
313        if ( value != null )
314        {
315            final Calendar cal = Calendar.getInstance();
316            cal.setTime( value );
317            cal.clear( Calendar.HOUR_OF_DAY );
318            cal.clear( Calendar.MINUTE );
319            cal.clear( Calendar.SECOND );
320            cal.clear( Calendar.MILLISECOND );
321            this.executionDate = cal.getTime();
322        }
323    }
324
325    /**
326     * Getter for property {@code bankData}.
327     *
328     * @return Bank internal data.
329     */
330    public Bankleitzahl getBankData()
331    {
332        return this.bankData;
333    }
334
335    /**
336     * Setter for property {@code bankData}.
337     *
338     * @param value Bank internal data.
339     */
340    public void setBankData( final Bankleitzahl value )
341    {
342        this.bankData = value;
343        this.hashCode = NO_HASHCODE;
344    }
345
346    /**
347     * Indicates whether some other object is equal to this one by comparing the values of all properties.
348     *
349     * @param o The reference object with which to compare.
350     *
351     * @return {@code true} if this object is the same as {@code o}; {@code false} otherwise.
352     */
353    public boolean equals( final Object o )
354    {
355        boolean ret = o == this;
356
357        if ( !ret && o instanceof Header )
358        {
359            final Header that = (Header) o;
360            ret = ( this.getAccount() == null
361                    ? that.getAccount() == null : this.getAccount().equals( that.getAccount() ) ) &&
362                  ( this.getBank() == null
363                    ? that.getBank() == null : this.getBank().equals( that.getBank() ) ) &&
364                  ( this.getBankData() == null
365                    ? that.getBankData() == null : this.getBankData().equals( that.getBankData() ) ) &&
366                  ( this.getCurrency() == null
367                    ? that.getCurrency() == null : this.getCurrency().equals( that.getCurrency() ) ) &&
368                  ( this.getCustomer() == null
369                    ? that.getCustomer() == null : this.getCustomer().equals( that.getCustomer() ) ) &&
370                  ( this.getType() == null
371                    ? that.getType() == null : this.getType().equals( that.getType() ) ) &&
372                  ( this.getReference() == null
373                    ? that.getReference() == null : this.getReference().equals( that.getReference() ) ) &&
374                  ( this.getCreateDate() == null
375                    ? that.getCreateDate() == null : this.getCreateDate().equals( that.getCreateDate() ) ) &&
376                  ( this.getExecutionDate() == null
377                    ? that.getExecutionDate() == null : this.getExecutionDate().equals( that.getExecutionDate() ) );
378
379        }
380
381        return ret;
382    }
383
384    /**
385     * Returns a hash code value for this object.
386     *
387     * @return A hash code value for this object.
388     */
389    public int hashCode()
390    {
391        if ( this.hashCode == NO_HASHCODE )
392        {
393            int hc = 23;
394            hc = 37 * hc + ( this.account == null ? 0 : this.account.hashCode() );
395            hc = 37 * hc + ( this.bank == null ? 0 : this.bank.hashCode() );
396            hc = 37 * hc + ( this.bankData == null ? 0 : this.bankData.hashCode() );
397            hc = 37 * hc + ( this.currency == null ? 0 : this.currency.hashCode() );
398            hc = 37 * hc + ( this.customer == null ? 0 : this.customer.hashCode() );
399            hc = 37 * hc + ( this.type == null ? 0 : this.type.hashCode() );
400            hc = 37 * hc + ( this.reference == null ? 0 : this.reference.hashCode() );
401            hc = 37 * hc + ( this.createDate == null ? 0 : this.createDate.hashCode() );
402            hc = 37 * hc + ( this.executionDate == null ? 0 : this.executionDate.hashCode() );
403            this.hashCode = hc;
404        }
405
406        return this.hashCode;
407    }
408
409    /**
410     * Creates and returns a copy of this object.
411     *
412     * @return A clone of this instance.
413     */
414    public Object clone()
415    {
416        try
417        {
418            final Object o = super.clone();
419            if ( this.createDate != null )
420            {
421                ( (Header) o ).createDate = (Date) this.createDate.clone();
422            }
423            if ( this.executionDate != null )
424            {
425                ( (Header) o ).executionDate = (Date) this.executionDate.clone();
426            }
427
428            return o;
429        }
430        catch ( final CloneNotSupportedException e )
431        {
432            throw new AssertionError( e );
433        }
434    }
435
436    /**
437     * Returns a string representation of the object.
438     *
439     * @return A string representation of the object.
440     */
441    public String toString()
442    {
443        return super.toString() + this.internalString();
444    }
445
446    /**
447     * Creates a string representing the properties of the instance.
448     *
449     * @return A string representing the properties of the instance.
450     */
451    private String internalString()
452    {
453        return new StringBuffer( 150 ).append( '{' ).
454            append( "account=" ).append( this.account ).
455            append( ", bank=" ).append( this.bank ).
456            append( ", bankData=" ).append( this.bankData ).
457            append( ", currency=" ).append( this.currency ).
458            append( ", customer=" ).append( (Object) this.customer ).
459            append( ", createDate=" ).append( this.createDate ).
460            append( ", executionDate=" ).append( this.executionDate ).
461            append( ", type=" ).append( this.type ).
462            append( ", reference=" ).append( this.reference ).
463            append( '}' ).toString();
464
465    }
466
467}