001/*
002 *  jDTAUS Banking RI Bankleitzahlenverzeichnis
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.ri.blzdirectory;
022
023import java.io.IOException;
024import java.net.URL;
025import java.text.DateFormat;
026import java.text.DecimalFormat;
027import java.text.NumberFormat;
028import java.text.ParseException;
029import java.text.SimpleDateFormat;
030import java.util.ArrayList;
031import java.util.Collection;
032import java.util.Date;
033import java.util.Locale;
034import java.util.regex.Pattern;
035import java.util.regex.PatternSyntaxException;
036import org.jdtaus.banking.Bankleitzahl;
037import org.jdtaus.banking.BankleitzahlExpirationException;
038import org.jdtaus.banking.BankleitzahlInfo;
039import org.jdtaus.banking.BankleitzahlenVerzeichnis;
040import org.jdtaus.banking.messages.OutdatedBankleitzahlenVerzeichnisMessage;
041import org.jdtaus.banking.messages.ReadsBankleitzahlenDateiMessage;
042import org.jdtaus.banking.messages.SearchesBankleitzahlInfosMessage;
043import org.jdtaus.banking.util.BankleitzahlenDatei;
044import org.jdtaus.core.container.ContainerFactory;
045import org.jdtaus.core.container.PropertyException;
046import org.jdtaus.core.logging.spi.Logger;
047import org.jdtaus.core.monitor.spi.Task;
048import org.jdtaus.core.monitor.spi.TaskMonitor;
049import org.jdtaus.core.text.Message;
050import org.jdtaus.core.text.MessageEvent;
051import org.jdtaus.core.text.spi.ApplicationLogger;
052
053/**
054 * {@code BankleitzahlenVerzeichnis} implementation backed by bank files.
055 * <p>This implementation uses bank file resources provided by any available {@link BankfileProvider}
056 * implementation.</p>
057 *
058 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
059 * @version $JDTAUS: BankfileBankleitzahlenVerzeichnis.java 8893 2014-12-08 22:40:08Z schulte $
060 */
061public class BankfileBankleitzahlenVerzeichnis implements BankleitzahlenVerzeichnis
062{
063
064    /** Flag indicating that initialization has been performed. */
065    private boolean initialized;
066
067    /** {@code BankleitzahlenDatei} delegate. */
068    private BankleitzahlenDatei bankFile;
069
070    /** Date of expiration. */
071    private Date dateOfExpiration;
072
073    /** Timestamp providers got checked for modifications. */
074    private long lastModificationCheck = System.currentTimeMillis();
075
076    /** Number of milliseconds to pass before providers are checked for modifications. */
077    private Long reloadIntervalMillis;
078
079    /** Provider checked for modifications. */
080    private BankfileProvider provider;
081
082    /** Last modification of the provider checked for modifications. */
083    private long lastModifiedMillis;
084
085    /** Number of bank codes for which progress monitoring gets enabled. */
086    private Long monitoringThreshold;
087
088    /**
089     * Creates a new {@code BankfileBankleitzahlenVerzeichnis} instance taking the number of milliseconds to pass before
090     * resources are checked for modifications and the number of bank codes for which progress monitoring gets enabled.
091     *
092     * @param reloadIntervalMillis Number of milliseconds to pass before resources are checked for modifications.
093     * @param monitoringThreshold Number of bank codes for which progress monitoring gets enabled.
094     */
095    public BankfileBankleitzahlenVerzeichnis( final long reloadIntervalMillis, final long monitoringThreshold )
096    {
097        this();
098        if ( reloadIntervalMillis > 0 )
099        {
100            this.reloadIntervalMillis = new Long( reloadIntervalMillis );
101        }
102        if ( monitoringThreshold > 0 )
103        {
104            this.monitoringThreshold = new Long( monitoringThreshold );
105        }
106    }
107
108    /**
109     * Gets the number of milliseconds to pass before providers are checked for modifications.
110     *
111     * @return The number of milliseconds to pass before providers are checked for modifications.
112     */
113    public long getReloadIntervalMillis()
114    {
115        if ( this.reloadIntervalMillis == null )
116        {
117            this.reloadIntervalMillis = this.getDefaultReloadIntervalMillis();
118        }
119
120        return this.reloadIntervalMillis.longValue();
121    }
122
123    /**
124     * Gets the number of bank codes for which progress monitoring gets enabled.
125     *
126     * @return The number of bank codes for which progress monitoring gets enabled.
127     */
128    public long getMonitoringThreshold()
129    {
130        if ( this.monitoringThreshold == null )
131        {
132            this.monitoringThreshold = this.getDefaultMonitoringThreshold();
133        }
134
135        return this.monitoringThreshold.longValue();
136    }
137
138    public Date getDateOfExpiration()
139    {
140        this.assertValidProperties();
141        this.assertInitialized();
142        return (Date) this.dateOfExpiration.clone();
143    }
144
145    public BankleitzahlInfo getHeadOffice( final Bankleitzahl bankCode ) throws BankleitzahlExpirationException
146    {
147        if ( bankCode == null )
148        {
149            throw new NullPointerException( "bankCode" );
150        }
151
152        this.assertValidProperties();
153        this.assertInitialized();
154
155        BankleitzahlInfo headOffice = this.bankFile.getHeadOfficeRecord( bankCode );
156
157        if ( headOffice == null )
158        {
159            final BankleitzahlInfo deletedHeadOfficeRecord = this.bankFile.getDeletedHeadOfficeRecord( bankCode );
160            final BankleitzahlInfo replacementRecord = this.findReplacementBankeitzahlInfo( deletedHeadOfficeRecord );
161
162            if ( replacementRecord != null
163                     && ( replacementRecord.getDeletionDate() == null
164                          || replacementRecord.getDeletionDate().before( this.getDateOfExpiration() ) ) )
165            {
166                throw new BankleitzahlExpirationException( deletedHeadOfficeRecord, replacementRecord );
167            }
168        }
169
170        return headOffice;
171    }
172
173    public BankleitzahlInfo[] getBranchOffices( final Bankleitzahl bankCode ) throws BankleitzahlExpirationException
174    {
175        if ( bankCode == null )
176        {
177            throw new NullPointerException( "bankCode" );
178        }
179
180        this.assertValidProperties();
181        this.assertInitialized();
182
183        final BankleitzahlInfo[] branchOfficeRecords = this.bankFile.getBranchOfficeRecords( bankCode );
184
185        if ( branchOfficeRecords.length == 0 )
186        {
187            final BankleitzahlInfo deletedHeadOfficeRecord = this.bankFile.getDeletedHeadOfficeRecord( bankCode );
188            final BankleitzahlInfo replacementRecord = this.findReplacementBankeitzahlInfo( deletedHeadOfficeRecord );
189
190            if ( replacementRecord != null
191                     && ( replacementRecord.getDeletionDate() == null
192                          || replacementRecord.getDeletionDate().before( this.getDateOfExpiration() ) ) )
193            {
194                throw new BankleitzahlExpirationException( deletedHeadOfficeRecord, replacementRecord );
195            }
196        }
197
198        return branchOfficeRecords;
199    }
200
201    public final BankleitzahlInfo[] search( final String name, final String postalCode, final String city,
202                                            final boolean branchOffices )
203    {
204        return this.searchBankleitzahlInfos( name, postalCode, city, Boolean.valueOf( !branchOffices ),
205                                             Boolean.valueOf( branchOffices ) );
206
207    }
208
209    public BankleitzahlInfo[] searchBankleitzahlInfos( final String name, final String postalCode, final String city,
210                                                       final Boolean headOffices, final Boolean branchOffices )
211    {
212        this.assertValidProperties();
213        this.assertInitialized();
214
215        final BankleitzahlInfo[] records =
216            this.bankFile == null ? new BankleitzahlInfo[ 0 ] : this.bankFile.getRecords();
217
218        final Collection col = new ArrayList( records.length );
219
220        if ( records.length > 0 )
221        {
222            final Task task = new Task();
223            task.setCancelable( true );
224            task.setDescription( new SearchesBankleitzahlInfosMessage() );
225            task.setIndeterminate( false );
226            task.setMinimum( 0 );
227            task.setMaximum( records.length - 1 );
228            task.setProgress( 0 );
229
230            try
231            {
232                if ( task.getMaximum() > this.getMonitoringThreshold() )
233                {
234                    this.getTaskMonitor().monitor( task );
235                }
236
237                final NumberFormat plzFmt = new DecimalFormat( "00000" );
238                final Pattern namePattern =
239                    name != null ? Pattern.compile( ".*" + name.toUpperCase() + ".*" ) : null;
240
241                final Pattern postalPattern =
242                    postalCode != null ? Pattern.compile( ".*" + postalCode.toUpperCase() + ".*" ) : null;
243
244                final Pattern cityPattern =
245                    city != null ? Pattern.compile( ".*" + city.toUpperCase() + ".*" ) : null;
246
247                for ( int i = records.length - 1; i >= 0 && !task.isCancelled(); i-- )
248                {
249                    final String plz = plzFmt.format( records[i].getPostalCode() );
250                    task.setProgress( task.getMaximum() - i );
251
252                    if ( ( namePattern == null
253                           ? true : namePattern.matcher( records[i].getName().toUpperCase() ).matches() )
254                             && ( postalPattern == null
255                                  ? true : postalPattern.matcher( plz ).matches() )
256                             && ( cityPattern == null
257                                  ? true : cityPattern.matcher( records[i].getCity().toUpperCase() ).matches() )
258                             && ( headOffices == null
259                                  ? true : records[i].isHeadOffice() == headOffices.booleanValue() )
260                             && ( branchOffices == null
261                                  ? true : records[i].isHeadOffice() != branchOffices.booleanValue() ) )
262                    {
263                        col.add( records[i].clone() );
264                    }
265                }
266
267                if ( task.isCancelled() )
268                {
269                    col.clear();
270                }
271            }
272            catch ( final PatternSyntaxException e )
273            {
274                throw (IllegalArgumentException) new IllegalArgumentException( e.getMessage() ).initCause( e );
275            }
276            finally
277            {
278                if ( task.getMaximum() > this.getMonitoringThreshold() )
279                {
280                    this.getTaskMonitor().finish( task );
281                }
282            }
283        }
284
285        return (BankleitzahlInfo[]) col.toArray( new BankleitzahlInfo[ col.size() ] );
286    }
287
288    /**
289     * Gets the {@code BankleitzahlenDatei} backing the instance.
290     *
291     * @return The {@code BankleitzahlenDatei} backing the instance.
292     * @since 1.16
293     */
294    protected BankleitzahlenDatei getBankfile()
295    {
296        this.assertValidProperties();
297        this.assertInitialized();
298        return this.bankFile;
299    }
300
301    /**
302     * Initializes the instance.
303     *
304     * @throws RuntimeException if initialization fails.
305     *
306     * @see #assertValidProperties()
307     */
308    private synchronized void assertInitialized()
309    {
310        Task task = null;
311        boolean logExpirationMessage = false;
312
313        try
314        {
315            if ( this.provider == null
316                     || System.currentTimeMillis() - this.lastModificationCheck > this.getReloadIntervalMillis() )
317            {
318                this.lastModificationCheck = System.currentTimeMillis();
319                if ( this.provider == null || this.provider.getLastModifiedMillis() != this.lastModifiedMillis )
320                {
321                    this.bankFile = null;
322                    this.dateOfExpiration = null;
323                    this.initialized = false;
324
325                    if ( this.provider != null )
326                    {
327                        this.getLogger().info( this.getReloadInfoMessage(
328                            this.getLocale(), new Date( this.lastModifiedMillis ),
329                            new Date( this.provider.getLastModifiedMillis() ) ) );
330
331                    }
332                }
333            }
334
335            if ( !this.initialized )
336            {
337                final DateFormat dateFormat = new SimpleDateFormat( this.getDateOfExpirationPattern() );
338                this.dateOfExpiration = dateFormat.parse( this.getDateOfExpirationText() );
339                final BankfileProvider bankfileProvider = this.getLatestBankfileProvider();
340
341                if ( bankfileProvider != null && bankfileProvider.getBankfileCount() > 0 )
342                {
343                    this.provider = bankfileProvider;
344                    this.lastModifiedMillis = bankfileProvider.getLastModifiedMillis();
345                    this.dateOfExpiration =
346                        bankfileProvider.getDateOfExpiration( bankfileProvider.getBankfileCount() - 1 );
347
348                    final URL[] rsrc = new URL[ bankfileProvider.getBankfileCount() ];
349                    for ( int i = 0; i < rsrc.length; i++ )
350                    {
351                        rsrc[i] = bankfileProvider.getBankfile( i );
352                    }
353
354                    task = new Task();
355                    task.setIndeterminate( false );
356                    task.setCancelable( false );
357                    task.setDescription( new ReadsBankleitzahlenDateiMessage() );
358                    task.setMinimum( 0 );
359                    task.setProgress( 0 );
360                    task.setMaximum( rsrc.length );
361                    this.getTaskMonitor().monitor( task );
362
363                    int progress = 0;
364                    long processedRecords = 0L;
365                    task.setProgress( progress++ );
366                    this.bankFile = new BankleitzahlenDatei( rsrc[0], bankfileProvider.getFormat( 0 ),
367                                                             bankfileProvider.getDateOfValidity( 0 ),
368                                                             bankfileProvider.getDateOfExpiration( 0 ) );
369
370                    processedRecords += this.bankFile.getRecords().length;
371                    for ( int i = 1; i < rsrc.length; i++ )
372                    {
373                        task.setProgress( progress++ );
374                        final BankleitzahlenDatei update =
375                            new BankleitzahlenDatei( rsrc[i], bankfileProvider.getFormat( i ),
376                                                     bankfileProvider.getDateOfValidity( i ),
377                                                     bankfileProvider.getDateOfExpiration( i ) );
378
379                        this.bankFile.update( update );
380                        processedRecords += update.getRecords().length;
381                    }
382
383                    // Log outdated records.
384                    if ( this.getLogger().isDebugEnabled() )
385                    {
386                        for ( int i = 0, l0 = this.bankFile.getDeletedRecords().length; i < l0; i++ )
387                        {
388                            final BankleitzahlInfo record = this.bankFile.getDeletedRecords()[i];
389
390                            if ( record.isHeadOffice() )
391                            {
392                                this.getLogger().debug( this.getOutdatedInfoMessage(
393                                    this.getLocale(), record.getBankCode().format( Bankleitzahl.LETTER_FORMAT ) ) );
394
395                            }
396                        }
397                    }
398
399                    logExpirationMessage = true;
400                    this.initialized = true;
401
402                    this.getLogger().info( this.getBankfileInfoMessage(
403                        this.getLocale(), new Long( processedRecords ), new Integer( rsrc.length ) ) );
404
405                }
406                else
407                {
408                    this.getLogger().warn( this.getNoBankfilesFoundMessage( this.getLocale() ) );
409                }
410            }
411        }
412        catch ( final ParseException e )
413        {
414            throw new RuntimeException( e );
415        }
416        catch ( final IOException e )
417        {
418            throw new RuntimeException( e );
419        }
420        finally
421        {
422            if ( task != null )
423            {
424                this.getTaskMonitor().finish( task );
425            }
426        }
427
428        // Log an application message if the directory is outdated.
429        if ( logExpirationMessage )
430        {
431            if ( new Date().after( this.getDateOfExpiration() ) )
432            {
433                this.getApplicationLogger().log( new MessageEvent(
434                    this, new Message[]
435                    {
436                        new OutdatedBankleitzahlenVerzeichnisMessage( this.getDateOfExpiration() )
437                    }, MessageEvent.WARNING ) );
438
439            }
440        }
441    }
442
443    /**
444     * Checks configured properties.
445     *
446     * @throws PropertyException if configured properties hold invalid values.
447     */
448    private void assertValidProperties()
449    {
450        if ( this.getReloadIntervalMillis() < 0L )
451        {
452            throw new PropertyException( "reloadIntervalMillis", Long.toString( this.getReloadIntervalMillis() ) );
453        }
454        if ( this.getDateOfExpirationText() == null || this.getDateOfExpirationText().length() == 0 )
455        {
456            throw new PropertyException( "dateOfExpirationText", this.getDateOfExpirationText() );
457        }
458        if ( this.getDateOfExpirationPattern() == null || this.getDateOfExpirationPattern().length() == 0 )
459        {
460            throw new PropertyException( "dateOfExpirationPattern", this.getDateOfExpirationPattern() );
461        }
462
463        try
464        {
465            final DateFormat dateFormat = new SimpleDateFormat( this.getDateOfExpirationPattern() );
466            dateFormat.parse( this.getDateOfExpirationText() );
467        }
468        catch ( final ParseException e )
469        {
470            throw new PropertyException( "dateOfExpirationText", this.getDateOfExpirationText(), e );
471        }
472    }
473
474    /**
475     * Searches for a record replacing a given record recursively.
476     *
477     * @param bankInfo The record to search a replacing record for or {@code null}.
478     *
479     * @return The record to replace {@code bankInfo} with {@code null}.
480     */
481    private BankleitzahlInfo findReplacementBankeitzahlInfo( final BankleitzahlInfo bankInfo )
482    {
483        BankleitzahlInfo replacement = null;
484
485        if ( bankInfo != null && bankInfo.getReplacingBankCode() != null )
486        {
487            replacement = this.bankFile.getHeadOfficeRecord( bankInfo.getReplacingBankCode() );
488
489            if ( replacement == null )
490            {
491                replacement = this.bankFile.getDeletedHeadOfficeRecord( bankInfo.getReplacingBankCode() );
492            }
493
494            final BankleitzahlInfo recurse = this.findReplacementBankeitzahlInfo( replacement );
495
496            if ( recurse != null )
497            {
498                replacement = recurse;
499            }
500        }
501
502        return replacement;
503    }
504
505    /**
506     * Gets the {@code BankfileProvider} with the latest date of expiration from the available
507     * {@code BankfileProvider}s.
508     *
509     * @return The {@code BankfileProvider} with the latest date of expiration or {@code null}, if no providers are
510     * available.
511     *
512     * @throws IOException if getting the provider fails.
513     *
514     * @see BankfileProvider
515     */
516    private BankfileProvider getLatestBankfileProvider() throws IOException
517    {
518        final BankfileProvider[] providers = this.getBankfileProvider();
519        BankfileProvider latest = null;
520
521        for ( int i = providers.length - 1; i >= 0; i-- )
522        {
523            if ( providers[i].getBankfileCount() > 0
524                     && ( latest == null || latest.getDateOfExpiration( latest.getBankfileCount() - 1 ).
525                         before( providers[i].getDateOfExpiration( providers[i].getBankfileCount() - 1 ) ) ) )
526            {
527                latest = providers[i];
528            }
529        }
530
531        return latest;
532    }
533
534    //--Constructors------------------------------------------------------------
535
536// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:jdtausConstructors
537    // This section is managed by jdtaus-container-mojo.
538
539    /** Standard implementation constructor <code>org.jdtaus.banking.ri.blzdirectory.BankfileBankleitzahlenVerzeichnis</code>. */
540    public BankfileBankleitzahlenVerzeichnis()
541    {
542        super();
543    }
544
545// </editor-fold>//GEN-END:jdtausConstructors
546
547    //------------------------------------------------------------Constructors--
548    //--Dependencies------------------------------------------------------------
549
550// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:jdtausDependencies
551    // This section is managed by jdtaus-container-mojo.
552
553    /**
554     * Gets the configured <code>Logger</code> implementation.
555     *
556     * @return The configured <code>Logger</code> implementation.
557     */
558    private Logger getLogger()
559    {
560        return (Logger) ContainerFactory.getContainer().
561            getDependency( this, "Logger" );
562
563    }
564
565    /**
566     * Gets the configured <code>ApplicationLogger</code> implementation.
567     *
568     * @return The configured <code>ApplicationLogger</code> implementation.
569     */
570    private ApplicationLogger getApplicationLogger()
571    {
572        return (ApplicationLogger) ContainerFactory.getContainer().
573            getDependency( this, "ApplicationLogger" );
574
575    }
576
577    /**
578     * Gets the configured <code>TaskMonitor</code> implementation.
579     *
580     * @return The configured <code>TaskMonitor</code> implementation.
581     */
582    private TaskMonitor getTaskMonitor()
583    {
584        return (TaskMonitor) ContainerFactory.getContainer().
585            getDependency( this, "TaskMonitor" );
586
587    }
588
589    /**
590     * Gets the configured <code>BankfileProvider</code> implementation.
591     *
592     * @return The configured <code>BankfileProvider</code> implementation.
593     */
594    private BankfileProvider[] getBankfileProvider()
595    {
596        return (BankfileProvider[]) ContainerFactory.getContainer().
597            getDependency( this, "BankfileProvider" );
598
599    }
600
601    /**
602     * Gets the configured <code>Locale</code> implementation.
603     *
604     * @return The configured <code>Locale</code> implementation.
605     */
606    private Locale getLocale()
607    {
608        return (Locale) ContainerFactory.getContainer().
609            getDependency( this, "Locale" );
610
611    }
612
613// </editor-fold>//GEN-END:jdtausDependencies
614
615    //------------------------------------------------------------Dependencies--
616    //--Properties--------------------------------------------------------------
617
618// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:jdtausProperties
619    // This section is managed by jdtaus-container-mojo.
620
621    /**
622     * Gets the value of property <code>defaultReloadIntervalMillis</code>.
623     *
624     * @return Default number of milliseconds to pass before providers are checked for modifications.
625     */
626    private java.lang.Long getDefaultReloadIntervalMillis()
627    {
628        return (java.lang.Long) ContainerFactory.getContainer().
629            getProperty( this, "defaultReloadIntervalMillis" );
630
631    }
632
633    /**
634     * Gets the value of property <code>defaultMonitoringThreshold</code>.
635     *
636     * @return Default number of bank codes for which progress monitoring gets enabled.
637     */
638    private java.lang.Long getDefaultMonitoringThreshold()
639    {
640        return (java.lang.Long) ContainerFactory.getContainer().
641            getProperty( this, "defaultMonitoringThreshold" );
642
643    }
644
645    /**
646     * Gets the value of property <code>dateOfExpirationText</code>.
647     *
648     * @return The date of expiration of the directory.
649     */
650    private java.lang.String getDateOfExpirationText()
651    {
652        return (java.lang.String) ContainerFactory.getContainer().
653            getProperty( this, "dateOfExpirationText" );
654
655    }
656
657    /**
658     * Gets the value of property <code>dateOfExpirationPattern</code>.
659     *
660     * @return Format pattern of the date of expiration property.
661     */
662    private java.lang.String getDateOfExpirationPattern()
663    {
664        return (java.lang.String) ContainerFactory.getContainer().
665            getProperty( this, "dateOfExpirationPattern" );
666
667    }
668
669// </editor-fold>//GEN-END:jdtausProperties
670
671    //--------------------------------------------------------------Properties--
672    //--Messages----------------------------------------------------------------
673
674// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:jdtausMessages
675    // This section is managed by jdtaus-container-mojo.
676
677    /**
678     * Gets the text of message <code>outdatedInfo</code>.
679     * <blockquote><pre>Bankleitzahl {0} ist veraltet.</pre></blockquote>
680     * <blockquote><pre>Bankleitzahl {0} is outdated.</pre></blockquote>
681     *
682     * @param locale The locale of the message instance to return.
683     * @param bankleitzahl format parameter.
684     *
685     * @return the text of message <code>outdatedInfo</code>.
686     */
687    private String getOutdatedInfoMessage( final Locale locale,
688            final java.lang.String bankleitzahl )
689    {
690        return ContainerFactory.getContainer().
691            getMessage( this, "outdatedInfo", locale,
692                new Object[]
693                {
694                    bankleitzahl
695                });
696
697    }
698
699    /**
700     * Gets the text of message <code>bankfileInfo</code>.
701     * <blockquote><pre>{1,choice,0#Keine Bankleitzahlendatei|1#Eine Bankleitzahlendatei|1<{1} Bankleitzahlendateien} gelesen. {0,choice,0#Keine Datensätze|1#Einen Datensatz|1<{0} Datensätze} verarbeitet.</pre></blockquote>
702     * <blockquote><pre>Read {1,choice,0#no bankfile|1#one bankfile|1<{1} bankfiles}. Processed {0,choice,0#no entities|1#one entity|1<{0} entities}.</pre></blockquote>
703     *
704     * @param locale The locale of the message instance to return.
705     * @param entityCount format parameter.
706     * @param bankfileCount format parameter.
707     *
708     * @return the text of message <code>bankfileInfo</code>.
709     */
710    private String getBankfileInfoMessage( final Locale locale,
711            final java.lang.Number entityCount,
712            final java.lang.Number bankfileCount )
713    {
714        return ContainerFactory.getContainer().
715            getMessage( this, "bankfileInfo", locale,
716                new Object[]
717                {
718                    entityCount,
719                    bankfileCount
720                });
721
722    }
723
724    /**
725     * Gets the text of message <code>reloadInfo</code>.
726     * <blockquote><pre>Änderungszeitstempel des Bankleitzahlen-Providers von ''{0,date} {0,time}'' zu ''{1,date} {1,time}''. Lädt neue Bankleitzahlen.</pre></blockquote>
727     * <blockquote><pre>Provider's last modification timestamp changed from ''{0,date} {0,time}'' to ''{1,date} {1,time}''. Loading new bankcodes.</pre></blockquote>
728     *
729     * @param locale The locale of the message instance to return.
730     * @param lastModification format parameter.
731     * @param lastProviderModification format parameter.
732     *
733     * @return the text of message <code>reloadInfo</code>.
734     */
735    private String getReloadInfoMessage( final Locale locale,
736            final java.util.Date lastModification,
737            final java.util.Date lastProviderModification )
738    {
739        return ContainerFactory.getContainer().
740            getMessage( this, "reloadInfo", locale,
741                new Object[]
742                {
743                    lastModification,
744                    lastProviderModification
745                });
746
747    }
748
749    /**
750     * Gets the text of message <code>noBankfilesFound</code>.
751     * <blockquote><pre>Keine Bankleitzahlendateien gefunden.</pre></blockquote>
752     * <blockquote><pre>No bankcode files found.</pre></blockquote>
753     *
754     * @param locale The locale of the message instance to return.
755     *
756     * @return the text of message <code>noBankfilesFound</code>.
757     */
758    private String getNoBankfilesFoundMessage( final Locale locale )
759    {
760        return ContainerFactory.getContainer().
761            getMessage( this, "noBankfilesFound", locale, null );
762
763    }
764
765// </editor-fold>//GEN-END:jdtausMessages
766
767    //----------------------------------------------------------------Messages--
768}