Revision as of 10:33, 30 July 2017 by Aunkrig (Talk | contribs)

Jump to: navigation, search

de.unkrig.commons is a versatile Java™ library that implements many useful container and utility classes. It extends and integrates seamlessly with the standard JDK library.



de.unkrig.commons is structured in several modules who's names are aligned to the related packages in the JDK libraries.

Module Details


Helper classes that are useful in the context of ASM, a Java bytecode manipulation library.

Resources: JAVADOC, JAR file Download, Source code Download Maven POM


Helper classes that are useful for those who write doclets.

Resources: JAVADOC, JAR file Download, Source code Download Maven POM


Functionality for processing or transforming trees of directories, files, compressed and archive files, and even nested compressed and archive files. Supports more than a dozen compression and archive formats.

Resources: JAVADOC, JAR file Download, Source code Download Maven POM


Functionality around byte streams and readers/writers, e.g. for converting a byte stream into a hex dump, or formatting an XML document.

Resources: JAVADOC, JAR file Download, Source code Download Maven POM


Assertions etc. for those who write tests with JUNIT 4.

Resources: JAVADOC, JAR file Download, Source code Download Maven POM


Resources: JAVADOC, JAR file Download, Source code Download Maven POM


de.unkrig.commons.math: A linear congruential generator; a random sequence generator

Resources: JAVADOC, JAR file Download, Source code Download Maven POM


Resources: JAVADOC, JAR file Download, Source code Download Maven POM


  • Annotations and utility classes for ECLIPSE annotation-base "null analysis".

Resources: JAVADOC, JAR file Download, Source code Download Maven POM


Various utilities for Java's reflection API.

Resources: JAVADOC, JAR file Download, Source code Download Maven POM


  • An expression evaluator
  • A small framework for creating scanners and parsers
  • A Glob class that combines the widely known elements of UNIX file name globbing with the power of regular expressions

Resources: JAVADOC, JAR file Download, Source code Download Maven POM


  • CommandLineOptions makes parsing and documentation of command line options (e.g. for "public static void main(String[])") easy; see the tutorial.
  • TimeTable parses and implements a CRON-like specification string
  • Various filters, handlers and formatters for java.util.logging
  • The SimpleLogging facility for easy integration of java.util.logging within command line tools

Resources: JAVADOC, JAR file Download, Source code Download Maven POM

Source Code

The source code is available through SVN:


COMMONS.UNKRIG.DE is published under the "New BSD License".

Change Log

Version 1.2.10 2017-07-30
  • Added method "MD5.of(InputStream)".
  • Added utility class "de.unkrig.commons.lang.Comparators".
  • CompressUtil: The "UnsupportedZipFeatureException" was not properly wrapped because it has none of the "usual" constructors that "ExceptionUtil.wrap()" requires.
  • Added "InputStreams.readAll(InputStream, boolean closeInputStream)".
  • de.unkrig.commons.util.collections.Peekerators: Introduced the concept of the "peekerator" - an Iterator with a "peek()" method.
  • IterableUtil: Added "IterableUtil.NATURALS" and "NATURALS0".
  • de.unkrig.commons.util.collections: Added methods "IteratorUtil.foR(...)" and "IterableUtil.foR(...)".
  • de.unkrig.commons.util.collections: Moved "iteratorWithContext()" from IterableUtil to IteratorUtil.
  • de.unkrig.commons.util.collections: Made "ElementWithContext" a top-level type, because it is now used by two compilation units (IteratorUtil and IterableUtil).
  • commons-net and commons-util: Moved the "CustomAuthenticator" (and its fellows "CredentialsSpec", "JPasswordFields" and "Regex" from the ANTOLOGY project to the "" project, where it belongs.
  • CommandLineOptions: Gave "printResource(Class, String relativeResourceName, ...)" a sibling method "printResource(ClassLoader, String resourceName, ...)".
  • In "attempt unstreaming" mode, the body was written TWICE (caused IllegalStateExceptions).
  • Added support for the "CONNECT" method.
  • Added to many methods parameter(s) "xxxLoggingPrefix" so that one can customize the logging messages. By default, logging messages related to incoming data are prefixed with ">>> ", and logging messages related to outgoing data with "<<< ".
  • HttpMessage: The "attempt unstreaming" feature can now be switched off (important for the CONNECT method).
  • "IoUtil.copy()" now flushes the output stream when the next READ from the input stream will block.
  • de.unkrig.commons.text.expression: Added support for nested types.
  • Changed the return types of "Expression.evaluateTo[Primitive](...)" from "Object" to "T".
  • AuthenticateHeaderParser: Implemented BASIC authentication for the "HttpClient" - useful to configure HTTP proxies that handle authentication.
  • unkrig.commons/text/scanner: Added "String[] Token.captured" for access to input subsequences that were captured during the token match.
  • ConsumerUtil: Added methods "head(m)" and "tail(n)".
  • "Transformer" now extends "TransformerWhichThrows<I, O, RuntimeException>", as it always should have done.
  • Added "BooleanProducer ProducerUtil.once()".
  • Added the "de.unkrig.commons.text.scanner.XmlScanner" class and tests.
  • Added "StringUtil.containsAny(String subject, String characters)", which checks whether the subject contains any of the characters.
  • Added the "FilterAppendable", very much in anaolgy with the "".
  • Added "CharSequences.from(char[])" and "CharSequences.from(char[], int off, int len)".
  • Added the "Appendables" utility class.
  • de.unkrig.commons.doclet.html.Html: Added support for {@value} on enum constants.
  • de.unkrig.commons.doclet.html.Html: STANDARD_LINK_MAKER: Added support for links to enum constants.
  • de.unkrig.commons.text.expression.ExpressionEvaluator: Breaking API change: "evaluateTo(..)" now returns a _nullable_ result.
  • ConsumerUtil: Added various "store()" and "cumulate()" methods.
  • Added method "body(final ProducerWhichThrows<InputStream, IOException> in)".
  • Automatic XML formatting is now not only active for content type "text/xml", but for any content type with an infix "xml".
  • First implementation of the "ReaderInputStream" as the complement of the "WriterOutputStream"; as of now supports only char set ISO8859-1.
  • TransformingFilterReader: Bug fixed: "" returned -1 on the first pattern match.
  • de.unkrig.commons.doclet.html.Html: @value: The argument was not SGML-Escaped.
  • TransformerUtil: Added "cache(final Transformer<? super I, O> delegate, final Map<I, O> cache)".
  • ContentsProcessings.processArchive(): "Directory archive entries" are now silently ignored, because they have no contents and thus it makes no sense to process them with the "contentsProcessor".
  • FileUtil: Added a workaround for MS WINDOWS 7: Read-protected directory produces: isDirectory() => true; canRead() => true; list() => null; listFiles() => null (Caused NPEs.)
  • PasswordAuthenticationStores: "..customAuthenticator_credentials,orig" file was not deleted after saving the credentials properties file.
Version 1.2.9 2017-02-02
  • de.unkrig.commons.crypto/security: Gave up on the concept of "DestroyableString"s - they cause more confusion than they are helpful.
  • ProducerUtil: Fixed a serious bug in "cacheAsynchronously()": ExecutionExceptions thrown by the Future were not handled properly and caused the cache to "hang".
  • Added "roundRobin()".
Version 1.2.8 2017-01-27
  • New utility class "AssertString": Provides methods like "assertContains(String expectedInfix, String actual)".
  • Added a new package "de.unkrig.commons.lang.crypto", and moved many classes from "" to there.
  • Extracted the UserNamePasswordStore from "de.unkrig.antology.task.SetAuthenticatorTask" to here.
  • Added "StatefulScanner.getCurrentState()" and "setCurrentState()" so that the state of the scanner can be changed from outside admidst scanning.
  • Added "AbstractScanner.suppress(TT)" and "suppress(EnumSet<TT>)".
  • Added "ProducterUtil.filter(Producer, Predicate)".
  • StatefulScanner: Declared a constant "REMAIN" for the "addRule()" methods that have a final "nextState" parameter.
  • AbstractParser: End-of-input handling was brooken in "read(Object... tokenTypeOrText)".
  • Added the "de.unkrig.commons.lang.Characters" utility class.
  • The first parameter of methods "StatefulScanner.addRule(EnumSet<S>, ...)" is now NULLABLE, where "null" means "any state, including the default state".
  • Added a constructor "StatefulScanner(StatefulScanner)" that clones the configuration, but not the state.
  • StatefulScanner: Added methods "addRule(@Nullable EnumSet<S> states, String regex, TT tokenType)" and "addRule(@Nullable EnumSet<S> states, String regex, TT tokenType, S nextState)", which make it easier to declare rules that apply in more than one non-default states.
  • Fixed one major design error in "CommandLineOptions": Method "applyCommandLineOption()" now gets a "Method" as its second parameter, instead of, previously, a "CommandLineOption" object.
Version 1.2.7 2016-12-12
  • IoUtil: Added "singlingFilterReader()" and "singlingInputStream()".
  • PatternUtil: Fixed several bugs in "PatternUtil.replaceAll()".
  • PatternUtil: Added "replaceAllFilterReader()".
  • PatternUtil: Added "replaceAllFilterWriter()".
  • Moved many, many methods from "IoUtil" to the new utility classes "InputStreams", "OutputStreams", "Readers", "Writers" and "FransformingFilter(Reader|Writer)".
  • Added "StringTransformers", a collection of simple "Transformer<CharSequence, CharSequence>"s.
  • Added TransformerUtil.chain(Transformer...)".
  • Extracted "PatternUtil.replaceAllFilterReader()" as the new "Substitutor" class.
  • Adapted to the refactoring of "IoUtil".
  • Added unit tests for the "Substitutor".
  • "IoUtil.findOnPath()": The search stopped at the FIRST archive file.
Version 1.2.6 2016-11-30
  • commons-io: Added the "CharFilter", "CharFilterReader" and "CharFilterWrite", which are the char-wise equivalent of "ByteFilter(InputStream|OutputStream)?".
  • Glob: Added the "" special case for the "container match".
  • FileProcessings, ContentsProcessings: The "pathPredicate" was missing from content processors.
Version 1.2.5 2016-11-28
  • Printers: Added "Printers.redirectToFile(Level|EnumSet<Level>)".
Version 1.2.4 2016-11-25
  • IoUtil: Fixed one MalformedURLException.
  • Added the "ByteFilterOutputStream", as a complement to the "ByteFilterInputStream".
  • ContentsTransformations: Added methods "chain(ContentsTransformer, ContentsTransformer)", "asInputStream(InputStream delegate, ContentsTransformer, String)" and "asOutputStream(ContentsTransformer, OutputStream delegate, name)".
  • Added "SelectiveContentsTransformer.create()", which can conduct many optimizations.
  • Workover of the "Printers" API: A lot of functionality went from "Printers" to "AbstractPrinter"; the old methods, however, remain, and are now marked as @deprecated.
  • IoUtil: Added methods "findOnPath(File[], String resourceName)" and "copyTree(URL, File)".
  • Added "de.unkrig.commons.lang.ClassLoaders".
  • Slightly clarified the wording of the license: Replaced "author" with "copyright holder and its contributors".
Version 1.2.3, 2016-11-07
  • commons-file: The "formats" files didn't make it into the JAR, because they were in "src/main/java" instead of "src/main/resource".
Version 1.2.2, 2016-11-07
  • XmlUtil.parse(): Detect and throw IOExceptions (esp. FileNotFoundException) properly.
  • commons-junit4: Removed the unnecessary dependency on "org.apache.commons:commons-compress".
  • For unknown reasons, the POM of org.apache.commons:commons-compress fails to declare the dependency on "org.tukaani:xz", although it definitely depends on it. Thus added the dependency in "de.unkrig.commons:commons-file"'s POM.
  • "IoUtil.parallel()", as a side effect, caused the JVM to not terminate when it is shut down orderly (i.e. "main()" returns or "System.exit()" is invoked).
  • Added "ThreadUtil.DAEMON_THREAD_FACTORY".
Version 1.2.1, 2016-10-30
  • Removed the nasty circular dependencies around "commons-junit".
Version 1.2.0, 2016-10-24
  • Replaced the old ANT build with MAVEN.
Version 1.1.12, 2016-10-14
  • Bug fixes in "ProducerUtil.cache()".
Version 1.1.11, 2016-08-13
  • ProducerUtil.cache...(): The "invalidationCondition" was treated the wrong way around in some places. Pulled things straigt.
  • PredicateUtil: Added method "static synchronizedPredicate(Predicate)".
Version 1.1.10, 2016-08-12
  • ProducerUtil.cache(): When the first call of "delegate.produce()" threw an exception, then the NEXT invocation returned NULL (instead of calling "delegate.produce()" again).
  • ProducerUtil: Added "cacheAsynchronously()" and "atMostEvery(ms, firstProduct, startAtTrueProduct)".
Version 1.1.9, 2016-08-02
  • Fixed the bounds of of the parameters of some "MapUtil()" methods, to make them more versatile.
Version 1.1.8, 2016-07-26
  • Moved various map-related methods from "CollectionUtil" to "MapUtil" (where they actually belong), marked the original methods with "@Deprecated" and replaced them with invocations of the "new" methods.
  • Moved a few more fields and methods from "CollectionUtil" to "IterableUtil" and "IteratorUtil", where they belong.
  • Added many missing bounds to method parameters to make the methods more flexible.
Version 1.1.7, 2016-06-17
  • Added "ObjectUtil.hashCode()".
  • Added "PredicateUtil.always(boolean)".
  • Added "PredicateUtil.xor()".
  • "Predicate<T>" now extends "PredicateWhichThrows<T, RuntimeException>".
  • Added "ProducerUtil.cache(delegate, condition)".
  • "commons/doclet": Added support for the inline tags "{@docRoot}", "{@literal}", "{@constantsof}" and "{@constantsofplain}".
  • CommandLineOptions: Initial support for "option cardinality" and "option group cardinality".
  • Added "de.unkrig.commons.util.Enums".
  • Added the "IdentityHashSet".
  • Added methods "[])" and "Pipe.write(byte[])".
  • Changed type parameter "EX" of "(Consumer|Function|Predicate|Producer|Runnable|Transformer)WhichThrows" interfaces from "extends Exception" to "extends Throwable" to allow for seamless handlich of the "Longjump" throwable.
  • Added a static "ignoreExceptions()" method to the "(Consumer|Function|Predicate|Producer|Runnable|Transformer)Util" classes.
  • Longjump: Added various "catchLongjump()" methods for easy integration with Java 8 lambdas.
  • Added the following methods:
    • IoUtil.copy(File, File, CollisionStrategy)
    • IoUtil.copyTree(File, File, CollisionStrategy)
    • IoUtil.isContentIdentical(File, File)
Version 1.1.6, 2016-03-21
  • Added "ObjectUtil.almostNull()".
Version 1.1.5, 2016-03-14
  • Added "skip()" and "skipAll()".
  • de.unkrig.commons.text.PatternUtil: Replaced the "Replacer" interface with a "Function<Matcher, String>".
  • de.unkrig.commons.file.ExceptionHandler: Handler methods now have, for consistency with the other APIs, an additional parameter "String path".
  • TcpServer(SSLContext): Remove several "cipher suites" from the SSL context because otherwise some modern browsers refuse to connect with this server.
Version 1.1.4, 2015-11-11
  • de.unkrig.commons.text: JavaScanner/JsonScanner: The CXX_COMMENT now INCLUDES the trailing line break.
  • Added Utility class "UrlConnections", with the single method "followRedirects2()".
  • de.unkrig.commons.text: Replaced "CamelCase" with the more versatile "Notations" helper class.
  • de.unkrig.util.collections: Added the "Stack" interface and its implementation "ArrayStack".
  • de.unkrig.commons.lang: Added the "FunctionWhichThrows" interface and the "Functions" utility class.
Version 1.1.3, 2015-09-19
  • de.unkrig.commons.doclet: Removed the concept of generating MEDIAWIKI markup - MEDIAWIKI is for COLLABORATION, not for documentation.
  • Added "de.unkrig.commons.util.CommandLineOptions" for elegant command line processing.
  • Added "de.unkrig.commons.util.concurrent.ByteStreamSequentializer" and "ObjectSequentializer".
Version 1.1.2, 2015-08-31
  • Added optional dependencies on 'xz' and APACHE COMPRESS.
  • Added "de.unkrig.commons.doclet".
  • Added "de.unkrig.commons.text.xml".
  • Added "de.unkrig.commons.util.collections.IteratorUtil".
  • Various bug fixes in de.unkrig.commons.file
  • Added "de.unkrig.commons.file.contentstransformation.TextTransformer".
  • "de.unkrig.commons.file.fileprocessing" now supports parallel execution.
  • The "JavaScanner" now decodes unicode escapes - strictly speaking: wrong, but very useful in some situations.
Version 1.1.1, 2015-02-24
  • Gave up on Java 5 compatibility; Java >= 6 is now required.
  • UPDATE no longer takes two separate paramaters 'glob' and 'update-file', but one parameter 'glob=update-file', which makes it possible to use variable references when creating the 'update-file' name.
  • Push releases to OSSRH and eventually to MAVEN CENTRAL
Version 1.1.0, 2015-02-04
  • Major refactoring of 'de.unkrig.commons.file.fileprocessing' and 'de.unkrig.commons.file.contentsprocessing'.
  • de.unkrig.commons.file.filetransformation: Thanks to apache.commons.compress, we now not only support the ZIP archive format and the GZIP compression algorithm, but also the AR, ARJ, CPIO, DUMP, JAR, TAR and SEVEN_Z archive formats and the BZIP2, PACK200, XZ, LZMA, SNAPPY and Z compression algorithms.
  • Added ''.
Version 1.0.5, 2014-05-01
  • Moved the <log>, <logging> and <simpleLogging> tasks from 'de.unkrig.commons.util' to 'de.unkrig.antcontrib'.
Version 1.0.4, 2014-04-29
  • 'keepOriginals' did not work for in-place file transformations.
  • <simplelogging>: Added attribute 'spec="..."'.
  • <simpleLogging>: Attribute 'debug="..."' no longer is boolean, but "FINE|FINER|FINEST".
  • <logging>: Removed attribute 'parent="..."'
  • <logging>: Added attribute 'clearFilter="true"'.
  • Renamed task <simplelogging> to <simpleLogging> (with a big 'L').
Versions 1.0.3 and earlier
No change log available.
Personal tools