ao-hodgepodge-5.3.0-SNAPSHOT
Snapshot Notes
- Updated to Checkstyle 10.21.1.
- Minimum Java version changed from 1.8 to 11.
- SyncFile improvements:
- RandomAccessFile.length()is returning 0 on Linux block devices as of Java 11. Implemented fall-back to- /sbin/blockdev --getsize64 …, but only for canonical paths starting with- /dev/.
- Debug output disabled, but verbose remains
 
- New class AoTextField.
- New class RunnableDocumentListener.
ao-hodgepodge-5.2.0
Release Notes
- Additional recurring schedule parsing:
- Supporting "other" for "every ### unit", equal to "2".
- Supporting ordinals for "every ### unit" from 2 to 12: "second", "third", …, "twelfth".
- Days of week may now be referred to in plural form, such as "Fridays".
- Months of year may now be referred to in plural form, such as "Januarys" or "Januaries".
- Supporting days of week as unit for "every ### unit", such as "every other Friday" or "every 100 mondays".
- Substituting more specialized recurring implementations for "every 1 (day|week|month|year)" as equivalent to "everyday", "weekly", "monthly", "yearly".
- Substituting "everyday" in place of "on …" that contains every day of the week.
- Substituting "weekdays" in place of "on …" that contains every weekday.
- Substituting "monthly" in place of "in …" that contains every month.
 
- Added missing implementations of checkScheduleFrom(…).
- Maintaining original day-of-month in all types of yearly and monthly processing. Some uses would previously round-down for shorter months and lose the original "on" day-of-month.
- Added unit tests for recurring scheduling.
ao-hodgepodge-5.1.2
Release Notes
- 
Fixed bug in Benchmarkthat was seeking to byte offset instead of 4k block number. This resulted in significantly higher I/O measurements due to caching. This was a result of some previous refactoring to use random number generator streams.
ao-hodgepodge-5.1.1
Release Notes
- RandomAccessFile.length()is returning 0 on Linux block devices as of Java 11. Implemented fall-back to- /sbin/blockdev --getsize64 …, but only for canonical paths starting with- /dev/.
ao-hodgepodge-5.1.0
Release Notes
- Updated dependencies.
- New interface NoClosealong with staticwrap(…)methods to avoid duplicate wrapping.
- MarkupCoercion.write(…)disallows potential bypass of buffered encoders.
- MarkupCoercionalways writes prefix/suffix even when value is null, for consistency. For example, writing null text in JavaScript should still be "", since writing null is equivalent to "".
- MarkupCoercioncan unwrap an- EncoderWriterwhen encoder is null. This is done for consistency with the related implementation of- Coercionin AO Lang.
- Removed all implementations of Object.finalize().
ao-hodgepodge-5.0.2
Release Notes
- Now properly restoring Thread interrupted state on InterruptedException.
- Cleaning-up ThreadLocal variables when no longer used, see https://rules.sonarsource.com/java/RSPEC-5164.
- DontCloseOutputStreamnow overrides- write(byte[],int,int)for greater performance.
- 
Deprecated DontCloseInputStreamandDontCloseOutputStreamin favor or duplicateNoCloseInputStreamandNoCloseOutputStream.
ao-hodgepodge-5.0.1
Release Notes
- Log warnings when unable to read resource bundle source files due to SecurityException.
- notify()replaced with- notifyAll()since more than one thread can be waiting.
ao-hodgepodge-5.0.0
Release Notes
- Now supports Java 9+ modules with included module-info.class.
- Maven artifact relocated from com.aoindustries:aocode-publictocom.aoapps:ao-hodgepodge.
- Packages renamed from com.aoindustries.*tocom.aoapps.hodgepodge.*.
- Renamed NativeToUnixWritertoNativeToPosixWriter.
- Images.getImageFromResourcesnow uses a provided lambda function to get the resources. This allows access to resources without opening the package.
aocode-public-4.9.1
Release Notes
- RandomAccessFile.length()is returning 0 on Linux block devices as of Java 11. Implemented fall-back to- /sbin/blockdev --getsize64 ….
aocode-public-4.9.0
Release Notes
- MarkupCoercionimprovements:- Added optimization for Segmentto not convert to String for bundle lookups.
- Added support for Optionalby unwrapping the value.
 
- Added optimization for 
aocode-public-4.8.0
Release Notes
- Coercionmoved out of AO Encoding:- Non-localized parts moved to AO Lang.
- 
Localized parts moved to this project and
renamed to MarkupCoercion.
- New pluggable CoercionOptimizerto allow this decoupling.
- Servlet-specific optimizations moved to AO Servlet Util.
 
aocode-public-4.7.2
Release Notes
- AOPoolnow logs allocation stack traces when full and a thread has to wait for a connection. The logging is limited to once per minute maximum, due to the message length.
aocode-public-4.7.1
Release Notes
- Moved UnixCryptto the new AO Security project.
aocode-public-4.7.0
Release Notes
- 
Deprecated Base64Coderin favor ofBase64available since Java 8.
- 
Removed dependency on the com.aoindustries.securitypackage, which has been split from AO Lang to the new AO Security project:- AOPoolnow internally tracks thread ID as a- Longinstead of- SmallIdentifier. This only affects the textual display of thread ID in- printStatisticsHTML(…), and it is arguably more meaningful since they are now sequentially generated.
- 
Moved read/write methods for IdentifierandSmallIdentifierfromStreamableInputandStreamableOutputto static methods on a newSecurityStreamablesclass.
 
aocode-public-4.6.0
Release Notes
- 
Deprecated fixed padding in PaddingOutputStreamin favor of random padding. Also supports zero value forpadding, which disables padding, which is consistent withCipher.getBlockSize()returning zero when not a block cipher.
aocode-public-4.5.1
Release Notes
- 
Reverted back to the ThreadLocalfor in-context translation settings being initialized when missing, instead of returningnull. This is for compatibility with prior versions. With this restored, sub-tasks are part of the same settings, and thus share lookup maps, even when settings are not explicitly set prior to sub-task execution.
aocode-public-4.5.0
Release Notes
- In-context translation settings may now be reset and restored on-the-fly. This allows the in-context translations to be temporarily reconfigured.
- New option to disable scripts within the in-context translation tools. This is useful when writing HTML that will not be immediately used by the browser, such as when generating email body content.
- In-context translation editor now supports both SGML (HTML) and XML (XHTML) serializations.
- In-context translations markups may now be disabled while still recording lookups. This allows the user interface to display the editor for lookups that were performed while markup disabled.
aocode-public-4.4.0
Release Notes
- 
Split development-only classes into a new sub-project in devel/. This sub-project is used only for development and is never deployed to artifact repositories.
- Reverted a previous change made on 2020-03-01 that was released in version 4.0.0 on 2020-03-25. Encoding of in-context translation lookup markups is required after all. - One example is the lookup IDs added inside alt attributes like - alt="<##<value>##>". With this bug, this was incorrectly written as- alt="<##<value>##>", which fails XML validation.- This bug is unlikely to affect production systems for two reasons: - Lookup markups are only performed when in-context translations are enabled, which is only when in development mode.
- Most production sites are served in SGML mode, where browsers will handle the incorrect HTML formatting. XML mode is used in development specifically for this stricter validation.
 
aocode-public-4.3.0
Release Notes
- 
Moved the com.aoindustries.sqlpackage to the new AO SQL project, with the exception ofLocalizedSQLExceptionthat stays here with other localized exceptions.
- ConnectionWrappermoved to new- com.aoindustries.sql.wrapperpackage in the new AO SQL Wrapper project.
- AOConnectionPoolmoved to new- com.aoindustries.sql.poolpackage in the new AO SQL Pool project.
- BackgroundCachenow allows all- Throwable. This is a source-compatible, but binary-incompatible change. A recompile of dependents will is required.
- Temporary files are now created with more secure default permissions.
- Now registering exception types for use with - Throwables.newSurrogate(…)that supports creating new instances of throwables in order to have caller stack trace. When wrapped, the original throwable is the cause of the new throwable. When not wrapped, the original throwable is used directly and caller stack trace is lost.- This is used to maintain exception types and states across thread boundaries, such as when an exception cause is obtained from an - ExecutionException.
- Now using java.io.UncheckedIOExceptioninstead ofWrappedException.
aocode-public-4.2.0
Release Notes
- 
Added support for Web development file types *.less,*.sass,*.scss,*.css.map, and*.js.map.
aocode-public-4.1.1
Release Notes
- ZeroFileno longer writes blank lines when there are no blocks to read or write.
aocode-public-4.1.0
Release Notes
- ModifiablePropertiesResourceBundlenow writes properties files with keys sorted (base, base + MODIFIED_SUFFIX, base + VALIDATED_SUFFIX). This groups the keys together better, which aids version control diffs.
aocode-public-4.0.0
Release Notes
- Minimum Java version changed from 1.7 to 1.8.
- 
Reduced use of property substitutions in pom.xml. This is to help 3rd-party parsers that fail to perform full Maven-compatible substitutions.
- 
Deprecated MimeType: This simple hard-coded list of MIME types is not maintained well. It is strongly recommended to use a different, well-supported API.
- 
Made EncodingUtils.toString(Object)(deprecated) consistent with Coercion:- Supporting instances of Writable.
- Supporting instances of CharSequence.
- Supporting instances of char[].
 
- EncodingUtils.encodeHtml(…)(deprecated) now require additional- isXhtmlflag.
- Connection pool statistics HTML generation now supports both SGML and XML serializations.
- 
New bundle lookup markup types:
- MarkupType.CSS for text/css.
 
- MarkupType.CSS for 
- com.aoindustries.util.logging.*significantly reworked to be compatible with- logging.properties.
- TopologicalSorternow returns a modifiable- Set. Previously it returned an unmodifiable- List.
- Updated dependencies.
- Removed the com.aoindustries.securitypackage:- com.aoindustries.security.NotAuthenticatedExceptionmoved to the AO Lang project. Resolves this split-package with AO Lang.
- 
Removed com.aoindustries.security.AccountDisabledException; please use AccountLockedException instead.
- 
Removed com.aoindustries.security.AccountNotFoundException; please use AccountNotFoundException instead.
- 
Removed com.aoindustries.security.BadPasswordException; please use FailedLoginException instead.
- 
Removed com.aoindustries.security.IncompleteLoginException; please use CredentialNotFoundException instead.
- 
Removed com.aoindustries.security.LoginException; please use LoginException instead.
 
- Moved the com.aoindustries.util.persistentpackage to the new AO Persistence project.
- Split collection-related utilities into new AO Collections project.
aocode-public-3.1.1
Release Notes
- Now supporting queries and anchors on EditableResourceBundle.setValueUrl.
aocode-public-3.1.0
Release Notes
- During coercion, XML Node will be output as UTF-8.
- Moved networking utilities to AO Net Types.
- Moved Servlet and JSP related utilities to a new AO Servlet Util project.
- This project no longer depends on servlet and JSP APIs.
- Moved the following classes to the new AO Lang project:
- com.aoindustries.util.StringUtility
 
- 
New class DiffableProperties
to format Properties
files in a way optimized for diff tools, such as git diff. Best used in conjunction with SortedProperties.
- Made CommentCaptureInputStream public so other tools may use it when manipulating Properties files.
- Made SkipCommentsFilterOutputStream public so other tools may use it when manipulating Properties files.
- ModifiablePropertiesResourceBundle now stores the properties files in the maximally diffable format. It also no longer overwrites the file when the content has not changed.
aocode-public-3.0.0
Release Notes
- New abstract class ConnectionWrapper split from PostgresqlConnectionWrapper to be used by other implementations of Connection wrapping.
- Removed some long-deprecated or otherwise long-unused classes and methods:
- com.aoindustries.servlet.http.ServletUtil.getResource(…)
- com.aoindustries.servlet.http.ServletUtil.resourceExists(…)
- com.aoindustries.sql.SQLUtility.escapeSQL(…)
- com.aoindustries.sql.SQLUtility.encodeString(String)
- com.aoindustries.sql.SQLUtility.decodeString(String)
- com.aoindustries.sql.SQLUtility.negIntIfEmpty(String)
- com.aoindustries.sql.SQLUtility.negLongIfEmpty(String)
- com.aoindustries.sql.SQLUtility.nullIfEmpty(String)
- com.aoindustries.sql.SQLUtility.getDaysFromMillis(long)
- com.aoindustries.sql.SQLUtility.getMillisFromDays(long)
- com.aoindustries.sql.SQLUtility.roundToDay(long)
- com.aoindustries.sql.SQLUtility.printResultSetHTMLTable(ResultSet, Appendable, String, boolean)
- com.aoindustries.util.Stack
- com.aoindustries.util.StringUtility.buildEmailList(String[])
- com.aoindustries.util.StringUtility.buildList(…)
- com.aoindustries.util.StringUtility.compareToDDMMYYYY(String, String)
- com.aoindustries.util.StringUtility.convertStringDateToTime(String)
- com.aoindustries.util.StringUtility.countOccurances(…)
- com.aoindustries.util.StringUtility.escapeSQL(String)
- com.aoindustries.util.StringUtility.getDateMMDDYYYY(String)
- com.aoindustries.util.StringUtility.getDateString(…)
- com.aoindustries.util.StringUtility.getDateStringMMDDYYYY(Date)
- com.aoindustries.util.StringUtility.getDateStringSecond(…)
- com.aoindustries.util.StringUtility.getStringArray(List)
- com.aoindustries.util.StringUtility.intern(String)
- com.aoindustries.util.StringUtility.isValidDate(String)
- com.aoindustries.util.StringUtility.leapYear(int)
- com.aoindustries.util.StringUtility.removeChars(…)
- com.aoindustries.util.WildcardPatternMatcher.getMatchNone()
- com.aoindustries.util.WildcardPatternMatcher.getMatchAll()
- com.aoindustries.util.WildcardPatternMatcher.getInstance(String)
- com.aoindustries.util.logging.ProcessTimer.ProcessTimer(Logger, Random, String, String, String, String, long, long)
- com.aoindustries.util.logging.ProcessTimer.finished()
- com.aoindustries.util.persistent.PersistentCollections.charToBuffer(…)
- com.aoindustries.util.persistent.PersistentCollections.bufferToChar(…)
- com.aoindustries.util.persistent.PersistentCollections.shortToBuffer(…)
- com.aoindustries.util.persistent.PersistentCollections.bufferToShort(…)
- com.aoindustries.util.persistent.PersistentCollections.intToBuffer(…)
- com.aoindustries.util.persistent.PersistentCollections.bufferToInt(…)
- com.aoindustries.util.persistent.PersistentCollections.longToBuffer(…)
- com.aoindustries.util.persistent.PersistentCollections.bufferToLong(…)
 
- Significant, breaking changes to SQLUtility:
- Renamed getDate(long)toformatDate(long)
- Added formatDate(long, TimeZone)for other time zones
- Added formatDate(Long)for nullable integers
- Added formatDate(Long, TimeZone)for nullable integers
- Added formatDate(Date)for dates
- Added formatDate(Date, TimeZone)for dates
- Renamed getDate(String)toparseDate(String)
- Added parseDate(String, TimeZone)for other time zones
- Renamed getDateTime(long)toformatDateTime(long)
- Added formatDateTime(long, TimeZone)for other time zones
- Added formatDateTime(Long)for nullable integers
- Added formatDateTime(Long, TimeZone)for nullable integers
- Added formatDateTime(Date)for dates
- Added formatDateTime(Date, TimeZone)for dates
- Renamed getDateTime(String)toparseDateTime(String)
- Added parseDateTime(String, TimeZone)for other time zones
- Renamed getTime(long)toformatTime(long)
- Added formatTime(long, TimeZone)for other time zones
- Added formatTime(Long)for nullable integers
- Added formatTime(Long, TimeZone)for nullable integers
- Added formatTime(Date)for dates
- Added formatTime(Date, TimeZone)for dates
- Renamed getDecimal(int)toformatDecimal2(int)
- Renamed getDecimal(long)toformatDecimal2(long)
- Renamed getPennies(String)toparseDecimal2(String)
- Renamed getPenniesLong(String)toparseLongDecimal2(String)
- Renamed getMilliDecimal(int)toformatDecimal3(int)
- Renamed getMilliDecimal(long)toformatDecimal3(long)
- Renamed getMillis(String)toparseDecimal3(String)
- Added parseLongDecimal3(String)
 
- Renamed 
- Renamed Compressed*toStreamable*and moved to newcom.aoindustries.io.streampackage:- Renamed CompressedDataInputStreamto StreamableInput.
- Renamed CompressedDataOutputStreamto StreamableOutput.
- Renamed CompressedReadableto StreamReadable.
- Renamed CompressedWritableto StreamWritable.
- Moved Streamableto Streamable.
 
- Renamed 
- New methods to read and write possibly nullable Timestamp in StreamableOutput and StreamableInput. - These methods use a wire protocol deliberately compatible with Instant in Java 8, however the API remains - Timestamp-only since the minimum Java version is still 1.7.
- 
Added protocol version to reading in StreamableandCompressedReadable, because a server may be reading objects streamed by older clients. Protocol compatibility can be necessary both directions.
- New methods to read and write possibly nullable IdentifierandSmallIdentifier.
- FileListnow implements- Closeable.
- SQLUtility.printTable(…)improvements:- 
Created a variant of printTable(…)that acceptsIterable<? extends Object[]>for row data. Deprecated the old variants as they forced the caller to combine all their cell values into big collections or arrays, which is not conducive to displaying large, streamed datasets.
- printTable(…)now uses code points to correctly align output with characters outside the Basic Multilingual Plane.
- Implemented Unicode-formatted output when in interactive mode.
 
- 
Created a variant of 
- 
New method FifoFile.flush()that may be used to flush the fifo file. This makes sense here because reads also update the underlying fifo persistence.
- UrlUtils.encodeUrlPath(String, String)now skips encoding the full set of the characters defined in RFC 3986: Reserved Characters. Previously, only a partial subset of these characters were added as-needed. We have now improved the implementation to match the specification.- This means "mailto:" links will now maintain the "@" in the email address, instead of it being incorrectly percent-encoded. 
- UrlUtils.encodeUrlPath(String, String)now correctly encodes space as- %20instead of- +.
- UrlUtils.encodeUrlPath(String, String)now determines query string or fragment by first ? or #, accordingly, instead of last.
- UrlUtils.decodeUrlPath(String, String)now re-encodes characters that decode to reserved characters to avoid ambiguity.
- Case-insensitive matching of URL schemes. Previously, URL schemes were matched case-sensitive, while the spec is case-insensitive. This has been OK given we only use lower-case schemes within our code and tools, but this is now a correct implementation.
- PersistentLinkedListnow implements Deque instead of Queue.
aocode-public-2.1.1
Release Notes
- Using - ;-split-package:=firstof maven-bundle-plugin to avoid bundling the classes in the split packages from AO Lang.- These split packages are transitional. In the future we will have more fine-grained projects. 
aocode-public-2.1.0
Release Notes
- New methods to read and write nullable Byte:
- New methods to read and write nullable Short:
- Using managed dependencies:
- This project uses managed dependencies.
- This project's managed dependencies may also be imported by other projects.
 
- Improved API docs linking.
- New methods to quickly get the last modified time of a web resource. The result may be cached for up to five seconds.
- Improved implementation of java.sql.Wrapper.
aocode-public-2.0.0
Release Notes
- Minimum Java version changed from 1.6 to 1.7.
- Deprecated in favor of new TempFileContext that does not suffer from a memory leak in long-running applications:
- Improved ServletContextCache to still work correctly when accessed before initialized by ServletContextCacheListener.Initializer. This allows the caches to safely be used during application initialization. This also allows the cache to still work correctly without being initialized as a web listener, at the cost of not stopping promptly when context destroyed.
- New constant ServletUtil.SKIP_PAGE_EXCEPTION to avoid the overhead of instantiating new SkipPageException repeatedly during routine operation.
- UnmodifiableHttpParameters.wrapnow returns- nullwhen given- null.
- New methods to read and write nullable Boolean:
- New methods to join into arbitrary Appendable:
- 
New bundle lookup markup types:
- MarkupType.MYSQL for the MySQL mysqlcommand line.
- MarkupType.PSQL for the PostgreSQL psqlcommand line.
- MarkupType.SH for shell script encoding.
 
- MarkupType.MYSQL for the MySQL 
- Dispatcher may now forward and include to caller-provided RequestDispatcher.
aocode-public-1.9.0
Release Notes
- Fixed bug in ByteCountInputStreamthat subtracted the-1returned at end of stream.
- Moved the following classes to the new AO Lang project:
- com.aoindustries.io.AoByteArrayInputStream
- com.aoindustries.io.AoByteArrayOutputStream
- com.aoindustries.io.AoCharArrayWriter
- com.aoindustries.io.Encoder
- com.aoindustries.io.EncoderWriter
- com.aoindustries.io.FastExternalizable
- com.aoindustries.io.FastObjectInput
- com.aoindustries.io.FastObjectOutput
- com.aoindustries.io.FileUtils
- com.aoindustries.io.IoUtils
- com.aoindustries.io.LocalizedIOException
- com.aoindustries.io.NullOutputStream
- com.aoindustries.io.NullPrintWriter
- com.aoindustries.io.NullWriter
- com.aoindustries.io.SniffInputStream
- com.aoindustries.io.Writable
- com.aoindustries.io.WriterFacade
- com.aoindustries.io.WriterOutputStream
- com.aoindustries.lang.Disposable
- com.aoindustries.lang.DisposedException
- com.aoindustries.lang.EnumUtils
- com.aoindustries.lang.LocalizedIllegalArgumentException
- com.aoindustries.lang.NotImplementedException
- com.aoindustries.lang.NullArgumentException
- com.aoindustries.lang.ObjectUtils
- com.aoindustries.lang.ProcessResult
- com.aoindustries.lang.RuntimeUtils
- com.aoindustries.lang.SysExits
- com.aoindustries.lang.reflect.Methods
- com.aoindustries.lang.reflect.ReflectionException
- com.aoindustries.math.BigFraction
- com.aoindustries.math.LongLong
- com.aoindustries.math.NullMath
- com.aoindustries.math.SafeMath
- com.aoindustries.math.Statistics
- com.aoindustries.math.UnsignedLong
- com.aoindustries.nio.charset.Charsets
- com.aoindustries.security.HashedKey
- com.aoindustries.security.HashedPassword
- com.aoindustries.security.Identifier
- com.aoindustries.security.SmallIdentifier
- com.aoindustries.sql.LocalizedSQLException
- com.aoindustries.sql.UnmodifiableTimestamp
- com.aoindustries.sql.WrappedSQLException
- com.aoindustries.text.MessageFormatFactory
- com.aoindustries.text.SmartComparator
- com.aoindustries.text.UnmodifiableMessageFormat
- com.aoindustries.time.Clock
- com.aoindustries.time.Duration
- com.aoindustries.time.Instant
- com.aoindustries.util.AoArrays
- com.aoindustries.util.AoCollections
- com.aoindustries.util.AtomicSequence
- com.aoindustries.util.BufferManager
- com.aoindustries.util.CalendarUtils
- com.aoindustries.util.ComparatorUtils
- com.aoindustries.util.EnumerationIterator
- com.aoindustries.util.ErrorPrinter
- com.aoindustries.util.GetOpt
- com.aoindustries.util.HashCodeComparator
- com.aoindustries.util.IdentityKey
- com.aoindustries.util.InternUtils
- com.aoindustries.util.Internable
- com.aoindustries.util.MinimalList
- com.aoindustries.util.MinimalMap
- com.aoindustries.util.PropertiesUtils
- com.aoindustries.util.Sequence
- com.aoindustries.util.SortedProperties
- com.aoindustries.util.UnmodifiableCalendar
- com.aoindustries.util.UnmodifiableDate
- com.aoindustries.util.UnsynchronizedSequence
- com.aoindustries.util.WrappedException
- com.aoindustries.util.WrappedExceptions
- com.aoindustries.util.concurrent.ThreadLocalCallable
- com.aoindustries.util.concurrent.ThreadLocalRunnable
- com.aoindustries.util.concurrent.ThreadLocalsCallable
- com.aoindustries.util.concurrent.ThreadLocalsRunnable
- com.aoindustries.util.i18n.ApplicationResourcesAccessor
- com.aoindustries.util.i18n.CurrencyComparator
- com.aoindustries.util.i18n.LocaleComparator
- com.aoindustries.util.i18n.LocaleString
- com.aoindustries.util.i18n.Locales
- com.aoindustries.util.i18n.Money
- com.aoindustries.util.i18n.ThreadLocale
- com.aoindustries.util.zip.CorrectedGZIPInputStream
- com.aoindustries.util.zip.ZipEntryFilter
- com.aoindustries.util.zip.ZipUtils
- com.aoindustries.xml.XmlUtils
 
- 
New interfaces CompressedReadableandCompressedWritablefor code that only needs to handle one direction ofStreamable.
- AOPoolimprovements:- More fine-grained locking through atomics.
- No longer holding connection lock while connecting.
- Non-blocking statistics methods.
- Bug fix: Notifying other threads on connection allocation.
 
- CompressedDataOutputStreamand- CompressedDataInputStreamnow support streaming of- Enums.
- Updated dependencies.
- WildcardPatternMatcherimprovements:- Coalesces adjacent '*' into a single '*' during parsing.
- Compiles patterns instead of interpreting them on the fly.
- Supports any arbitrary patterns containing '*'.
- Fast-path checks for none, all, prefix, suffix, and exact matches.
- Renamed methods to better represent the functionality. Left deprecated methods for compatibility.
- Added test suite to verify correctness and benchmark versus equivalent regular expressions.
- The typical performance is 8 to 10 times that of the regular expressions.
- 
Some operations, in particular suffix matching on long strings, can be as high as 2000 times the
performance of regular expressions.  This is not so uncommon, a typical use-case for
wildcard patterns is "*.jpg".
 
- Like any typical "contains" or "indexOf" string operation, the infix matching can fall-flat when trying to find long strings of repeating patterns within an almost-as-long string of repeating patterns following by non-matching padding. When strictly using prefix or suffix matching this will never occur.
 
aocode-public-1.8.3
Release Notes
- New AO OSS Parent POM to simplify pom.xmlfiles.
- Project documentation moved to per-project book in SemanticCMS format.
- Added changelog as top-level project link.
- Added utility to find the maximum non-null value.
- Added support for XML DOM Node in toString type coercion.
aocode-public-1.8.2
Release Notes
- Release of 1.8.1 failed due to JDK bug in bootclasspath set for Javadoc: https://bugs.openjdk.org/browse/JDK-8041628
- JDK bug workaround.
aocode-public-1.8.1
Release Notes
- Main method to generate a random Identifier.
- Improved Javadoc formatting.
- Improved README formatting.
- Allowing varargs for locales.
aocode-public-1.8.0
Release Notes
- Moved servlet-specific methods to a different class to avoid introducing compile-time dependencies on servlet api to non-servlet projects.
aocode-public-1.7.0
Release Notes
Added
- Java 1.7 compatible long sorting for pre-Java 1.7 use.
- Now automatically maintains some ThreadLocal values between caller and executor during concurrent processing, and provides wrapper hook for subclasses to extend.
- Recurring now allows null during parsing and returns null.
- Convenience method to make unmodifiable from MinimalList and MinimalMap.
- Background-refreshed cache implementation.
- Caching access to ServletContext to improve performance.
Changed
- Improved Javadoc formatting.
- Additional compiler flags in preparation to do away with our old Ant build system.
- Using request object instead of ThreadLocals to support asynchronous and concurrent request processing.
- Working on thread safety for concurrent sub requests.
- Avoiding setting ThreadLocal when value has not changed.
- nullIfEmpty moved to StringUtility.
- Each lock object now a small empty class to help identify lock contention.
The lock contention profiler in NetBeans is just showing "java.lang.Object" all over, and can't seem to get from the lock object id to the actual object in the heap dump using OQL (id not found). 
- Using minimal list to efficiently filter small numbers of matches.
- Number of buffers is now unlimited.
aocode-public-1.6.1
Release Notes
- Improved Maven configuration for Java EE 6 dependencies.
aocode-public-1.6
Release Notes
- Efficient way to check if writables empty.
aocode-public-1.5
Release Notes
- Wildcard to show immutability just cluttered the API, reverted.
aocode-public-1.4
Release Notes
- Allowing ao-taglib style "arg" maps to be passed through Dispatcher for non-taglib use.
- args passed unmodifiable.
- Passing args as Map<String, ?> instead of forcing Map<String, Object>
- Returning wildcard bound list as it better captures the essence of the unmodifiable list returned.
- Java 1.7 compatible boolean sorting for pre-Java 1.7 use.
aocode-public-1.3
Release Notes
- Reverted to Java 1.6 for Android and Java EE 6 compatibility.
aocode-public-1.2
Release Notes
- Testing if nexus-staging:release required when using autoReleaseAfterClose=true
- Now deployed to The Central Repository.
aocode-public-1.1
Release Notes
- Java EE 6 optional, since only used by a subset of the features.
- Preparing to deploy to The Central Repository.
aocode-public-1.0
Release Notes
- Project moved to GitHub and Maven.
- Ignoring locales with scripts or extensions since this API predates them.