Commons.unkrig.de

From unkrig.de
Jump to navigation Jump to search

<meta name="keywords" content="versatile, library, java, commons"></meta> <meta name="description" content="A versatile library that implements many useful container and utility classes"></meta> 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.

Overview[edit]

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

Module Details[edit]

commons-asm[edit]

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

commons-doclet[edit]

Helper classes that are useful for those who write doclets.

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

commons-file[edit]

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

commons-io[edit]

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

commons-junit4[edit]

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

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

commons-lang[edit]

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

commons-math[edit]

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

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

commons-net[edit]

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

commons-nullanalysis[edit]

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

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

commons-reflect[edit]

Various utilities for Java's reflection API.

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

commons-text[edit]

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

commons-util[edit]

  • 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[edit]

The source code is available through GITHUB:

   https://github.com/aunkrig/commons/

License[edit]

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

Change Log[edit]

Version 1.2.18 2022-12-28
  • de.unkrig.commons.file.resourceprocessing.ResourceProcessings: Added "ResourceProcessings.STDIN_URL".
  • de.unkrig.commons.file.resourceprocessing.ResourceProcessings: ZZDIFF can now handle "-" (stdin) as one of its two inputs.
  • de.unkrig.commons.text.scanner: Added "setInput(input, int start, int end)" for scanning partial strings.
  • de.unkrig.commons.text.expression.ExpressionEvaluator: Added "parsePart(String spec, int[] offset, int end)" for parsing partial strings.
  • de.unkrig.commons.text.pattern.ExpressionMatchReplacer: Added "\Q...\E" and "\Q...".
  • ExpressionMatchReplacer.parseExt(): Added "\xhh", "\uhhhh", "\x{h...h}" and "normal" escapes ("\r", "\n", asf.).
Version 1.2.17 2022-07-22
  • d.u.c.lang.Characters: Small fixes of character classes for JRE 8 backwards compatibility.
  • d.u.c.lang.PrettyPrinter: Fixed one NPE in "PrettyPrinter.getPrettyClassName()" (handling of classes without a canonical name).
  • d.u.c.lang.StringUtil: Added multi-needle variants of "boyerMooreHorspoolIndexOf()", e.g. "needle1|[Nn]eedle2".
  • Added tests for "MapUtil.lazyMap()".
  • d.u.c.util.collections.MapUtil: Created a brother method "MapUtil.lazyMap(Map<K, Producer<? extends V>> valueGetters)" for "MapUtil.lazyMap(Map<K, Function<? super I, ? extends V>> valueGetters, @Nullable final I in)".
  • d.u.c.util.collections.IteratorUtil: Added "IteratorUtil.concat(List<Iterator>)".
  • d.u.c.util.CommandLineOptionException: Include "toString()" of the cause into the OptionProcessingException's message, because the cause's "getMessage()" is often not verbose enough.
  • d.u.c.text.expression.ExpressionEvaluator: Implemented the special attributes "_attributes", "_properties", "_staticAttributes" and "_staticProperties".
  • d.u.c.text.expression.ExpressionEvaluator: Arrays are now silently pretty-printed in all places.
  • Added "ObjectUtil.arrayToString(Object)".
  • d.u.c.lang.protocol.ConsumerUtil: Moved "Grep.lineCounter()" to "ConsumerUtil".
  • d.u.c.text.pattern.PatternUtil: Added to the "patternFinderWriter()" method family some more with a "Runnable flush" parameter.
  • d.u.c.text.pattern.Finders: Added to the "patternFinder()" method family some more with a "Runnable flush" parameter.
  • d.u.c.lang.protocol.Functions: Added "Functions.constant(O)".
  • d.u.c.io.ConsumingWriter: Added the "ConsumingWriter".
  • d.u.c.text.pattern.Substitutor: The Substitutor is now based on the Finders.patternFinder().
  • d.u.c.text.pattern.PatternUtil: The object returned by "replacementStringMatchReplacer()" didn't have a proper "toString()" method.
  • d.u.c.file.org.apache.commons.compress.archivers: "ArchiveFormat.forArchiveOutputStream(ArchiveOutputStream)" didn't work in all cases.
Version 1.2.16 2022-03-21
  • Iff the field "Throwable.message" cannot be made accessible, print a useful warning message on STDERR instead of throwing an exception.
  • Gave up on Java 6 compatibility... now Java 8.
  • Added "setPassword()", in addition to the system property.
  • Gave up on Java 6 compatibility... now Java 8.
  • Added "MavenUtil".
  • Reverted the commit of "Glob.java" of 2021-12-01 19:22: "%" is *not* a valid suffix; otherwise all compressed contents (e.g. "dir/file.gz%") would match a pattern like "***foo".
  • Added test case for "FileProcessings.starterFile(String regex)".
  • Added "ContentProcessings.glob()".
  • Added "PatternUtil.constantPrefix()".
  • Added "FileProcessings.glob()".
  • Added "OutputStreams.newOverwritingFileOutputStream(File)": "$xyz" was handled differently from "${xyz}" and caused an NPE.
  • Added "AbstractParser.readEnum()".
  • Gave up on backwards compatibility with Java 6 and 7 (removed substitutes for java.util.Base64).
  • Added "Readers.readFully()".
  • Added "InputStreams.readFully()".
  • Set "useTransparentBounds(true)" when scanning, so token regexes can use lookaheads and lookbehinds.
  • Eliminated the terrible hack where STORED zip archive entries were silently transformed into DEFLATED (because STORED entries need a correct SIZE and CRC, and these were difficult to calculate). Implemented this with a temporary storage using an "elastic pipe".
  • Added "OutputStreams.updatesChecksum(final Checksum checksum) => OutputStream".
  • The substitution count was wrong (*2 value).
  • Typo in "elasticPipe()" caused an IllegalStateException.
  • Added "ArchiveFormat.getCompressionMethod(ArchiveEntry)", which returns a string representation of the compression method used for the archive entry.
  • Generating TAR archives: The "long file mode" (determines the handling of file names longer than 100 characters) can now be controlled with a system property "TarArchiveFormat.longFileMode"; the default is now "GNU" (and not, as before, "ERROR").
  • Added "Numbers.unsignedCompareToByte/Short/Int/Long()".
  • Added the "Relation" interface and the "Relations" utility class.
Version 1.2.15 2020-11-06
  • commons-file: Implemented decryption of encrypted 7ZIP archives with a sysem property "sevenZInputFilePassword".
  • commons-file: Directory processing: JRE11+MS WINDOWS replace colons (#003A) in member names with #F03A, for whatever reason.
  • commons-net: For method CONNECT, the second word of the request line is not a URI, but only an authority (host:port).
  • commons-file: Handle AR archive entriy with empty name: Silently rename it to "__ROOT".
  • commons-net: Fixed one resource leak.
  • commons-file: "apache.commons.compress" no longer seems to miss the dependency on "org.tukaani" -- removed the workaround.
  • commons-file: Augmented all content processing with an optional "lastModifiedDate" parameter.
  • commons-file: Added (read-only) support for the "rpm" archive format. (An PM file is actually a compressed CPIO archive preceeded by some binary metadata.)
  • commons-util: Added "MapUtil.lazyMap()".
  • commons-text: Added "Notation.Phrase.size()" and "Notation.Phrase.get()".
  • commons-io: Fixed an endless loop in "MarkableFileInputtream.skip()".
  • commons-io: Fixed a ConcurrentModificationException.
  • commons-text: Replaced single quotes in many messages with (the typographically more correct) double quotes.
  • commons-util: Wrap exceptions that occur during option processing with the new "OptionProcessingException" (instead of an AssertionError).
  • commons-io: Added "Writers.autoFlushing()" and "OutputStreams.autoFlushing()". Added "Readers.wye(Reader, Writer)" and marked "WyeReader" as deprecated.
  • commons-io, commons-lang: Added tons of "? super" and "? extends" clauses.
Version 1.2.14 2019-10-11
  • Fixed an IllegalArgumentException in "Pattern2.compile(String, int)" and "Glob.compile(String, int)".
  • StringStream: Made "next()" and "consume()" public.
  • OptionalMethods: All methods get an additional first parameter "@Nullable String message", which, if non-null, is used for the UnsupportedOperationException.
  • Added "XmlUtil.parse(DocumentBuilder, InputStream, String publicId, String encoding)".
  • Added "Writers.tee(Writer... delegates)".
  • ArArchiveFormat: Catch an NPE thrown by ArArchiveInputStream.
  • ArArchiveFOrmat: Catch a NumberFormatException in ArArchiveInputStream.
  • Work around "ZipException: uncompressed size is required for STORED method when not writing to a file"
  • commons.doclet.Html: Changed fragment style from Java 7 to Java 8+.
  • ResourceProcessings: "isFile()" did not decode %xx escape sequences in URLs.
  • commons.lang.Comparators: Added "Comparators.keyComparator()" and ".valueComparator()".
  • FileProcessings.directoryProcessor(): The "pathPredicate" was applied wrong for *files* (as opposed to directories). As a result, "zzgrep --include '***.class'" did not match .class files *in archives*.
  • InputStreams: Added "EventCounter", "ExponentiallyLoggingEventCounter" and "InputStreams.statisticsInputStream()" for real-time IO statistics.
  • Optimize archive file and compressed file reading by replacing small file READs with large file READs.
  • Added input stream statistics in "CompressUtil" and "FileContentsProcessor".
  • Fatal bug in "ConsumerUtil.head()" fixed!
  • Added "commons.lang.protocolTuple2", "Tuple3" and "Tuple4".
  • ExpressionMatchReplacer: Replaced "imports" with "singleImports" and "onDemandImports".
  • ExpressionEvaluator: Added scanning of MULTI-LINE C-style comments. Added scanning of C++-style comments.
  • Added "de.unkrig.commons.file.resourceprocessing", in symmetry with "fileprocessing" and "contentsprocessing", to process *resources* (designated by URLs) in addition to files and InputStreams.
  • commons.file: Compressed file names and compressed contents paths are now suffixed with '%' (instead of '!') to circumvent problems with "Glob"'s directory prefix mechanism.
  • Java 9 added "@Override public final CharBuffer CharBuffer.rewind() { ..." -- leads easily to a "NoSuchMethodError: java.nio.CharBuffer.rewind()Ljava/nio/CharBuffer"; a cast to "Buffer" is the workaround.
  • Added "LineUtil.lineAndColumnTracker()".
  • Added "Readers.onFirstChar()" and "Readers.trackLineAndColumn(Reader)".
  • Added "Writers.onFirstChar()" and "Writers.trackLineAndColumn(Writer)".
  • Removed unnecessary dependency on "de.unkrig.commons:commons-junit4".
  • CommandLineOptions: Convert "any" to InetAddr "null" ("wildcard address").
Version 1.2.13 2018-11-23
  • In analogy with the "Substitutor", the new "Search" class finds pattern matches in a sequence of chunks in a "sliding" manner. Instead of a "match replacer", it invokes a "match handler".
  • Breaking change: A "match replacer" is no longer a "FunctionWhichThrows<Matcher, String, EX>", but a "FunctionWhichThrows<MatchResult, String, EX>".
  • Added support for HTTP method "OPTIONS".
  • Refined the logic that checks for "Socket closed" exceptions.
Version 1.2.12 2018-10-29
  • ChunkedInputStream: Reading of blank line after last chunk was missing.
  • Added "LevelFilteredPrinter.setNoErrors()".
  • Added "evaluateExpressionTo(@Nullable String[] imports, String input,Class<T> targetType, Mapping<String, ?> variables)".
  • Added convenience methods with a parameter "Object... variableNamesAndValues" for all methods with a parameter "Mapping<String, ?> variables".
  • Added "or(PredicateWhichThrows<? super T, ? extends EX> lhs, PredicateWhichThrows<? super T, ? extends EX> rhs)" as a brother of "or(Predicate<? super T> lhs, Predicate<? super T> rhs)".
  • Added "containsKeyPredicateWhichThrows(final Mapping<K, V>)".
  • Removed the "<EX>" type parameter from "ExpressionEvaluator.parser(String spec)".
  • Optimized "toPredicate()" and "constantExpression()" for the special cases "true", "false" and "null".
  • Replaced "HttpAuthenticationServlett(String realm, String userName, String password)" with "HttpAuthenticationServlett(String realm, UserNamePasswordPredicate)".
  • Added "removeParameter()".
  • Added test cases for "de.unkrig.commons.util.Enums".
  • Optimized performance of "Enums.valueOf(String, Class<? extends Enum>)".
  • Added "enumSetFromString(String, Class<? extends Enum>)" and "valueOf(String, Class<? extends Enum>)".
  • Started implementation of "IndexOf.indexOf(CharSequence haystack, int minIndex, int maxIndex, int limit)" for partial terminal matches.
  • Added method "toCharArray(CharSequence cs)".
  • Added "of(T... values)", "union(Set<? extends T> lhs, Set<? extends T> rhs)" and "intersection(Set<? extends T> lhs, Set<? extends T> rhs)".
  • Added "toCharArray(Set<Character>)" and "toIntArray(Set<Integer>)".
  • Added "append(char[] a, char... values)" and "mirror(char[][])".
  • Fixed up several bugs in "boyerMooreHorspool...()".
  • Renamed methods "knuthMorrisPratt...()" to "boyerMooreHolbrook...()".
  • Fixed up the Knuth-Morris-Pratt "lastIndexOf()" method.
  • More optimization on the "knuthMorrisPratt()" index-of algorithm.
  • Renamed the "...Index" parameters of the "IndexOf.(indexOf|lastIndexOf)()" methods from "(from|to)Index" to "(min|max)Index", because "from" and "to" are very confusing for "lastIndexOf()".
  • Utility functionality related to {@link HttpsURLConnection}s.
  • Added "ExpressionEvaluator.parsePart()".
  • Added "ExpressionEvaluator.parsePart()".
  • "getMostSpecificMethod()": Didn't find some methods declared in superinterfaces.
  • Added "containsKeyPredicate(Mapping)".
  • The non-"...WhichThrows" protocol classes now declare the EX type parameter as "NoException" (was "RuntimeException") to make any code more self-documenting.
  • "isLessSpecific()": The synthetic methods that are generated for covariant return values were regarded as "ambiguous".
  • The "transformer" argument is now allowed to throw IOExceptions.
  • "copyAndTransform()" now declares an "EX" type parameter.
  • Added the "assertFind()" methods.
  • Added "StringUtil.asJavaLiteral(String)".
  • Added "IterableUtil.addAllElementsTo(Iterable, Collection)" and "IteratorUtil.addAllElementsTo(Iterator, Collection)".
  • Moved "EMPTY_SORTED_SET" and "emptySortedSet()" from "CollectionUtil" to "Sets", leaving (deprecated) wrappers behind.
Version 1.2.11 2017-08-23
  • Added methods "Rule.goTo(S)", "Rule.push(S)" and "Rule.pop()", making many of the "StatefulScanner.addRule(...)" methods DEPRECATED.
  • Added utility class "OptionalMethods".
  • Made JRE 7's methods "isAlphabetic(int)" and "isIdeographic(int)" available for all JRE versions.
  • "Token.captured" is no longer @Nullable; this is much more practical.
  • Added "PrettyPrinter.codePointToString(int)".
  • Added the following methods, and the plethora of predicates that implement them:
    • javaCharacterClassFromName(String)
    • unicodeCategoryFromName(String)
    • unicodeBinaryPropertyFromName(String)
    • unicodePredefinedCharacterClassFromName(String)
    • posixCharacterClassFromName(String)
  • Improved the "unexpected character" exception message by adding information about the current scanner state.
  • Added the "de.unkrig.commons.util.EnhancedServiceLoader".
  • Added appropriate "toString()" methods on "IndexOf" implementations.
  • Extended the "StringUtil.IndexOf" interface with various "lastIndexOf()" methods.
  • Added "StringUtil.newIndexOf(final String infix)" which implements the Knuth-Morris-Pratt algorithm.
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 "de.unkrig.commons.net" project, where it belongs.
  • CommandLineOptions: Gave "printResource(Class, String relativeResourceName, ...)" a sibling method "printResource(ClassLoader, String resourceName, ...)".
  • de.unkrig.commons.net.http.HttpMessage: In "attempt unstreaming" mode, the body was written TWICE (caused IllegalStateExceptions).
  • de.unkrig.commons.net.http: 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 "java.io.FilterWriter".
  • 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.
  • de.unkrig.commons.net.http.HttpMessage: 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".
  • de.unkrig.commons.io.ReaderInputStream: First implementation of the "ReaderInputStream" as the complement of the "WriterOutputStream"; as of now supports only char set ISO8859-1.
  • TransformingFilterReader: Bug fixed: "TransformingFilterReader.read()" 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 "lang.security" 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 "Pipe.read(byte[])" 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
  • de.unkrig.commons.io.IoUtil: 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".
  • de.unkrig.commons.net: 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.
  • de.unkrig.commons.net: 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 'de.unkrig.commons.lang.security.Sandbox'.
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.