View Javadoc
1   /*
2    *  jDTAUS Banking RI Bankleitzahlenverzeichnis
3    *  Copyright (C) 2005 Christian Schulte
4    *  <cs@schulte.it>
5    *
6    *  This library is free software; you can redistribute it and/or
7    *  modify it under the terms of the GNU Lesser General Public
8    *  License as published by the Free Software Foundation; either
9    *  version 2.1 of the License, or any later version.
10   *
11   *  This library is distributed in the hope that it will be useful,
12   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   *  Lesser General Public License for more details.
15   *
16   *  You should have received a copy of the GNU Lesser General Public
17   *  License along with this library; if not, write to the Free Software
18   *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19   *
20   */
21  package org.jdtaus.banking.ri.blzdirectory;
22  
23  import java.io.IOException;
24  import java.net.URL;
25  import java.text.DateFormat;
26  import java.text.DecimalFormat;
27  import java.text.NumberFormat;
28  import java.text.ParseException;
29  import java.text.SimpleDateFormat;
30  import java.util.ArrayList;
31  import java.util.Collection;
32  import java.util.Date;
33  import java.util.Locale;
34  import java.util.regex.Pattern;
35  import java.util.regex.PatternSyntaxException;
36  import org.jdtaus.banking.Bankleitzahl;
37  import org.jdtaus.banking.BankleitzahlExpirationException;
38  import org.jdtaus.banking.BankleitzahlInfo;
39  import org.jdtaus.banking.BankleitzahlenVerzeichnis;
40  import org.jdtaus.banking.messages.OutdatedBankleitzahlenVerzeichnisMessage;
41  import org.jdtaus.banking.messages.ReadsBankleitzahlenDateiMessage;
42  import org.jdtaus.banking.messages.SearchesBankleitzahlInfosMessage;
43  import org.jdtaus.banking.util.BankleitzahlenDatei;
44  import org.jdtaus.core.container.ContainerFactory;
45  import org.jdtaus.core.container.PropertyException;
46  import org.jdtaus.core.logging.spi.Logger;
47  import org.jdtaus.core.monitor.spi.Task;
48  import org.jdtaus.core.monitor.spi.TaskMonitor;
49  import org.jdtaus.core.text.Message;
50  import org.jdtaus.core.text.MessageEvent;
51  import org.jdtaus.core.text.spi.ApplicationLogger;
52  
53  /**
54   * {@code BankleitzahlenVerzeichnis} implementation backed by bank files.
55   * <p>This implementation uses bank file resources provided by any available {@link BankfileProvider}
56   * implementation.</p>
57   *
58   * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
59   * @version $JDTAUS: BankfileBankleitzahlenVerzeichnis.java 8893 2014-12-08 22:40:08Z schulte $
60   */
61  public class BankfileBankleitzahlenVerzeichnis implements BankleitzahlenVerzeichnis
62  {
63  
64      /** Flag indicating that initialization has been performed. */
65      private boolean initialized;
66  
67      /** {@code BankleitzahlenDatei} delegate. */
68      private BankleitzahlenDatei bankFile;
69  
70      /** Date of expiration. */
71      private Date dateOfExpiration;
72  
73      /** Timestamp providers got checked for modifications. */
74      private long lastModificationCheck = System.currentTimeMillis();
75  
76      /** Number of milliseconds to pass before providers are checked for modifications. */
77      private Long reloadIntervalMillis;
78  
79      /** Provider checked for modifications. */
80      private BankfileProvider provider;
81  
82      /** Last modification of the provider checked for modifications. */
83      private long lastModifiedMillis;
84  
85      /** Number of bank codes for which progress monitoring gets enabled. */
86      private Long monitoringThreshold;
87  
88      /**
89       * Creates a new {@code BankfileBankleitzahlenVerzeichnis} instance taking the number of milliseconds to pass before
90       * resources are checked for modifications and the number of bank codes for which progress monitoring gets enabled.
91       *
92       * @param reloadIntervalMillis Number of milliseconds to pass before resources are checked for modifications.
93       * @param monitoringThreshold Number of bank codes for which progress monitoring gets enabled.
94       */
95      public BankfileBankleitzahlenVerzeichnis( final long reloadIntervalMillis, final long monitoringThreshold )
96      {
97          this();
98          if ( reloadIntervalMillis > 0 )
99          {
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 }