Apache Commons Validator 1.9.0
RELEASE NOTES

The Apache Commons Validator team is pleased to announce the release of Apache Commons Validator 1.9.0.

Apache Commons Validator provides the building blocks for both client side validation and server side data validation.
It may be used standalone or with a framework like Struts.


This is a maintenance and bug fix release; requires Java 8.

For complete information on Apache Commons Validator, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons Validator website:

http://commons.apache.org/proper/commons-validator/

Download page: http://commons.apache.org/proper/commons-validator/download_validator.cgi

Changes in this version
-----------------------

New features
------------

*                 IBANValidator: #209 - add Falkland Islands, Mongolia, Nicaragua, Oman, Somalia Thanks to homebeaver.
*                 ISINValidator: Add 9 additional exception country code #129. Thanks to ashoknan2, Gary Gregory.
*                 ISINValidator: Add all codes from ISO 3166-1 alpha-2 except unassigned code elements. Thanks to Gary Gregory.
*                 Add validator CASNumberCheckDigit for Chemical Registry CAS Numbers and ECNumberCheckDigit #217. Thanks to homebeaver, Gary Gregory.
*                 Add PMD check to default Maven goal. Thanks to Gary Gregory.

Fixed Bugs
----------

* VALIDATOR-492:  ValidatorUtils.copyFastHashMap is broken. Thanks to Tobias Wildgruber, Gary Gregory.
*                 DomainValidator: Changes from Version 2024040200, Apr 2 07:07:02 2024 UTC. Thanks to Sebb.
*                 Fix PMD UnnecessaryFullyQualifiedName. Thanks to Gary GRegory.

Changes
-------

*                 Bump org.apache.commons:commons-parent from 65 to 70 #201. Thanks to Dependabot, Gary Gregory.
*                 Bump commons-logging:commons-logging from 1.3.0 to 1.3.2 #199, #221. Thanks to Dependabot.
*                 Bump org.apache.commons:commons-csv from 1.10.0 to 1.11.0 #214. Thanks to Dependabot.


Historical list of changes: http://commons.apache.org/proper/commons-validator/changes-report.html

Enjoy!
-Apache Commons Validator team

-----------------------------------------------------------------------------
Apache Commons Validator 1.8.0
RELEASE NOTES

The Apache Commons Validator team is pleased to announce the release of Apache Commons Validator 1.8.0.

Apache Commons Validator provides the building blocks for both client side validation and server side data validation.
It may be used standalone or with a framework like Struts.

For complete information on Apache Commons Validator, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons Validator website:

http://commons.apache.org/proper/commons-validator/

Download page: http://commons.apache.org/proper/commons-validator/download_validator.cgi

Changes in this version
-----------------------

New features
------------

*                 Add github/codeql-action. Thanks to Dependabot, Gary Gregory.
* VALIDATOR-486:  Add new countries to IBAN list: DJ, RU #88. Thanks to tatiana-scda, Gary Gregory.
*                 Add IBANValidator.Validator.getRegexValidator(). Thanks to Arnaud Fournier, Gary Gregory.
*                 Add RegexValidator.getPatterns(). Thanks to Arnaud Fournier, Gary Gregory.
*                 Add country codes listed as other countries and territories in the IBAN registry for Finland: AX. Thanks to Gary Gregory, rossmills3, sebbASF.
*                 Add country codes listed as other countries and territories in the IBAN registry for France: GF, GP, MQ, RE, PF, TF, YT, NC, BL, MF, PM, WF. Thanks to Gary Gregory, rossmills3, sebbASF.
*                 Add country codes listed as other countries and territories in the IBAN registry for United Kingdom: IM, JE, GG. Thanks to Gary Gregory, rossmills3, sebbASF.
*                 Add ValidatorAction.setClassName(String) and deprecate setClassname(String). Thanks to Gary Gregory.

Fixed Bugs
----------

*                 Update Javadoc for InetAddressValidator isValid #76 Thanks to Gennaro Napolitano.
* VALIDATOR-479:  Fix typo in /routines/package-summary.html #79. Thanks to Gyoo.
*                 Use JUnit 5 assertThrows() #92, #93, #94, #95. Thanks to John Patrick.
*                 [StepSecurity] ci: Harden GitHub Actions #136. Thanks to step-security-bot, Gary Gregory.
*                 Javadoc typos #144. Thanks to Andrés Torres.
*                 Precompile regular expression in InetAddressValidator.isValidInet6Address(String). Thanks to Gary Gregory.
*                 Fix SpotBugs [ERROR] Medium: Class org.apache.commons.validator.routines.CreditCardValidator$1 defines non-transient non-serializable instance field ccr [org.apache.commons.validator.routines.CreditCardValidator$1] In CreditCardValidator.java SE_BAD_FIELD. Thanks to Gary Gregory.
*                 Fix SpotBugs [ERROR] High: Class org.apache.commons.validator.ValidatorAction defines non-transient non-serializable instance field validationMethod [org.apache.commons.validator.ValidatorAction] In ValidatorAction.java SE_BAD_FIELD. Thanks to Gary Gregory.
*                 Fix SpotBugs [ERROR] High: Found reliance on default encoding in org.apache.commons.validator.ValidatorAction.readJavascriptFile(String): new java.io.InputStreamReader(InputStream) [org.apache.commons.validator.ValidatorAction] At ValidatorAction.java:[line 428] DM_DEFAULT_ENCODING. Thanks to Gary Gregory.
*                 Fix SpotBugs [ERROR] Medium: Inconsistent synchronization of org.apache.commons.validator.ValidatorAction.jsFunction; locked 62% of time [org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.ValidatorAction] Unsynchronized access at ValidatorAction.java:[line 340]Unsynchronized access at ValidatorAction.java:[line 358]Synchronized access at ValidatorAction.java:[line 393]Synchronized access at ValidatorAction.java:[line 394]Synchronized access at ValidatorAction.java:[line 459]Synchronized access at ValidatorAction.java:[line 461]Synchronized access at ValidatorAction.java:[line 462] IS2_INCONSISTENT_SYNC. Thanks to Gary Gregory.
*                 Port tests to JUnit 5. Exception: DomainValidatorStartupTest. Thanks to Gary Gregory.
*                 Use singletons in org.apache.commons.validator.CreditCardValidator. Thanks to Gary Gregory.

Changes
-------

*                 Bump Java from 7 to 8. Thanks to Gary Gregory.
*                 Bump actions/cache from 2 to 3.0.11 #71, #84. #90, #91. Thanks to Dependabot, Gary Gregory.
*                 Bump actions/checkout from 2.3.1 to 3.0.2, #38, #47, #70. Thanks to Dependabot, Gary Gregory.
*                 Bump actions/setup-java from 1.4.0 to 3.6.0 #42, #72, #98. Thanks to Dependabot, Gary Gregory.
*                 Bump actions/upload-artifact from 3.1.0 to 3.1.1 #96. Thanks to Dependabot.
*                 Bump junit from 4.13 to 5.9.1 Vintage #44. Thanks to Dependabot, Gary Gregory.
*                 Bump maven-pmd-plugin from 3.13.0 to 3.19.0 #69, #77, #80, #81. Thanks to Dependabot.
*                 Bump commons-parent from 52 to 65 #83, #107, #111, #132. Thanks to Gary Gregory, Dependabot.
*                 Bump japicmp-maven-plugin from 0.15.3 to 0.15.7. Thanks to Gary Gregory.
*                 Bump maven-antrun-plugin from 3.0.0 to 3.1.0 #74. Thanks to Dependabot.
*                 Bump commons-csv from 1.6 to 1.10.0 #118. Thanks to Gary Gregory, Dependabot.
*                 Bump japicmp-maven-plugin from 0.15.7 to 0.16.0. Thanks to Gary Gregory.
*                 Bump commons-logging:commons-logging from 1.2 to 1.3.0. Thanks to Gary Gregory.

Removed
-------

*                 Remove FindBugs, SpotBugs is in use #87. Thanks to John Patrick, Gary Gregory.

Historical list of changes: http://commons.apache.org/proper/commons-validator/changes-report.html

Enjoy!
-Apache Commons Validator team

-----------------------------------------------------------------------------

Apache Commons Validator 1.7
RELEASE NOTES

The Apache Commons Validator team is pleased to announce the release of Apache Commons Validator 1.7

Apache Commons Validator provides the building blocks for both client side validation and server side data validation.
It may be used standalone or with a framework like Struts.


This is primarily a maintenance release.
All projects are encouraged to update to this release of Apache Commons Validator.

Commons Validator requires Java 7 or later.

Main enhancements
-----------------

* CreditCard validation specification by numeric range
* DomainValidator instances can be created with instance overrides
* DomainValidator supports overrides of LOCAL TLDs

IMPORTANT NOTES
---------------

BREAKING CHANGES:

* Now requires Java 7
* N.B. Java 9 changed the way Locales are handled. This affects the output from some Date-related methods, and may cause some tests to break.

DEPENDENCIES
------------

* Updates Apache Commons BeanUtils dependency from 1.9.2 to 1.9.4.
 This picks up BEANUTILS-482: Update commons-collections from 3.2.1 to 3.2.2 (CVE-2015-4852).

For the current list of dependencies, please see http://commons.apache.org/validator/dependencies.html

For complete information on Apache Commons Validator, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons Validator website:

http://commons.apache.org/proper/commons-validator/

Download page: http://commons.apache.org/proper/commons-validator/download_validator.cgi

Changes in this version
-----------------------

New features
------------

* VALIDATOR-474:  DomainValidator should allow local overrides
* VALIDATOR-473:  Allow Email- and UrlValidator to use specified DomainValidator
* VALIDATOR-471:  Allow DomainValidator overrides at run-time
* VALIDATOR-423:  Add ISINValidator
* VALIDATOR-455:  Add IBAN validator for VA – Vatican City State Thanks to Eugen Hanussek.
* VALIDATOR-446:  ISSN Validator extract ISSN from EAN-13 Thanks to Alex.

Fixed Bugs
----------

* VALIDATOR-403:  Accept Discover cards of 17 digits long that start with 6011 Thanks to Tanya.
* VALIDATOR-408:  DISCOVER Card Validation Patterns Thanks to Raj Vaida.
* VALIDATOR-472:  UrlValidator should not be more lax than java.net.URI
* VALIDATOR-283:  URLValidator should check for illegal Hex characters Thanks to RC Johnson.
* VALIDATOR-445:  Inet6Address may also contain a scope id Thanks to devson.
* VALIDATOR-452:  Validation of URL containing IPv4-mapped IPv6 address Thanks to devson.
* VALIDATOR-438:  IBANValidator fails for El Salvador
                  Add definition Thanks to Simon Marti.
* VALIDATOR-434:  Field does not synchronize iteration on synchronized list Thanks to emopers.
* VALIDATOR-437:  Update Apache Commons BeanUtils dependency from 1.9.2 to 1.9.3.
                  This picks up BEANUTILS-482: Update commons-collections from 3.2.1 to 3.2.2 (CVE-2015-4852).
* VALIDATOR-460:  Update Apache Commons BeanUtils dependency from 1.9.3 to 1.9.4
                  This picks up BEANUTILS-520: Mitigate CVE-2014-0114. Thanks to Jeff Schram.
* VALIDATOR-461:  Generic .gmbh top level domain is considered invalid Thanks to Nils Reischmann.
* VALIDATOR-444:  LongValidator: numbers bigger than the maxvalue are Valid Thanks to Martin Scholz.
* VALIDATOR-416:  CreditCardValidator default ctor disagrees with Javadoc
* VALIDATOR-467:  URL validator fails if path starts with double slash and has underscores Thanks to Ivan Larionov.
* VALIDATOR-464:  UrlValidator says "file://bad ^ domain.com/label/test" is valid Thanks to Sebastian Choina.
* VALIDATOR-449:  Leading and trailing spaces in EmailValidator should not be valid Thanks to Frederic Boutin.
* VALIDATOR-302:  EMailValidator: Addresses with leading spaces must not be accepted Thanks to Guido Zockoll.
* VALIDATOR-468:  DomainValidator.getTLDArray does not synch mutable arrays

Changes
-------

*                 Drop Clirr and Cobertura in favour of JApiCmp and JaCoCo
*                 IANA TLD lists: Updated to Version 2020073100, Last Updated Fri Jul 31 07:07:01 2020 UTC
* VALIDATOR-428:  Update commons digester to 2.1 Thanks to Matthew Zavislak.


Historical list of changes: http://commons.apache.org/proper/commons-validator/changes-report.html

Enjoy!
- The Apache Commons Validator team

-----------------------------------------------------------------------------
