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}