<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://unkrig.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>unkrig.de - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://unkrig.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://unkrig.de/w/Special:Contributions/Admin"/>
	<updated>2026-08-04T22:30:34Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=65</id>
		<title>Unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=65"/>
		<updated>2026-07-04T08:38:04Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;font size=&amp;quot;+6&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Welcome to unkrig.de!&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;font color=&amp;quot;#777&amp;quot;&amp;gt;&#039;&#039;Where the fine software grows&#039;&#039;&amp;lt;/font&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[image:Javawordcloud.png|right]]&lt;br /&gt;
&lt;br /&gt;
== Important ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked all my repositories as archived and read-only. A big thank you goes to all the contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preamble ==&lt;br /&gt;
&lt;br /&gt;
Hello out there!&lt;br /&gt;
&lt;br /&gt;
I am a professional programmer, and when I have time I work on several cool open source projects. Find them useful, interesting, inspiring - or contribute! To contact me, send email to &#039;arno att unkrig dott de&#039;.&lt;br /&gt;
&lt;br /&gt;
Cheers, Arno&lt;br /&gt;
&lt;br /&gt;
== Larger Projects ==&lt;br /&gt;
&lt;br /&gt;
=== [https://janino-compiler.github.io/janino/ Janino] ===&lt;br /&gt;
: A super-small, super-fast Java&amp;amp;trade; compiler for embedded applications where you want to compile code on-the-fly into byte code which is executed in the running JVM.&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/aunkrig/lfr LFR - Lightning-fast Regular Expressions for Java] ===&lt;br /&gt;
: A 99.9%-complete reimplementation of &amp;lt;code&amp;gt;java.util.regex&amp;lt;/code&amp;gt; (&amp;quot;JUR&amp;quot;) with better &amp;lt;code&amp;gt;match()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt; performance.&lt;br /&gt;
&lt;br /&gt;
=== [[Zz.unkrig.de|ZZ Tools]] ===&lt;br /&gt;
: Enhanced versions of the widely known DIFF, FIND, GREP and PATCH command-line tools, which handle not only directories and files, but also archive and compressed files, and even nested archive and compressed files. They can even disassemble Java &amp;lt;code&amp;gt;.class&amp;lt;/code&amp;gt; files on-the fly and operate on the disassembly.&lt;br /&gt;
&lt;br /&gt;
=== [[Cs-contrib.unkrig.de|CheckStyle Contributions]] ===&lt;br /&gt;
: Additional checks, filters and quickfixes for [http://checkstyle.sourceforge.net/ CheckStyle] and [http://eclipse-cs.sourceforge.net/ Eclipse-CS].&lt;br /&gt;
&lt;br /&gt;
=== [[Commons.unkrig.de]] ===&lt;br /&gt;
: A versatile Java&amp;amp;trade; library, including a highly flexible HTTP and FTP server.&lt;br /&gt;
&lt;br /&gt;
== Smaller Projects ==&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/aunkrig/autoauth AUTOAUTH] ===&lt;br /&gt;
&lt;br /&gt;
An HTTP proxy that handles proxy authentication.&lt;br /&gt;
&lt;br /&gt;
=== [[Doclet|Doclets]] ===&lt;br /&gt;
&lt;br /&gt;
Doclets are a way to re-use the JAVADOC tool to do other things than just generate Java API documentation. I wrote a few of them for different purposes:&lt;br /&gt;
&lt;br /&gt;
===== [[ANT doclet|The ANT Doclet]] =====&lt;br /&gt;
: Generates JAVADOC-like HTML documentation for an ANTLIB, e.g. for [[Antology]] and the [[Zz.unkrig.de|ZZ tools]].&lt;br /&gt;
&lt;br /&gt;
===== [[Cs-doclet|The CheckStyle Doclet]] =====&lt;br /&gt;
: Generates the metadata files for CheckStyle and eclipse-cs from &#039;doc tags&#039; in the source code of your checks and filters. &lt;br /&gt;
&lt;br /&gt;
===== [[JAVADOC doclet|The JAVADOC Doclet]] =====&lt;br /&gt;
: A re-implementation of the JAVADOC standard doclet, basically a reference to show how to use the &amp;quot;[[No-template|no-template]]&amp;quot; framework.&lt;br /&gt;
&lt;br /&gt;
===== [[MAIN doclet|The MAIN Doclet]] =====&lt;br /&gt;
: Generates HTML documentation for a &amp;quot;main()&amp;quot; method - useful for command line tools with a set of command line options.&lt;br /&gt;
&lt;br /&gt;
=== [[Html2txt|html2txt]] ===&lt;br /&gt;
: A Java tool to convert HTML documents into plain text.&lt;br /&gt;
&lt;br /&gt;
=== [[JDisasm|jdisasm]] ===&lt;br /&gt;
: A disassembler for Java .class files.&lt;br /&gt;
&lt;br /&gt;
=== [[No-template|no-template]] ===&lt;br /&gt;
: A super-small Java library for templating, i.e. generating text files (HTML, XML, whatever) from a &amp;quot;template&amp;quot; text file.&lt;br /&gt;
&lt;br /&gt;
== Retired Projects ==&lt;br /&gt;
&lt;br /&gt;
These projects are no longer maintained and are only of limited use, e.g. because they work only with old Java versions.&lt;br /&gt;
&lt;br /&gt;
=== [[Antology]] ===&lt;br /&gt;
: Some contributions to [http://ant.apache.org APACHE ANT], e.g. the &amp;lt;code&amp;gt;&amp;amp;lt;swingDialog&amp;gt;&amp;lt;/code&amp;gt; task which significantly enhances ANT&#039;s &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;gt;&amp;lt;/code&amp;gt; task.&lt;br /&gt;
&lt;br /&gt;
=== [[Loggifier.unkrig.de|Loggifier]] ===&lt;br /&gt;
: A tool for automatic injection of logging code into Java&amp;amp;trade; class files, making it unnecessary to mess up your code with hand-written logging.&lt;br /&gt;
&lt;br /&gt;
=== [[Cvstools.unkrig.de|Eclipse plug-in for extended CVS possibilities]] ===&lt;br /&gt;
&lt;br /&gt;
: An ECLIPSE plug-in that adds CVS functionality that is sometimes painfully missing from ECLIPSE&#039;s built-in CVS client.&lt;br /&gt;
&lt;br /&gt;
=== [[Subclipse.unkrig.de|Subclipse enhancements Eclipse plug-in]] ===&lt;br /&gt;
&lt;br /&gt;
: The often-missed &amp;lt;code&amp;gt;&amp;lt;de.unkrig.subclipse.svn&amp;gt;&amp;lt;/code&amp;gt; ANT task that uses the SUBCLIPSE client of the running ECLIPSE workbench.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=64</id>
		<title>Unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=64"/>
		<updated>2026-07-04T08:37:28Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;font size=&amp;quot;+6&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Welcome to unkrig.de!&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;font color=&amp;quot;#777&amp;quot;&amp;gt;&#039;&#039;Where the fine software grows&#039;&#039;&amp;lt;/font&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[image:Javawordcloud.png|right]]&lt;br /&gt;
&lt;br /&gt;
== Important ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preamble ==&lt;br /&gt;
&lt;br /&gt;
Hello out there!&lt;br /&gt;
&lt;br /&gt;
I am a professional programmer, and when I have time I work on several cool open source projects. Find them useful, interesting, inspiring - or contribute! To contact me, send email to &#039;arno att unkrig dott de&#039;.&lt;br /&gt;
&lt;br /&gt;
Cheers, Arno&lt;br /&gt;
&lt;br /&gt;
== Larger Projects ==&lt;br /&gt;
&lt;br /&gt;
=== [https://janino-compiler.github.io/janino/ Janino] ===&lt;br /&gt;
: A super-small, super-fast Java&amp;amp;trade; compiler for embedded applications where you want to compile code on-the-fly into byte code which is executed in the running JVM.&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/aunkrig/lfr LFR - Lightning-fast Regular Expressions for Java] ===&lt;br /&gt;
: A 99.9%-complete reimplementation of &amp;lt;code&amp;gt;java.util.regex&amp;lt;/code&amp;gt; (&amp;quot;JUR&amp;quot;) with better &amp;lt;code&amp;gt;match()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt; performance.&lt;br /&gt;
&lt;br /&gt;
=== [[Zz.unkrig.de|ZZ Tools]] ===&lt;br /&gt;
: Enhanced versions of the widely known DIFF, FIND, GREP and PATCH command-line tools, which handle not only directories and files, but also archive and compressed files, and even nested archive and compressed files. They can even disassemble Java &amp;lt;code&amp;gt;.class&amp;lt;/code&amp;gt; files on-the fly and operate on the disassembly.&lt;br /&gt;
&lt;br /&gt;
=== [[Cs-contrib.unkrig.de|CheckStyle Contributions]] ===&lt;br /&gt;
: Additional checks, filters and quickfixes for [http://checkstyle.sourceforge.net/ CheckStyle] and [http://eclipse-cs.sourceforge.net/ Eclipse-CS].&lt;br /&gt;
&lt;br /&gt;
=== [[Commons.unkrig.de]] ===&lt;br /&gt;
: A versatile Java&amp;amp;trade; library, including a highly flexible HTTP and FTP server.&lt;br /&gt;
&lt;br /&gt;
== Smaller Projects ==&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/aunkrig/autoauth AUTOAUTH] ===&lt;br /&gt;
&lt;br /&gt;
An HTTP proxy that handles proxy authentication.&lt;br /&gt;
&lt;br /&gt;
=== [[Doclet|Doclets]] ===&lt;br /&gt;
&lt;br /&gt;
Doclets are a way to re-use the JAVADOC tool to do other things than just generate Java API documentation. I wrote a few of them for different purposes:&lt;br /&gt;
&lt;br /&gt;
===== [[ANT doclet|The ANT Doclet]] =====&lt;br /&gt;
: Generates JAVADOC-like HTML documentation for an ANTLIB, e.g. for [[Antology]] and the [[Zz.unkrig.de|ZZ tools]].&lt;br /&gt;
&lt;br /&gt;
===== [[Cs-doclet|The CheckStyle Doclet]] =====&lt;br /&gt;
: Generates the metadata files for CheckStyle and eclipse-cs from &#039;doc tags&#039; in the source code of your checks and filters. &lt;br /&gt;
&lt;br /&gt;
===== [[JAVADOC doclet|The JAVADOC Doclet]] =====&lt;br /&gt;
: A re-implementation of the JAVADOC standard doclet, basically a reference to show how to use the &amp;quot;[[No-template|no-template]]&amp;quot; framework.&lt;br /&gt;
&lt;br /&gt;
===== [[MAIN doclet|The MAIN Doclet]] =====&lt;br /&gt;
: Generates HTML documentation for a &amp;quot;main()&amp;quot; method - useful for command line tools with a set of command line options.&lt;br /&gt;
&lt;br /&gt;
=== [[Html2txt|html2txt]] ===&lt;br /&gt;
: A Java tool to convert HTML documents into plain text.&lt;br /&gt;
&lt;br /&gt;
=== [[JDisasm|jdisasm]] ===&lt;br /&gt;
: A disassembler for Java .class files.&lt;br /&gt;
&lt;br /&gt;
=== [[No-template|no-template]] ===&lt;br /&gt;
: A super-small Java library for templating, i.e. generating text files (HTML, XML, whatever) from a &amp;quot;template&amp;quot; text file.&lt;br /&gt;
&lt;br /&gt;
== Retired Projects ==&lt;br /&gt;
&lt;br /&gt;
These projects are no longer maintained and are only of limited use, e.g. because they work only with old Java versions.&lt;br /&gt;
&lt;br /&gt;
=== [[Antology]] ===&lt;br /&gt;
: Some contributions to [http://ant.apache.org APACHE ANT], e.g. the &amp;lt;code&amp;gt;&amp;amp;lt;swingDialog&amp;gt;&amp;lt;/code&amp;gt; task which significantly enhances ANT&#039;s &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;gt;&amp;lt;/code&amp;gt; task.&lt;br /&gt;
&lt;br /&gt;
=== [[Loggifier.unkrig.de|Loggifier]] ===&lt;br /&gt;
: A tool for automatic injection of logging code into Java&amp;amp;trade; class files, making it unnecessary to mess up your code with hand-written logging.&lt;br /&gt;
&lt;br /&gt;
=== [[Cvstools.unkrig.de|Eclipse plug-in for extended CVS possibilities]] ===&lt;br /&gt;
&lt;br /&gt;
: An ECLIPSE plug-in that adds CVS functionality that is sometimes painfully missing from ECLIPSE&#039;s built-in CVS client.&lt;br /&gt;
&lt;br /&gt;
=== [[Subclipse.unkrig.de|Subclipse enhancements Eclipse plug-in]] ===&lt;br /&gt;
&lt;br /&gt;
: The often-missed &amp;lt;code&amp;gt;&amp;lt;de.unkrig.subclipse.svn&amp;gt;&amp;lt;/code&amp;gt; ANT task that uses the SUBCLIPSE client of the running ECLIPSE workbench.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Subclipse.unkrig.de&amp;diff=63</id>
		<title>Subclipse.unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Subclipse.unkrig.de&amp;diff=63"/>
		<updated>2026-07-04T08:36:53Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Important ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This ECLIPSE plug-in adds an additional ANT task &#039;de.unkrig.subclipse.svn&#039; which is available in ANT builds which have the option &#039;Run in the same JRE as the workspace&#039; set.&lt;br /&gt;
&lt;br /&gt;
The ANT task uses the SVN client that is provided by the SUBCLIPSE plug-in. Thus no configuration is required, because it is re-used from SUBCLIPSE.&lt;br /&gt;
&lt;br /&gt;
== Download and Installation ==&lt;br /&gt;
&lt;br /&gt;
Within ECLIPSE, download and install the feature from the update site&lt;br /&gt;
&lt;br /&gt;
 http://subclipse.unkrig.de/update&lt;br /&gt;
&lt;br /&gt;
The change log is available [http://subclipse.unkrig.de/changelog.txt here].&lt;br /&gt;
&lt;br /&gt;
== Task Documentation ==&lt;br /&gt;
&lt;br /&gt;
: [http://subclipse.unkrig.de/antdoc/tasks/de.unkrig.subclipse.svn.html &amp;lt;code&amp;gt;&amp;lt;de.unkrig.subclipse.svn&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
Tagging projects in SVN:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;!-- Verify that ANT is running in the same JVM as ECLIPSE. --&amp;gt;&lt;br /&gt;
 &amp;lt;fail&lt;br /&gt;
     unless=&amp;quot;eclipse.running&amp;quot;&lt;br /&gt;
     message=&amp;quot;Please activate the ECLIPSE external tool configuration option &#039;Run in the same JRE as the workspace&#039; and re-run.&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;!-- Verify that the &#039;de.unkrig.subclipse&#039; plugin is available. --&amp;gt;&lt;br /&gt;
 &amp;lt;fail message=&amp;quot;Please install the &#039;de.unkrig.subclipse&#039; ECLIPSE feature and re-run.&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;condition&amp;gt;&amp;lt;not&amp;gt;&amp;lt;typefound name=&amp;quot;de.unkrig.subclipse.svn&amp;quot; /&amp;gt;&amp;lt;/not&amp;gt;&amp;lt;/condition&amp;gt;&lt;br /&gt;
 &amp;lt;/fail&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;property name=&amp;quot;d&amp;quot; value=&amp;quot;http://svn.acme.com/svn/MyRepo/tags/${tag}&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;de.unkrig.subclipse.svn&amp;gt;&lt;br /&gt;
     &amp;lt;mkdir                          url=&amp;quot;${d}&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;copy srcpath=&amp;quot;.&amp;quot;           desturl=&amp;quot;${d}&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;copy srcpath=&amp;quot;../project2&amp;quot; desturl=&amp;quot;${d}&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/de.unkrig.subclipse.svn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you like loading ANT tasks in separate XML namespaces, you can alternatively write:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;&#039;&#039;some-enclosing-tag-e-g-project-or-target&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;xmlns:unkrig=&amp;quot;antlib:de.unkrig.subclipse&amp;quot;&amp;lt;/font&amp;gt;&amp;gt;&lt;br /&gt;
     ...&lt;br /&gt;
     &amp;lt;!-- Verify that ANT is running in the same JVM as ECLIPSE. --&amp;gt;&lt;br /&gt;
     &amp;lt;fail&lt;br /&gt;
         unless=&amp;quot;eclipse.running&amp;quot;&lt;br /&gt;
         message=&amp;quot;Please activate the ECLIPSE external tool configuration option &#039;Run in the same JRE as the workspace&#039; and re-run.&amp;quot;&lt;br /&gt;
     /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;!-- Verify that the &#039;de.unkrig.subclipse&#039; plugin is available. --&amp;gt;&lt;br /&gt;
     &amp;lt;fail message=&amp;quot;Please install the &#039;de.unkrig.subclipse&#039; ECLIPSE feature and re-run.&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;condition&amp;gt;&amp;lt;not&amp;gt;&amp;lt;typefound &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;uri=&amp;quot;antlib:de.unkrig.subclipse&amp;quot; name=&amp;quot;svn&amp;quot;&amp;lt;/font&amp;gt; /&amp;gt;&amp;lt;/not&amp;gt;&amp;lt;/condition&amp;gt;&lt;br /&gt;
     &amp;lt;/fail&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;unkrig:svn&amp;lt;/font&amp;gt;&amp;gt;...&lt;br /&gt;
&lt;br /&gt;
, where &amp;quot;&amp;lt;code&amp;gt;unkrig&amp;lt;/code&amp;gt;&amp;quot; is the (arbitrary) XML namespace prefix.&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
SUBCLIPSE.UNKRIG.DE is published under the &amp;quot;[[New BSD License]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
Source code is available via SVN on&lt;br /&gt;
&lt;br /&gt;
:https://svn.code.sf.net/p/loggifier/code&lt;br /&gt;
&lt;br /&gt;
. From that repository, check out the projects&lt;br /&gt;
*de.unkrig.checkstyle-configuration&lt;br /&gt;
*de.unkrig.commons.nullanalysis&lt;br /&gt;
*de.unkrig.subclipse_dist&lt;br /&gt;
*de.unkrig.subclipse.ant.tasks&lt;br /&gt;
*de.unkrig.subclipse.branding&lt;br /&gt;
*de.unkrig.subclipse.core&lt;br /&gt;
*org.apache.ant-1.8.4&lt;br /&gt;
, or, if you are using ECLIPSE, just import https://svn.code.sf.net/p/loggifier/code/trunk/de.unkrig.subclipse_dist/projectSet.psf.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
For bugs, improvements, complaints, or any other kind of feedback, send email to [mailto:arno@subclipse.unkrig.de arno@subclipse.unkrig.de].&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Cvstools.unkrig.de&amp;diff=62</id>
		<title>Cvstools.unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Cvstools.unkrig.de&amp;diff=62"/>
		<updated>2026-07-04T08:36:18Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Important ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;CVS Tools - an ECLIPSE plug-in for advanced CVS operations&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
A nice little ECLIPSE plug-in that adds CVS functionality that is sometimes painfully missing from ECLIPSE&#039;s built-in CVS client.&lt;br /&gt;
&lt;br /&gt;
== Custom CVS command user interface ==&lt;br /&gt;
* A &amp;quot;CVS Tools...&amp;quot; entry in the popup menus of all resources that are under CVS control.&lt;br /&gt;
[[Image:CVS_Tools_Menu.jpg|400x400px]]&lt;br /&gt;
* A &amp;quot;CVS Tools...&amp;quot; entry in the popup menu of all remote resources in the &amp;quot;CVS Repositories&amp;quot; view.&lt;br /&gt;
[[Image:CVS_Tools_Menu_Remote.jpg|400x400px]]&lt;br /&gt;
* These open the &amp;quot;Custom CVS Command&amp;quot; dialog in which you can configure and run any CVS command.&lt;br /&gt;
[[Image:Custom_CVS_Command_Dialog.jpg|400x400px]]&lt;br /&gt;
&lt;br /&gt;
== The &amp;quot;eclipse.cvs&amp;quot; and &amp;quot;eclipse.rcvs&amp;quot; ANT tasks ==&lt;br /&gt;
These ANT tasks provide access to the CVS client that is part of the ECLIPSE platform. Using that is much cooler than running an external &amp;quot;cvs.exe&amp;quot; (as the normal &amp;quot;cvs&amp;quot; ANT task does).&lt;br /&gt;
&lt;br /&gt;
[[Image:Ant_Task.jpg|400x400px]]&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;eclipse.cvs&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;Attributes&#039;&#039;&#039; ====&lt;br /&gt;
&#039;&#039;&#039;quiet&#039;&#039;&#039;&lt;br /&gt;
:No messages in the CVS console.&lt;br /&gt;
&#039;&#039;&#039;debug&#039;&#039;&#039;&lt;br /&gt;
:Unexpected exception print stack traces in the CVS console.&lt;br /&gt;
&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
:One of add, admin, annotate, commit, diff, edit, editors, history, log, ls, release, remove, status, tag, unedit, update, version, watch-add, watch-off, watch-on, watch-remove, watchers.&lt;br /&gt;
&#039;&#039;&#039;argument&#039;&#039;&#039;&lt;br /&gt;
:Only for the &amp;quot;tag&amp;quot; command.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;Subelements&#039;&#039;&#039; ====&lt;br /&gt;
&amp;lt;&#039;&#039;&#039;globaloption&#039;&#039;&#039; option=&amp;quot;-n&amp;quot;/&amp;gt;&lt;br /&gt;
:One of -Q, -q, -r, -n, -t, -l (For descriptions see the &amp;quot;Custom CVS Commands&amp;quot; dialog or &amp;quot;cvs --help-options&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&#039;&#039;&#039;localoption&#039;&#039;&#039; option=&amp;quot;-r1.5&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;&#039;&#039;&#039;localoption&#039;&#039;&#039; option=&amp;quot;-m&amp;quot; argument=&amp;quot;My Message&amp;quot;/&amp;gt;&lt;br /&gt;
:Command-dependent; for descriptions see the &amp;quot;Custom CVS Commands&amp;quot; dialog or &amp;quot;cvs -H &#039;&#039;command&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;&#039;&#039;&#039;fileset&#039;&#039;&#039;&amp;gt;...&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;&#039;&#039;&#039;dirset&#039;&#039;&#039;&amp;gt;...&lt;br /&gt;
:See ANT documentation.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;eclipse.rcvs&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;Attributes&#039;&#039;&#039; ====&lt;br /&gt;
&#039;&#039;&#039;cvsroot&#039;&#039;&#039;&lt;br /&gt;
:Format:&lt;br /&gt;
::* :method:[user[:password]@]hostname[#port]:/path/to/repository (CVSNT)&lt;br /&gt;
::* :method:[[user][:password]@]hostname[:[port]]/path/to/repository (other)&lt;br /&gt;
&#039;&#039;&#039;quiet&#039;&#039;&#039;&lt;br /&gt;
:No messages in the CVS console.&lt;br /&gt;
&#039;&#039;&#039;debug&#039;&#039;&#039;&lt;br /&gt;
:Unexpected exception print stack traces in the CVS console.&lt;br /&gt;
&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
:One of checkout, export, import, rannotate, rlog, rdiff, rls, rtag, version.&lt;br /&gt;
&#039;&#039;&#039;argument&#039;&#039;&#039;&lt;br /&gt;
:Only for the &amp;quot;rtag&amp;quot; command.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;Subelements&#039;&#039;&#039; ====&lt;br /&gt;
&amp;lt;&#039;&#039;&#039;globaloption&#039;&#039;&#039; option=&amp;quot;-n&amp;quot;/&amp;gt;&lt;br /&gt;
:One of -Q, -q, -r, -n, -t, -l (For descriptions see the &amp;quot;Custom CVS Commands&amp;quot; dialog or &amp;quot;cvs --help-options&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&#039;&#039;&#039;localoption&#039;&#039;&#039; option=&amp;quot;-r1.5&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;&#039;&#039;&#039;localoption&#039;&#039;&#039; option=&amp;quot;-m&amp;quot; argument=&amp;quot;My Message&amp;quot;/&amp;gt;&lt;br /&gt;
:Command-dependent; for descriptions see the &amp;quot;Custom CVS Commands&amp;quot; dialog or &amp;quot;cvs -H &#039;&#039;command&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;&#039;&#039;&#039;module&#039;&#039;&#039; name=&amp;quot;foo&amp;quot;/&amp;gt;...&lt;br /&gt;
:Target CVS module.&lt;br /&gt;
&lt;br /&gt;
== Download and Installation ==&lt;br /&gt;
Download the plug-in JAR file from&lt;br /&gt;
&lt;br /&gt;
:http://cvstools.unkrig.de/download/&lt;br /&gt;
&lt;br /&gt;
and copy it into your ECLIPSE&#039;s &amp;quot;dropins&amp;quot; subdirectory, then &amp;quot;File / Restart&amp;quot; your ECLIPSE.&lt;br /&gt;
&lt;br /&gt;
Source code is available via SVN on&lt;br /&gt;
&lt;br /&gt;
:https://svn.code.sf.net/p/cvstools/code&lt;br /&gt;
&lt;br /&gt;
== Project status ==&lt;br /&gt;
Everything is still very experimental, and not all CVS commands, options and combinations thereof have been tested. Still I feel that there may be some interest out there for these tools? Use, comment, contribute!&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
CVSTOOLS is published under the &amp;quot;[[New BSD License]]&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Loggifier.unkrig.de&amp;diff=61</id>
		<title>Loggifier.unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Loggifier.unkrig.de&amp;diff=61"/>
		<updated>2026-07-04T08:35:41Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Important ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
Have you ever wondered how much cleaner your code would look if it weren&#039;t littered with all that logging code? And, when you&#039;re hunting bugs in production environments, do you produce tons of logging output, but often find that the critical bit of information that you need is missing?&lt;br /&gt;
&lt;br /&gt;
If the answers are &amp;quot;no&amp;quot; and &amp;quot;no&amp;quot;, then stop reading. Otherwise, LOGGIFIER may be the tool you need.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The concept of LOGGIFIER is as follows:&lt;br /&gt;
&lt;br /&gt;
* Relevant class files are instrumented during the build process:&amp;lt;br /&amp;gt;Code similar to&lt;br /&gt;
    &amp;lt;nowiki&amp;gt;if (MyClass.__logger123.isLoggable(Level.FINE)) {&lt;br /&gt;
        Helper.logp(&lt;br /&gt;
            MyClass.__logger123,      // logger&lt;br /&gt;
            Level.FINE,               // level&lt;br /&gt;
            &amp;quot;com.acme.MyClass&amp;quot;,       // sourceClass&lt;br /&gt;
            &amp;quot;main(String[])&amp;quot;,         // sourceMethod&lt;br /&gt;
            &amp;quot;MyClass.java&amp;quot;,           // source&lt;br /&gt;
            120,                      // lineNumber&lt;br /&gt;
            &amp;quot;ENTRY  args=(args={0})&amp;quot;, // message&lt;br /&gt;
            new Object[] { arg1 }     // parameters&lt;br /&gt;
        );&lt;br /&gt;
    }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: is inserted all over the place. (&amp;lt;code&amp;gt;Helper.logp()&amp;lt;/code&amp;gt; eventually calls &amp;lt;code&amp;gt;java.util.logging.Logger.logp()&amp;lt;/code&amp;gt;, after having done some pretty-printing on the message arguments.) Where exactly (in the example: At the top of &#039;MyClass.main()&#039;), and at what log level (here: FINE) is controlled by the applicable [[#Loggification rules|loggification rules]]. In typical scenarios, the default rules should generate a reasonable amount of logging points.&lt;br /&gt;
* The instrumentation remains even in production. This is possible because the instrumentation is optimized for very low overhead (as you can see in the code above: The call to &#039;isLoggable()&#039; is typically super fast).&lt;br /&gt;
* Alternatively you loggify the code only when you start debugging. This is often less practical, because it requires that you either have access to the .jar/.war/.ear files in the target environment., or restart the JVM with loggification activated. Also, the restart or the loggification may influence the problems that you want to track down.&lt;br /&gt;
* Then, when it comes to debugging, you enable logging at runtime, e.g. by editing the &#039;logging.properties&#039; file, or by connecting to the running JVM through JMX. LOGGIFIER does not have one single Logger or one Logger per class, but separate loggers for all classes, methods and events. (Loggers are cheap, so the cost for having hundreds of them is low.) Hence you can enable the logging very selectively and thereby keep the amount of logging output reasonable.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
&lt;br /&gt;
Click [[Loggifier.unkrig.de / Getting Started|here]] to take the fast track to Loggifier.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
There are various tools to loggify your classes:&lt;br /&gt;
&lt;br /&gt;
* At build time:&lt;br /&gt;
** The LOGGIFIER [[Loggifier.unkrig.de / Tools / Command line tool|command line tool]]&lt;br /&gt;
** The LOGGIFIER [[Loggifier.unkrig.de / Tools / Eclipse plug-in|ECLIPSE plug-in]]&lt;br /&gt;
** The &amp;lt;code&amp;gt;&amp;lt;de.unkrig.loggifier&amp;gt;&amp;lt;/code&amp;gt; [[Loggifier.unkrig.de / Tools / Ant task|ANT task]]&lt;br /&gt;
* At runtime:&lt;br /&gt;
** The [[Loggifier.unkrig.de / Tools / LoggifyingClassLoader|LoggifyingClassLoader]]&lt;br /&gt;
** The LOGGIFIER [[Loggifier.unkrig.de / Tools / Java agent|Java agent]]&lt;br /&gt;
&lt;br /&gt;
== Loggification ==&lt;br /&gt;
&lt;br /&gt;
The LOGGIFIER loads a class file and analyzes the bytecode of the class&#039;s constructors and methods. Looking at the code, it identifies &amp;quot;interesting&amp;quot; points where logging code could be inserted. Each of the logging points is characterized by an [[#Logging actions|action]]. For each logging point, the relevant [[#Loggification rules|loggification rules]] are executed, and the first that matches determines at what level the logging event is to be logged (or if no logging code is injected for this logging point). Loggification rules optionally have a [[#Discriminator expression|discriminator expression]], which has a set of [[#Discriminator expression parameters|parameters]].&lt;br /&gt;
&lt;br /&gt;
=== Logging actions ===&lt;br /&gt;
&lt;br /&gt;
Each section of code is characterized by an &#039;Action&#039;. For example, the JVM bytecodes &amp;lt;code&amp;gt;PUTFIELD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PUTSTATIC&amp;lt;/code&amp;gt; are characterized by action &#039;&#039;&#039;PUT&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ALOAD&#039;&#039;&#039;     ||Log array type, array value, index and element value read from an array&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ARITH&#039;&#039;&#039;     ||Log operands, operator (+, -, ...) and result of an arithmetic operation&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ASTORE&#039;&#039;&#039;    ||Log the array, the index and the value being stored in an array&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CAST&#039;&#039;&#039;      ||Log the type to which the operand is casted&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CATCH&#039;&#039;&#039;     ||Log the declared catch type and the actually caught exception&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CLINIT&#039;&#039;&#039;    ||Log the name of a class that is initialized&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CONST&#039;&#039;&#039;     ||Log the value of a constant being pushed on the operand stack&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CONVERT&#039;&#039;&#039;   ||Log a value that is arithmetically converted and the conversion result&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ENTRY&#039;&#039;&#039;     ||Log the target object (if non-static) and the arguments as a method begins execution&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;GET&#039;&#039;&#039;       ||Log declaring class of, name of, source instance of (if non-static) and value read from a field&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INVOKE&#039;&#039;&#039;    ||Log signature, target object (if non-static) and arguments right before a method is invoked&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INSTANCEOF&#039;&#039;&#039;||Log the type to which the operand type is compared&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;LENGTH&#039;&#039;&#039;    ||Log the array who&#039;s length is determined&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;LOAD&#039;&#039;&#039;      ||Log type of, name of and value read from a local variable&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;NEW&#039;&#039;&#039;       ||Log the type of a new object being instantiated&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PUT&#039;&#039;&#039;       ||Log declaring class of, name of, target instance of (if non-static) and value assigned to field&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;RESULT&#039;&#039;&#039;    ||Log method signature and invocation result (if not &#039;void&#039;)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;RETURN&#039;&#039;&#039;    ||Log the value that is being returned by a method (if not &#039;void&#039;)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;STORE&#039;&#039;&#039;     ||Log value assigned to, type of and name of a local variable&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SWITCH&#039;&#039;&#039;    ||Log the integer value that a switch is being executed on&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;THROW&#039;&#039;&#039;     ||Log an exception right before it is thrown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Loggification rule syntax ===&lt;br /&gt;
&lt;br /&gt;
A rule triggers if and only if&lt;br /&gt;
* It applies to the action of the loggification point (ENTRY, EXIT, THROW, ...)&lt;br /&gt;
* Its discriminator expression (if any) evaluates to TRUE for the actual point (who&#039;s properties are availables as variables in the discriminator expression, see above)&lt;br /&gt;
&lt;br /&gt;
The syntax of all loggification rules is:&lt;br /&gt;
&lt;br /&gt;
 loggification-rule :=&lt;br /&gt;
     ( action { &#039;,&#039; action } | &#039;ALL&#039; ) &#039;=&#039; level [ &#039;:&#039; discriminator-expression ]&lt;br /&gt;
 &lt;br /&gt;
 action :=&lt;br /&gt;
     (One of the actions documented above)&lt;br /&gt;
 &lt;br /&gt;
 level :=&lt;br /&gt;
     &#039;SEVERE&#039; | &#039;WARNING&#039; | &#039;INFO&#039; | &#039;CONFIG&#039; | &#039;FINE&#039; | &#039;FINER&#039; | &#039;FINEST&#039;&lt;br /&gt;
 &lt;br /&gt;
 discriminator-expression :=&lt;br /&gt;
     (Syntax defined below)&lt;br /&gt;
&lt;br /&gt;
Examples of valid loggification rules are:&lt;br /&gt;
&lt;br /&gt;
 ALL=FINE&lt;br /&gt;
 ENTRY=FINE&lt;br /&gt;
 ARITH=FINE&lt;br /&gt;
 LOAD,CONVERT,ARITH,STORE=FINE&lt;br /&gt;
 ALL=FINE:class =* &amp;quot;de.*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(&amp;lt;code&amp;gt;=*&amp;lt;/code&amp;gt; is the &#039;glob matching operator&#039;, e.g. &amp;quot;hello&amp;quot; matches &amp;quot;he*&amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
=== Loggification rule precedence ===&lt;br /&gt;
&lt;br /&gt;
The sequence of checked rules for each logging point is as follows:&lt;br /&gt;
&lt;br /&gt;
;If the constructor or method being instrumented has a &#039;@Loggify&#039; annotation (not for action CLINIT)&lt;br /&gt;
:Its values in reverse order (i.e. the last value/rule takes the highest precedence).&lt;br /&gt;
&lt;br /&gt;
;If a field &#039;static final String $$loggifierRules = &amp;quot;xyz&amp;quot;&#039; was declared before the contructor or method being instrumented&lt;br /&gt;
:Its value, split at &#039;\n&#039;, in reverse order (i.e. the last fragment/rule takes the highest precedence).&lt;br /&gt;
&lt;br /&gt;
;If the class or interface being instrumented has a &#039;@Loggify&#039; annotation&lt;br /&gt;
:Its values of in reverse order (i.e. the last value/rule takes the highest precedence).&lt;br /&gt;
&lt;br /&gt;
;If using the four-parameter [[Loggifier.unkrig.de / Tools / LoggifyingClassLoader|LoggifyingClassLoader]] constructor&lt;br /&gt;
:The &#039;logLevelCalculator&#039; argument.&lt;br /&gt;
&lt;br /&gt;
;If using the [[Loggifier.unkrig.de / Tools / Ant task|ANT task]]&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;rule&amp;gt;&amp;lt;/code&amp;gt; subelements, in reverse order (i.e. the last &amp;lt;code&amp;gt;&amp;lt;rule&amp;gt;&amp;lt;/code&amp;gt; takes the highest precedence).&lt;br /&gt;
&lt;br /&gt;
;If using the [[Loggifier.unkrig.de / Tools / Command line tool|LOGGIFIER command line tool]]&lt;br /&gt;
:The &#039;-rule&#039; options, in reverse order (i.e. the last &#039;-rule&#039; option takes the highest precedence).&lt;br /&gt;
&lt;br /&gt;
;If using the [[Loggifier.unkrig.de / Tools / Eclipse plug-in|ECLIPSE plug-in]]&lt;br /&gt;
:The levels on the &amp;quot;Loggifier&amp;quot; property page of each project. (This rule ALWAYS applies, hence the following rules are never executed).&lt;br /&gt;
&lt;br /&gt;
;If using the [[Loggifier.unkrig.de / Tools / Java agent|Java agent]]&lt;br /&gt;
:Its argument string passed to the agent, split at &#039;\n&#039;, in reverse order (i.e. the last fragment/rule takes the highest precedence).&lt;br /&gt;
&lt;br /&gt;
;If the action is LOAD or STORE, and the local variable&#039;s name ends with &#039;__&#039;&lt;br /&gt;
:FINER&lt;br /&gt;
&lt;br /&gt;
;If the action is GET or PUT, and the field&#039;s name ends with &#039;__&#039;&lt;br /&gt;
:FINER&lt;br /&gt;
&lt;br /&gt;
;If the action is NEW, CAST or INSTANCEOF, and the target class&#039;s name ends with &#039;__&#039;&lt;br /&gt;
:FINER&lt;br /&gt;
&lt;br /&gt;
;If the action is ENTRY, RETURN or THROW&lt;br /&gt;
:FINER&lt;br /&gt;
&lt;br /&gt;
;Last resort (when none of the above rules triggered)&lt;br /&gt;
:OFF&lt;br /&gt;
&lt;br /&gt;
Notice that non-static fields (a.k.a. &#039;instance variables&#039;) are initialized by the class&#039;s constructors. Static fields (&#039;class variables&#039;) are initialized by the synthetic &amp;lt;code&amp;gt;&amp;lt;clinit&amp;gt;()&amp;lt;/code&amp;gt; method, which cannot be annotated in source code.&lt;br /&gt;
&lt;br /&gt;
=== Discriminator expression ===&lt;br /&gt;
&lt;br /&gt;
Discriminator expressions are implemented by means of &amp;lt;code&amp;gt;de.unkrig.commons.text.expression.ExpressionEvaluator&amp;lt;/code&amp;gt;; find the expression syntax documented [http://commons.unkrig.de/javadoc/de/unkrig/commons/text/expression/Parser.html here].&lt;br /&gt;
&lt;br /&gt;
=== Discriminator expression parameters ===&lt;br /&gt;
&lt;br /&gt;
To provide fine-grained control over loggification, the properties of each loggification point are provided as parameters to the discriminator expression:&lt;br /&gt;
&lt;br /&gt;
;action&lt;br /&gt;
:One of the [[#Logging actions|documented logging actions]]&lt;br /&gt;
;source&lt;br /&gt;
:The name of the Java source file that JAVAC stores in each &amp;lt;code&amp;gt;.class&amp;lt;/code&amp;gt; file if enabled by &amp;lt;code&amp;gt;-g:source&amp;lt;/code&amp;gt;.&lt;br /&gt;
;classAccess&lt;br /&gt;
:The accessibility of the class being instrumented (&amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;protected&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;)&lt;br /&gt;
;class&lt;br /&gt;
:The fully qualified name of the class being instrumented, e.g. &amp;lt;code&amp;gt;pkg.MyClass&amp;lt;/code&amp;gt;&lt;br /&gt;
;methodAccess&lt;br /&gt;
:The accessibility of the method being instrumented (&amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;protected&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;)&lt;br /&gt;
;method&lt;br /&gt;
:The enhanced, dequalified name of the method being instrumented, e.g. &amp;lt;code&amp;gt;meth(String, MyClass)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;lt;T extends IOException&amp;gt;meth(T, MyClass, List&amp;lt;T&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
;line&lt;br /&gt;
:The line number related to the code point being instrumented that JAVAC stores in each .class file if enabled by &amp;lt;code&amp;gt;-g:lines&amp;lt;/code&amp;gt;&lt;br /&gt;
;type&lt;br /&gt;
:The relevant type for the operation, e.g. &amp;lt;code&amp;gt;pkg.Class&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pkg.Class[][]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int[][]&amp;lt;/code&amp;gt; (only for actions &#039;&#039;&#039;CAST&#039;&#039;&#039;, &#039;&#039;&#039;INSTANCEOF&#039;&#039;&#039; and &#039;&#039;&#039;NEW&#039;&#039;&#039;)&lt;br /&gt;
;classAndField&lt;br /&gt;
:The subject class and field, e.g. &amp;lt;code&amp;gt;pkg.Class.field&amp;lt;/code&amp;gt; (only for actions &#039;&#039;&#039;GET&#039;&#039;&#039; and &#039;&#039;&#039;PUT&#039;&#039;&#039;)&lt;br /&gt;
;variable&lt;br /&gt;
:The name of the subject local variable (only for actions &#039;&#039;&#039;LOAD&#039;&#039;&#039; and &#039;&#039;&#039;STORE&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
At each loggification point, the LOGGIFIER determines if logging code is to be inserted or not (&#039;discrimination&#039;) and&lt;br /&gt;
on which level the event will be logged at runtime (&#039;level&#039;). This is achieved by checking the &#039;loggification&lt;br /&gt;
rules&#039;.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
To get the LOGGIFIER ECLIPSE plugins, define an update site&lt;br /&gt;
&lt;br /&gt;
    http://loggifier.unkrig.de/update/&lt;br /&gt;
&lt;br /&gt;
in &amp;quot;Help / Install new software...&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get the JAR files mentioned above, download them from&lt;br /&gt;
&lt;br /&gt;
    http://loggifier.unkrig.de/download/&lt;br /&gt;
&lt;br /&gt;
The source code is available through SVN:&lt;br /&gt;
&lt;br /&gt;
    https://svn.code.sf.net/p/loggifier/code&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
LOGGIFIER is published under the &amp;quot;[[New BSD License]]&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Antology&amp;diff=60</id>
		<title>Antology</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Antology&amp;diff=60"/>
		<updated>2026-07-04T08:34:41Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Important =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This library contributes useful tasks and types to [http://ant.apache.org APACHE ANT]. It integrates seamlessly with other libraries like [http://ant-contrib.sourceforge.net/ ant-contrib].&lt;br /&gt;
&lt;br /&gt;
ANTOLOGY was formerly known as &amp;quot;[[Ant-contrib.unkrig.de]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tasks ==&lt;br /&gt;
&lt;br /&gt;
=== In Alphabetical Order ===&lt;br /&gt;
&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/break.html               &amp;lt;code&amp;gt;&amp;lt;break&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/continue.html            &amp;lt;code&amp;gt;&amp;lt;continue&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/cookieHandler.html       &amp;lt;code&amp;gt;&amp;lt;cookieHandler&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/follow.html              &amp;lt;code&amp;gt;&amp;lt;follow&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/forEach2.html            &amp;lt;code&amp;gt;&amp;lt;forEach2&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/ftp2.html                &amp;lt;code&amp;gt;&amp;lt;ftp2&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/httpsUrlConnections.html &amp;lt;code&amp;gt;&amp;lt;httpsUrlConnections&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/jsonProperty.html        &amp;lt;code&amp;gt;&amp;lt;jsonProperty&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/log.html                 &amp;lt;code&amp;gt;&amp;lt;log&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/logging.html             &amp;lt;code&amp;gt;&amp;lt;logging&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/nslookup.html            &amp;lt;code&amp;gt;&amp;lt;nslookup&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/propertyXml2.html        &amp;lt;code&amp;gt;&amp;lt;propertyXml2&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/retry2.html              &amp;lt;code&amp;gt;&amp;lt;retry2&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/setAuthenticator.html    &amp;lt;code&amp;gt;&amp;lt;setAuthenticator&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/setCookieHandler.html    &amp;lt;code&amp;gt;&amp;lt;setCookieHandler&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/simpleLogging.html       &amp;lt;code&amp;gt;&amp;lt;simpleLogging&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/swingDialog.html         &amp;lt;code&amp;gt;&amp;lt;swingDialog&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/swingLookAndFeel.html    &amp;lt;code&amp;gt;&amp;lt;swingLookAndFeel&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/throughput.html          &amp;lt;code&amp;gt;&amp;lt;throughput&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/urlConnection.html       &amp;lt;code&amp;gt;&amp;lt;urlConnection&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
: [http://antology.unkrig.de/antdoc/index.html?tasks/xmlProperty2.html        &amp;lt;code&amp;gt;&amp;lt;xmlProperty2&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=== By Function Group ===&lt;br /&gt;
&lt;br /&gt;
==== Control Flow Tasks ====&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/break.html &amp;lt;code&amp;gt;&amp;lt;break&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Terminates the execution of the enclosing &amp;lt;code&amp;gt;&amp;lt;forEach2&amp;gt;&amp;lt;/code&amp;gt; task.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/continue.html &amp;lt;code&amp;gt;&amp;lt;continue&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Causes the enclosing &amp;lt;code&amp;gt;&amp;lt;forEach2&amp;gt;&amp;lt;/code&amp;gt; task to continue with the next iteration element.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/follow.html &amp;lt;code&amp;gt;&amp;lt;follow&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Waits until a file grows.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/forEach2.html &amp;lt;code&amp;gt;&amp;lt;forEach2&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:An enhanced version of [http://ant-contrib.sourceforge.net/tasks/tasks/for.html the &amp;lt;code&amp;gt;&amp;lt;for&amp;gt;&amp;lt;/code&amp;gt; task of ant-contrib.sourceforge.net].&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/retry2.html &amp;lt;code&amp;gt;&amp;lt;retry2&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:An enhanced version of the standard [http://ant.apache.org/manual/Tasks/retry.html &amp;lt;code&amp;gt;&amp;lt;retry&amp;gt;&amp;lt;/code&amp;gt;] task.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/throughput.html &amp;lt;code&amp;gt;&amp;lt;throughput&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Measures expired time and calculates and displays throughput rates and estimated remaining times.&lt;br /&gt;
&lt;br /&gt;
==== Text Processing Tasks ====&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/jsonProperty.html &amp;lt;code&amp;gt;&amp;lt;jsonProperty&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Parses a JSON document into a set of properties, in analogy with [http://ant.apache.org/manual/Tasks/xmlproperty.html the standard ANT &amp;lt;code&amp;gt;&amp;lt;xmlproperty&amp;gt;&amp;lt;/code&amp;gt; task].&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/propertyXml2.html &amp;lt;code&amp;gt;&amp;lt;propertyXml2&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Creates an XML document from ANT properties; the counterpart of the [http://antology.unkrig.de/antdoc/index.html?tasks/xmlProperty2.html &amp;lt;code&amp;gt;&amp;lt;xmlProperty2&amp;gt; task&amp;lt;/code&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/xmlProperty2.html &amp;lt;code&amp;gt;&amp;lt;xmlProperty2&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Parses an XML document into ANT properties. Resembles [http://ant.apache.org/manual/Tasks/xmlproperty.html ANT&#039;s standard &amp;lt;xmlproperty&amp;gt; task], but maps the XML DOM in a different, more detailed way.&lt;br /&gt;
&lt;br /&gt;
==== Logging Tasks ====&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/log.html &amp;lt;code&amp;gt;&amp;lt;log&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Logs one message through &amp;lt;code&amp;gt;java.util.logging&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/logging.html &amp;lt;code&amp;gt;&amp;lt;logging&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Configures one or more loggers of the &amp;lt;code&amp;gt;java.util.logging&amp;lt;/code&amp;gt; logging component.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/simpleLogging.html &amp;lt;code&amp;gt;&amp;lt;simpleLogging&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Configures the [http://commons.unkrig.de/javadoc/de/unkrig/commons/util/logging/SimpleLogging.html &amp;lt;code&amp;gt;de.unkrig.commons.util.logging.SimpleLogging&amp;lt;/code&amp;gt;] facility.&lt;br /&gt;
&lt;br /&gt;
==== Networking Tasks ====&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/cookieHandler.html &amp;lt;code&amp;gt;&amp;lt;cookieHandler&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Performs various actions on the JRE&#039;s &amp;quot;cookie handler&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/ftp2.html &amp;lt;code&amp;gt;&amp;lt;ftp2&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Extends ANT&#039;s standard &amp;lt;code&amp;gt;&amp;lt;ftp&amp;gt;&amp;lt;/code&amp;gt; with support for proxies.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/httpsUrlConnections.html &amp;lt;code&amp;gt;&amp;lt;httpsUrlConnections&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Configures Java&#039;s &amp;lt;code&amp;gt;HttpsURLConnection&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/nslookup.html &amp;lt;code&amp;gt;&amp;lt;nslookup&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Resolves a host name or IP address.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/setAuthenticator.html &amp;lt;code&amp;gt;&amp;lt;setAuthenticator&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Configures the authentication for all following [http://docs.oracle.com/javase/6/docs/api/java/net/HttpURLConnection.html &amp;lt;code&amp;gt;java.net.URLConnection&amp;lt;/code&amp;gt;]s, including the &amp;lt;code&amp;gt;&amp;lt;urlConnection&amp;gt;&amp;lt;/code&amp;gt; task.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/setCookieHandler.html &amp;lt;code&amp;gt;&amp;lt;setCookieHandler&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Enables or disables cookie handling for Java&#039;s [http://docs.oracle.com/javase/6/docs/api/java/net/HttpURLConnection.html &amp;lt;code&amp;gt;java.net.HttpURLConnection&amp;lt;/code&amp;gt;], including the &amp;lt;code&amp;gt;&amp;lt;urlConnection&amp;gt;&amp;lt;/code&amp;gt; task.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/urlConnection.html &amp;lt;code&amp;gt;&amp;lt;urlConnection&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Connects to a resource and writes data to it and/or reads data from it.&lt;br /&gt;
&lt;br /&gt;
==== UI Tasks ====&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/swingDialog.html &amp;lt;code&amp;gt;&amp;lt;swingDialog&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Pops up a highly configurable dialog and invites the user to fill in form fields.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?tasks/swingLookAndFeel.html &amp;lt;code&amp;gt;&amp;lt;swingLookAndFeel&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Sets the SWING look-and-feel for this JVM, or retrieves look-and-feel-related information from the JVM.&lt;br /&gt;
&lt;br /&gt;
== Resource Collections ==&lt;br /&gt;
&lt;br /&gt;
A [http://antology.org/manual/Types/resources.html#collection resource collection] represents a group of resources (e.g. local files, archive entries, etc.). A resource is an entity that has a name and a value. An often-used example of a resource collection is the &amp;lt;code&amp;gt;&amp;lt;fileSet&amp;gt;&amp;lt;/code&amp;gt; type, where each resource is a file with its name and its contents.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?resourceCollections/literalResource.html &amp;lt;code&amp;gt;&amp;lt;literalResource&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:A read-only resource with a name and a literal value - configurable either through &amp;lt;code&amp;gt;value=&amp;quot;...&amp;quot;&amp;lt;/code&amp;gt; or nested text.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?resourceCollections/resourceCollectionDelta.html &amp;lt;code&amp;gt;&amp;lt;resourceCollectionDelta&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Selects the subset of resources that was added, deleted or modified since the last check.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?resourceCollections/resourceNames.html &amp;lt;code&amp;gt;&amp;lt;resourceNames&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Replaces the resources&#039; values with their names.&lt;br /&gt;
&lt;br /&gt;
== Chainable Readers ==&lt;br /&gt;
&lt;br /&gt;
[http://ant.apache.org/manual/Types/filterchain.html Filter readers] are an ANT concept that mimics the functionality of UNIX&#039; pipes: A stream of bytes is read through a chain of filter readers, where each filter reader modifies the byte stream and/or performs some additional actions.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?chainableReaders/progress.html &amp;lt;code&amp;gt;&amp;lt;progress&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Prints dots (&amp;quot;.&amp;quot;) to STDERR as data is read through it. This implements a kind of &amp;quot;progress monitoring&amp;quot; for tasks that read data slowly.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?chainableReaders/tee.html &amp;lt;code&amp;gt;&amp;lt;tee&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Passes data through unmodified, and copies it to a second filter chain.&lt;br /&gt;
&lt;br /&gt;
== Conditions ==&lt;br /&gt;
&lt;br /&gt;
[http://ant.apache.org/manual/Tasks/conditions.html Conditions] are nested elements of the &amp;lt;code&amp;gt;&amp;lt;condition&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;waitfor&amp;gt;&amp;lt;/code&amp;gt; and several other tasks.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?conditions/every.html &amp;lt;code&amp;gt;&amp;lt;every&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Evaluates to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; when it is evaluated for the &amp;lt;b&amp;gt;first time&amp;lt;/b&amp;gt;, and when the last evaluation to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; has been more than a configured interval ago.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?conditions/false.html &amp;lt;code&amp;gt;&amp;lt;false&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Always evaluates to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?conditions/successful.html &amp;lt;code&amp;gt;&amp;lt;successful&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Executes the tasks configured as subelements sequentially and evaluates to whether all subtasks have completed successfully.&lt;br /&gt;
&lt;br /&gt;
;[http://antology.unkrig.de/antdoc/index.html?conditions/true.html &amp;lt;code&amp;gt;&amp;lt;true&amp;gt;&amp;lt;/code&amp;gt;]&lt;br /&gt;
:Always evaluates to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Download and installation ==&lt;br /&gt;
&lt;br /&gt;
Download the &amp;quot;jar-with-dependencies.jar&amp;quot; file from&lt;br /&gt;
[https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&amp;amp;g=de.unkrig&amp;amp;a=antology&amp;amp;v=LATEST&amp;amp;c=jar-with-dependencies MAVENCENTRAL].&lt;br /&gt;
&lt;br /&gt;
To make Antology&#039;s tasks and types available in your ANT scripts, write&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;taskdef resource=&amp;quot;de/unkrig/antology/ant.xml&amp;quot; classpath=&amp;quot;path/to/antology-x.y.z-jar-with-dependencies.jar&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
, or, if you put the JAR file on ANT&#039;s default classpath, just&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;taskdef resource=&amp;quot;de/unkrig/antology/ant.xml&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ANTDOC documentation for Antology can be found online [http://antology.unkrig.de/antdoc/ here], or offline [https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&amp;amp;g=de.unkrig&amp;amp;a=antology&amp;amp;v=LATEST&amp;amp;c=javadoc here].&lt;br /&gt;
&lt;br /&gt;
A [[Antology Change Log|Change Log]] is also available.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
The source code is available on GITHUB: https://github.com/aunkrig/antology&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
ANTOLOGY is published under the &amp;quot;[[New BSD License]]&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=59</id>
		<title>Unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=59"/>
		<updated>2026-07-04T08:31:45Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;font size=&amp;quot;+6&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Welcome to unkrig.de!&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;font color=&amp;quot;#777&amp;quot;&amp;gt;&#039;&#039;Where the fine software grows&#039;&#039;&amp;lt;/font&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[image:Javawordcloud.png|right]]&lt;br /&gt;
&lt;br /&gt;
= Important =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preamble ==&lt;br /&gt;
&lt;br /&gt;
Hello out there!&lt;br /&gt;
&lt;br /&gt;
I am a professional programmer, and when I have time I work on several cool open source projects. Find them useful, interesting, inspiring - or contribute! To contact me, send email to &#039;arno att unkrig dott de&#039;.&lt;br /&gt;
&lt;br /&gt;
Cheers, Arno&lt;br /&gt;
&lt;br /&gt;
== Larger Projects ==&lt;br /&gt;
&lt;br /&gt;
=== [https://janino-compiler.github.io/janino/ Janino] ===&lt;br /&gt;
: A super-small, super-fast Java&amp;amp;trade; compiler for embedded applications where you want to compile code on-the-fly into byte code which is executed in the running JVM.&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/aunkrig/lfr LFR - Lightning-fast Regular Expressions for Java] ===&lt;br /&gt;
: A 99.9%-complete reimplementation of &amp;lt;code&amp;gt;java.util.regex&amp;lt;/code&amp;gt; (&amp;quot;JUR&amp;quot;) with better &amp;lt;code&amp;gt;match()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt; performance.&lt;br /&gt;
&lt;br /&gt;
=== [[Zz.unkrig.de|ZZ Tools]] ===&lt;br /&gt;
: Enhanced versions of the widely known DIFF, FIND, GREP and PATCH command-line tools, which handle not only directories and files, but also archive and compressed files, and even nested archive and compressed files. They can even disassemble Java &amp;lt;code&amp;gt;.class&amp;lt;/code&amp;gt; files on-the fly and operate on the disassembly.&lt;br /&gt;
&lt;br /&gt;
=== [[Cs-contrib.unkrig.de|CheckStyle Contributions]] ===&lt;br /&gt;
: Additional checks, filters and quickfixes for [http://checkstyle.sourceforge.net/ CheckStyle] and [http://eclipse-cs.sourceforge.net/ Eclipse-CS].&lt;br /&gt;
&lt;br /&gt;
=== [[Commons.unkrig.de]] ===&lt;br /&gt;
: A versatile Java&amp;amp;trade; library, including a highly flexible HTTP and FTP server.&lt;br /&gt;
&lt;br /&gt;
== Smaller Projects ==&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/aunkrig/autoauth AUTOAUTH] ===&lt;br /&gt;
&lt;br /&gt;
An HTTP proxy that handles proxy authentication.&lt;br /&gt;
&lt;br /&gt;
=== [[Doclet|Doclets]] ===&lt;br /&gt;
&lt;br /&gt;
Doclets are a way to re-use the JAVADOC tool to do other things than just generate Java API documentation. I wrote a few of them for different purposes:&lt;br /&gt;
&lt;br /&gt;
===== [[ANT doclet|The ANT Doclet]] =====&lt;br /&gt;
: Generates JAVADOC-like HTML documentation for an ANTLIB, e.g. for [[Antology]] and the [[Zz.unkrig.de|ZZ tools]].&lt;br /&gt;
&lt;br /&gt;
===== [[Cs-doclet|The CheckStyle Doclet]] =====&lt;br /&gt;
: Generates the metadata files for CheckStyle and eclipse-cs from &#039;doc tags&#039; in the source code of your checks and filters. &lt;br /&gt;
&lt;br /&gt;
===== [[JAVADOC doclet|The JAVADOC Doclet]] =====&lt;br /&gt;
: A re-implementation of the JAVADOC standard doclet, basically a reference to show how to use the &amp;quot;[[No-template|no-template]]&amp;quot; framework.&lt;br /&gt;
&lt;br /&gt;
===== [[MAIN doclet|The MAIN Doclet]] =====&lt;br /&gt;
: Generates HTML documentation for a &amp;quot;main()&amp;quot; method - useful for command line tools with a set of command line options.&lt;br /&gt;
&lt;br /&gt;
=== [[Html2txt|html2txt]] ===&lt;br /&gt;
: A Java tool to convert HTML documents into plain text.&lt;br /&gt;
&lt;br /&gt;
=== [[JDisasm|jdisasm]] ===&lt;br /&gt;
: A disassembler for Java .class files.&lt;br /&gt;
&lt;br /&gt;
=== [[No-template|no-template]] ===&lt;br /&gt;
: A super-small Java library for templating, i.e. generating text files (HTML, XML, whatever) from a &amp;quot;template&amp;quot; text file.&lt;br /&gt;
&lt;br /&gt;
== Retired Projects ==&lt;br /&gt;
&lt;br /&gt;
These projects are no longer maintained and are only of limited use, e.g. because they work only with old Java versions.&lt;br /&gt;
&lt;br /&gt;
=== [[Antology]] ===&lt;br /&gt;
: Some contributions to [http://ant.apache.org APACHE ANT], e.g. the &amp;lt;code&amp;gt;&amp;amp;lt;swingDialog&amp;gt;&amp;lt;/code&amp;gt; task which significantly enhances ANT&#039;s &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;gt;&amp;lt;/code&amp;gt; task.&lt;br /&gt;
&lt;br /&gt;
=== [[Loggifier.unkrig.de|Loggifier]] ===&lt;br /&gt;
: A tool for automatic injection of logging code into Java&amp;amp;trade; class files, making it unnecessary to mess up your code with hand-written logging.&lt;br /&gt;
&lt;br /&gt;
=== [[Cvstools.unkrig.de|Eclipse plug-in for extended CVS possibilities]] ===&lt;br /&gt;
&lt;br /&gt;
: An ECLIPSE plug-in that adds CVS functionality that is sometimes painfully missing from ECLIPSE&#039;s built-in CVS client.&lt;br /&gt;
&lt;br /&gt;
=== [[Subclipse.unkrig.de|Subclipse enhancements Eclipse plug-in]] ===&lt;br /&gt;
&lt;br /&gt;
: The often-missed &amp;lt;code&amp;gt;&amp;lt;de.unkrig.subclipse.svn&amp;gt;&amp;lt;/code&amp;gt; ANT task that uses the SUBCLIPSE client of the running ECLIPSE workbench.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Cs-contrib.unkrig.de&amp;diff=58</id>
		<title>Cs-contrib.unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Cs-contrib.unkrig.de&amp;diff=58"/>
		<updated>2026-07-04T08:15:30Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Important =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
This project adds custom checks, filters and quickfixes for [http://checkstyle.sourceforge.net/ CheckStyle] and [http://eclipse-cs.sourceforge.net/ Eclipse-CS].&lt;br /&gt;
&lt;br /&gt;
This project uses the [[Cs-doclet|CS doclet]] (internally) to generate its CheckStyle and eclipse-cs metadata files.&lt;br /&gt;
&lt;br /&gt;
Cs-contrib 1.2.21+ requires the CheckStyle core version 8.21+, because there was an (accidential) breaking change in that version.&lt;br /&gt;
&lt;br /&gt;
= Download =&lt;br /&gt;
&lt;br /&gt;
Install the ECLIPSE plug-in from this update site:&lt;br /&gt;
     http://cs-contrib.unkrig.de/update&lt;br /&gt;
&lt;br /&gt;
If you&#039;re only interested in the checks (and not the ECLIPSE plug-in), you can download the most recent &#039;de.unkrig.cs-contrib.core_*.jar&#039; file from&lt;br /&gt;
     http://cs-contrib.unkrig.de/update/plugins/&lt;br /&gt;
and put it on CheckStyle&#039;s classpath.&lt;br /&gt;
&lt;br /&gt;
A [http://cs-contrib.unkrig.de/CHANGELOG.txt change log] is also available.&lt;br /&gt;
&lt;br /&gt;
= Documentation =&lt;br /&gt;
&lt;br /&gt;
The [http://cs-contrib.unkrig.de/csdoc/ documentation for the cs-contrib checks, filters and quickfixes] was generated by the [http://doclet.unkrig.de CS doclet]&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
CS-CONTRIB.UNKRIG.DE is published under the &amp;quot;[[New BSD License]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Source Code =&lt;br /&gt;
&lt;br /&gt;
The source code of &amp;lt;code&amp;gt;cs-contrib&amp;lt;/code&amp;gt; (the CheckStyle extension) is on GITHUB:&lt;br /&gt;
&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib/&lt;br /&gt;
&lt;br /&gt;
The source code of the Eclipse plugin (&amp;lt;code&amp;gt;.core&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.branding&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.feature&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.updatesite&amp;lt;/code&amp;gt;) is also on GITHUB:&lt;br /&gt;
&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib.branding&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib.core&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib.core_test&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib.feature&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib.updatesite&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib_dist&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Zz.unkrig.de&amp;diff=57</id>
		<title>Zz.unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Zz.unkrig.de&amp;diff=57"/>
		<updated>2026-07-04T08:14:59Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Important =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A set of command-line tools that handle not only directories and files, but also archive and compressed files, and even nested archive files. They can even disassemble Java &amp;lt;code&amp;gt;.class&amp;lt;/code&amp;gt; files on-the fly and operate on the disassembly.&lt;br /&gt;
&lt;br /&gt;
== Tool Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== zzdiff ===&lt;br /&gt;
&lt;br /&gt;
Computes the differences between files, directory trees, archive file entries, compressed files and prints them in various formats; widely compatible with the UNIX&amp;amp;trade; DIFF command line utility.&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/maindoc/zz-diff/Main.main(String%5b%5d).html command line tool documentation].&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/antdoc/index.html?tasks/zzdiff.html ANT task documentation].&lt;br /&gt;
&lt;br /&gt;
=== zzfind ===&lt;br /&gt;
&lt;br /&gt;
Finds files in directory trees and entries in archive files by various criteria; widely compatible with the UNIX&amp;amp;trade; FIND command line utility.&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/maindoc/zz-find/Main.main(String%5b%5d).html command line tool documentation] (or the [http://zz.unkrig.de/maindoc/zz-find/Main.main(String%5b%5d).txt plain text version]).&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/antdoc/index.html?tasks/zzfind.html ANT task documentation].&lt;br /&gt;
&lt;br /&gt;
=== zzgrep ===&lt;br /&gt;
&lt;br /&gt;
Finds lines in files in directory trees and in entries in archive files by regular expressions; widely compatible with the UNIX&amp;amp;trade; GREP command line utility.&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/maindoc/zz-grep/Main.main(String%5b%5d).html command line tool documentation].&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/antdoc/index.html?tasks/zzgrep.html ANT task documentation].&lt;br /&gt;
&lt;br /&gt;
=== zzpack ===&lt;br /&gt;
&lt;br /&gt;
Creates an archive file from a set of given files, directories, and archive entries.&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/maindoc/zz-pack/Main.main(String%5b%5d).html command line tool documentation].&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/antdoc/index.html?tasks/zzpack.html ANT task documentation].&lt;br /&gt;
&lt;br /&gt;
=== zzpatch ===&lt;br /&gt;
&lt;br /&gt;
Modifies the contents of files in directory trees and of entries in archive files by various criteria; widely compatible with the UNIX&amp;amp;trade; PATCH command line utility.&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/maindoc/zz-patch/Main.main(String%5b%5d).html command line tool documentation].&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/antdoc/index.html?tasks/zzpatch.html ANT task documentation].&lt;br /&gt;
&lt;br /&gt;
== Download and Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Runnable JAR files ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;form method=&amp;quot;get&amp;quot; action=&amp;quot;https://repository.sonatype.org/service/local/artifact/maven/redirect&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;r&amp;quot; value=&amp;quot;central-proxy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;g&amp;quot; value=&amp;quot;de.unkrig.zz&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;v&amp;quot; value=&amp;quot;LATEST&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;c&amp;quot; value=&amp;quot;jar-with-dependencies&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    Latest version of&lt;br /&gt;
    &amp;lt;select name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-diff&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-find&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-grep&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-pack&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-patch&amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;lt;/select&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;DOWNLOAD&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MS WINDOWS executables ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;form method=&amp;quot;get&amp;quot; action=&amp;quot;https://repository.sonatype.org/service/local/artifact/maven/redirect&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;r&amp;quot; value=&amp;quot;central-proxy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;g&amp;quot; value=&amp;quot;de.unkrig.zz&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;v&amp;quot; value=&amp;quot;LATEST&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;p&amp;quot; value=&amp;quot;exe&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    Latest version of&lt;br /&gt;
    &amp;lt;select name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-diff&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-find&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-grep&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-pack&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-patch&amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;lt;/select&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;DOWNLOAD&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice: These executables require an installed JRE; at least version 1.6. They will complain if they cannot find a suitable JRE, and give advice how to get things running.&lt;br /&gt;
&lt;br /&gt;
=== APACHE ANT libraries ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;form method=&amp;quot;get&amp;quot; action=&amp;quot;https://repository.sonatype.org/service/local/artifact/maven/redirect&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;r&amp;quot; value=&amp;quot;central-proxy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;g&amp;quot; value=&amp;quot;de.unkrig.zz&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;v&amp;quot; value=&amp;quot;LATEST&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;c&amp;quot; value=&amp;quot;jar-with-dependencies&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    Latest version of&lt;br /&gt;
    &amp;lt;select name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;option value=&amp;quot;zz-all&amp;quot;&amp;gt;All-in-one&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-diff&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-find&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-grep&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-pack&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-patch&amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;lt;/select&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;DOWNLOAD&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use the ANT types, insert one of the following lines in your build script:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;taskdef resource=&amp;quot;de/unkrig/zz/zz-diff.xml&amp;quot;  classpath=&amp;quot;path/to/zz-diff-x.y.z-jar-with-dependencies.jar&amp;quot;  /&amp;gt;&lt;br /&gt;
  &amp;lt;taskdef resource=&amp;quot;de/unkrig/zz/zz-find.xml&amp;quot;  classpath=&amp;quot;path/to/zz-find-x.y.z-jar-with-dependencies.jar&amp;quot;  /&amp;gt;&lt;br /&gt;
  &amp;lt;taskdef resource=&amp;quot;de/unkrig/zz/zz-grep.xml&amp;quot;  classpath=&amp;quot;path/to/zz-grep-x.y.z-jar-with-dependencies.jar&amp;quot;  /&amp;gt;&lt;br /&gt;
  &amp;lt;taskdef resource=&amp;quot;de/unkrig/zz/zz-pack.xml&amp;quot;  classpath=&amp;quot;path/to/zz-pack-x.y.z-jar-with-dependencies.jar&amp;quot;  /&amp;gt;&lt;br /&gt;
  &amp;lt;taskdef resource=&amp;quot;de/unkrig/zz/zz-patch.xml&amp;quot; classpath=&amp;quot;path/to/zz-patch-x.y.z-jar-with-dependencies.jar&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you use more than one of the tools in your build script, it is more efficient to use the &amp;quot;all-in-one&amp;quot; JAR file:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;taskdef resource=&amp;quot;de/unkrig/zz/zz-all.xml&amp;quot; classpath=&amp;quot;path/to/zz-all-x.y.z-jar-with-dependencies.jar&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Java Library ===&lt;br /&gt;
&lt;br /&gt;
The ZZ tools also have a public Java API that can be used from by any Java application. You can either download and use this JAR file, or, if you&#039;re using MAVEN, put in your &amp;quot;pom.xml&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;dependency&amp;gt;&lt;br /&gt;
     &amp;lt;groupId&amp;gt;de.unkrig.zz&amp;lt;/groupId&amp;gt;&lt;br /&gt;
     &amp;lt;artifactId&amp;gt;zz-diff&amp;lt;/artifactId&amp;gt; &amp;lt;!-- Or zz-find, zz-grep, zz-pack, zz-patch. --&amp;gt;&lt;br /&gt;
     &amp;lt;version&amp;gt;x.y.z&amp;lt;/version&amp;gt;&lt;br /&gt;
 &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the API documentation:&lt;br /&gt;
&lt;br /&gt;
* [http://zz.unkrig.de/javadoc/zz-diff/ zz-diff API documentation]&lt;br /&gt;
* [http://zz.unkrig.de/javadoc/zz-find/ zz-find API documentation]&lt;br /&gt;
* [http://zz.unkrig.de/javadoc/zz-grep/ zz-grep API documentation]&lt;br /&gt;
* [http://zz.unkrig.de/javadoc/zz-pack/ zz-pack API documentation]&lt;br /&gt;
* [http://zz.unkrig.de/javadoc/zz-patch/ zz-patch API documentation]&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;form method=&amp;quot;get&amp;quot; action=&amp;quot;https://repository.sonatype.org/service/local/artifact/maven/redirect&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;r&amp;quot; value=&amp;quot;central-proxy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;g&amp;quot; value=&amp;quot;de.unkrig.zz&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;v&amp;quot; value=&amp;quot;LATEST&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;c&amp;quot; value=&amp;quot;sources&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    Source code is available on &amp;lt;a href=&amp;quot;https://github.com/aunkrig/zz&amp;quot;&amp;gt;GITHUB&amp;lt;/a&amp;gt;,&lt;br /&gt;
    and also through MAVEN:&lt;br /&gt;
    &amp;lt;select name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-diff&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-find&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-grep&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-pack&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-patch&amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;lt;/select&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;DOWNLOAD&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ZZ tools make heavy use of [http://commons.unkrig.de/ commons.unkrig.de].&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
ZZ.UNKRIG.DE is published under the &amp;quot;[[New BSD License]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Change Log ==&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.11-SNAPSHOT (not yet released):&lt;br /&gt;
:* -&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.10, 2022-12-29:&lt;br /&gt;
:* Changed handling of &amp;quot;-&amp;quot; to ResourceProcessings.STDIN_URL.&lt;br /&gt;
:* ZZDIFF can now handle &amp;quot;-&amp;quot; (stdin) as one of its two inputs.&lt;br /&gt;
:* ZZPATCH: --substitute: Removed the concept of the &amp;quot;replacement mode&amp;quot;, because the extended replacement syntax just implements the &amp;quot;literal&amp;quot; and &amp;quot;expression&amp;quot; replacement modes.&lt;br /&gt;
:* ZZPACK: Added the &amp;quot;--rename&amp;quot; feature.&lt;br /&gt;
:* ZZPATCH: Substitution: Replacement mode &amp;quot;REPLACEMENT_STRING&amp;quot; now supports &amp;quot;ext syntax&amp;quot;, i.e. &amp;quot;${...}&amp;quot; embedded expressions.&lt;br /&gt;
:* ZZPATCH: ExitException message is now &amp;quot;Printers.info()&amp;quot;ed instead of &amp;quot;Printers.verbose()&amp;quot;ed.&lt;br /&gt;
:* ZZFIND: Greatly simplified the computation of the expression variables.&lt;br /&gt;
:* ZZFIND: Fixed an exception when finding in STDIN: STDIN does not have the properties &amp;quot;readable&amp;quot;, &amp;quot;writable&amp;quot; and &amp;quot;executable&amp;quot;.&lt;br /&gt;
:* ZZFIND: Class file version can now be accessed by &amp;quot;cf.javaVersion&amp;quot;.&lt;br /&gt;
:* ZZFIND: MAINDOC: Documented the &amp;quot;archiveEntry&amp;quot; variable.&lt;br /&gt;
:* ZZGREP: Moved &amp;quot;Grep.lineCounter()&amp;quot; to &amp;quot;ConsumerUtil&amp;quot;.&lt;br /&gt;
:* ZZGREP: Eliminated the 65536-characters-per-line limit -- finds and counts matches now also in very long lines.&lt;br /&gt;
:* ZZPATCH: Added the &amp;quot;--assert-count&amp;quot; condition for updates/substitution replacements/patch hunks/removals/renamings/additions.&lt;br /&gt;
:* ZZFIND: Learned that the various ZIP archive libraries return random values for &amp;quot;ZipEntry.getMethod()&amp;quot; and &amp;quot;ZipEntry.getCrc()&amp;quot;, thus made the test cases tolerant against these.&lt;br /&gt;
:* ZZFIND: Don&#039;t print a stack trace on predicate parse errors; only print the error message.&lt;br /&gt;
:* ZZPATCH: Added command line options for archive decryption: --7z-input-file-password --zip-input-file-password --password&lt;br /&gt;
:* ZZPATCH: Added command line options for archive compression and encryption: --zip-output-entry-compression-level --zip-output-file-password --zip-output-file-encryption-method&lt;br /&gt;
:* ZZFIND: Added short command line option for archive decryption: --password&lt;br /&gt;
:* ZZFIND: Added the &amp;quot;-version&amp;quot; command line option.&lt;br /&gt;
:* ZZGREP: Added command line options &amp;quot;--input-encoding&amp;quot; and &amp;quot;--output-encoding&amp;quot;. (Previously, the output encoding was not configurable.)&lt;br /&gt;
:* ZZGREP: Fixed the printing of &amp;quot;--&amp;quot; separator lines between context-grep chunks.&lt;br /&gt;
:* ZZFIND: MAINDOC: Documented priority of operators.&lt;br /&gt;
:* ZZFIND: CatAction: Entries that have no input stream (e.g. directories or directory archive entries) are silently ignored, because that is practical: Otherwise, you&#039;d always have to put &amp;quot;-type normal*&amp;quot; right before the &amp;quot;-cat&amp;quot; action.&lt;br /&gt;
:* ZZFIND: -copy action: Now ignore entries that have no input stream (e.g. directories or directory archive entries), because that is practical: Otherwise, you&#039;d always have to put &amp;quot;-type normal*&amp;quot; right before the &amp;quot;-copy&amp;quot; action.&lt;br /&gt;
:* ZZFIND: -copy action: Attempt to restore each file&#039;s &amp;quot;last modification date&amp;quot;, too.&lt;br /&gt;
:* ZZPATCH: Unified DIFF format: Some DIFF tools (namely GNU diffutils 3.5) put a TAB character (instead of a SPACE) between the file name and the date.&lt;br /&gt;
:* ZZFIND: Added &amp;quot;--toFile&amp;quot; option to &amp;quot;-disassemble&amp;quot;.&lt;br /&gt;
:* ZZFIND: Added new variable &amp;quot;archiveEntry&amp;quot;.&lt;br /&gt;
:* ZZFIND: Added action &amp;quot;-java-class-file&amp;quot;.&lt;br /&gt;
:* ZZFIND: Added expression variable &amp;quot;compressionMethod&amp;quot; (for archive entries).&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.9, 2020-11-06:&lt;br /&gt;
:* Updated jdisasm to 1.0.6.&lt;br /&gt;
:* Updated de.unkrig.commons to 1.2.15.&lt;br /&gt;
:* Removed the generation of the &amp;quot;...-antlib.jar&amp;quot; file, because &amp;quot;...-jar-with-dependencies.jar&amp;quot; can be used as an ANTLIB as well.&lt;br /&gt;
:* Fixed the file type in the output of -ls.&lt;br /&gt;
:* Added expression variables &amp;quot;readable&amp;quot;, &amp;quot;writable&amp;quot; and &amp;quot;executable&amp;quot;.&lt;br /&gt;
:* Adapted to an incompatible API change in &amp;quot;commons-file&amp;quot; (all content processing was augmented with an optional &amp;quot;lastModifiedDate&amp;quot; parameter).&lt;br /&gt;
:* Fixed an NPE that occurred with 7Z archive entries that have NO modification date set.&lt;br /&gt;
:* ZZFIND now compiles with JDK 1.8 (before it was 1.6).&lt;br /&gt;
:* Major refactoring: Replaced &amp;quot;Mappings properties&amp;quot; with &amp;quot;Map&amp;lt;String, Function&amp;lt;Object, Object&amp;gt;&amp;gt; properties.&lt;br /&gt;
:* Implemented the new expression variables &amp;quot;_map&amp;quot;, &amp;quot;_keys&amp;quot; and &amp;quot;_values&amp;quot;.&lt;br /&gt;
:* Context diff: The &amp;quot;hunk separator line&amp;quot; (&amp;quot;--&amp;quot;) was missing.&lt;br /&gt;
:* Actions that read the contents of a document (-cat, -copy, -disassemble, -digest, -checksum) didn&#039;t for &amp;quot;normal-file&amp;quot; documents.&lt;br /&gt;
:* &amp;quot;--nowarn&amp;quot;, &amp;quot;--quiet&amp;quot;, &amp;quot;--verbose&amp;quot; and &amp;quot;--debug&amp;quot; now not only configure the &amp;quot;Printers&amp;quot;, but also &amp;quot;SimpleLogging&amp;quot;.&lt;br /&gt;
:* Added the &amp;quot;--replacementMode&amp;quot; option which allows for more complex replacements than the java.util.regex.Matcher can offer&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.8, 2019-10-09:&lt;br /&gt;
:* zzgrep: Implemented &amp;quot;-e&amp;quot;.&lt;br /&gt;
:* zzgrep: Implemented &amp;quot;--byte-offset&amp;quot;, &amp;quot;--with-path&amp;quot;, &amp;quot;--no-path&amp;quot;, &amp;quot;--label&amp;quot;, &amp;quot;--line-number&amp;quot;, &amp;quot;--after-context&amp;quot;, &amp;quot;--before-context&amp;quot; and &amp;quot;--context&amp;quot;.&lt;br /&gt;
:* &amp;lt;zzpatch&amp;gt; Ant task: &amp;quot;&amp;lt;substitution&amp;gt;&amp;lt;regex&amp;gt;...&amp;quot; and &amp;quot;...&amp;lt;replacement&amp;gt;...&amp;quot;: Property &amp;quot;replacement&amp;quot; was missing for &amp;quot;addText()&amp;quot;.&lt;br /&gt;
:* Major refactoring of &amp;quot;zz.Find&amp;quot; - removed tons of copied code.&lt;br /&gt;
:* zzfind: Improved handling of corrupt archives and compressed contents.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.7, 2019-08-05:&lt;br /&gt;
:* In addition to &amp;quot;...-jar-with-dependencies.jar&amp;quot;, generate a &amp;quot;...-antlib.jar&amp;quot; file, where the ANT classes are NOT included.&lt;br /&gt;
:* The &amp;quot;-copy&amp;quot; action now supports a &amp;quot;--append&amp;quot; (alias &amp;quot;-a&amp;quot;) modifier.&lt;br /&gt;
:* Now using &amp;quot;ExpressionEvaluator.parseExt()&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;--printf&amp;quot; command line action.&lt;br /&gt;
:* Fixed the &amp;quot;line equivalence&amp;quot; and the &amp;quot;ignore&amp;quot; feature; both were accidentially broken with revision 6980 (affects only release 1.3.5).&lt;br /&gt;
:* The &amp;quot;zz-diff&amp;quot; command line tool now also accepts URLs on its command line.&lt;br /&gt;
:* &amp;quot;--verbose&amp;quot; had no effect; now it prints the names of files and archive entries that are searched.&lt;br /&gt;
&lt;br /&gt;
; Changes in Version 1.3.6, 2018-07-24:&lt;br /&gt;
:* Added a test case for &amp;quot;zzpatch --substitute --iff&amp;quot;.&lt;br /&gt;
:* Substitution conditions now support a new variable, &amp;quot;occurrence&amp;quot;.&lt;br /&gt;
:* Added a &amp;quot;&amp;lt;condition&amp;gt;&amp;quot; subelement on the &amp;quot;&amp;lt;substitution&amp;gt;&amp;quot; element. This is useful, e.g., to replace only the FIRST match.&lt;br /&gt;
:* For conformance with GREP, exit with status 2 (not 1) on errors.&lt;br /&gt;
:* &amp;lt;zzfind&amp;gt;: Added the &amp;quot;&amp;lt;prune /&amp;gt;&amp;quot; and &amp;quot;&amp;lt;delete /&amp;gt;&amp;quot; subelements.&lt;br /&gt;
:* zzfind: Renamed option &amp;quot;--depth&amp;quot; to &amp;quot;--descendants-first&amp;quot; (and left the original as an alias).&lt;br /&gt;
:* &amp;lt;zzfind&amp;gt;: Renamed the depth=&amp;quot;...&amp;quot; attribute to descendantsFirst=&amp;quot;...&amp;quot;.&lt;br /&gt;
:* Added the &amp;quot;-prune&amp;quot; and &amp;quot;-delete&amp;quot; actions.&lt;br /&gt;
:* Added &amp;quot;&amp;amp;&amp;amp;&amp;quot; and &amp;quot;-and&amp;quot; as aliases for &amp;quot;-a&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;||&amp;quot; and &amp;quot;-or&amp;quot; as aliases for &amp;quot;-o&amp;quot;.&lt;br /&gt;
:* Added options &amp;quot;da-verbose&amp;quot;, &amp;quot;da-source-directory&amp;quot; and &amp;quot;da-symbolic-labels&amp;quot;.&lt;br /&gt;
:* Continue with next archive entry on IOException.&lt;br /&gt;
:* ZZGREP: When run with a list file-or-dirs, only every second file-or-dir was searched.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.4, 2017-02-03:&lt;br /&gt;
:* Added a workaround for: MS WINDOWS 7: Read-protected directory produces: isDirectory() =&amp;gt; true canRead()     =&amp;gt; true list()        =&amp;gt; null listFiles()   =&amp;gt; null (Caused NPEs.)&lt;br /&gt;
:* ZZDIFF: Bug fixed: Document DIFF was always UNIFIED, regardless of the document diff mode setting.&lt;br /&gt;
:* Change version of de.unkrig.commons from &amp;quot;1.2.6-SNAPSHOT&amp;quot; to &amp;quot;1.2.7-SNAPSHOT&amp;quot; (because THAT is the correct post-1.2.6 version).&lt;br /&gt;
:* Renamed &amp;quot;namePredicate&amp;quot; to &amp;quot;pathPredicate&amp;quot;.&lt;br /&gt;
:* Replaced the &amp;quot;name=...&amp;quot; attribute with &amp;quot;path=...&amp;quot;, and marked the old attribute as @deprecated.&lt;br /&gt;
:* The &amp;quot;pathPredicate&amp;quot; was missing from content processors.&lt;br /&gt;
:* Generate ANTDOC only for the &amp;quot;zz-all&amp;quot; module, not for &amp;quot;zz-(diff|find|grep|pack|patch)&amp;quot; individually. Saves on build time, and reduces redundant documentation.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.3, 2016-11-28:&lt;br /&gt;
:* Removed unnecessary dependency on &amp;quot;jdisasm&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:* Fixed the classpath for zz-all antdoc.&lt;br /&gt;
:* Added the &amp;quot;--no-recurse-subdirctories&amp;quot; command line option.&lt;br /&gt;
:* Extracted the &amp;quot;DOcumentDiff&amp;quot; class from the &amp;quot;Diff&amp;quot; class.&lt;br /&gt;
:* Added task attribute &amp;quot;recurseSubdirectories=false&amp;quot;.&lt;br /&gt;
:* Added the &amp;quot;Diff.diff(path1, path2, stream1, stream2)&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.2, 2016-11-25:&lt;br /&gt;
:* Added test cases for ZZDIFF.&lt;br /&gt;
:* Added &amp;quot;Diff.execute(String path1, String path2, ...)&amp;quot; to allow for custom &amp;quot;path1&amp;quot; and &amp;quot;path2&amp;quot; strings when reporting differences.&lt;br /&gt;
:* Improved many &amp;quot;DiffException&amp;quot;s&#039; messages.&lt;br /&gt;
:* Slightly clarified the wording of the license: Replaced &amp;quot;author&amp;quot; with &amp;quot;copyright holder and its contributors&amp;quot;.&lt;br /&gt;
:* Include project name and version in APIDOC&#039;s &amp;quot;-header&amp;quot; and &amp;quot;-footer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.1, 2016-11-07:&lt;br /&gt;
:* The JVM (sometimes) did not terminate when it is shut down orderly (i.e. &amp;quot;main()&amp;quot; returns or &amp;quot;System.exit()&amp;quot; is invoked).&lt;br /&gt;
:* Added the &amp;quot;launch4j&amp;quot; maven plugin that creates MS WINDOWS executables from the runnable JAR files.&lt;br /&gt;
:* Made the scope of the &amp;quot;ant&amp;quot; dependency &amp;quot;provided&amp;quot;, so that the classes of &amp;quot;ant.jar&amp;quot; don&#039;t get into the &amp;quot;jar-with-dependencies&amp;quot;.&lt;br /&gt;
:* Added JAVADOC &amp;quot;overview.html&amp;quot; files for the five zz tools.&lt;br /&gt;
:* ZZFIND: Made many methods and nested types PUBLIC, so they can be used via the Java API.&lt;br /&gt;
:* Moved ANTDOC generation from &amp;quot;zz-parent/build.ant&amp;quot; to &amp;quot;zz-parent/pom.xml&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;zz-all&amp;quot;, which is an aggregation of the five ZZ tools.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.0, 2016-10-30:&lt;br /&gt;
:* ZZFIND, &amp;lt;zzfind&amp;gt;: Line separator was missing from the &amp;quot;LS&amp;quot; action.&lt;br /&gt;
:* ZZFIND, &amp;lt;zzfind&amp;gt;: Added the &amp;quot;-digest&amp;quot; and &amp;quot;-checksum&amp;quot; actions.&lt;br /&gt;
:* ZZFIND: Allow combinations of file names and &amp;quot;-&amp;quot; (STDIN).&lt;br /&gt;
:* &amp;lt;zzfind&amp;gt;: Added &amp;quot;&amp;lt;true/&amp;gt;&amp;quot; and &amp;quot;&amp;lt;false/&amp;gt;&amp;quot;.&lt;br /&gt;
:* ZZFIND: Added &amp;quot;-true&amp;quot; and &amp;quot;-false&amp;quot;.&lt;br /&gt;
:* &amp;lt;zzfind&amp;gt;: The expression subelements are now named ANT components.&lt;br /&gt;
:* ZZFIND: Variable substitution (in &amp;quot;-echo&amp;quot; and &amp;quot;-copy&amp;quot;) now supports &amp;quot;@variableName&amp;quot; in addition to &amp;quot;@{variable-name}&amp;quot;.&lt;br /&gt;
:* ZZDIFF, &amp;lt;zzdiff&amp;gt;: Added options &amp;quot;addedFile&amp;quot; and &amp;quot;deletedFile&amp;quot; which supersede &amp;quot;newFile&amp;quot; and &amp;quot;unidirectionalNewFile&amp;quot;.&lt;br /&gt;
:* &amp;lt;zzpatch&amp;gt;: File/entry renaming did not work (flag Glob.REPLACEMENT was missing).&lt;br /&gt;
:* &amp;lt;zzfind&amp;gt;: Renamed the &amp;quot;&amp;lt;path&amp;gt;&amp;quot; expression component to &amp;quot;&amp;lt;path_&amp;gt;&amp;quot; to avoid a name clash with the global type with the same name.&lt;br /&gt;
:* Switched from the old ANT build to MAVEN.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.2.5, 2016-02-12:&lt;br /&gt;
:* ZZFIND, &amp;lt;zzfind&amp;gt;: Added the &amp;quot;depth&amp;quot; property.&lt;br /&gt;
:* ZZFIND, &amp;lt;zzfind&amp;gt;: Added the &amp;quot;comma operator&amp;quot;, &amp;quot;-mtime&amp;quot;, &amp;quot;-depth&amp;quot;, &amp;quot;-minDepth&amp;quot; and &amp;quot;-maxDepth&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.2.4, 2016-02-10:&lt;br /&gt;
:* &amp;lt;zzpatch&amp;gt;: &amp;quot;condition=...&amp;quot; is now an attribute of the &amp;lt;patch&amp;gt; subelement, not the task.&lt;br /&gt;
:* zzdiff: Added command line option &amp;quot;--normal&amp;quot;.&lt;br /&gt;
:* All pathes: Compressed file names and compressed contents paths are now suffixed with &#039;%&#039; (instead of &#039;!&#039;) to circumvent problems with &amp;quot;Glob&amp;quot;&#039;s directory prefix mechanism.&lt;br /&gt;
:* ZZFIND on STDIN threw exceptions, because &amp;quot;-ls&amp;quot; requires &amp;quot;isDirectory&amp;quot;, &amp;quot;size&amp;quot;, etc.&lt;br /&gt;
:* ZZFIND: Parsing of special command line argument &amp;quot;-&amp;quot; (for &amp;quot;STDIN&amp;quot;) didn&#039;t work.&lt;br /&gt;
:* ZZGREP: The &amp;quot;-quiet&amp;quot; command line option did not have any effect.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.2.3, 2015-09-27:&lt;br /&gt;
:* ZZFIND command line tool: Option &amp;quot;--look-into&amp;quot;: Glob was compiled WITHOUT the WILDCARD|INCLUDES_EXCLUDES flag.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.2.2, 2015-09-27:&lt;br /&gt;
:* ZZPATCH ant task: Removed attribute &amp;quot;memberName=...&amp;quot; from subelement &amp;quot;&amp;lt;add&amp;gt;&amp;quot;, because the ant task does not traverse directories (opposed to the command line version), and thus adding members to directories is not possible.&lt;br /&gt;
:* ZZDIFF: Fixed some NPEs that occurred when files / entries are EXCLUDED.&lt;br /&gt;
:* ZZFIND: Added the &amp;quot;DisassembleAction&amp;quot; (disassembles a Java .class file).&lt;br /&gt;
:* Generate and publish HTML documentation for ANT tasks with ANTDOC.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.2.1, 2015-05-24:&lt;br /&gt;
:* FIND: Command line tool and ANT task now continue with next directory member on IOExceptions.&lt;br /&gt;
:* DIFF: Added the &amp;quot;tokenization&amp;quot; configuration parameter, which allows for Java token-based DIFFing.&lt;br /&gt;
:* DIFF: Added the &amp;quot;ignoreCStyleComments&amp;quot; and &amp;quot;ignoreCPlusPlusStyleComments&amp;quot; configuration option (relevant iff &amp;quot;tokenization&amp;quot; is &amp;quot;JAVA&amp;quot;).&lt;br /&gt;
:* The classes for the &#039;zzpack&#039; ant task were missing from the jar file.&lt;br /&gt;
:* ZZFIND ant task: Added the &amp;quot;file=...&amp;quot; and &amp;quot;dir=...&amp;quot; attributes.&lt;br /&gt;
:* ZZFIND: Added the &amp;quot;&amp;lt;echo message=...&amp;gt;&amp;quot; and &amp;quot;&amp;lt;property name=... value=...&amp;gt;&amp;quot; actions.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.2.0, 2015-04-30:&lt;br /&gt;
:* &amp;quot;ArchiveFormatFactory&amp;quot; and &amp;quot;CompressionFormatFactory&amp;quot; now register &amp;quot;URLStreamHandler&amp;quot;s for all archive and compression formats, so these can be used as &amp;quot;protocols&amp;quot; of &amp;quot;java.net.URL&amp;quot;, e.g. &amp;quot;zip:file:foo.zip!file.txt&amp;quot;.&lt;br /&gt;
:* Major refactoring of &#039;de.unkrig.commons.file.fileprocessing&#039; and &#039;de.unkrig.commons.file.contentsprocessing&#039;. Effectively, ZZGREP can now use these classes, because &#039;process()&#039; now returns &#039;T&#039;. &lt;br /&gt;
:* Renamed the following classes for consistency with &#039;java.util.Collections&#039;, &#039;...Arrays&#039;, etc.:&lt;br /&gt;
:** ContentsProcessingUtil =&amp;gt; ContentsProcessings&lt;br /&gt;
:** ContentsTransformerUtil =&amp;gt; ContentsTransformations&lt;br /&gt;
:** FileProcessingUtil =&amp;gt; FileProcessings&lt;br /&gt;
:** FileTransformationUtil  =&amp;gt; FileTransformations&lt;br /&gt;
:* ANT integration: Added the &#039;&amp;lt;patch&amp;gt;&#039; filter (for use in ANT &#039;filter chain&#039;s).&lt;br /&gt;
:* ANT integration: Added the &#039;condition&#039; property to the &#039;&amp;lt;zzpatch&amp;gt;&#039; task.&lt;br /&gt;
:* ZZDIFF: Added the &amp;quot;-sequential&amp;quot; command line option.&lt;br /&gt;
:* &amp;lt;zzdiff&amp;gt;: Replaced the &#039;lookInto[Nested](Zip|Gzip)=&amp;quot;...&amp;quot;&#039; attributes with the (more flexible) &#039;lookInto=&amp;quot;...&amp;quot;&#039; attribute.&lt;br /&gt;
:* &amp;lt;zzdiff&amp;gt;: Replaced the &amp;quot;&amp;lt;exclude&amp;gt;&amp;quot; subelements with the &amp;quot;path=...&amp;quot; attribute, eliminating the unusual &amp;quot;negative&amp;quot; logic. &lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.1.0, 2014-10-25:&lt;br /&gt;
:* zzpatch: No file arguments mean &#039;transform STDIN to STDOUT&#039;.&lt;br /&gt;
:* zzpatch: Added &#039;conditions&#039; for the &#039;substitute&#039;, &#039;replace&#039;, &#039;patch&#039;, &#039;remove&#039;, &#039;rename&#039; and &#039;add&#039; features.&lt;br /&gt;
:* zzpatch: Added &#039;dontSortDirectoryMembers&#039; feature.&lt;br /&gt;
:* de.unkrig.commons.file: 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.&lt;br /&gt;
:* &amp;lt;zzpatch&amp;gt;, &amp;lt;zzgrep&amp;gt;: Removed the &#039;dir=&amp;quot;...&amp;quot;&#039; and &#039;sortDirectoryMembers=&amp;quot;...&amp;quot;&#039; attributes from these ANT tasks because recursing directories is ANT&#039;s job.&lt;br /&gt;
:* &amp;lt;zzpatch&amp;gt;, &amp;lt;zzgrep&amp;gt;: Replaced the &#039;lookInto[Nested](Zip|Gzip)=&amp;quot;...&amp;quot;&#039; attributes with the (more flexible) &#039;lookInto=&amp;quot;...&amp;quot;&#039; attribute.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Removed the &amp;quot;dir=...&amp;quot; attribute.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.11, 2014-04-12:&lt;br /&gt;
:* ZZDIFF: Added option &#039;-unchanged-files&#039; resp. ANT task attribute &#039;reportUnchangedFiles=&amp;quot;true&amp;quot;&#039;: Also report unchanged files.&lt;br /&gt;
:* ZZDIFF: Added &#039;-zip&#039; and &#039;-nested-zip&#039; command line options - aliases for &#039;-z&#039; and &#039;-zz&#039;.&lt;br /&gt;
:* ZZFIND: Added the &#039;-copy&#039; action - similar to &#039;-cat&#039;, but copies the data bytewise.&lt;br /&gt;
:* &amp;lt;zzfind&amp;gt;: Added a &#039;&amp;lt;sequential&amp;gt;&#039; subelement.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Added attributes &#039;file=&amp;quot;...&amp;quot;&#039; and &#039;dir=&amp;quot;...&amp;quot;&#039;&lt;br /&gt;
:* &amp;lt;zzpatch&amp;gt;: Added attributes &#039;file=&amp;quot;...&amp;quot;&#039;, &#039;tofile=&amp;quot;...&amp;quot;&#039;, &#039;dir=&amp;quot;...&amp;quot;&#039; and &#039;todir=&amp;quot;...&amp;quot;&#039;&lt;br /&gt;
:* de.unkrig.commons.util: &amp;lt;simplelogging&amp;gt;: Added attribute &#039;spec=&amp;quot;...&amp;quot;&#039;.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Added attribute &#039;property=&amp;quot;...&amp;quot;&#039;.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Added subelement &#039;&amp;lt;search name=&amp;quot;...&amp;quot; regex=&amp;quot;...&amp;quot; caseSensitive=&amp;quot;...&amp;quot;/&amp;gt;&#039;&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Made the &#039;case sensitivity logic&#039; POSITIVE.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Removed the &#039;&amp;lt;include&amp;gt;&#039; and &#039;&amp;lt;exclude&amp;gt;&#039; subelements in favor of &#039;name=&amp;quot;...&amp;quot;&#039;.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: &#039;name=&amp;quot;...&amp;quot;&#039;, &#039;regex=&amp;quot;...&amp;quot;&#039; and &#039;caseSensitive=&amp;quot;...&amp;quot;&#039; are now mutually exclusive with &#039;&amp;lt;search&amp;gt;&#039; subelements.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Runtime optimization: Now only the files to which at least one search applies are processed.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.10, 2014-03-22:&lt;br /&gt;
:* ZZDIFF: Added option &#039;-keep-going&#039; resp. ANT task attribute &#039;keepGoing=&amp;quot;true&amp;quot;&#039;: Report errors and continue with next file.&lt;br /&gt;
  &lt;br /&gt;
; Changes in version 1.0.9, 2014-03-20:&lt;br /&gt;
:* COMMONS.UTIL: Added the SIMPLELOGGING task that was missing from &#039;antlib.xml&#039;.&lt;br /&gt;
:* COMMONS.FILE: Inserted lots of logging.&lt;br /&gt;
:* ZZPATCH: Added the &amp;lt;regex&amp;gt; and &amp;lt;replacement&amp;gt; subelements to &amp;lt;substitute&amp;gt;: Alternative to the &#039;regex=...&#039; and &#039;replacement=...&#039; attributes. The major advantage of the subelements is that they can contain &#039;&amp;lt;![CDATA[...]]&amp;gt;&#039; sections where you don&#039;t have to SGML-escape special characters.&lt;br /&gt;
:* ZZPATCH: Added lots of logging to make ANT build file debugging easier.&lt;br /&gt;
:* ZZPATCH: Contents substitution is no longer line-wise, but allows for multi-line matching and replacement.&lt;br /&gt;
:* ZZFIND: Now searching STDIN iff no file specified.&lt;br /&gt;
:* ZZDIFF: Added diff mode &#039;EXIST&#039;, which is like diff mode &#039;QUIET&#039; but ignores CONTENT differences. &lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.8, 2013-11-29:&lt;br /&gt;
:* ZZDIFF: Absent file modes COMPARE_*_WITH_EMPTY: Added and deleted directories were counted as difference, although they shouldn&#039;t.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.7, 2013-11-26:&lt;br /&gt;
:* The ZZ tools now live in ONE jar file; there is a new &#039;Main&#039; class that forks into the various tools&lt;br /&gt;
:* Renamed the tasks from &#039;de.unkrig.zz.diff&#039; to &#039;zzdiff&#039;.&lt;br /&gt;
:* ZZDIFF: Absent file modes COMPARE_ADDED_AND_DELETED_WITH_EMPTY and COMPARE_ADDED_WITH_EMPTY: Added and deleted DIRECTORIES are now treated as EMPTY directories.&lt;br /&gt;
:* ZZDIFF: Added ANT task property &#039;property&#039;.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.6, 2013-10-02:&lt;br /&gt;
:* ZZPATCH: &#039;-patch&#039; now preserves line separators (instead of silently replacing them with the default line separator).&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.5, 2013-10-01:&lt;br /&gt;
:* ZZDIFF: Added the &#039;encoding&#039; attribute to the ant task.&lt;br /&gt;
:* ZZFIND: Added the missing &#039;&amp;lt;cat&amp;gt;&#039; and &#039;&amp;lt;ls&amp;gt;&#039; actions to the ant task.&lt;br /&gt;
:* ZZFIND: Added the &#039;-encoding&#039; option to the command line tool.&lt;br /&gt;
:* ZZGREP: Added the &#039;encoding&#039; attribute to the ant task.&lt;br /&gt;
:* ZZGREP: Added the &#039;-encoding&#039; option to the command line tool.&lt;br /&gt;
:* ZZPATCH: Added &#039;inputEncoding&#039; and &#039;outputEncoding&#039; to &#039;substitution&#039; and &#039;patch&#039;.&lt;br /&gt;
:* ZZPATCH: Added &#039;patchFileEncoding&#039; to &#039;patch&#039;.&lt;br /&gt;
:* ZZPATCH: &#039;-substitute&#039; now preserves line separators (instead of silently replacing them with the default line separator).&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.4, 2013-09-22:&lt;br /&gt;
:* ZZFIND: The &#039;readable&#039;, &#039;writable&#039;, &#039;size&#039; and &#039;modificationTime&#039; tests were missing from the ANT task&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.3, 2013-09-22:&lt;br /&gt;
:* ZZDIFF: Added the &#039;absentFileMode&#039; option (a.k.a. as &#039;-new-file&#039; and &#039;-unidirectional-new-file&#039;).&lt;br /&gt;
:* SimpleLogging: VERBOSE messages were not printed because the OUT_HANDLER was misconfigured.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.2, 2013-07-05:&lt;br /&gt;
:* Fixed a major bug: &#039;SelectiveContentsTransfomer&#039; executed BOTH delegates when the predicate evaluates to FALSE. This didn&#039;t hurt in many cases, but for &#039;zzpatch -update&#039; it did.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.1, 2013-06-14:&lt;br /&gt;
:* Major refactoring of &#039;de.unkrig.commons&#039;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.0, 2012-10-03:&lt;br /&gt;
Initial release.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=No-template&amp;diff=56</id>
		<title>No-template</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=No-template&amp;diff=56"/>
		<updated>2026-07-04T08:09:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Important =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A super-small Java library for templating, i.e. generating text files (HTML, XML, whatever) from a &amp;quot;template&amp;quot; text file.&lt;br /&gt;
&lt;br /&gt;
The project home page is [https://github.com/aunkrig/no-template here].&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=JDisasm&amp;diff=55</id>
		<title>JDisasm</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=JDisasm&amp;diff=55"/>
		<updated>2026-07-04T08:09:14Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Important =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A disassembler for Java .class files.&lt;br /&gt;
&lt;br /&gt;
Currently supports .class files up to and including version 8.&lt;br /&gt;
&lt;br /&gt;
The project home page is [https://github.com/aunkrig/jdisasm here].&lt;br /&gt;
&lt;br /&gt;
== Change Log ==&lt;br /&gt;
&lt;br /&gt;
;Version 1.0.6 (2020-11-06):&lt;br /&gt;
:* Changed license name from &amp;quot;New BSD License&amp;quot; to &amp;quot;BSD-3-Clause&amp;quot;, because https://maven.apache.org/pom.html#Licenses recommends &amp;quot;... Using an SPDX identifier as the license name...&amp;quot;.&lt;br /&gt;
:* Changed license URL from &amp;quot;https://raw.githubusercontent.com/janino-compiler/janino/master/LICENSE.txt&amp;quot; to &amp;quot;https://spdx.org.licenses/BSD-3-Clause.html&amp;quot;, because the latter is probably the most reliable and stable copy. (We are already using the SPDX identifier, see above, so it appears reasonable to link to the SPDX web site.)&lt;br /&gt;
:* Show thrown exceptions with &amp;quot;MethodSignature.toString()&amp;quot;.&lt;br /&gt;
:* Added Java7 and Java 11 support for LDC[_W] and LDC2_W.&lt;br /&gt;
:* Added support for cp_infos 17, 18, 19 and 20.&lt;br /&gt;
&lt;br /&gt;
;Version 1.0.5 (2020-03-09):&lt;br /&gt;
:* Enable SMT generation by default... thus some regression tests currently fail.&lt;br /&gt;
:* Implemented the Java 9 &amp;quot;ModulePackages&amp;quot; class attribute.&lt;br /&gt;
:* Added command line option &amp;quot;printAllOffsets&amp;quot;.&lt;br /&gt;
:* Implemented Java 9 &amp;quot;CONSTANT_Module_info&amp;quot; and &amp;quot;CONSTANT_Package_info&amp;quot;.&lt;br /&gt;
:* Added command line option &amp;quot;printAllOffsets&amp;quot;.&lt;br /&gt;
:* Fixed the disassembly of stack map frames.&lt;br /&gt;
:* Improved exception handling.&lt;br /&gt;
:* Made the new features available for the command line tool: &amp;quot;-show-class-pool-indexes&amp;quot;, &amp;quot;-dump-constant-pool&amp;quot;, &amp;quot;-print-all-attributes&amp;quot;, &amp;quot;-print-stack-map&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Version 1.0.4:&lt;br /&gt;
:* Implemented the &amp;quot;StackMapTable&amp;quot; attribute.&lt;br /&gt;
:* Fixed one NPE.&lt;br /&gt;
:* Signature parsing choked on signatures like &amp;quot;com/sun/xml/ws/server/StatefulInstanceResolver.1CookieSniffer&amp;quot; (&amp;quot;1&amp;quot; after &amp;quot;.&amp;quot;).&lt;br /&gt;
:* CheckStyle clean-up with cs-contrib 1.2.19: Now not only the &amp;quot;{&amp;quot; of method declarations must be aligned, but also the &amp;quot;}&amp;quot;.&lt;br /&gt;
:* Implemented command line option &amp;quot;--stack-map&amp;quot;.&lt;br /&gt;
:* Issue #58: Integer overflow in ClassFile reader&lt;br /&gt;
&lt;br /&gt;
;Version 1.0.3:&lt;br /&gt;
:* (unclear)&lt;br /&gt;
&lt;br /&gt;
;Version 1.0.2:&lt;br /&gt;
:* Added support for the method_info&#039;s &amp;quot;MethodParameters&amp;quot; attribute.&lt;br /&gt;
:* &amp;quot;-src&amp;quot; now accepts a _path_ instead of a single _directory_.&lt;br /&gt;
:* Implemented the &amp;quot;StackMapTable&amp;quot; attribute.:* Opcodes &amp;quot;[adfil](load|store)_[0123]&amp;quot; are no longer printed as &amp;quot;[adfil](load|store)&amp;quot; (without the &amp;quot;implicit local variable index&amp;quot; suffix), but with their full mnemonic.&lt;br /&gt;
:* Added test cases.&lt;br /&gt;
:* Refactoring: Switched from a map that maps opcodes to &amp;quot;Instruction&amp;quot;s to one big SWITCH statement.&lt;br /&gt;
:* Java 8 fix: The operand of INVOKESPECIAL and INVOKESTATIC can now be an InterfaceMethodref, not only a Methodref.&lt;br /&gt;
&lt;br /&gt;
;Version 1.0.1:&lt;br /&gt;
:* Remove our &amp;quot;own&amp;quot; implementation of Nullable, NotNull and NotNullByDefault, and added a dependency on&amp;quot;de.unkrig.commons-nullanalysis&amp;quot; instead.&lt;br /&gt;
:* MAIN class definition was missing from JAR manifest.&lt;br /&gt;
:* Slightly clarified the wording of the license: Replaced &amp;quot;author&amp;quot; with &amp;quot;copyright holder and its contributors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Version 1.0.0, 2016-10-30:&lt;br /&gt;
:(-)&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Html2txt&amp;diff=54</id>
		<title>Html2txt</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Html2txt&amp;diff=54"/>
		<updated>2026-07-04T08:08:41Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Important =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A tool to convert HTML documents into plain text.&lt;br /&gt;
&lt;br /&gt;
For example this HTML code&lt;br /&gt;
&lt;br /&gt;
[[File:Main.main.jpg]]&lt;br /&gt;
&lt;br /&gt;
is rendered like this:&lt;br /&gt;
&lt;br /&gt;
[[File:usage.txt.jpg]]&lt;br /&gt;
&lt;br /&gt;
For a complete description of the supported HTML inline elements, see&lt;br /&gt;
&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://html2txt.unkrig.de/javadoc/de/unkrig/html2txt/Html2Txt.html#ALL_INLINE_ELEMENTS here]&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For a complete description of the supported HTML block elements, see&lt;br /&gt;
&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://html2txt.unkrig.de/javadoc/de/unkrig/html2txt/Html2Txt.html#ALL_BLOCK_ELEMENTS here]&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
The goal was to generate the &amp;quot;usage&amp;quot; page that a command line tool usually prints when you invoke it with a &amp;quot;&amp;lt;tt&amp;gt;-help&amp;lt;/tt&amp;gt;&amp;quot; or &amp;quot;&amp;lt;tt&amp;gt;--help&amp;lt;/tt&amp;gt;&amp;quot; option, rather than maintain it manually (e.g. in the form of &amp;quot;&amp;lt;tt&amp;gt;println()&amp;lt;/tt&amp;gt;&amp;quot; statements in the code).&lt;br /&gt;
&lt;br /&gt;
The chosen solution is to put a big DOC comment before the &amp;quot;&amp;lt;tt&amp;gt;main()&amp;lt;/tt&amp;gt;&amp;quot; method, generate an HTML page with JAVADOC, convert that into a plain text file, put it into the application&#039;s JAR file and copy its contents to STDOUT when the user want to see it.&lt;br /&gt;
&lt;br /&gt;
The command line version of &amp;lt;tt&amp;gt;html2txt&amp;lt;/tt&amp;gt; itself uses that technique, and you can see the results above.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
You can download the latest version of the runnable JAR file [https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&amp;amp;g=de.unkrig&amp;amp;a=html2txt&amp;amp;v=LATEST&amp;amp;c=jar-with-dependencies here].&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
Since the tool uses the JRE&#039;s built-in XML parser, it supports &amp;quot;numeric character references&amp;quot; (like &amp;quot;&amp;amp;amp;#252;&amp;quot; for &amp;quot;Ü&amp;quot;), but not &amp;quot;named HTML character entity references&amp;quot; (like &amp;quot;&amp;amp;amp;Uuml;&amp;quot; for &amp;quot;Ü&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
For the same reason, the HTML markup in the DOC comments must be &amp;quot;well-formed&amp;quot;, i.e. all start tags must be matched by an end tag (like &amp;quot;&amp;lt;code&amp;gt;&amp;amp;lt;li&amp;gt;...&amp;amp;lt;/li&amp;gt;&amp;lt;/code&amp;gt;&amp;quot;), and void tags must end with a slash, like &amp;quot;&amp;lt;code&amp;gt;&amp;amp;lt;br /&amp;gt;&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Command line tool ===&lt;br /&gt;
&lt;br /&gt;
see [http://html2txt.unkrig.de/Main.main(String%5b%5d).html here].&lt;br /&gt;
&lt;br /&gt;
=== ANT task ===&lt;br /&gt;
&lt;br /&gt;
see [http://html2txt.unkrig.de/antdoc/index.html here].&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
&lt;br /&gt;
see [http://html2txt.unkrig.de/javadoc/index.html the JAVADOC].&lt;br /&gt;
&lt;br /&gt;
=== Source Code ===&lt;br /&gt;
&lt;br /&gt;
see [https://github.com/aunkrig/html2txt the source code repository].&lt;br /&gt;
&lt;br /&gt;
== Change Log ==&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.3, 2018-10-29:&lt;br /&gt;
:* Added vertical alignment (e.g. &amp;quot;&amp;amp;lt;div align=&#039;justify&#039;&amp;gt;&amp;quot;).&lt;br /&gt;
:* Made the tests robust against the platform-dependent line separators.&lt;br /&gt;
:* Cleaned up the MAINDOC generation.&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.2, 2016-11-25:&lt;br /&gt;
:* Modified the text of the copyright notice slightly: Replaced &amp;quot;author&amp;quot; with &amp;quot;copyright holders and contributors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.1, 2016-11-07:&lt;br /&gt;
:* Resurrected Java 6 compatibility.&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;html2txt&amp;lt;/code&amp;gt; is published under the &amp;quot;[[New BSD License]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
If you have issues, don&#039;t hesitate to [https://sourceforge.net/p/html2txt/tickets/ submit a ticket].&lt;br /&gt;
&lt;br /&gt;
To discuss in public, check the [https://sourceforge.net/p/html2txt/discussion/ forum] and/or subscribe to it (envelope icon).&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Doclet&amp;diff=53</id>
		<title>Doclet</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Doclet&amp;diff=53"/>
		<updated>2026-07-04T08:08:09Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Important =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This site makes several doclets publicly available which I wrote for my personal needs, but are hopefully useful for others. Enjoy!&lt;br /&gt;
&lt;br /&gt;
== The ANT Doclet ==&lt;br /&gt;
&lt;br /&gt;
Generates (JAVADOC-like) HTML documentation for [http://ant.apache.org APACHE ANT] antlibs.&lt;br /&gt;
&lt;br /&gt;
The motivation for writing this doclet is to ease the maintenance of the documentation for the [[Antology]] antlib.&lt;br /&gt;
&lt;br /&gt;
[[ANT doclet|Read more...]]&lt;br /&gt;
&lt;br /&gt;
== The CheckStyle Doclet ==&lt;br /&gt;
&lt;br /&gt;
Generates (JAVADOC-like) HTML documentation and the metadata files for [http://checkstyle.sf.net CheckStyle] and [http://eclipse-cs.sf.net Eclipse-CS] plugin-ins from &amp;quot;doc tags&amp;quot; in the source code of your checks and filters.&lt;br /&gt;
&lt;br /&gt;
[[Cs-doclet|Read more...]]&lt;br /&gt;
&lt;br /&gt;
== The JAVADOC Doclet ==&lt;br /&gt;
&lt;br /&gt;
A re-implementation of the JAVADOC standard doclet, basically a reference to show how to use [https://github.com/aunkrig/no-template the &amp;quot;no-template&amp;quot; framework].&lt;br /&gt;
&lt;br /&gt;
[[JAVADOC doclet|Read more...]]&lt;br /&gt;
&lt;br /&gt;
== The MAIN Doclet ==&lt;br /&gt;
&lt;br /&gt;
Generates an HTML page for the &amp;lt;code&amp;gt;main(String[])&amp;lt;/code&amp;gt; method (or any other method) of each of the specified classes. This is useful for command line tools with a set of command line options. Converted to plain text (e.g. with the [[html2txt]] utility), that documentation is perfect for a self description that a command line utility would print in response to &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[MAIN doclet|Read more...]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Commons.unkrig.de&amp;diff=52</id>
		<title>Commons.unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Commons.unkrig.de&amp;diff=52"/>
		<updated>2026-07-04T08:06:56Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Important =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;de.unkrig.commons&amp;lt;/tt&amp;gt; is a versatile Java&amp;amp;trade; library that implements many useful container and utility classes.&lt;br /&gt;
It extends and integrates seamlessly with the standard JDK library.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;de.unkrig.commons&amp;lt;/tt&amp;gt; is structured in several modules who&#039;s names are aligned to the related packages in the JDK libraries.&lt;br /&gt;
&lt;br /&gt;
== Module Details ==&lt;br /&gt;
&lt;br /&gt;
=== commons-asm ===&lt;br /&gt;
&lt;br /&gt;
Helper classes that are useful in the context of [http://forge.ow2.org/projects/asm/ ASM], a Java bytecode manipulation library.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Resources:&#039;&#039;&lt;br /&gt;
[http://commons.unkrig.de/commons-asm/apidocs/index.html JAVADOC],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-asm&amp;amp;v=LATEST&amp;amp;e=jar JAR file Download],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-asm&amp;amp;v=LATEST&amp;amp;c=sources Source code Download]&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-asm&amp;amp;v=LATEST&amp;amp;e=pom Maven POM]&lt;br /&gt;
&lt;br /&gt;
=== commons-doclet ===&lt;br /&gt;
&lt;br /&gt;
Helper classes that are useful for those who write [http://docs.oracle.com/javase/8/docs/technotes/guides/javadoc/doclet/overview.html doclets].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Resources:&#039;&#039;&lt;br /&gt;
[http://commons.unkrig.de/commons-asm/apidocs/index.html JAVADOC],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-asm&amp;amp;v=LATEST&amp;amp;e=jar JAR file Download],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-asm&amp;amp;v=LATEST&amp;amp;c=sources Source code Download]&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-asm&amp;amp;v=LATEST&amp;amp;e=pom Maven POM]&lt;br /&gt;
&lt;br /&gt;
=== commons-file ===&lt;br /&gt;
&lt;br /&gt;
Functionality for&lt;br /&gt;
[http://commons.unkrig.de/commons-file/apidocs/index.html?de/unkrig/commons/file/fileprocessing/package-summary.html processing]&lt;br /&gt;
or&lt;br /&gt;
[http://commons.unkrig.de/commons-file/apidocs/index.html?de/unkrig/commons/file/filetransformation/package-summary.html transforming]&lt;br /&gt;
trees of directories, files, compressed and archive files, and even nested compressed and archive files. Supports more than a dozen compression and archive formats.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Resources:&#039;&#039;&lt;br /&gt;
[http://commons.unkrig.de/commons-file/apidocs/index.html JAVADOC],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-file&amp;amp;v=LATEST&amp;amp;e=jar JAR file Download],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-file&amp;amp;v=LATEST&amp;amp;c=sources Source code Download]&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-file&amp;amp;v=LATEST&amp;amp;e=pom Maven POM]&lt;br /&gt;
&lt;br /&gt;
=== commons-io ===&lt;br /&gt;
&lt;br /&gt;
Functionality around byte streams and readers/writers, e.g. for converting a byte stream into a hex dump, or formatting an XML document.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Resources:&#039;&#039;&lt;br /&gt;
[http://commons.unkrig.de/commons-io/apidocs/index.html JAVADOC],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-io&amp;amp;v=LATEST&amp;amp;e=jar JAR file Download],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-io&amp;amp;v=LATEST&amp;amp;c=sources Source code Download]&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-io&amp;amp;v=LATEST&amp;amp;e=pom Maven POM]&lt;br /&gt;
&lt;br /&gt;
=== commons-junit4 ===&lt;br /&gt;
&lt;br /&gt;
Assertions etc. for those who write tests with JUNIT 4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Resources:&#039;&#039;&lt;br /&gt;
[http://commons.unkrig.de/commons-io/apidocs/index.html JAVADOC],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-io&amp;amp;v=LATEST&amp;amp;e=jar JAR file Download],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-io&amp;amp;v=LATEST&amp;amp;c=sources Source code Download]&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-io&amp;amp;v=LATEST&amp;amp;e=pom Maven POM]&lt;br /&gt;
&lt;br /&gt;
=== commons-lang ===&lt;br /&gt;
&lt;br /&gt;
* Utility classes for [http://commons.unkrig.de/commons-lang/apidocs/index.html?de/unkrig/commons/lang/ExceptionUtil.html exceptions], [http://commons.unkrig.de/commons-lang/apidocs/index.html?de/unkrig/commons/lang/ThreadUtil.html threads] and [http://commons.unkrig.de/commons-lang/apidocs/index.html?de/unkrig/commons/lang/RunnableUtil.html runnables]&lt;br /&gt;
* [http://commons.unkrig.de/commons-lang/apidocs/index.html?de/unkrig/commons/lang/protocol/package-summary.html &amp;quot;Protocol&amp;quot; interfaces] like [http://commons.unkrig.de/commons-lang/apidocs/index.html?de/unkrig/commons/lang/protocol/Producer.html Producer], [http://commons.unkrig.de/commons-lang/apidocs/index.html?de/unkrig/commons/lang/protocol/Consumer.html Consumer], [http://commons.unkrig.de/commons-lang/apidocs/index.html?de/unkrig/commons/lang/protocol/Predicate.html Predicate], [http://commons.unkrig.de/commons-lang/apidocs/index.html?de/unkrig/commons/lang/protocol/Transformer.html Transformer]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Resources:&#039;&#039;&lt;br /&gt;
[http://commons.unkrig.de/commons-lang/apidocs/index.html JAVADOC],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-lang&amp;amp;v=LATEST&amp;amp;e=jar JAR file Download],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-lang&amp;amp;v=LATEST&amp;amp;c=sources Source code Download]&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-lang&amp;amp;v=LATEST&amp;amp;e=pom Maven POM]&lt;br /&gt;
&lt;br /&gt;
=== commons-math ===&lt;br /&gt;
&lt;br /&gt;
[http://commons.unkrig.de/commons-math/apidocs/index.html?de/unkrig/commons/math/package-summary.html de.unkrig.commons.math]: A linear congruential generator; a [http://commons.unkrig.de/commons-math/apidocs/index.html?de/unkrig/commons/math/Sequences.html random sequence generator]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Resources:&#039;&#039;&lt;br /&gt;
[http://commons.unkrig.de/commons-math/apidocs/index.html JAVADOC],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-math&amp;amp;v=LATEST&amp;amp;e=jar JAR file Download],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-math&amp;amp;v=LATEST&amp;amp;c=sources Source code Download]&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-math&amp;amp;v=LATEST&amp;amp;e=pom Maven POM]&lt;br /&gt;
&lt;br /&gt;
=== commons-net ===&lt;br /&gt;
&lt;br /&gt;
* [http://commons.unkrig.de/commons-net/apidocs/index.html?de/unkrig/commons/net/http/package-summary.html HTTP] and [http://commons.unkrig.de/commons-net/apidocs/index.html?de/unkrig/commons/net/ftp/package-summary.html FTP] servers and clients&lt;br /&gt;
* Various networking tools like [http://commons.unkrig.de/commons-net/apidocs/index.html?de/unkrig/commons/net/tool/tcpmon/package-summary.html TCPMON], [http://commons.unkrig.de/commons-net/apidocs/index.html?de/unkrig/commons/net/tool/ftpmon/package-summary.html FTPMON], [http://commons.unkrig.de/commons-net/apidocs/index.html?de/unkrig/commons/net/tool/telnet/package-summary.html TELNET]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Resources:&#039;&#039;&lt;br /&gt;
[http://commons.unkrig.de/commons-net/apidocs/index.html JAVADOC],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-net&amp;amp;v=LATEST&amp;amp;e=jar JAR file Download],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-net&amp;amp;v=LATEST&amp;amp;c=sources Source code Download]&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-net&amp;amp;v=LATEST&amp;amp;e=pom Maven POM]&lt;br /&gt;
&lt;br /&gt;
=== commons-nullanalysis ===&lt;br /&gt;
&lt;br /&gt;
* Annotations and utility classes for ECLIPSE annotation-base &amp;quot;null analysis&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Resources:&#039;&#039;&lt;br /&gt;
[http://commons.unkrig.de/commons-nullanalysis/apidocs/index.html JAVADOC],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-nullanalysis&amp;amp;v=LATEST&amp;amp;e=jar JAR file Download],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-nullanalysis&amp;amp;v=LATEST&amp;amp;c=sources Source code Download]&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-nullanalysis&amp;amp;v=LATEST&amp;amp;e=pom Maven POM]&lt;br /&gt;
&lt;br /&gt;
=== commons-reflect ===&lt;br /&gt;
&lt;br /&gt;
Various utilities for Java&#039;s reflection API.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Resources:&#039;&#039;&lt;br /&gt;
[http://commons.unkrig.de/commons-reflect/apidocs/index.html JAVADOC],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-reflect&amp;amp;v=LATEST&amp;amp;e=jar JAR file Download],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-reflect&amp;amp;v=LATEST&amp;amp;c=sources Source code Download]&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-reflect&amp;amp;v=LATEST&amp;amp;e=pom Maven POM]&lt;br /&gt;
&lt;br /&gt;
=== commons-text ===&lt;br /&gt;
&lt;br /&gt;
* An [http://commons.unkrig.de/commons-text/apidocs/index.html?de/unkrig/commons/text/expression/ExpressionEvaluator.html expression evaluator]&lt;br /&gt;
* A small framework for creating [http://commons.unkrig.de/commons-text/apidocs/index.html?de/unkrig/commons/text/scanner/package-summary.html scanners] and [http://commons.unkrig.de/commons-text/apidocs/index.html?de/unkrig/commons/text/parser/package-summary.html parsers]&lt;br /&gt;
* A [http://commons.unkrig.de/commons-text/apidocs/index.html?de/unkrig/commons/text/pattern/Glob.html Glob] class that combines the widely known elements of UNIX file name globbing with the power of regular expressions&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Resources:&#039;&#039;&lt;br /&gt;
[http://commons.unkrig.de/commons-text/apidocs/index.html JAVADOC],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-text&amp;amp;v=LATEST&amp;amp;e=jar JAR file Download],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-text&amp;amp;v=LATEST&amp;amp;c=sources Source code Download]&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-text&amp;amp;v=LATEST&amp;amp;e=pom Maven POM]&lt;br /&gt;
&lt;br /&gt;
=== commons-util ===&lt;br /&gt;
&lt;br /&gt;
* [http://commons.unkrig.de/commons-util/apidocs/index.html?de/unkrig/commons/util/CommandLineOptions.html CommandLineOptions] makes parsing and documentation of command line options (e.g. for &amp;quot;&amp;lt;code&amp;gt;public static void main(String[])&amp;lt;/code&amp;gt;&amp;quot;) easy; see the [[CommandLineOptions tutorial|tutorial]].&lt;br /&gt;
* [http://commons.unkrig.de/commons-util/apidocs/index.html?de/unkrig/commons/util/TimeTable.html TimeTable] parses and implements a CRON-like specification string&lt;br /&gt;
* Various [http://commons.unkrig.de/commons-util/apidocs/index.html?de/unkrig/commons/util/logging/filter/package-summary.html filters], [http://commons.unkrig.de/commons-util/apidocs/index.html?de/unkrig/commons/util/logging/handler/package-summary.html handlers] and [http://commons.unkrig.de/commons-util/apidocs/index.html?de/unkrig/commons/util/logging/formatter/package-summary.html formatters] for &amp;lt;tt&amp;gt;java.util.logging&amp;lt;/tt&amp;gt;&lt;br /&gt;
* The [http://commons.unkrig.de/commons-util/apidocs/index.html?de/unkrig/commons/util/logging/SimpleLogging.html SimpleLogging] facility for easy integration of &amp;lt;tt&amp;gt;java.util.logging&amp;lt;/tt&amp;gt; within command line tools&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Resources:&#039;&#039;&lt;br /&gt;
[http://commons.unkrig.de/commons-util/apidocs/index.html JAVADOC],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-util&amp;amp;v=LATEST&amp;amp;e=jar JAR file Download],&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-util&amp;amp;v=LATEST&amp;amp;c=sources Source code Download]&lt;br /&gt;
[http://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&amp;amp;g=de.unkrig.commons&amp;amp;a=commons-util&amp;amp;v=LATEST&amp;amp;e=pom Maven POM]&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
The source code is available through GITHUB:&lt;br /&gt;
&lt;br /&gt;
    https://github.com/aunkrig/commons/&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
COMMONS.UNKRIG.DE is published under the &amp;quot;[[New BSD License]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Change Log ==&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.19 2024-03-14:&lt;br /&gt;
:* CommandLineOptions: Improved the handling of sub-options: These can now be terminated with &amp;quot;--&amp;quot;; unknown sub-options are now detected realiably (and not taken as following option arguments).&lt;br /&gt;
:* Add a variant of &amp;quot;FileTransformations.transfor(String[] args...)&amp;quot; that treats file name &amp;quot;-&amp;quot; as STDIN or STDOUT.&lt;br /&gt;
:* FtpClient: Added missing FTP operations.&lt;br /&gt;
:* FtpClient: Fixed up data connection handling.&lt;br /&gt;
:* CommandLineOptions: Do NOT consider command line arguments starting with dash+space as an option.&lt;br /&gt;
:* CommandLineOptions: Improved the handling of suboption arguments that look like options (i.e. begin with one or two dashes and a letter).&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.18 2022-12-28:&lt;br /&gt;
:* de.unkrig.commons.file.resourceprocessing.ResourceProcessings: Added &amp;quot;ResourceProcessings.STDIN_URL&amp;quot;.&lt;br /&gt;
:* de.unkrig.commons.file.resourceprocessing.ResourceProcessings: ZZDIFF can now handle &amp;quot;-&amp;quot; (stdin) as one of its two inputs.&lt;br /&gt;
:* de.unkrig.commons.text.scanner: Added &amp;quot;setInput(input, int start, int end)&amp;quot; for scanning partial strings.&lt;br /&gt;
:* de.unkrig.commons.text.expression.ExpressionEvaluator: Added &amp;quot;parsePart(String spec, int[] offset, int end)&amp;quot; for parsing partial strings.&lt;br /&gt;
:* de.unkrig.commons.text.pattern.ExpressionMatchReplacer: Added &amp;quot;\Q...\E&amp;quot; and &amp;quot;\Q...&amp;quot;.&lt;br /&gt;
:* ExpressionMatchReplacer.parseExt(): Added &amp;quot;\xhh&amp;quot;, &amp;quot;\uhhhh&amp;quot;, &amp;quot;\x{h...h}&amp;quot; and &amp;quot;normal&amp;quot; escapes (&amp;quot;\r&amp;quot;, &amp;quot;\n&amp;quot;, asf.).&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.17 2022-07-22:&lt;br /&gt;
:* d.u.c.lang.Characters: Small fixes of character classes for JRE 8 backwards compatibility.&lt;br /&gt;
:* d.u.c.lang.PrettyPrinter: Fixed one NPE in &amp;quot;PrettyPrinter.getPrettyClassName()&amp;quot; (handling of classes without a canonical name).&lt;br /&gt;
:* d.u.c.lang.StringUtil: Added multi-needle variants of &amp;quot;boyerMooreHorspoolIndexOf()&amp;quot;, e.g. &amp;quot;needle1|[Nn]eedle2&amp;quot;.&lt;br /&gt;
:* Added tests for &amp;quot;MapUtil.lazyMap()&amp;quot;.&lt;br /&gt;
:* d.u.c.util.collections.MapUtil: Created a brother method &amp;quot;MapUtil.lazyMap(Map&amp;lt;K, Producer&amp;lt;? extends V&amp;gt;&amp;gt; valueGetters)&amp;quot; for &amp;quot;MapUtil.lazyMap(Map&amp;lt;K, Function&amp;lt;? super I, ? extends V&amp;gt;&amp;gt; valueGetters, @Nullable final I in)&amp;quot;.&lt;br /&gt;
:* d.u.c.util.collections.IteratorUtil: Added &amp;quot;IteratorUtil.concat(List&amp;lt;Iterator&amp;gt;)&amp;quot;.&lt;br /&gt;
:* d.u.c.util.CommandLineOptionException: Include &amp;quot;toString()&amp;quot; of the cause into the OptionProcessingException&#039;s message, because the cause&#039;s &amp;quot;getMessage()&amp;quot; is often not verbose enough.&lt;br /&gt;
:* d.u.c.text.expression.ExpressionEvaluator: Implemented the special attributes &amp;quot;_attributes&amp;quot;, &amp;quot;_properties&amp;quot;, &amp;quot;_staticAttributes&amp;quot; and &amp;quot;_staticProperties&amp;quot;.&lt;br /&gt;
:* d.u.c.text.expression.ExpressionEvaluator: Arrays are now silently pretty-printed in all places.&lt;br /&gt;
:* Added &amp;quot;ObjectUtil.arrayToString(Object)&amp;quot;.&lt;br /&gt;
:* d.u.c.lang.protocol.ConsumerUtil: Moved &amp;quot;Grep.lineCounter()&amp;quot; to &amp;quot;ConsumerUtil&amp;quot;.&lt;br /&gt;
:* d.u.c.text.pattern.PatternUtil: Added to the &amp;quot;patternFinderWriter()&amp;quot; method family some more with a &amp;quot;Runnable flush&amp;quot; parameter.&lt;br /&gt;
:* d.u.c.text.pattern.Finders: Added to the &amp;quot;patternFinder()&amp;quot; method family some more with a &amp;quot;Runnable flush&amp;quot; parameter.&lt;br /&gt;
:* d.u.c.lang.protocol.Functions: Added &amp;quot;Functions.constant(O)&amp;quot;.&lt;br /&gt;
:* d.u.c.io.ConsumingWriter: Added the &amp;quot;ConsumingWriter&amp;quot;.&lt;br /&gt;
:* d.u.c.text.pattern.Substitutor: The Substitutor is now based on the Finders.patternFinder().&lt;br /&gt;
:* d.u.c.text.pattern.PatternUtil: The object returned by &amp;quot;replacementStringMatchReplacer()&amp;quot; didn&#039;t have a proper &amp;quot;toString()&amp;quot; method.&lt;br /&gt;
:* d.u.c.file.org.apache.commons.compress.archivers: &amp;quot;ArchiveFormat.forArchiveOutputStream(ArchiveOutputStream)&amp;quot; didn&#039;t work in all cases.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.16 2022-03-21:&lt;br /&gt;
:* Iff the field &amp;quot;Throwable.message&amp;quot; cannot be made accessible, print a useful warning message on STDERR instead of throwing an exception.&lt;br /&gt;
:* Gave up on Java 6 compatibility... now Java 8.&lt;br /&gt;
:* Added &amp;quot;setPassword()&amp;quot;, in addition to the system property.&lt;br /&gt;
:* Gave up on Java 6 compatibility... now Java 8.&lt;br /&gt;
:* Added &amp;quot;MavenUtil&amp;quot;.&lt;br /&gt;
:* Reverted the commit of &amp;quot;Glob.java&amp;quot; of 2021-12-01 19:22: &amp;quot;%&amp;quot; is *not* a valid suffix; otherwise all compressed contents (e.g. &amp;quot;dir/file.gz%&amp;quot;) would match a pattern like &amp;quot;***foo&amp;quot;.&lt;br /&gt;
:* Added test case for &amp;quot;FileProcessings.starterFile(String regex)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;ContentProcessings.glob()&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;PatternUtil.constantPrefix()&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;FileProcessings.glob()&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;OutputStreams.newOverwritingFileOutputStream(File)&amp;quot;: &amp;quot;$xyz&amp;quot; was handled differently from &amp;quot;${xyz}&amp;quot; and caused an NPE.&lt;br /&gt;
:* Added &amp;quot;AbstractParser.readEnum()&amp;quot;.&lt;br /&gt;
:* Gave up on backwards compatibility with Java 6 and 7 (removed substitutes for java.util.Base64).&lt;br /&gt;
:* Added &amp;quot;Readers.readFully()&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;InputStreams.readFully()&amp;quot;.&lt;br /&gt;
:* Set &amp;quot;useTransparentBounds(true)&amp;quot; when scanning, so token regexes can use lookaheads and lookbehinds.&lt;br /&gt;
:* 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 &amp;quot;elastic pipe&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;OutputStreams.updatesChecksum(final Checksum checksum) =&amp;gt; OutputStream&amp;quot;.&lt;br /&gt;
:* The substitution count was wrong (*2 value).&lt;br /&gt;
:* Typo in &amp;quot;elasticPipe()&amp;quot; caused an IllegalStateException.&lt;br /&gt;
:* Added &amp;quot;ArchiveFormat.getCompressionMethod(ArchiveEntry)&amp;quot;, which returns a string representation of the compression method used for the archive entry.&lt;br /&gt;
:* Generating TAR archives: The &amp;quot;long file mode&amp;quot; (determines the handling of file names longer than 100 characters) can now be controlled with a system property &amp;quot;TarArchiveFormat.longFileMode&amp;quot;; the default is now &amp;quot;GNU&amp;quot; (and not, as before, &amp;quot;ERROR&amp;quot;).&lt;br /&gt;
:* Added &amp;quot;Numbers.unsignedCompareToByte/Short/Int/Long()&amp;quot;.&lt;br /&gt;
:* Added the &amp;quot;Relation&amp;quot; interface and the &amp;quot;Relations&amp;quot; utility class.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.15 2020-11-06:&lt;br /&gt;
:* commons-file: Implemented decryption of encrypted 7ZIP archives with a sysem property &amp;quot;sevenZInputFilePassword&amp;quot;.&lt;br /&gt;
:* commons-file: Directory processing: JRE11+MS WINDOWS replace colons (#003A) in member names with #F03A, for whatever reason.&lt;br /&gt;
:* commons-net: For method CONNECT, the second word of the request line is not a URI, but only an authority (host:port).&lt;br /&gt;
:* commons-file: Handle AR archive entriy with empty name: Silently rename it to &amp;quot;__ROOT&amp;quot;.&lt;br /&gt;
:* commons-net: Fixed one resource leak.&lt;br /&gt;
:* commons-file: &amp;quot;apache.commons.compress&amp;quot; no longer seems to miss the dependency on &amp;quot;org.tukaani&amp;quot; -- removed the workaround.&lt;br /&gt;
:* commons-file: Augmented all content processing with an optional &amp;quot;lastModifiedDate&amp;quot; parameter.&lt;br /&gt;
:* commons-file: Added (read-only) support for the &amp;quot;rpm&amp;quot; archive format. (An PM file is actually a compressed CPIO archive preceeded by some binary metadata.)&lt;br /&gt;
:* commons-util: Added &amp;quot;MapUtil.lazyMap()&amp;quot;.&lt;br /&gt;
:* commons-text: Added &amp;quot;Notation.Phrase.size()&amp;quot; and &amp;quot;Notation.Phrase.get()&amp;quot;.&lt;br /&gt;
:* commons-io: Fixed an endless loop in &amp;quot;MarkableFileInputtream.skip()&amp;quot;.&lt;br /&gt;
:* commons-io: Fixed a ConcurrentModificationException.&lt;br /&gt;
:* commons-text: Replaced single quotes in many messages with (the typographically more correct) double quotes.&lt;br /&gt;
:* commons-util: Wrap exceptions that occur during option processing with the new &amp;quot;OptionProcessingException&amp;quot; (instead of an AssertionError).&lt;br /&gt;
:* commons-io: Added &amp;quot;Writers.autoFlushing()&amp;quot; and &amp;quot;OutputStreams.autoFlushing()&amp;quot;. Added &amp;quot;Readers.wye(Reader, Writer)&amp;quot; and marked &amp;quot;WyeReader&amp;quot; as deprecated.&lt;br /&gt;
:* commons-io, commons-lang: Added tons of &amp;quot;? super&amp;quot; and &amp;quot;? extends&amp;quot; clauses.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.14 2019-10-11:&lt;br /&gt;
:* Fixed an IllegalArgumentException in &amp;quot;Pattern2.compile(String, int)&amp;quot; and &amp;quot;Glob.compile(String, int)&amp;quot;.&lt;br /&gt;
:* StringStream: Made &amp;quot;next()&amp;quot; and &amp;quot;consume()&amp;quot; public.&lt;br /&gt;
:* OptionalMethods: All methods get an additional first parameter &amp;quot;@Nullable String message&amp;quot;, which, if non-null, is used for the UnsupportedOperationException.&lt;br /&gt;
:* Added &amp;quot;XmlUtil.parse(DocumentBuilder, InputStream, String publicId, String encoding)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;Writers.tee(Writer... delegates)&amp;quot;.&lt;br /&gt;
:* ArArchiveFormat: Catch an NPE thrown by ArArchiveInputStream.&lt;br /&gt;
:* ArArchiveFOrmat: Catch a NumberFormatException in ArArchiveInputStream.&lt;br /&gt;
:* Work around &amp;quot;ZipException: uncompressed size is required for STORED method when not writing to a file&amp;quot;&lt;br /&gt;
:* commons.doclet.Html: Changed fragment style from Java 7 to Java 8+.&lt;br /&gt;
:* ResourceProcessings: &amp;quot;isFile()&amp;quot; did not decode %xx escape sequences in URLs.&lt;br /&gt;
:* commons.lang.Comparators: Added &amp;quot;Comparators.keyComparator()&amp;quot; and &amp;quot;.valueComparator()&amp;quot;.&lt;br /&gt;
:* FileProcessings.directoryProcessor(): The &amp;quot;pathPredicate&amp;quot; was applied wrong for *files* (as opposed to directories).	As a result, &amp;quot;zzgrep --include &#039;***.class&#039;&amp;quot; did not match .class files *in archives*.&lt;br /&gt;
:* InputStreams: Added &amp;quot;EventCounter&amp;quot;, &amp;quot;ExponentiallyLoggingEventCounter&amp;quot; and &amp;quot;InputStreams.statisticsInputStream()&amp;quot; for real-time IO statistics.&lt;br /&gt;
:* Optimize archive file and compressed file reading by replacing small file READs with large file READs.&lt;br /&gt;
:* Added input stream statistics in &amp;quot;CompressUtil&amp;quot; and &amp;quot;FileContentsProcessor&amp;quot;.&lt;br /&gt;
:* Fatal bug in &amp;quot;ConsumerUtil.head()&amp;quot; fixed!&lt;br /&gt;
:* Added &amp;quot;commons.lang.protocolTuple2&amp;quot;, &amp;quot;Tuple3&amp;quot; and &amp;quot;Tuple4&amp;quot;.&lt;br /&gt;
:* ExpressionMatchReplacer: Replaced &amp;quot;imports&amp;quot; with &amp;quot;singleImports&amp;quot; and &amp;quot;onDemandImports&amp;quot;.&lt;br /&gt;
:* ExpressionEvaluator: Added scanning of MULTI-LINE C-style comments. Added scanning of C++-style comments.&lt;br /&gt;
:* Added &amp;quot;de.unkrig.commons.file.resourceprocessing&amp;quot;, in symmetry with &amp;quot;fileprocessing&amp;quot; and &amp;quot;contentsprocessing&amp;quot;, to process *resources* (designated by URLs) in addition to files and InputStreams.&lt;br /&gt;
:* commons.file: Compressed file names and compressed contents paths are now suffixed with &#039;%&#039; (instead of &#039;!&#039;) to circumvent problems with &amp;quot;Glob&amp;quot;&#039;s directory prefix mechanism.&lt;br /&gt;
:* Java 9 added &amp;quot;@Override public final CharBuffer CharBuffer.rewind() { ...&amp;quot; -- leads easily to a &amp;quot;NoSuchMethodError: java.nio.CharBuffer.rewind()Ljava/nio/CharBuffer&amp;quot;; a cast to &amp;quot;Buffer&amp;quot; is the workaround.&lt;br /&gt;
:* Added &amp;quot;LineUtil.lineAndColumnTracker()&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;Readers.onFirstChar()&amp;quot; and &amp;quot;Readers.trackLineAndColumn(Reader)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;Writers.onFirstChar()&amp;quot; and &amp;quot;Writers.trackLineAndColumn(Writer)&amp;quot;.&lt;br /&gt;
:* Removed unnecessary dependency on &amp;quot;de.unkrig.commons:commons-junit4&amp;quot;.&lt;br /&gt;
:* CommandLineOptions: Convert &amp;quot;any&amp;quot; to InetAddr &amp;quot;null&amp;quot; (&amp;quot;wildcard address&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.13 2018-11-23:&lt;br /&gt;
:* In analogy with the &amp;quot;Substitutor&amp;quot;, the new &amp;quot;Search&amp;quot; class finds pattern matches in a sequence of chunks in a &amp;quot;sliding&amp;quot; manner. Instead of a &amp;quot;match replacer&amp;quot;, it invokes a &amp;quot;match handler&amp;quot;.&lt;br /&gt;
:* Breaking change: A &amp;quot;match replacer&amp;quot; is no longer a &amp;quot;FunctionWhichThrows&amp;lt;Matcher, String, EX&amp;gt;&amp;quot;, but a &amp;quot;FunctionWhichThrows&amp;lt;MatchResult, String, EX&amp;gt;&amp;quot;.&lt;br /&gt;
:* Added support for HTTP method &amp;quot;OPTIONS&amp;quot;.&lt;br /&gt;
:* Refined the logic that checks for &amp;quot;Socket closed&amp;quot; exceptions.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.12 2018-10-29:&lt;br /&gt;
:* ChunkedInputStream: Reading of blank line after last chunk was missing.&lt;br /&gt;
:* Added &amp;quot;LevelFilteredPrinter.setNoErrors()&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;evaluateExpressionTo(@Nullable String[] imports, String input,Class&amp;lt;T&amp;gt; targetType, Mapping&amp;lt;String, ?&amp;gt; variables)&amp;quot;.&lt;br /&gt;
:* Added convenience methods with a parameter &amp;quot;Object... variableNamesAndValues&amp;quot; for all methods with a parameter &amp;quot;Mapping&amp;lt;String, ?&amp;gt; variables&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;or(PredicateWhichThrows&amp;lt;? super T, ? extends EX&amp;gt; lhs, PredicateWhichThrows&amp;lt;? super T, ? extends EX&amp;gt; rhs)&amp;quot; as a brother of &amp;quot;or(Predicate&amp;lt;? super T&amp;gt; lhs, Predicate&amp;lt;? super T&amp;gt; rhs)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;containsKeyPredicateWhichThrows(final Mapping&amp;lt;K, V&amp;gt;)&amp;quot;.&lt;br /&gt;
:* Removed the &amp;quot;&amp;lt;EX&amp;gt;&amp;quot; type parameter from &amp;quot;ExpressionEvaluator.parser(String spec)&amp;quot;.&lt;br /&gt;
:* Optimized &amp;quot;toPredicate()&amp;quot; and &amp;quot;constantExpression()&amp;quot; for the special cases &amp;quot;true&amp;quot;, &amp;quot;false&amp;quot; and &amp;quot;null&amp;quot;.&lt;br /&gt;
:* Replaced &amp;quot;HttpAuthenticationServlett(String realm, String userName, String password)&amp;quot; with &amp;quot;HttpAuthenticationServlett(String realm, UserNamePasswordPredicate)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;removeParameter()&amp;quot;.&lt;br /&gt;
:* Added test cases for &amp;quot;de.unkrig.commons.util.Enums&amp;quot;.&lt;br /&gt;
:* Optimized performance of &amp;quot;Enums.valueOf(String, Class&amp;lt;? extends Enum&amp;gt;)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;enumSetFromString(String, Class&amp;lt;? extends Enum&amp;gt;)&amp;quot; and &amp;quot;valueOf(String, Class&amp;lt;? extends Enum&amp;gt;)&amp;quot;.&lt;br /&gt;
:* Started implementation of &amp;quot;IndexOf.indexOf(CharSequence haystack, int minIndex, int maxIndex, int limit)&amp;quot; for partial terminal matches.&lt;br /&gt;
:* Added method &amp;quot;toCharArray(CharSequence cs)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;of(T... values)&amp;quot;, &amp;quot;union(Set&amp;lt;? extends T&amp;gt; lhs, Set&amp;lt;? extends T&amp;gt; rhs)&amp;quot; and &amp;quot;intersection(Set&amp;lt;? extends T&amp;gt; lhs, Set&amp;lt;? extends T&amp;gt; rhs)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;toCharArray(Set&amp;lt;Character&amp;gt;)&amp;quot; and &amp;quot;toIntArray(Set&amp;lt;Integer&amp;gt;)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;append(char[] a, char... values)&amp;quot; and &amp;quot;mirror(char[][])&amp;quot;.&lt;br /&gt;
:* Fixed up several bugs in &amp;quot;boyerMooreHorspool...()&amp;quot;.&lt;br /&gt;
:* Renamed methods &amp;quot;knuthMorrisPratt...()&amp;quot; to &amp;quot;boyerMooreHolbrook...()&amp;quot;.&lt;br /&gt;
:* Fixed up the Knuth-Morris-Pratt &amp;quot;lastIndexOf()&amp;quot; method.&lt;br /&gt;
:* More optimization on the &amp;quot;knuthMorrisPratt()&amp;quot; index-of algorithm.&lt;br /&gt;
:* Renamed the &amp;quot;...Index&amp;quot; parameters of the &amp;quot;IndexOf.(indexOf|lastIndexOf)()&amp;quot; methods from &amp;quot;(from|to)Index&amp;quot; to &amp;quot;(min|max)Index&amp;quot;, because &amp;quot;from&amp;quot; and &amp;quot;to&amp;quot; are very confusing for &amp;quot;lastIndexOf()&amp;quot;.&lt;br /&gt;
:* Utility functionality related to {@link HttpsURLConnection}s.&lt;br /&gt;
:* Added &amp;quot;ExpressionEvaluator.parsePart()&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;ExpressionEvaluator.parsePart()&amp;quot;.&lt;br /&gt;
:* &amp;quot;getMostSpecificMethod()&amp;quot;: Didn&#039;t find some methods declared in superinterfaces.&lt;br /&gt;
:* Added &amp;quot;containsKeyPredicate(Mapping)&amp;quot;.&lt;br /&gt;
:* The non-&amp;quot;...WhichThrows&amp;quot; protocol classes now declare the EX type parameter as &amp;quot;NoException&amp;quot; (was &amp;quot;RuntimeException&amp;quot;) to make any code more self-documenting.&lt;br /&gt;
:* &amp;quot;isLessSpecific()&amp;quot;: The synthetic methods that are generated for covariant return values were regarded as &amp;quot;ambiguous&amp;quot;.&lt;br /&gt;
:* The &amp;quot;transformer&amp;quot; argument is now allowed to throw IOExceptions.&lt;br /&gt;
:* &amp;quot;copyAndTransform()&amp;quot; now declares an &amp;quot;EX&amp;quot; type parameter.&lt;br /&gt;
:* Added the &amp;quot;assertFind()&amp;quot; methods.&lt;br /&gt;
:* Added &amp;quot;StringUtil.asJavaLiteral(String)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;IterableUtil.addAllElementsTo(Iterable, Collection)&amp;quot; and &amp;quot;IteratorUtil.addAllElementsTo(Iterator, Collection)&amp;quot;.&lt;br /&gt;
:* Moved &amp;quot;EMPTY_SORTED_SET&amp;quot; and &amp;quot;emptySortedSet()&amp;quot; from &amp;quot;CollectionUtil&amp;quot; to &amp;quot;Sets&amp;quot;, leaving (deprecated) wrappers behind.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.11 2017-08-23:&lt;br /&gt;
:* Added methods &amp;quot;Rule.goTo(S)&amp;quot;, &amp;quot;Rule.push(S)&amp;quot; and &amp;quot;Rule.pop()&amp;quot;, making many of the &amp;quot;StatefulScanner.addRule(...)&amp;quot; methods DEPRECATED.&lt;br /&gt;
:* Added utility class &amp;quot;OptionalMethods&amp;quot;.&lt;br /&gt;
:* Made JRE 7&#039;s methods &amp;quot;isAlphabetic(int)&amp;quot; and &amp;quot;isIdeographic(int)&amp;quot; available for all JRE versions.&lt;br /&gt;
:* &amp;quot;Token.captured&amp;quot; is no longer @Nullable; this is much more practical.&lt;br /&gt;
:* Added &amp;quot;PrettyPrinter.codePointToString(int)&amp;quot;.&lt;br /&gt;
:* Added the following methods, and the plethora of predicates that implement them:&lt;br /&gt;
:**	javaCharacterClassFromName(String)&lt;br /&gt;
:**	unicodeCategoryFromName(String)&lt;br /&gt;
:**	unicodeBinaryPropertyFromName(String)&lt;br /&gt;
:**	unicodePredefinedCharacterClassFromName(String)&lt;br /&gt;
:**	posixCharacterClassFromName(String)&lt;br /&gt;
:* Improved the &amp;quot;unexpected character&amp;quot; exception message by adding information about the current scanner state.&lt;br /&gt;
:* Added the &amp;quot;de.unkrig.commons.util.EnhancedServiceLoader&amp;quot;.&lt;br /&gt;
:* Added appropriate &amp;quot;toString()&amp;quot; methods on &amp;quot;IndexOf&amp;quot; implementations.&lt;br /&gt;
:* Extended the &amp;quot;StringUtil.IndexOf&amp;quot; interface with various &amp;quot;lastIndexOf()&amp;quot; methods.&lt;br /&gt;
:* Added &amp;quot;StringUtil.newIndexOf(final String infix)&amp;quot; which implements the Knuth-Morris-Pratt algorithm.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.10 2017-07-30:&lt;br /&gt;
:* Added method &amp;quot;MD5.of(InputStream)&amp;quot;.&lt;br /&gt;
:* Added utility class &amp;quot;de.unkrig.commons.lang.Comparators&amp;quot;.&lt;br /&gt;
:* CompressUtil: The &amp;quot;UnsupportedZipFeatureException&amp;quot; was not properly wrapped because it has none of the &amp;quot;usual&amp;quot; constructors that &amp;quot;ExceptionUtil.wrap()&amp;quot; requires.&lt;br /&gt;
:* Added &amp;quot;InputStreams.readAll(InputStream, boolean closeInputStream)&amp;quot;.&lt;br /&gt;
:* de.unkrig.commons.util.collections.Peekerators: Introduced the concept of the &amp;quot;peekerator&amp;quot; - an Iterator with a &amp;quot;peek()&amp;quot; method.&lt;br /&gt;
:* IterableUtil: Added &amp;quot;IterableUtil.NATURALS&amp;quot; and &amp;quot;NATURALS0&amp;quot;.&lt;br /&gt;
:* de.unkrig.commons.util.collections: Added methods &amp;quot;IteratorUtil.foR(...)&amp;quot; and &amp;quot;IterableUtil.foR(...)&amp;quot;.&lt;br /&gt;
:* de.unkrig.commons.util.collections: Moved &amp;quot;iteratorWithContext()&amp;quot; from IterableUtil to IteratorUtil.&lt;br /&gt;
:* de.unkrig.commons.util.collections: Made &amp;quot;ElementWithContext&amp;quot; a top-level type, because it is now used by two compilation units (IteratorUtil and IterableUtil).&lt;br /&gt;
:* commons-net and commons-util: Moved the &amp;quot;CustomAuthenticator&amp;quot; (and its fellows &amp;quot;CredentialsSpec&amp;quot;, &amp;quot;JPasswordFields&amp;quot; and &amp;quot;Regex&amp;quot; from the ANTOLOGY project to the &amp;quot;de.unkrig.commons.net&amp;quot; project, where it belongs.&lt;br /&gt;
:* CommandLineOptions: Gave &amp;quot;printResource(Class, String relativeResourceName, ...)&amp;quot; a sibling method &amp;quot;printResource(ClassLoader, String resourceName, ...)&amp;quot;.&lt;br /&gt;
:* de.unkrig.commons.net.http.HttpMessage: In &amp;quot;attempt unstreaming&amp;quot; mode, the body was written TWICE (caused IllegalStateExceptions).&lt;br /&gt;
:* de.unkrig.commons.net.http: Added support for the &amp;quot;CONNECT&amp;quot; method.&lt;br /&gt;
:* Added to many methods parameter(s) &amp;quot;xxxLoggingPrefix&amp;quot; so that one can customize the logging messages. By default, logging messages related to incoming data are prefixed with &amp;quot;&amp;gt;&amp;gt;&amp;gt; &amp;quot;, and logging messages related to outgoing data with &amp;quot;&amp;lt;&amp;lt;&amp;lt; &amp;quot;.&lt;br /&gt;
:* HttpMessage: The &amp;quot;attempt unstreaming&amp;quot; feature can now be switched off (important for the CONNECT method).&lt;br /&gt;
:* &amp;quot;IoUtil.copy()&amp;quot; now flushes the output stream when the next READ from the input stream will block.&lt;br /&gt;
:* de.unkrig.commons.text.expression: Added support for nested types.&lt;br /&gt;
:* Changed the return types of &amp;quot;Expression.evaluateTo[Primitive](...)&amp;quot; from &amp;quot;Object&amp;quot; to &amp;quot;T&amp;quot;.&lt;br /&gt;
:* AuthenticateHeaderParser: Implemented BASIC authentication for the &amp;quot;HttpClient&amp;quot; - useful to configure HTTP proxies that handle authentication.&lt;br /&gt;
:* unkrig.commons/text/scanner: Added &amp;quot;String[] Token.captured&amp;quot; for access to input subsequences that were captured during the token match.&lt;br /&gt;
:* ConsumerUtil: Added methods &amp;quot;head(m)&amp;quot; and &amp;quot;tail(n)&amp;quot;.&lt;br /&gt;
:* &amp;quot;Transformer&amp;quot; now extends &amp;quot;TransformerWhichThrows&amp;amp;lt;I, O, RuntimeException&amp;gt;&amp;quot;, as it always should have done.&lt;br /&gt;
:* Added &amp;quot;BooleanProducer ProducerUtil.once()&amp;quot;.&lt;br /&gt;
:* Added the &amp;quot;de.unkrig.commons.text.scanner.XmlScanner&amp;quot; class and tests.&lt;br /&gt;
:* Added &amp;quot;StringUtil.containsAny(String subject, String characters)&amp;quot;, which checks whether the subject contains any of the characters.&lt;br /&gt;
:* Added the &amp;quot;FilterAppendable&amp;quot;, very much in anaolgy with the &amp;quot;java.io.FilterWriter&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;CharSequences.from(char[])&amp;quot; and &amp;quot;CharSequences.from(char[], int off, int len)&amp;quot;.&lt;br /&gt;
:* Added the &amp;quot;Appendables&amp;quot; utility class.&lt;br /&gt;
:* de.unkrig.commons.doclet.html.Html: Added support for {@value} on enum constants.&lt;br /&gt;
:* de.unkrig.commons.doclet.html.Html: STANDARD_LINK_MAKER: Added support for links to enum constants.&lt;br /&gt;
:* de.unkrig.commons.text.expression.ExpressionEvaluator: Breaking API change: &amp;quot;evaluateTo(..)&amp;quot; now returns a _nullable_ result.&lt;br /&gt;
:* ConsumerUtil: Added various &amp;quot;store()&amp;quot; and &amp;quot;cumulate()&amp;quot; methods.&lt;br /&gt;
:* de.unkrig.commons.net.http.HttpMessage: Added method &amp;quot;body(final ProducerWhichThrows&amp;amp;lt;InputStream, IOException&amp;gt; in)&amp;quot;.&lt;br /&gt;
:* Automatic XML formatting is now not only active for content type &amp;quot;text/xml&amp;quot;, but for any content type with an infix &amp;quot;xml&amp;quot;.&lt;br /&gt;
:* de.unkrig.commons.io.ReaderInputStream: First implementation of the &amp;quot;ReaderInputStream&amp;quot; as the complement of the &amp;quot;WriterOutputStream&amp;quot;; as of now supports only char set ISO8859-1.&lt;br /&gt;
:* TransformingFilterReader: Bug fixed: &amp;quot;TransformingFilterReader.read()&amp;quot; returned -1 on the first pattern match.&lt;br /&gt;
:* de.unkrig.commons.doclet.html.Html: @value: The argument was not SGML-Escaped.&lt;br /&gt;
:* TransformerUtil: Added &amp;quot;cache(final Transformer&amp;amp;lt;? super I, O&amp;gt; delegate, final Map&amp;amp;lt;I, O&amp;gt; cache)&amp;quot;.&lt;br /&gt;
:* ContentsProcessings.processArchive(): &amp;quot;Directory archive entries&amp;quot; are now silently ignored, because they have no contents and thus it makes no sense to process them with the &amp;quot;contentsProcessor&amp;quot;.&lt;br /&gt;
:* FileUtil: Added a workaround for MS WINDOWS 7: Read-protected directory produces: isDirectory() =&amp;gt; true; canRead() =&amp;gt; true; list() =&amp;gt; null; listFiles() =&amp;gt; null (Caused NPEs.)&lt;br /&gt;
:* PasswordAuthenticationStores: &amp;quot;..customAuthenticator_credentials,orig&amp;quot; file was not deleted after saving the credentials properties file.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.9 2017-02-02:&lt;br /&gt;
:* de.unkrig.commons.crypto/security: Gave up on the concept of &amp;quot;DestroyableString&amp;quot;s - they cause more confusion than they are helpful.&lt;br /&gt;
:* ProducerUtil: Fixed a serious bug in &amp;quot;cacheAsynchronously()&amp;quot;: ExecutionExceptions thrown by the Future were not handled properly and caused the cache to &amp;quot;hang&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;roundRobin()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.8 2017-01-27:&lt;br /&gt;
:* New utility class &amp;quot;AssertString&amp;quot;: Provides methods like &amp;quot;assertContains(String expectedInfix, String actual)&amp;quot;.&lt;br /&gt;
:* Added a new package &amp;quot;de.unkrig.commons.lang.crypto&amp;quot;, and moved many classes from &amp;quot;lang.security&amp;quot; to there.&lt;br /&gt;
:* Extracted the UserNamePasswordStore from &amp;quot;de.unkrig.antology.task.SetAuthenticatorTask&amp;quot; to here.&lt;br /&gt;
:* Added &amp;quot;StatefulScanner.getCurrentState()&amp;quot; and &amp;quot;setCurrentState()&amp;quot; so that the state of the scanner can be changed from outside admidst scanning.&lt;br /&gt;
:* Added &amp;quot;AbstractScanner.suppress(TT)&amp;quot; and &amp;quot;suppress(EnumSet&amp;amp;lt;TT&amp;gt;)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;ProducterUtil.filter(Producer, Predicate)&amp;quot;.&lt;br /&gt;
:* StatefulScanner: Declared a constant &amp;quot;REMAIN&amp;quot; for the &amp;quot;addRule()&amp;quot; methods that have a final &amp;quot;nextState&amp;quot; parameter.&lt;br /&gt;
:* AbstractParser: End-of-input handling was brooken in &amp;quot;read(Object... tokenTypeOrText)&amp;quot;.&lt;br /&gt;
:* Added the &amp;quot;de.unkrig.commons.lang.Characters&amp;quot; utility class.&lt;br /&gt;
:* The first parameter of methods &amp;quot;StatefulScanner.addRule(EnumSet&amp;amp;lt;S&amp;gt;, ...)&amp;quot; is now NULLABLE, where &amp;quot;null&amp;quot; means &amp;quot;any state, including the default state&amp;quot;.&lt;br /&gt;
:* Added a constructor &amp;quot;StatefulScanner(StatefulScanner)&amp;quot; that clones the configuration, but not the state.&lt;br /&gt;
:* StatefulScanner: Added methods &amp;quot;addRule(@Nullable EnumSet&amp;amp;lt;S&amp;gt; states, String regex, TT tokenType)&amp;quot; and &amp;quot;addRule(@Nullable EnumSet&amp;amp;lt;S&amp;gt; states, String regex, TT tokenType, S nextState)&amp;quot;, which make it easier to declare rules that apply in more than one non-default states.&lt;br /&gt;
:* Fixed one major design error in &amp;quot;CommandLineOptions&amp;quot;: Method &amp;quot;applyCommandLineOption()&amp;quot; now gets a &amp;quot;Method&amp;quot; as its second parameter, instead of, previously, a &amp;quot;CommandLineOption&amp;quot; object.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.7 2016-12-12:&lt;br /&gt;
:* IoUtil: Added &amp;quot;singlingFilterReader()&amp;quot; and &amp;quot;singlingInputStream()&amp;quot;.&lt;br /&gt;
:* PatternUtil: Fixed several bugs in &amp;quot;PatternUtil.replaceAll()&amp;quot;.&lt;br /&gt;
:* PatternUtil: Added &amp;quot;replaceAllFilterReader()&amp;quot;.&lt;br /&gt;
:* PatternUtil: Added &amp;quot;replaceAllFilterWriter()&amp;quot;.&lt;br /&gt;
:* Moved many, many methods from &amp;quot;IoUtil&amp;quot; to the new utility classes &amp;quot;InputStreams&amp;quot;, &amp;quot;OutputStreams&amp;quot;, &amp;quot;Readers&amp;quot;, &amp;quot;Writers&amp;quot; and &amp;quot;FransformingFilter(Reader|Writer)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;StringTransformers&amp;quot;, a collection of simple &amp;quot;Transformer&amp;amp;lt;CharSequence, CharSequence&amp;gt;&amp;quot;s.&lt;br /&gt;
:* Added TransformerUtil.chain(Transformer...)&amp;quot;.&lt;br /&gt;
:* Extracted &amp;quot;PatternUtil.replaceAllFilterReader()&amp;quot; as the new &amp;quot;Substitutor&amp;quot; class.&lt;br /&gt;
:* Adapted to the refactoring of &amp;quot;IoUtil&amp;quot;.&lt;br /&gt;
:* Added unit tests for the &amp;quot;Substitutor&amp;quot;.&lt;br /&gt;
:* &amp;quot;IoUtil.findOnPath()&amp;quot;: The search stopped at the FIRST archive file.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.6 2016-11-30:&lt;br /&gt;
:* commons-io: Added the &amp;quot;CharFilter&amp;quot;, &amp;quot;CharFilterReader&amp;quot; and &amp;quot;CharFilterWrite&amp;quot;, which are the char-wise equivalent of &amp;quot;ByteFilter(InputStream|OutputStream)?&amp;quot;.&lt;br /&gt;
:* Glob: Added the &amp;quot;&amp;quot; special case for the &amp;quot;container match&amp;quot;.&lt;br /&gt;
:* FileProcessings, ContentsProcessings: The &amp;quot;pathPredicate&amp;quot; was missing from content processors.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.5 2016-11-28:&lt;br /&gt;
:* Printers: Added &amp;quot;Printers.redirectToFile(Level|EnumSet&amp;amp;lt;Level&amp;gt;)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.4 2016-11-25:&lt;br /&gt;
:* IoUtil: Fixed one MalformedURLException.&lt;br /&gt;
:* Added the &amp;quot;ByteFilterOutputStream&amp;quot;, as a complement to the &amp;quot;ByteFilterInputStream&amp;quot;.&lt;br /&gt;
:* ContentsTransformations: Added methods &amp;quot;chain(ContentsTransformer, ContentsTransformer)&amp;quot;, &amp;quot;asInputStream(InputStream delegate, ContentsTransformer, String)&amp;quot; and &amp;quot;asOutputStream(ContentsTransformer, OutputStream delegate, name)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;SelectiveContentsTransformer.create()&amp;quot;, which can conduct many optimizations.&lt;br /&gt;
:* Workover of the &amp;quot;Printers&amp;quot; API: A lot of functionality went from &amp;quot;Printers&amp;quot; to &amp;quot;AbstractPrinter&amp;quot;; the old methods, however, remain, and are now marked as @deprecated.&lt;br /&gt;
:* IoUtil: Added methods &amp;quot;findOnPath(File[], String resourceName)&amp;quot; and &amp;quot;copyTree(URL, File)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;de.unkrig.commons.lang.ClassLoaders&amp;quot;.&lt;br /&gt;
:* Slightly clarified the wording of the license: Replaced &amp;quot;author&amp;quot; with &amp;quot;copyright holder and its contributors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.3, 2016-11-07:&lt;br /&gt;
:* commons-file: The &amp;quot;formats&amp;quot; files didn&#039;t make it into the JAR, because they were in &amp;quot;src/main/java&amp;quot; instead of &amp;quot;src/main/resource&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.2, 2016-11-07:&lt;br /&gt;
:* XmlUtil.parse(): Detect and throw IOExceptions (esp. FileNotFoundException) properly.&lt;br /&gt;
:* commons-junit4: Removed the unnecessary dependency on &amp;quot;org.apache.commons:commons-compress&amp;quot;.&lt;br /&gt;
:* For unknown reasons, the POM of org.apache.commons:commons-compress fails to declare the dependency on &amp;quot;org.tukaani:xz&amp;quot;, although it definitely depends on it. Thus added the dependency in &amp;quot;de.unkrig.commons:commons-file&amp;quot;&#039;s POM.&lt;br /&gt;
:* &amp;quot;IoUtil.parallel()&amp;quot;, as a side effect, caused the JVM to not terminate when it is shut down orderly (i.e. &amp;quot;main()&amp;quot; returns or &amp;quot;System.exit()&amp;quot; is invoked).&lt;br /&gt;
:* Added &amp;quot;ThreadUtil.DAEMON_THREAD_FACTORY&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.1, 2016-10-30:&lt;br /&gt;
:* Removed the nasty circular dependencies around &amp;quot;commons-junit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.2.0, 2016-10-24:&lt;br /&gt;
:* Replaced the old ANT build with MAVEN.&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.12, 2016-10-14:&lt;br /&gt;
:* Bug fixes in &amp;quot;ProducerUtil.cache()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.11, 2016-08-13:&lt;br /&gt;
:* ProducerUtil.cache...(): The &amp;quot;invalidationCondition&amp;quot; was treated the wrong way around in some places. Pulled things straigt.&lt;br /&gt;
:* PredicateUtil: Added method &amp;quot;static synchronizedPredicate(Predicate)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.10, 2016-08-12:&lt;br /&gt;
:* ProducerUtil.cache(): When the first call of &amp;quot;delegate.produce()&amp;quot; threw an exception, then the NEXT invocation returned NULL (instead of calling &amp;quot;delegate.produce()&amp;quot; again).&lt;br /&gt;
:* ProducerUtil: Added &amp;quot;cacheAsynchronously()&amp;quot; and &amp;quot;atMostEvery(ms, firstProduct, startAtTrueProduct)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.9, 2016-08-02:&lt;br /&gt;
:* Fixed the bounds of of the parameters of some &amp;quot;MapUtil()&amp;quot; methods, to make them more versatile.&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.8, 2016-07-26:&lt;br /&gt;
:* Moved various map-related methods from &amp;quot;CollectionUtil&amp;quot; to &amp;quot;MapUtil&amp;quot; (where they actually belong), marked the original methods with &amp;quot;@Deprecated&amp;quot; and replaced them with invocations of the &amp;quot;new&amp;quot; methods.&lt;br /&gt;
:* Moved a few more fields and methods from &amp;quot;CollectionUtil&amp;quot; to &amp;quot;IterableUtil&amp;quot; and &amp;quot;IteratorUtil&amp;quot;, where they belong.&lt;br /&gt;
:* Added many missing bounds to method parameters to make the methods more flexible.&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.7, 2016-06-17:&lt;br /&gt;
:* Added &amp;quot;ObjectUtil.hashCode()&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;PredicateUtil.always(boolean)&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;PredicateUtil.xor()&amp;quot;.&lt;br /&gt;
:* &amp;quot;Predicate&amp;amp;lt;T&amp;gt;&amp;quot; now extends &amp;quot;PredicateWhichThrows&amp;amp;lt;T, RuntimeException&amp;gt;&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;ProducerUtil.cache(delegate, condition)&amp;quot;.&lt;br /&gt;
:* &amp;quot;commons/doclet&amp;quot;: Added support for the inline tags &amp;quot;{@docRoot}&amp;quot;, &amp;quot;{@literal}&amp;quot;, &amp;quot;{@constantsof}&amp;quot; and &amp;quot;{@constantsofplain}&amp;quot;.&lt;br /&gt;
:* CommandLineOptions: Initial support for &amp;quot;option cardinality&amp;quot; and &amp;quot;option group cardinality&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;de.unkrig.commons.util.Enums&amp;quot;.&lt;br /&gt;
:* Added the &amp;quot;IdentityHashSet&amp;quot;.&lt;br /&gt;
:* Added methods &amp;quot;Pipe.read(byte[])&amp;quot; and &amp;quot;Pipe.write(byte[])&amp;quot;.&lt;br /&gt;
:* Changed type parameter &amp;quot;EX&amp;quot; of &amp;quot;(Consumer|Function|Predicate|Producer|Runnable|Transformer)WhichThrows&amp;quot; interfaces from &amp;quot;extends Exception&amp;quot; to &amp;quot;extends Throwable&amp;quot; to allow for seamless handlich of the &amp;quot;Longjump&amp;quot; throwable.&lt;br /&gt;
:* Added a static &amp;quot;ignoreExceptions()&amp;quot; method to the &amp;quot;(Consumer|Function|Predicate|Producer|Runnable|Transformer)Util&amp;quot; classes.&lt;br /&gt;
:* Longjump: Added various &amp;quot;catchLongjump()&amp;quot; methods for easy integration with Java 8 lambdas.&lt;br /&gt;
:* Added the following methods:&lt;br /&gt;
:** IoUtil.copy(File, File, CollisionStrategy)&lt;br /&gt;
:** IoUtil.copyTree(File, File, CollisionStrategy)&lt;br /&gt;
:** IoUtil.isContentIdentical(File, File)&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.6, 2016-03-21:&lt;br /&gt;
:* Added &amp;quot;ObjectUtil.almostNull()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.5, 2016-03-14:&lt;br /&gt;
:* de.unkrig.commons.io.IoUtil: Added &amp;quot;skip()&amp;quot; and &amp;quot;skipAll()&amp;quot;.&lt;br /&gt;
:* de.unkrig.commons.text.PatternUtil: Replaced the &amp;quot;Replacer&amp;quot; interface with a &amp;quot;Function&amp;amp;lt;Matcher, String&amp;gt;&amp;quot;.&lt;br /&gt;
:* de.unkrig.commons.file.ExceptionHandler: Handler methods now have, for consistency with the other APIs, an additional parameter &amp;quot;String path&amp;quot;.&lt;br /&gt;
:* de.unkrig.commons.net: TcpServer(SSLContext): Remove several &amp;quot;cipher suites&amp;quot; from the SSL context because otherwise some modern browsers refuse to connect with this server.&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.4, 2015-11-11:&lt;br /&gt;
:* de.unkrig.commons.text: JavaScanner/JsonScanner: The CXX_COMMENT now INCLUDES the trailing line break.&lt;br /&gt;
:* de.unkrig.commons.net: Added Utility class &amp;quot;UrlConnections&amp;quot;, with the single method &amp;quot;followRedirects2()&amp;quot;.&lt;br /&gt;
:* de.unkrig.commons.text: Replaced &amp;quot;CamelCase&amp;quot; with the more versatile &amp;quot;Notations&amp;quot; helper class.&lt;br /&gt;
:* de.unkrig.util.collections: Added the &amp;quot;Stack&amp;quot; interface and its implementation &amp;quot;ArrayStack&amp;quot;.&lt;br /&gt;
:* de.unkrig.commons.lang: Added the &amp;quot;FunctionWhichThrows&amp;quot; interface and the &amp;quot;Functions&amp;quot; utility class.&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.3, 2015-09-19:&lt;br /&gt;
:* de.unkrig.commons.doclet: Removed the concept of generating MEDIAWIKI markup - MEDIAWIKI is for COLLABORATION, not for documentation.&lt;br /&gt;
:* Added &amp;quot;de.unkrig.commons.util.CommandLineOptions&amp;quot; for elegant command line processing.&lt;br /&gt;
:* Added &amp;quot;de.unkrig.commons.util.concurrent.ByteStreamSequentializer&amp;quot; and &amp;quot;ObjectSequentializer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.2, 2015-08-31:&lt;br /&gt;
:* Added optional dependencies on &#039;xz&#039; and APACHE COMPRESS.&lt;br /&gt;
:* Added &amp;quot;de.unkrig.commons.doclet&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;de.unkrig.commons.text.xml&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;de.unkrig.commons.util.collections.IteratorUtil&amp;quot;.&lt;br /&gt;
:* Various bug fixes in de.unkrig.commons.file&lt;br /&gt;
:* Added &amp;quot;de.unkrig.commons.file.contentstransformation.TextTransformer&amp;quot;.&lt;br /&gt;
:* &amp;quot;de.unkrig.commons.file.fileprocessing&amp;quot; now supports parallel execution.&lt;br /&gt;
:* The &amp;quot;JavaScanner&amp;quot; now decodes unicode escapes - strictly speaking: wrong, but very useful in some situations.&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.1, 2015-02-24:&lt;br /&gt;
:* Gave up on Java 5 compatibility; Java &amp;gt;= 6 is now required.&lt;br /&gt;
:* UPDATE no longer takes two separate paramaters &#039;glob&#039; and &#039;update-file&#039;, but one parameter &#039;glob=update-file&#039;, which makes it possible to use variable references when creating the &#039;update-file&#039; name.&lt;br /&gt;
:* Push releases to OSSRH and eventually to MAVEN CENTRAL&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.0, 2015-02-04:&lt;br /&gt;
:* Major refactoring of &#039;de.unkrig.commons.file.fileprocessing&#039; and &#039;de.unkrig.commons.file.contentsprocessing&#039;.&lt;br /&gt;
:* 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.&lt;br /&gt;
:* Added &#039;de.unkrig.commons.lang.security.Sandbox&#039;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.5, 2014-05-01:&lt;br /&gt;
:* Moved the &amp;amp;lt;log&amp;gt;, &amp;amp;lt;logging&amp;gt; and &amp;amp;lt;simpleLogging&amp;gt; tasks from &#039;de.unkrig.commons.util&#039; to &#039;de.unkrig.antcontrib&#039;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.4, 2014-04-29:&lt;br /&gt;
:* &#039;keepOriginals&#039; did not work for in-place file transformations.&lt;br /&gt;
:* &amp;amp;lt;simplelogging&amp;gt;: Added attribute &#039;spec=&amp;quot;...&amp;quot;&#039;.&lt;br /&gt;
:* &amp;amp;lt;simpleLogging&amp;gt;: Attribute &#039;debug=&amp;quot;...&amp;quot;&#039; no longer is boolean, but &amp;quot;FINE|FINER|FINEST&amp;quot;.&lt;br /&gt;
:* &amp;amp;lt;logging&amp;gt;: Removed attribute &#039;parent=&amp;quot;...&amp;quot;&#039;&lt;br /&gt;
:* &amp;amp;lt;logging&amp;gt;: Added attribute &#039;clearFilter=&amp;quot;true&amp;quot;&#039;.&lt;br /&gt;
:* Renamed task &amp;amp;lt;simplelogging&amp;gt; to &amp;amp;lt;simpleLogging&amp;gt; (with a big &#039;L&#039;).&lt;br /&gt;
&lt;br /&gt;
; Versions 1.0.3 and earlier:&lt;br /&gt;
: No change log available.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Cs-contrib.unkrig.de&amp;diff=51</id>
		<title>Cs-contrib.unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Cs-contrib.unkrig.de&amp;diff=51"/>
		<updated>2026-07-04T08:06:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Important =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
This project adds custom checks, filters and quickfixes for [http://checkstyle.sourceforge.net/ CheckStyle] and [http://eclipse-cs.sourceforge.net/ Eclipse-CS].&lt;br /&gt;
&lt;br /&gt;
This project uses the [[Cs-doclet|CS doclet]] (internally) to generate its CheckStyle and eclipse-cs metadata files.&lt;br /&gt;
&lt;br /&gt;
Cs-contrib 1.2.21+ requires the CheckStyle core version 8.21+, because there was an (accidential) breaking change in that version.&lt;br /&gt;
&lt;br /&gt;
= Download =&lt;br /&gt;
&lt;br /&gt;
Install the ECLIPSE plug-in from this update site:&lt;br /&gt;
     http://cs-contrib.unkrig.de/update&lt;br /&gt;
&lt;br /&gt;
If you&#039;re only interested in the checks (and not the ECLIPSE plug-in), you can download the most recent &#039;de.unkrig.cs-contrib.core_*.jar&#039; file from&lt;br /&gt;
     http://cs-contrib.unkrig.de/update/plugins/&lt;br /&gt;
and put it on CheckStyle&#039;s classpath.&lt;br /&gt;
&lt;br /&gt;
A [http://cs-contrib.unkrig.de/CHANGELOG.txt change log] is also available.&lt;br /&gt;
&lt;br /&gt;
= Documentation =&lt;br /&gt;
&lt;br /&gt;
The [http://cs-contrib.unkrig.de/csdoc/ documentation for the cs-contrib checks, filters and quickfixes] was generated by the [http://doclet.unkrig.de CS doclet]&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
CS-CONTRIB.UNKRIG.DE is published under the &amp;quot;[[New BSD License]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Source Code =&lt;br /&gt;
&lt;br /&gt;
The source code of &amp;lt;code&amp;gt;cs-contrib&amp;lt;/code&amp;gt; (the CheckStyle extension) is on GITHUB:&lt;br /&gt;
&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib/&lt;br /&gt;
&lt;br /&gt;
The source code of the Eclipse plugin (&amp;lt;code&amp;gt;.core&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.branding&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.feature&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.updatesite&amp;lt;/code&amp;gt;) is also on GITHUB:&lt;br /&gt;
&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib.branding&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib.core&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib.core_test&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib.feature&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib.updatesite&lt;br /&gt;
    https://github.com/aunkrig/cs-contrib_dist&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Zz.unkrig.de&amp;diff=50</id>
		<title>Zz.unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Zz.unkrig.de&amp;diff=50"/>
		<updated>2026-07-04T08:05:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Important =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of 2025, I have discontinued my software development activities and marked&lt;br /&gt;
all my repositories as archived and read-only. A big thank you goes to all the&lt;br /&gt;
contributors, who made the work a lot of fun!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
A set of command-line tools that handle not only directories and files, but also archive and compressed files, and even nested archive files. They can even disassemble Java &amp;lt;code&amp;gt;.class&amp;lt;/code&amp;gt; files on-the fly and operate on the disassembly.&lt;br /&gt;
&lt;br /&gt;
== Tool Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== zzdiff ===&lt;br /&gt;
&lt;br /&gt;
Computes the differences between files, directory trees, archive file entries, compressed files and prints them in various formats; widely compatible with the UNIX&amp;amp;trade; DIFF command line utility.&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/maindoc/zz-diff/Main.main(String%5b%5d).html command line tool documentation].&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/antdoc/index.html?tasks/zzdiff.html ANT task documentation].&lt;br /&gt;
&lt;br /&gt;
=== zzfind ===&lt;br /&gt;
&lt;br /&gt;
Finds files in directory trees and entries in archive files by various criteria; widely compatible with the UNIX&amp;amp;trade; FIND command line utility.&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/maindoc/zz-find/Main.main(String%5b%5d).html command line tool documentation] (or the [http://zz.unkrig.de/maindoc/zz-find/Main.main(String%5b%5d).txt plain text version]).&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/antdoc/index.html?tasks/zzfind.html ANT task documentation].&lt;br /&gt;
&lt;br /&gt;
=== zzgrep ===&lt;br /&gt;
&lt;br /&gt;
Finds lines in files in directory trees and in entries in archive files by regular expressions; widely compatible with the UNIX&amp;amp;trade; GREP command line utility.&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/maindoc/zz-grep/Main.main(String%5b%5d).html command line tool documentation].&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/antdoc/index.html?tasks/zzgrep.html ANT task documentation].&lt;br /&gt;
&lt;br /&gt;
=== zzpack ===&lt;br /&gt;
&lt;br /&gt;
Creates an archive file from a set of given files, directories, and archive entries.&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/maindoc/zz-pack/Main.main(String%5b%5d).html command line tool documentation].&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/antdoc/index.html?tasks/zzpack.html ANT task documentation].&lt;br /&gt;
&lt;br /&gt;
=== zzpatch ===&lt;br /&gt;
&lt;br /&gt;
Modifies the contents of files in directory trees and of entries in archive files by various criteria; widely compatible with the UNIX&amp;amp;trade; PATCH command line utility.&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/maindoc/zz-patch/Main.main(String%5b%5d).html command line tool documentation].&lt;br /&gt;
&lt;br /&gt;
Read the [http://zz.unkrig.de/antdoc/index.html?tasks/zzpatch.html ANT task documentation].&lt;br /&gt;
&lt;br /&gt;
== Download and Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Runnable JAR files ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;form method=&amp;quot;get&amp;quot; action=&amp;quot;https://repository.sonatype.org/service/local/artifact/maven/redirect&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;r&amp;quot; value=&amp;quot;central-proxy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;g&amp;quot; value=&amp;quot;de.unkrig.zz&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;v&amp;quot; value=&amp;quot;LATEST&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;c&amp;quot; value=&amp;quot;jar-with-dependencies&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    Latest version of&lt;br /&gt;
    &amp;lt;select name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-diff&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-find&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-grep&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-pack&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-patch&amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;lt;/select&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;DOWNLOAD&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MS WINDOWS executables ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;form method=&amp;quot;get&amp;quot; action=&amp;quot;https://repository.sonatype.org/service/local/artifact/maven/redirect&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;r&amp;quot; value=&amp;quot;central-proxy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;g&amp;quot; value=&amp;quot;de.unkrig.zz&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;v&amp;quot; value=&amp;quot;LATEST&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;p&amp;quot; value=&amp;quot;exe&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    Latest version of&lt;br /&gt;
    &amp;lt;select name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-diff&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-find&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-grep&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-pack&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-patch&amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;lt;/select&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;DOWNLOAD&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice: These executables require an installed JRE; at least version 1.6. They will complain if they cannot find a suitable JRE, and give advice how to get things running.&lt;br /&gt;
&lt;br /&gt;
=== APACHE ANT libraries ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;form method=&amp;quot;get&amp;quot; action=&amp;quot;https://repository.sonatype.org/service/local/artifact/maven/redirect&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;r&amp;quot; value=&amp;quot;central-proxy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;g&amp;quot; value=&amp;quot;de.unkrig.zz&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;v&amp;quot; value=&amp;quot;LATEST&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;c&amp;quot; value=&amp;quot;jar-with-dependencies&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    Latest version of&lt;br /&gt;
    &amp;lt;select name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;option value=&amp;quot;zz-all&amp;quot;&amp;gt;All-in-one&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-diff&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-find&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-grep&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-pack&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-patch&amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;lt;/select&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;DOWNLOAD&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use the ANT types, insert one of the following lines in your build script:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;taskdef resource=&amp;quot;de/unkrig/zz/zz-diff.xml&amp;quot;  classpath=&amp;quot;path/to/zz-diff-x.y.z-jar-with-dependencies.jar&amp;quot;  /&amp;gt;&lt;br /&gt;
  &amp;lt;taskdef resource=&amp;quot;de/unkrig/zz/zz-find.xml&amp;quot;  classpath=&amp;quot;path/to/zz-find-x.y.z-jar-with-dependencies.jar&amp;quot;  /&amp;gt;&lt;br /&gt;
  &amp;lt;taskdef resource=&amp;quot;de/unkrig/zz/zz-grep.xml&amp;quot;  classpath=&amp;quot;path/to/zz-grep-x.y.z-jar-with-dependencies.jar&amp;quot;  /&amp;gt;&lt;br /&gt;
  &amp;lt;taskdef resource=&amp;quot;de/unkrig/zz/zz-pack.xml&amp;quot;  classpath=&amp;quot;path/to/zz-pack-x.y.z-jar-with-dependencies.jar&amp;quot;  /&amp;gt;&lt;br /&gt;
  &amp;lt;taskdef resource=&amp;quot;de/unkrig/zz/zz-patch.xml&amp;quot; classpath=&amp;quot;path/to/zz-patch-x.y.z-jar-with-dependencies.jar&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you use more than one of the tools in your build script, it is more efficient to use the &amp;quot;all-in-one&amp;quot; JAR file:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;taskdef resource=&amp;quot;de/unkrig/zz/zz-all.xml&amp;quot; classpath=&amp;quot;path/to/zz-all-x.y.z-jar-with-dependencies.jar&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Java Library ===&lt;br /&gt;
&lt;br /&gt;
The ZZ tools also have a public Java API that can be used from by any Java application. You can either download and use this JAR file, or, if you&#039;re using MAVEN, put in your &amp;quot;pom.xml&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;dependency&amp;gt;&lt;br /&gt;
     &amp;lt;groupId&amp;gt;de.unkrig.zz&amp;lt;/groupId&amp;gt;&lt;br /&gt;
     &amp;lt;artifactId&amp;gt;zz-diff&amp;lt;/artifactId&amp;gt; &amp;lt;!-- Or zz-find, zz-grep, zz-pack, zz-patch. --&amp;gt;&lt;br /&gt;
     &amp;lt;version&amp;gt;x.y.z&amp;lt;/version&amp;gt;&lt;br /&gt;
 &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the API documentation:&lt;br /&gt;
&lt;br /&gt;
* [http://zz.unkrig.de/javadoc/zz-diff/ zz-diff API documentation]&lt;br /&gt;
* [http://zz.unkrig.de/javadoc/zz-find/ zz-find API documentation]&lt;br /&gt;
* [http://zz.unkrig.de/javadoc/zz-grep/ zz-grep API documentation]&lt;br /&gt;
* [http://zz.unkrig.de/javadoc/zz-pack/ zz-pack API documentation]&lt;br /&gt;
* [http://zz.unkrig.de/javadoc/zz-patch/ zz-patch API documentation]&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;form method=&amp;quot;get&amp;quot; action=&amp;quot;https://repository.sonatype.org/service/local/artifact/maven/redirect&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;r&amp;quot; value=&amp;quot;central-proxy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;g&amp;quot; value=&amp;quot;de.unkrig.zz&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;v&amp;quot; value=&amp;quot;LATEST&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;c&amp;quot; value=&amp;quot;sources&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    Source code is available on &amp;lt;a href=&amp;quot;https://github.com/aunkrig/zz&amp;quot;&amp;gt;GITHUB&amp;lt;/a&amp;gt;,&lt;br /&gt;
    and also through MAVEN:&lt;br /&gt;
    &amp;lt;select name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-diff&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-find&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-grep&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-pack&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;zz-patch&amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;lt;/select&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;DOWNLOAD&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ZZ tools make heavy use of [http://commons.unkrig.de/ commons.unkrig.de].&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
ZZ.UNKRIG.DE is published under the &amp;quot;[[New BSD License]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Change Log ==&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.11-SNAPSHOT (not yet released):&lt;br /&gt;
:* -&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.10, 2022-12-29:&lt;br /&gt;
:* Changed handling of &amp;quot;-&amp;quot; to ResourceProcessings.STDIN_URL.&lt;br /&gt;
:* ZZDIFF can now handle &amp;quot;-&amp;quot; (stdin) as one of its two inputs.&lt;br /&gt;
:* ZZPATCH: --substitute: Removed the concept of the &amp;quot;replacement mode&amp;quot;, because the extended replacement syntax just implements the &amp;quot;literal&amp;quot; and &amp;quot;expression&amp;quot; replacement modes.&lt;br /&gt;
:* ZZPACK: Added the &amp;quot;--rename&amp;quot; feature.&lt;br /&gt;
:* ZZPATCH: Substitution: Replacement mode &amp;quot;REPLACEMENT_STRING&amp;quot; now supports &amp;quot;ext syntax&amp;quot;, i.e. &amp;quot;${...}&amp;quot; embedded expressions.&lt;br /&gt;
:* ZZPATCH: ExitException message is now &amp;quot;Printers.info()&amp;quot;ed instead of &amp;quot;Printers.verbose()&amp;quot;ed.&lt;br /&gt;
:* ZZFIND: Greatly simplified the computation of the expression variables.&lt;br /&gt;
:* ZZFIND: Fixed an exception when finding in STDIN: STDIN does not have the properties &amp;quot;readable&amp;quot;, &amp;quot;writable&amp;quot; and &amp;quot;executable&amp;quot;.&lt;br /&gt;
:* ZZFIND: Class file version can now be accessed by &amp;quot;cf.javaVersion&amp;quot;.&lt;br /&gt;
:* ZZFIND: MAINDOC: Documented the &amp;quot;archiveEntry&amp;quot; variable.&lt;br /&gt;
:* ZZGREP: Moved &amp;quot;Grep.lineCounter()&amp;quot; to &amp;quot;ConsumerUtil&amp;quot;.&lt;br /&gt;
:* ZZGREP: Eliminated the 65536-characters-per-line limit -- finds and counts matches now also in very long lines.&lt;br /&gt;
:* ZZPATCH: Added the &amp;quot;--assert-count&amp;quot; condition for updates/substitution replacements/patch hunks/removals/renamings/additions.&lt;br /&gt;
:* ZZFIND: Learned that the various ZIP archive libraries return random values for &amp;quot;ZipEntry.getMethod()&amp;quot; and &amp;quot;ZipEntry.getCrc()&amp;quot;, thus made the test cases tolerant against these.&lt;br /&gt;
:* ZZFIND: Don&#039;t print a stack trace on predicate parse errors; only print the error message.&lt;br /&gt;
:* ZZPATCH: Added command line options for archive decryption: --7z-input-file-password --zip-input-file-password --password&lt;br /&gt;
:* ZZPATCH: Added command line options for archive compression and encryption: --zip-output-entry-compression-level --zip-output-file-password --zip-output-file-encryption-method&lt;br /&gt;
:* ZZFIND: Added short command line option for archive decryption: --password&lt;br /&gt;
:* ZZFIND: Added the &amp;quot;-version&amp;quot; command line option.&lt;br /&gt;
:* ZZGREP: Added command line options &amp;quot;--input-encoding&amp;quot; and &amp;quot;--output-encoding&amp;quot;. (Previously, the output encoding was not configurable.)&lt;br /&gt;
:* ZZGREP: Fixed the printing of &amp;quot;--&amp;quot; separator lines between context-grep chunks.&lt;br /&gt;
:* ZZFIND: MAINDOC: Documented priority of operators.&lt;br /&gt;
:* ZZFIND: CatAction: Entries that have no input stream (e.g. directories or directory archive entries) are silently ignored, because that is practical: Otherwise, you&#039;d always have to put &amp;quot;-type normal*&amp;quot; right before the &amp;quot;-cat&amp;quot; action.&lt;br /&gt;
:* ZZFIND: -copy action: Now ignore entries that have no input stream (e.g. directories or directory archive entries), because that is practical: Otherwise, you&#039;d always have to put &amp;quot;-type normal*&amp;quot; right before the &amp;quot;-copy&amp;quot; action.&lt;br /&gt;
:* ZZFIND: -copy action: Attempt to restore each file&#039;s &amp;quot;last modification date&amp;quot;, too.&lt;br /&gt;
:* ZZPATCH: Unified DIFF format: Some DIFF tools (namely GNU diffutils 3.5) put a TAB character (instead of a SPACE) between the file name and the date.&lt;br /&gt;
:* ZZFIND: Added &amp;quot;--toFile&amp;quot; option to &amp;quot;-disassemble&amp;quot;.&lt;br /&gt;
:* ZZFIND: Added new variable &amp;quot;archiveEntry&amp;quot;.&lt;br /&gt;
:* ZZFIND: Added action &amp;quot;-java-class-file&amp;quot;.&lt;br /&gt;
:* ZZFIND: Added expression variable &amp;quot;compressionMethod&amp;quot; (for archive entries).&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.9, 2020-11-06:&lt;br /&gt;
:* Updated jdisasm to 1.0.6.&lt;br /&gt;
:* Updated de.unkrig.commons to 1.2.15.&lt;br /&gt;
:* Removed the generation of the &amp;quot;...-antlib.jar&amp;quot; file, because &amp;quot;...-jar-with-dependencies.jar&amp;quot; can be used as an ANTLIB as well.&lt;br /&gt;
:* Fixed the file type in the output of -ls.&lt;br /&gt;
:* Added expression variables &amp;quot;readable&amp;quot;, &amp;quot;writable&amp;quot; and &amp;quot;executable&amp;quot;.&lt;br /&gt;
:* Adapted to an incompatible API change in &amp;quot;commons-file&amp;quot; (all content processing was augmented with an optional &amp;quot;lastModifiedDate&amp;quot; parameter).&lt;br /&gt;
:* Fixed an NPE that occurred with 7Z archive entries that have NO modification date set.&lt;br /&gt;
:* ZZFIND now compiles with JDK 1.8 (before it was 1.6).&lt;br /&gt;
:* Major refactoring: Replaced &amp;quot;Mappings properties&amp;quot; with &amp;quot;Map&amp;lt;String, Function&amp;lt;Object, Object&amp;gt;&amp;gt; properties.&lt;br /&gt;
:* Implemented the new expression variables &amp;quot;_map&amp;quot;, &amp;quot;_keys&amp;quot; and &amp;quot;_values&amp;quot;.&lt;br /&gt;
:* Context diff: The &amp;quot;hunk separator line&amp;quot; (&amp;quot;--&amp;quot;) was missing.&lt;br /&gt;
:* Actions that read the contents of a document (-cat, -copy, -disassemble, -digest, -checksum) didn&#039;t for &amp;quot;normal-file&amp;quot; documents.&lt;br /&gt;
:* &amp;quot;--nowarn&amp;quot;, &amp;quot;--quiet&amp;quot;, &amp;quot;--verbose&amp;quot; and &amp;quot;--debug&amp;quot; now not only configure the &amp;quot;Printers&amp;quot;, but also &amp;quot;SimpleLogging&amp;quot;.&lt;br /&gt;
:* Added the &amp;quot;--replacementMode&amp;quot; option which allows for more complex replacements than the java.util.regex.Matcher can offer&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.8, 2019-10-09:&lt;br /&gt;
:* zzgrep: Implemented &amp;quot;-e&amp;quot;.&lt;br /&gt;
:* zzgrep: Implemented &amp;quot;--byte-offset&amp;quot;, &amp;quot;--with-path&amp;quot;, &amp;quot;--no-path&amp;quot;, &amp;quot;--label&amp;quot;, &amp;quot;--line-number&amp;quot;, &amp;quot;--after-context&amp;quot;, &amp;quot;--before-context&amp;quot; and &amp;quot;--context&amp;quot;.&lt;br /&gt;
:* &amp;lt;zzpatch&amp;gt; Ant task: &amp;quot;&amp;lt;substitution&amp;gt;&amp;lt;regex&amp;gt;...&amp;quot; and &amp;quot;...&amp;lt;replacement&amp;gt;...&amp;quot;: Property &amp;quot;replacement&amp;quot; was missing for &amp;quot;addText()&amp;quot;.&lt;br /&gt;
:* Major refactoring of &amp;quot;zz.Find&amp;quot; - removed tons of copied code.&lt;br /&gt;
:* zzfind: Improved handling of corrupt archives and compressed contents.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.7, 2019-08-05:&lt;br /&gt;
:* In addition to &amp;quot;...-jar-with-dependencies.jar&amp;quot;, generate a &amp;quot;...-antlib.jar&amp;quot; file, where the ANT classes are NOT included.&lt;br /&gt;
:* The &amp;quot;-copy&amp;quot; action now supports a &amp;quot;--append&amp;quot; (alias &amp;quot;-a&amp;quot;) modifier.&lt;br /&gt;
:* Now using &amp;quot;ExpressionEvaluator.parseExt()&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;--printf&amp;quot; command line action.&lt;br /&gt;
:* Fixed the &amp;quot;line equivalence&amp;quot; and the &amp;quot;ignore&amp;quot; feature; both were accidentially broken with revision 6980 (affects only release 1.3.5).&lt;br /&gt;
:* The &amp;quot;zz-diff&amp;quot; command line tool now also accepts URLs on its command line.&lt;br /&gt;
:* &amp;quot;--verbose&amp;quot; had no effect; now it prints the names of files and archive entries that are searched.&lt;br /&gt;
&lt;br /&gt;
; Changes in Version 1.3.6, 2018-07-24:&lt;br /&gt;
:* Added a test case for &amp;quot;zzpatch --substitute --iff&amp;quot;.&lt;br /&gt;
:* Substitution conditions now support a new variable, &amp;quot;occurrence&amp;quot;.&lt;br /&gt;
:* Added a &amp;quot;&amp;lt;condition&amp;gt;&amp;quot; subelement on the &amp;quot;&amp;lt;substitution&amp;gt;&amp;quot; element. This is useful, e.g., to replace only the FIRST match.&lt;br /&gt;
:* For conformance with GREP, exit with status 2 (not 1) on errors.&lt;br /&gt;
:* &amp;lt;zzfind&amp;gt;: Added the &amp;quot;&amp;lt;prune /&amp;gt;&amp;quot; and &amp;quot;&amp;lt;delete /&amp;gt;&amp;quot; subelements.&lt;br /&gt;
:* zzfind: Renamed option &amp;quot;--depth&amp;quot; to &amp;quot;--descendants-first&amp;quot; (and left the original as an alias).&lt;br /&gt;
:* &amp;lt;zzfind&amp;gt;: Renamed the depth=&amp;quot;...&amp;quot; attribute to descendantsFirst=&amp;quot;...&amp;quot;.&lt;br /&gt;
:* Added the &amp;quot;-prune&amp;quot; and &amp;quot;-delete&amp;quot; actions.&lt;br /&gt;
:* Added &amp;quot;&amp;amp;&amp;amp;&amp;quot; and &amp;quot;-and&amp;quot; as aliases for &amp;quot;-a&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;||&amp;quot; and &amp;quot;-or&amp;quot; as aliases for &amp;quot;-o&amp;quot;.&lt;br /&gt;
:* Added options &amp;quot;da-verbose&amp;quot;, &amp;quot;da-source-directory&amp;quot; and &amp;quot;da-symbolic-labels&amp;quot;.&lt;br /&gt;
:* Continue with next archive entry on IOException.&lt;br /&gt;
:* ZZGREP: When run with a list file-or-dirs, only every second file-or-dir was searched.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.4, 2017-02-03:&lt;br /&gt;
:* Added a workaround for: MS WINDOWS 7: Read-protected directory produces: isDirectory() =&amp;gt; true canRead()     =&amp;gt; true list()        =&amp;gt; null listFiles()   =&amp;gt; null (Caused NPEs.)&lt;br /&gt;
:* ZZDIFF: Bug fixed: Document DIFF was always UNIFIED, regardless of the document diff mode setting.&lt;br /&gt;
:* Change version of de.unkrig.commons from &amp;quot;1.2.6-SNAPSHOT&amp;quot; to &amp;quot;1.2.7-SNAPSHOT&amp;quot; (because THAT is the correct post-1.2.6 version).&lt;br /&gt;
:* Renamed &amp;quot;namePredicate&amp;quot; to &amp;quot;pathPredicate&amp;quot;.&lt;br /&gt;
:* Replaced the &amp;quot;name=...&amp;quot; attribute with &amp;quot;path=...&amp;quot;, and marked the old attribute as @deprecated.&lt;br /&gt;
:* The &amp;quot;pathPredicate&amp;quot; was missing from content processors.&lt;br /&gt;
:* Generate ANTDOC only for the &amp;quot;zz-all&amp;quot; module, not for &amp;quot;zz-(diff|find|grep|pack|patch)&amp;quot; individually. Saves on build time, and reduces redundant documentation.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.3, 2016-11-28:&lt;br /&gt;
:* Removed unnecessary dependency on &amp;quot;jdisasm&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:* Fixed the classpath for zz-all antdoc.&lt;br /&gt;
:* Added the &amp;quot;--no-recurse-subdirctories&amp;quot; command line option.&lt;br /&gt;
:* Extracted the &amp;quot;DOcumentDiff&amp;quot; class from the &amp;quot;Diff&amp;quot; class.&lt;br /&gt;
:* Added task attribute &amp;quot;recurseSubdirectories=false&amp;quot;.&lt;br /&gt;
:* Added the &amp;quot;Diff.diff(path1, path2, stream1, stream2)&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.2, 2016-11-25:&lt;br /&gt;
:* Added test cases for ZZDIFF.&lt;br /&gt;
:* Added &amp;quot;Diff.execute(String path1, String path2, ...)&amp;quot; to allow for custom &amp;quot;path1&amp;quot; and &amp;quot;path2&amp;quot; strings when reporting differences.&lt;br /&gt;
:* Improved many &amp;quot;DiffException&amp;quot;s&#039; messages.&lt;br /&gt;
:* Slightly clarified the wording of the license: Replaced &amp;quot;author&amp;quot; with &amp;quot;copyright holder and its contributors&amp;quot;.&lt;br /&gt;
:* Include project name and version in APIDOC&#039;s &amp;quot;-header&amp;quot; and &amp;quot;-footer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.1, 2016-11-07:&lt;br /&gt;
:* The JVM (sometimes) did not terminate when it is shut down orderly (i.e. &amp;quot;main()&amp;quot; returns or &amp;quot;System.exit()&amp;quot; is invoked).&lt;br /&gt;
:* Added the &amp;quot;launch4j&amp;quot; maven plugin that creates MS WINDOWS executables from the runnable JAR files.&lt;br /&gt;
:* Made the scope of the &amp;quot;ant&amp;quot; dependency &amp;quot;provided&amp;quot;, so that the classes of &amp;quot;ant.jar&amp;quot; don&#039;t get into the &amp;quot;jar-with-dependencies&amp;quot;.&lt;br /&gt;
:* Added JAVADOC &amp;quot;overview.html&amp;quot; files for the five zz tools.&lt;br /&gt;
:* ZZFIND: Made many methods and nested types PUBLIC, so they can be used via the Java API.&lt;br /&gt;
:* Moved ANTDOC generation from &amp;quot;zz-parent/build.ant&amp;quot; to &amp;quot;zz-parent/pom.xml&amp;quot;.&lt;br /&gt;
:* Added &amp;quot;zz-all&amp;quot;, which is an aggregation of the five ZZ tools.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.3.0, 2016-10-30:&lt;br /&gt;
:* ZZFIND, &amp;lt;zzfind&amp;gt;: Line separator was missing from the &amp;quot;LS&amp;quot; action.&lt;br /&gt;
:* ZZFIND, &amp;lt;zzfind&amp;gt;: Added the &amp;quot;-digest&amp;quot; and &amp;quot;-checksum&amp;quot; actions.&lt;br /&gt;
:* ZZFIND: Allow combinations of file names and &amp;quot;-&amp;quot; (STDIN).&lt;br /&gt;
:* &amp;lt;zzfind&amp;gt;: Added &amp;quot;&amp;lt;true/&amp;gt;&amp;quot; and &amp;quot;&amp;lt;false/&amp;gt;&amp;quot;.&lt;br /&gt;
:* ZZFIND: Added &amp;quot;-true&amp;quot; and &amp;quot;-false&amp;quot;.&lt;br /&gt;
:* &amp;lt;zzfind&amp;gt;: The expression subelements are now named ANT components.&lt;br /&gt;
:* ZZFIND: Variable substitution (in &amp;quot;-echo&amp;quot; and &amp;quot;-copy&amp;quot;) now supports &amp;quot;@variableName&amp;quot; in addition to &amp;quot;@{variable-name}&amp;quot;.&lt;br /&gt;
:* ZZDIFF, &amp;lt;zzdiff&amp;gt;: Added options &amp;quot;addedFile&amp;quot; and &amp;quot;deletedFile&amp;quot; which supersede &amp;quot;newFile&amp;quot; and &amp;quot;unidirectionalNewFile&amp;quot;.&lt;br /&gt;
:* &amp;lt;zzpatch&amp;gt;: File/entry renaming did not work (flag Glob.REPLACEMENT was missing).&lt;br /&gt;
:* &amp;lt;zzfind&amp;gt;: Renamed the &amp;quot;&amp;lt;path&amp;gt;&amp;quot; expression component to &amp;quot;&amp;lt;path_&amp;gt;&amp;quot; to avoid a name clash with the global type with the same name.&lt;br /&gt;
:* Switched from the old ANT build to MAVEN.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.2.5, 2016-02-12:&lt;br /&gt;
:* ZZFIND, &amp;lt;zzfind&amp;gt;: Added the &amp;quot;depth&amp;quot; property.&lt;br /&gt;
:* ZZFIND, &amp;lt;zzfind&amp;gt;: Added the &amp;quot;comma operator&amp;quot;, &amp;quot;-mtime&amp;quot;, &amp;quot;-depth&amp;quot;, &amp;quot;-minDepth&amp;quot; and &amp;quot;-maxDepth&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.2.4, 2016-02-10:&lt;br /&gt;
:* &amp;lt;zzpatch&amp;gt;: &amp;quot;condition=...&amp;quot; is now an attribute of the &amp;lt;patch&amp;gt; subelement, not the task.&lt;br /&gt;
:* zzdiff: Added command line option &amp;quot;--normal&amp;quot;.&lt;br /&gt;
:* All pathes: Compressed file names and compressed contents paths are now suffixed with &#039;%&#039; (instead of &#039;!&#039;) to circumvent problems with &amp;quot;Glob&amp;quot;&#039;s directory prefix mechanism.&lt;br /&gt;
:* ZZFIND on STDIN threw exceptions, because &amp;quot;-ls&amp;quot; requires &amp;quot;isDirectory&amp;quot;, &amp;quot;size&amp;quot;, etc.&lt;br /&gt;
:* ZZFIND: Parsing of special command line argument &amp;quot;-&amp;quot; (for &amp;quot;STDIN&amp;quot;) didn&#039;t work.&lt;br /&gt;
:* ZZGREP: The &amp;quot;-quiet&amp;quot; command line option did not have any effect.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.2.3, 2015-09-27:&lt;br /&gt;
:* ZZFIND command line tool: Option &amp;quot;--look-into&amp;quot;: Glob was compiled WITHOUT the WILDCARD|INCLUDES_EXCLUDES flag.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.2.2, 2015-09-27:&lt;br /&gt;
:* ZZPATCH ant task: Removed attribute &amp;quot;memberName=...&amp;quot; from subelement &amp;quot;&amp;lt;add&amp;gt;&amp;quot;, because the ant task does not traverse directories (opposed to the command line version), and thus adding members to directories is not possible.&lt;br /&gt;
:* ZZDIFF: Fixed some NPEs that occurred when files / entries are EXCLUDED.&lt;br /&gt;
:* ZZFIND: Added the &amp;quot;DisassembleAction&amp;quot; (disassembles a Java .class file).&lt;br /&gt;
:* Generate and publish HTML documentation for ANT tasks with ANTDOC.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.2.1, 2015-05-24:&lt;br /&gt;
:* FIND: Command line tool and ANT task now continue with next directory member on IOExceptions.&lt;br /&gt;
:* DIFF: Added the &amp;quot;tokenization&amp;quot; configuration parameter, which allows for Java token-based DIFFing.&lt;br /&gt;
:* DIFF: Added the &amp;quot;ignoreCStyleComments&amp;quot; and &amp;quot;ignoreCPlusPlusStyleComments&amp;quot; configuration option (relevant iff &amp;quot;tokenization&amp;quot; is &amp;quot;JAVA&amp;quot;).&lt;br /&gt;
:* The classes for the &#039;zzpack&#039; ant task were missing from the jar file.&lt;br /&gt;
:* ZZFIND ant task: Added the &amp;quot;file=...&amp;quot; and &amp;quot;dir=...&amp;quot; attributes.&lt;br /&gt;
:* ZZFIND: Added the &amp;quot;&amp;lt;echo message=...&amp;gt;&amp;quot; and &amp;quot;&amp;lt;property name=... value=...&amp;gt;&amp;quot; actions.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.2.0, 2015-04-30:&lt;br /&gt;
:* &amp;quot;ArchiveFormatFactory&amp;quot; and &amp;quot;CompressionFormatFactory&amp;quot; now register &amp;quot;URLStreamHandler&amp;quot;s for all archive and compression formats, so these can be used as &amp;quot;protocols&amp;quot; of &amp;quot;java.net.URL&amp;quot;, e.g. &amp;quot;zip:file:foo.zip!file.txt&amp;quot;.&lt;br /&gt;
:* Major refactoring of &#039;de.unkrig.commons.file.fileprocessing&#039; and &#039;de.unkrig.commons.file.contentsprocessing&#039;. Effectively, ZZGREP can now use these classes, because &#039;process()&#039; now returns &#039;T&#039;. &lt;br /&gt;
:* Renamed the following classes for consistency with &#039;java.util.Collections&#039;, &#039;...Arrays&#039;, etc.:&lt;br /&gt;
:** ContentsProcessingUtil =&amp;gt; ContentsProcessings&lt;br /&gt;
:** ContentsTransformerUtil =&amp;gt; ContentsTransformations&lt;br /&gt;
:** FileProcessingUtil =&amp;gt; FileProcessings&lt;br /&gt;
:** FileTransformationUtil  =&amp;gt; FileTransformations&lt;br /&gt;
:* ANT integration: Added the &#039;&amp;lt;patch&amp;gt;&#039; filter (for use in ANT &#039;filter chain&#039;s).&lt;br /&gt;
:* ANT integration: Added the &#039;condition&#039; property to the &#039;&amp;lt;zzpatch&amp;gt;&#039; task.&lt;br /&gt;
:* ZZDIFF: Added the &amp;quot;-sequential&amp;quot; command line option.&lt;br /&gt;
:* &amp;lt;zzdiff&amp;gt;: Replaced the &#039;lookInto[Nested](Zip|Gzip)=&amp;quot;...&amp;quot;&#039; attributes with the (more flexible) &#039;lookInto=&amp;quot;...&amp;quot;&#039; attribute.&lt;br /&gt;
:* &amp;lt;zzdiff&amp;gt;: Replaced the &amp;quot;&amp;lt;exclude&amp;gt;&amp;quot; subelements with the &amp;quot;path=...&amp;quot; attribute, eliminating the unusual &amp;quot;negative&amp;quot; logic. &lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.1.0, 2014-10-25:&lt;br /&gt;
:* zzpatch: No file arguments mean &#039;transform STDIN to STDOUT&#039;.&lt;br /&gt;
:* zzpatch: Added &#039;conditions&#039; for the &#039;substitute&#039;, &#039;replace&#039;, &#039;patch&#039;, &#039;remove&#039;, &#039;rename&#039; and &#039;add&#039; features.&lt;br /&gt;
:* zzpatch: Added &#039;dontSortDirectoryMembers&#039; feature.&lt;br /&gt;
:* de.unkrig.commons.file: 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.&lt;br /&gt;
:* &amp;lt;zzpatch&amp;gt;, &amp;lt;zzgrep&amp;gt;: Removed the &#039;dir=&amp;quot;...&amp;quot;&#039; and &#039;sortDirectoryMembers=&amp;quot;...&amp;quot;&#039; attributes from these ANT tasks because recursing directories is ANT&#039;s job.&lt;br /&gt;
:* &amp;lt;zzpatch&amp;gt;, &amp;lt;zzgrep&amp;gt;: Replaced the &#039;lookInto[Nested](Zip|Gzip)=&amp;quot;...&amp;quot;&#039; attributes with the (more flexible) &#039;lookInto=&amp;quot;...&amp;quot;&#039; attribute.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Removed the &amp;quot;dir=...&amp;quot; attribute.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.11, 2014-04-12:&lt;br /&gt;
:* ZZDIFF: Added option &#039;-unchanged-files&#039; resp. ANT task attribute &#039;reportUnchangedFiles=&amp;quot;true&amp;quot;&#039;: Also report unchanged files.&lt;br /&gt;
:* ZZDIFF: Added &#039;-zip&#039; and &#039;-nested-zip&#039; command line options - aliases for &#039;-z&#039; and &#039;-zz&#039;.&lt;br /&gt;
:* ZZFIND: Added the &#039;-copy&#039; action - similar to &#039;-cat&#039;, but copies the data bytewise.&lt;br /&gt;
:* &amp;lt;zzfind&amp;gt;: Added a &#039;&amp;lt;sequential&amp;gt;&#039; subelement.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Added attributes &#039;file=&amp;quot;...&amp;quot;&#039; and &#039;dir=&amp;quot;...&amp;quot;&#039;&lt;br /&gt;
:* &amp;lt;zzpatch&amp;gt;: Added attributes &#039;file=&amp;quot;...&amp;quot;&#039;, &#039;tofile=&amp;quot;...&amp;quot;&#039;, &#039;dir=&amp;quot;...&amp;quot;&#039; and &#039;todir=&amp;quot;...&amp;quot;&#039;&lt;br /&gt;
:* de.unkrig.commons.util: &amp;lt;simplelogging&amp;gt;: Added attribute &#039;spec=&amp;quot;...&amp;quot;&#039;.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Added attribute &#039;property=&amp;quot;...&amp;quot;&#039;.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Added subelement &#039;&amp;lt;search name=&amp;quot;...&amp;quot; regex=&amp;quot;...&amp;quot; caseSensitive=&amp;quot;...&amp;quot;/&amp;gt;&#039;&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Made the &#039;case sensitivity logic&#039; POSITIVE.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Removed the &#039;&amp;lt;include&amp;gt;&#039; and &#039;&amp;lt;exclude&amp;gt;&#039; subelements in favor of &#039;name=&amp;quot;...&amp;quot;&#039;.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: &#039;name=&amp;quot;...&amp;quot;&#039;, &#039;regex=&amp;quot;...&amp;quot;&#039; and &#039;caseSensitive=&amp;quot;...&amp;quot;&#039; are now mutually exclusive with &#039;&amp;lt;search&amp;gt;&#039; subelements.&lt;br /&gt;
:* &amp;lt;zzgrep&amp;gt;: Runtime optimization: Now only the files to which at least one search applies are processed.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.10, 2014-03-22:&lt;br /&gt;
:* ZZDIFF: Added option &#039;-keep-going&#039; resp. ANT task attribute &#039;keepGoing=&amp;quot;true&amp;quot;&#039;: Report errors and continue with next file.&lt;br /&gt;
  &lt;br /&gt;
; Changes in version 1.0.9, 2014-03-20:&lt;br /&gt;
:* COMMONS.UTIL: Added the SIMPLELOGGING task that was missing from &#039;antlib.xml&#039;.&lt;br /&gt;
:* COMMONS.FILE: Inserted lots of logging.&lt;br /&gt;
:* ZZPATCH: Added the &amp;lt;regex&amp;gt; and &amp;lt;replacement&amp;gt; subelements to &amp;lt;substitute&amp;gt;: Alternative to the &#039;regex=...&#039; and &#039;replacement=...&#039; attributes. The major advantage of the subelements is that they can contain &#039;&amp;lt;![CDATA[...]]&amp;gt;&#039; sections where you don&#039;t have to SGML-escape special characters.&lt;br /&gt;
:* ZZPATCH: Added lots of logging to make ANT build file debugging easier.&lt;br /&gt;
:* ZZPATCH: Contents substitution is no longer line-wise, but allows for multi-line matching and replacement.&lt;br /&gt;
:* ZZFIND: Now searching STDIN iff no file specified.&lt;br /&gt;
:* ZZDIFF: Added diff mode &#039;EXIST&#039;, which is like diff mode &#039;QUIET&#039; but ignores CONTENT differences. &lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.8, 2013-11-29:&lt;br /&gt;
:* ZZDIFF: Absent file modes COMPARE_*_WITH_EMPTY: Added and deleted directories were counted as difference, although they shouldn&#039;t.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.7, 2013-11-26:&lt;br /&gt;
:* The ZZ tools now live in ONE jar file; there is a new &#039;Main&#039; class that forks into the various tools&lt;br /&gt;
:* Renamed the tasks from &#039;de.unkrig.zz.diff&#039; to &#039;zzdiff&#039;.&lt;br /&gt;
:* ZZDIFF: Absent file modes COMPARE_ADDED_AND_DELETED_WITH_EMPTY and COMPARE_ADDED_WITH_EMPTY: Added and deleted DIRECTORIES are now treated as EMPTY directories.&lt;br /&gt;
:* ZZDIFF: Added ANT task property &#039;property&#039;.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.6, 2013-10-02:&lt;br /&gt;
:* ZZPATCH: &#039;-patch&#039; now preserves line separators (instead of silently replacing them with the default line separator).&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.5, 2013-10-01:&lt;br /&gt;
:* ZZDIFF: Added the &#039;encoding&#039; attribute to the ant task.&lt;br /&gt;
:* ZZFIND: Added the missing &#039;&amp;lt;cat&amp;gt;&#039; and &#039;&amp;lt;ls&amp;gt;&#039; actions to the ant task.&lt;br /&gt;
:* ZZFIND: Added the &#039;-encoding&#039; option to the command line tool.&lt;br /&gt;
:* ZZGREP: Added the &#039;encoding&#039; attribute to the ant task.&lt;br /&gt;
:* ZZGREP: Added the &#039;-encoding&#039; option to the command line tool.&lt;br /&gt;
:* ZZPATCH: Added &#039;inputEncoding&#039; and &#039;outputEncoding&#039; to &#039;substitution&#039; and &#039;patch&#039;.&lt;br /&gt;
:* ZZPATCH: Added &#039;patchFileEncoding&#039; to &#039;patch&#039;.&lt;br /&gt;
:* ZZPATCH: &#039;-substitute&#039; now preserves line separators (instead of silently replacing them with the default line separator).&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.4, 2013-09-22:&lt;br /&gt;
:* ZZFIND: The &#039;readable&#039;, &#039;writable&#039;, &#039;size&#039; and &#039;modificationTime&#039; tests were missing from the ANT task&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.3, 2013-09-22:&lt;br /&gt;
:* ZZDIFF: Added the &#039;absentFileMode&#039; option (a.k.a. as &#039;-new-file&#039; and &#039;-unidirectional-new-file&#039;).&lt;br /&gt;
:* SimpleLogging: VERBOSE messages were not printed because the OUT_HANDLER was misconfigured.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.2, 2013-07-05:&lt;br /&gt;
:* Fixed a major bug: &#039;SelectiveContentsTransfomer&#039; executed BOTH delegates when the predicate evaluates to FALSE. This didn&#039;t hurt in many cases, but for &#039;zzpatch -update&#039; it did.&lt;br /&gt;
&lt;br /&gt;
; Changes in version 1.0.1, 2013-06-14:&lt;br /&gt;
:* Major refactoring of &#039;de.unkrig.commons&#039;.&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.0, 2012-10-03:&lt;br /&gt;
Initial release.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=CommandLineOptions_tutorial&amp;diff=42</id>
		<title>CommandLineOptions tutorial</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=CommandLineOptions_tutorial&amp;diff=42"/>
		<updated>2024-05-01T20:50:22Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;===Processing command line options is easy, so why do I need a helper?===  To illustrate the reason being, let&amp;#039;s develop a command line application to show the typical problems and how &amp;lt;code&amp;gt;CommandLineOptions&amp;lt;/code&amp;gt; can help you:  &amp;lt;pre&amp;gt; package com.acme.clo_demo;  public class Diff {      public static void main(String[] args) {          boolean brief                = false;         boolean reportIdenticalFiles = false;         int     context              = 3;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Processing command line options is easy, so why do I need a helper?===&lt;br /&gt;
&lt;br /&gt;
To illustrate the reason being, let&#039;s develop a command line application to show the typical problems and how &amp;lt;code&amp;gt;CommandLineOptions&amp;lt;/code&amp;gt; can help you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.acme.clo_demo;&lt;br /&gt;
&lt;br /&gt;
public class Diff {&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
        boolean brief                = false;&lt;br /&gt;
        boolean reportIdenticalFiles = false;&lt;br /&gt;
        int     context              = 3;&lt;br /&gt;
&lt;br /&gt;
        int idx = 0;&lt;br /&gt;
        while (idx &amp;lt; args.length) {&lt;br /&gt;
            String arg = args[idx];&lt;br /&gt;
            if (!arg.startsWith(&amp;quot;-&amp;quot;)) break;&lt;br /&gt;
            idx++;&lt;br /&gt;
            if (&amp;quot;-q&amp;quot;.equals(arg) || &amp;quot;--brief&amp;quot;.equals(arg)) {&lt;br /&gt;
                brief = true;&lt;br /&gt;
            } else&lt;br /&gt;
            if (&amp;quot;-s&amp;quot;.equals(arg) || &amp;quot;--report-identical-files&amp;quot;.equals(arg)) {&lt;br /&gt;
                reportIdenticalFiles = true;&lt;br /&gt;
            } else&lt;br /&gt;
            if (&amp;quot;-C&amp;quot;.equals(arg) || &amp;quot;--Context&amp;quot;.equals(arg)) {&lt;br /&gt;
                context = Integer.parseInt(args[idx++]);&lt;br /&gt;
            } else&lt;br /&gt;
            {&lt;br /&gt;
                System.err.println(&amp;quot;Unrecognized command line option \&amp;quot;&amp;quot; + arg + &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Now process args[idx]... and do the &amp;quot;real work&amp;quot;.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This implementation supports both &amp;quot;short&amp;quot; and &amp;quot;long&amp;quot; options, and detects invalid options. However there is room for improvement:&lt;br /&gt;
* You cannot have &amp;quot;compact&amp;quot; short options, e.g. &amp;quot;&amp;lt;tt&amp;gt;-qs&amp;lt;/tt&amp;gt;&amp;quot; for &amp;quot;&amp;lt;tt&amp;gt;-q -s&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
* You get an &amp;lt;code&amp;gt;ArrayIndexOutOfBoundsException&amp;lt;/code&amp;gt; when &amp;quot;&amp;lt;tt&amp;gt;-C&amp;lt;/tt&amp;gt;&amp;quot; is not followed by an argument.&lt;br /&gt;
* You get a &amp;lt;code&amp;gt;NumberFormatException&amp;lt;/code&amp;gt; when the argument of &amp;quot;&amp;lt;tt&amp;gt;-C&amp;lt;/tt&amp;gt;&amp;quot; cannot be converted to an integer.&lt;br /&gt;
* If the first argument after the options starts with a hyphen, it is identified as an invalid option.&lt;br /&gt;
* The code is not documented.&lt;br /&gt;
* The only support the user gets when it uses the tool is the &amp;quot;Unsupported command line option...&amp;quot; error message.&lt;br /&gt;
&lt;br /&gt;
So here&#039;s the second version that overcomes these deficits:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.acme.clo_demo;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A (rudimentary) re-implementation of the well-known DIFF command line utility.&lt;br /&gt;
 */&lt;br /&gt;
public class Diff {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Parses the command line options and arguments, then prints the differences between two files or two&lt;br /&gt;
     * directories.&lt;br /&gt;
     * &amp;lt;p&amp;gt;&lt;br /&gt;
     *   Supports the following command line options:&lt;br /&gt;
     * &amp;lt;/p&amp;gt;&lt;br /&gt;
     * &amp;lt;dl&amp;gt;&lt;br /&gt;
     *   &amp;lt;dt&amp;gt;--help&amp;lt;/dt&amp;gt;&lt;br /&gt;
     *   &amp;lt;dd&amp;gt;Print usage help and exit&amp;lt;/dd&amp;gt;&lt;br /&gt;
     *   &amp;lt;dt&amp;gt;-q, --brief&amp;lt;/dt&amp;gt;&lt;br /&gt;
     *   &amp;lt;dd&amp;gt;Don&#039;t report the differences, only which files have changed&amp;lt;/dd&amp;gt;&lt;br /&gt;
     *   &amp;lt;dt&amp;gt;-s, --report-identical-files&amp;lt;/dt&amp;gt;&lt;br /&gt;
     *   &amp;lt;dd&amp;gt;Also report about files that did NOT change&amp;lt;/dd&amp;gt;&lt;br /&gt;
     *   &amp;lt;dt&amp;gt;-C &amp;lt;var&amp;gt;NUM&amp;lt;/var&amp;gt;, --context &amp;lt;var&amp;gt;NUM&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
     *   &amp;lt;dd&amp;gt;Report differences in &amp;quot;context diff&amp;quot; format, with &amp;lt;var&amp;gt;NUM&amp;lt;/var&amp;gt; lines of context&amp;lt;/dd&amp;gt;&lt;br /&gt;
     * &amp;lt;/dl&amp;gt;&lt;br /&gt;
     */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
        boolean brief                = false;&lt;br /&gt;
        boolean reportIdenticalFiles = false;&lt;br /&gt;
        int     context              = 3;&lt;br /&gt;
&lt;br /&gt;
        int idx = 0;&lt;br /&gt;
        while (idx &amp;lt; args.length) {&lt;br /&gt;
&lt;br /&gt;
            String arg = args[idx];&lt;br /&gt;
&lt;br /&gt;
            if (!arg.startsWith(&amp;quot;-&amp;quot;)) break;&lt;br /&gt;
&lt;br /&gt;
            idx++;&lt;br /&gt;
&lt;br /&gt;
            if (&amp;quot;--&amp;quot;.equals(arg)) {&lt;br /&gt;
                break;&lt;br /&gt;
            } else&lt;br /&gt;
            if (&amp;quot;--help&amp;quot;.equals(arg)) {&lt;br /&gt;
                System.out.println(&amp;quot;Prints the differences between files.&amp;quot;);&lt;br /&gt;
                System.out.println();&lt;br /&gt;
                System.out.println(&amp;quot;Usage:&amp;quot;);&lt;br /&gt;
                System.out.println(&amp;quot;  diff [ &amp;lt;option&amp;gt; ] ... &amp;lt;file1&amp;gt; &amp;lt;file2&amp;gt;&amp;quot;);&lt;br /&gt;
                System.out.println(&amp;quot;      Prints the differences between &amp;lt;file1&amp;gt; and &amp;lt;file2&amp;gt;.&amp;quot;);&lt;br /&gt;
                System.out.println(&amp;quot;  diff [ &amp;lt;option&amp;gt; ] ... &amp;lt;dir1&amp;gt; &amp;lt;dir2&amp;gt;&amp;quot;);&lt;br /&gt;
                System.out.println(&amp;quot;      Prints the differences between the files under &amp;lt;dir1&amp;gt; and &amp;lt;dir2&amp;gt;.&amp;quot;);&lt;br /&gt;
                System.out.println();&lt;br /&gt;
                System.out.println(&amp;quot;Supports the following command line options:&amp;quot;);&lt;br /&gt;
                System.out.println(&amp;quot;  --help&amp;lt;/dt&amp;gt;&amp;quot;);&lt;br /&gt;
                System.out.println(&amp;quot;      Print usage help and exit&amp;quot;);&lt;br /&gt;
                System.out.println(&amp;quot;  -q, --brief&amp;quot;);&lt;br /&gt;
                System.out.println(&amp;quot;      Don&#039;t report the differences, only which files have changed&amp;quot;);&lt;br /&gt;
                System.out.println(&amp;quot;  -s, --report-identical-files&amp;quot;);&lt;br /&gt;
                System.out.println(&amp;quot;      Also report about files that did NOT change&amp;quot;);&lt;br /&gt;
                System.out.println(&amp;quot;  -C &amp;lt;NUM&amp;gt;, --context &amp;lt;NUM&amp;gt;&amp;quot;);&lt;br /&gt;
                System.out.println(&amp;quot;      Report differences in \&amp;quot;context diff\&amp;quot; format, with &amp;lt;NUM&amp;gt; lines of&amp;quot;);&lt;br /&gt;
                System.out.println(&amp;quot;      context&amp;quot;);&lt;br /&gt;
                System.exit(0);&lt;br /&gt;
            } else&lt;br /&gt;
            if (&amp;quot;-q&amp;quot;.equals(arg) || &amp;quot;--brief&amp;quot;.equals(arg)) {&lt;br /&gt;
                brief = true;&lt;br /&gt;
            } else&lt;br /&gt;
            if (&amp;quot;-s&amp;quot;.equals(arg) || &amp;quot;--report-identical-files&amp;quot;.equals(arg)) {&lt;br /&gt;
                reportIdenticalFiles = true;&lt;br /&gt;
            } else&lt;br /&gt;
            if (&amp;quot;-C&amp;quot;.equals(arg) || &amp;quot;--Context&amp;quot;.equals(arg)) {&lt;br /&gt;
                if (idx == args.length) {&lt;br /&gt;
                    System.err.println(&amp;quot;Count missing after \&amp;quot;-C\&amp;quot; or \&amp;quot;--context\&amp;quot;.&amp;quot;);&lt;br /&gt;
                    System.exit(1);&lt;br /&gt;
                }&lt;br /&gt;
                try {&lt;br /&gt;
                   context = Integer.parseInt(args[idx++]);&lt;br /&gt;
               } catch (NumberFormatException nfe) {&lt;br /&gt;
                   System.err.println(&amp;quot;Cannot convert \&amp;quot;&amp;quot; + args[idx - 1] + &amp;quot;\&amp;quot; to an integer&amp;quot;);&lt;br /&gt;
                   System.exit(1);&lt;br /&gt;
               }&lt;br /&gt;
            } else&lt;br /&gt;
            {&lt;br /&gt;
                System.err.println(&amp;quot;Unrecognized command line option \&amp;quot;&amp;quot; + arg + &amp;quot;\&amp;quot;; try \&amp;quot;--help\&amp;quot;.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        // Now process args[idx]... and do the &amp;quot;real work&amp;quot;.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Well, that&#039;s a lot of boilerplate code! And it&#039;s just this trivial example...&lt;br /&gt;
&lt;br /&gt;
Also, people may want to read about the tool without installing or running it, so you fire up the word processor, or the HTML editor, or the Wiki...&lt;br /&gt;
&lt;br /&gt;
But after all, you have written and documented a professional command line tool, congratulations!&lt;br /&gt;
&lt;br /&gt;
But wait, now there is number of &#039;&#039;new&#039;&#039; problems:&lt;br /&gt;
* The code for processing the command line options is &#039;&#039;huge&#039;&#039;, and most of it deals with trivial error conditions.&lt;br /&gt;
* There is a lot of redundancy in the command line options: There&#039;s the CLO &#039;&#039;implementation&#039;&#039;, and the &#039;&#039;description&#039;&#039; appears in three places: The JAVADOC of the &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; method, the &amp;lt;code&amp;gt;System.out.println()&amp;lt;/code&amp;gt; for the &amp;quot;&amp;lt;tt&amp;gt;--help&amp;lt;/tt&amp;gt;&amp;quot; option, and in the online/paper documentation.&lt;br /&gt;
&lt;br /&gt;
What a maintenance nightmare!&lt;br /&gt;
&lt;br /&gt;
==So how can &amp;lt;code&amp;gt;CommandLineOptions&amp;lt;/code&amp;gt; help?==&lt;br /&gt;
&lt;br /&gt;
Here&#039;s how it works:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First&#039;&#039;&#039;, you replace the command line option parsing with a call to [http://commons.unkrig.de/javadoc/de/unkrig/commons/util/CommandLineOptions.html#parse-java.lang.String:A-java.lang.Object- CommandLineOptions.parse()]. Also add a method for each command line option, annotate it with [http://commons.unkrig.de/javadoc/de/unkrig/commons/util/annotation/CommandLineOption.html @CommandLineOption] and add its description as JAVADOC. Put the usage text into the JAVADOC comment of the &amp;quot;&amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;&amp;quot; method, with a placeholder &amp;quot;&amp;lt;tt&amp;gt;{@command-line-options}&amp;lt;/tt&amp;gt; for the descriptions of the command line options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Second&#039;&#039;&#039;, you generate HTML documentation with the [[Doclet#The_MAIN_Doclet|MAIN doclet]]:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;javadoc doclet=&amp;quot;de.unkrig.doclet.main.MainDoclet&amp;quot; docletpath=&amp;quot;de.unkrig.doclet.main.jar&amp;quot; destdir=&amp;quot;src&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;fileset file=&amp;quot;src/com/acme/clo_demo/Diff.java&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/javadoc&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Third&#039;&#039;&#039;, you convert the HTML documentation into plain text with the [http://html2txt.unkrig.de HTML2TXT] utility:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;taskdef classpath=&amp;quot;html2txt.jar&amp;quot; resource=&amp;quot;de/unkrig/html2txt/antlib.xml&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;html2txt&amp;gt;&lt;br /&gt;
     &amp;lt;fileset dir=&amp;quot;src&amp;quot; includes=&amp;quot;com/acme/clo_demo/Diff.main(String[]).html&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/html2txt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fourth&#039;&#039;&#039;, rewrite the &amp;quot;&amp;lt;tt&amp;gt;--help&amp;lt;/tt&amp;gt;&amp;quot; option to simply copy the plain text documentation to &amp;lt;code&amp;gt;System.out&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==So here&#039;s the code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.acme.clo_demo;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.OutputStreamWriter;&lt;br /&gt;
import java.io.Writer;&lt;br /&gt;
import java.util.regex.Pattern;&lt;br /&gt;
&lt;br /&gt;
import de.unkrig.commons.text.pattern.PatternUtil;&lt;br /&gt;
import de.unkrig.commons.util.CommandLineOptions;&lt;br /&gt;
import de.unkrig.commons.util.annotation.CommandLineOption;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A (rudimentary) re-implementation of the well-known DIFF command line utility.&lt;br /&gt;
 */&lt;br /&gt;
public class Diff {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Prints the differences between files.&lt;br /&gt;
     * &amp;lt;h2&amp;gt;Usage:&amp;lt;/h2&amp;gt;&lt;br /&gt;
     * &amp;lt;dl&amp;gt;&lt;br /&gt;
     *   &amp;lt;dt&amp;gt;diff [ &amp;lt;var&amp;gt;option&amp;lt;/var&amp;gt; ] ... &amp;lt;var&amp;gt;file1&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;file2&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
     *   &amp;lt;dd&amp;gt;Prints the differences between &amp;lt;var&amp;gt;file1&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;file2&amp;lt;/var&amp;gt;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
     *   &amp;lt;dt&amp;gt;diff [ &amp;lt;var&amp;gt;option&amp;lt;/var&amp;gt; ] ... &amp;lt;var&amp;gt;dir1&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;dir2&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
     *   &amp;lt;dd&amp;gt;Prints the differences between the files under &amp;lt;var&amp;gt;dir1&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;dir2&amp;lt;/var&amp;gt;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
     * &amp;lt;/dl&amp;gt;&lt;br /&gt;
     * &amp;lt;h2&amp;gt;Options:&amp;lt;/h2&amp;gt;&lt;br /&gt;
     * {@command-line-options}&lt;br /&gt;
     */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
        Diff diff = new Diff();&lt;br /&gt;
&lt;br /&gt;
        args = CommandLineOptions.parse(args, diff);&lt;br /&gt;
&lt;br /&gt;
        // Now process args[idx]... and do the &amp;quot;real work&amp;quot;.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private boolean brief                = false;&lt;br /&gt;
    private boolean reportIdenticalFiles = false;&lt;br /&gt;
    private int     context              = 3;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Print usage help and exit.&lt;br /&gt;
     */&lt;br /&gt;
    @CommandLineOption public void&lt;br /&gt;
    help() throws IOException {&lt;br /&gt;
        CommandLineOptions.printResource(Diff.class, &amp;quot;main(String[]).txt&amp;quot;, null, System.out);&lt;br /&gt;
        System.exit(0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Don&#039;t report the differences, only which files have changed.&lt;br /&gt;
     */&lt;br /&gt;
    @CommandLineOption(name = { &amp;quot;-q&amp;quot;, &amp;quot;--brief&amp;quot; }) public void&lt;br /&gt;
    setBrief() { this.brief = true; }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Also report about files that did NOT change.&lt;br /&gt;
     */&lt;br /&gt;
    @CommandLineOption(name = { &amp;quot;-s&amp;quot;, &amp;quot;--report-identical-files&amp;quot;}) public void&lt;br /&gt;
    setReportIdenticalFiles() { this.reportIdenticalFiles = true; }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Report differences in &amp;quot;context diff&amp;quot; format, with &amp;lt;var&amp;gt;number-of-lines&amp;lt;/var&amp;gt; lines of context.&lt;br /&gt;
     */&lt;br /&gt;
    @CommandLineOption(name = { &amp;quot;-C&amp;quot;, &amp;quot;--Context&amp;quot; }) public void&lt;br /&gt;
    setContext(int numberOfLines) { this.context = numberOfLines; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you run it with the &amp;quot;&amp;lt;tt&amp;gt;--help&amp;lt;/tt&amp;gt;&amp;quot; option, you get:&lt;br /&gt;
&lt;br /&gt;
 Prints the differences between files.&lt;br /&gt;
 &lt;br /&gt;
 Usage:&lt;br /&gt;
 ======&lt;br /&gt;
 &lt;br /&gt;
   diff [ &amp;lt;option&amp;gt; ] ... &amp;lt;file1&amp;gt; &amp;lt;file2&amp;gt;&lt;br /&gt;
       Prints the differences between &amp;lt;file1&amp;gt; and &amp;lt;file2&amp;gt;.&lt;br /&gt;
   diff [ &amp;lt;option&amp;gt; ] ... &amp;lt;dir1&amp;gt; &amp;lt;dir2&amp;gt;&lt;br /&gt;
       Prints the differences between the files under &amp;lt;dir1&amp;gt; and &amp;lt;dir2&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 Options:&lt;br /&gt;
 ========&lt;br /&gt;
 &lt;br /&gt;
 --help&lt;br /&gt;
     Print usage help and exit.&lt;br /&gt;
 -q&lt;br /&gt;
 --brief&lt;br /&gt;
     Don&#039;t report the differences, only which files have changed.&lt;br /&gt;
 -s&lt;br /&gt;
 --report-identical-files&lt;br /&gt;
     Also report about files that did NOT change.&lt;br /&gt;
 -C &amp;lt;number-of-lines&amp;gt;&lt;br /&gt;
 --context &amp;lt;number-of-lines&amp;gt;&lt;br /&gt;
     Report differences in &amp;quot;context diff&amp;quot; format, with &amp;lt;number-of-lines&amp;gt; lines&lt;br /&gt;
     of context.&lt;br /&gt;
&lt;br /&gt;
And voila - you have zero redundancy, and HTML documentation for printing and/or online presentation for free!&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Using_Globs&amp;diff=41</id>
		<title>Using Globs</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Using_Globs&amp;diff=41"/>
		<updated>2024-05-01T20:18:28Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;This article documents the &amp;quot;Globs&amp;quot; feature implemented in [http://commons.unkrig.de/commons-text/apidocs/index.html?de/unkrig/commons/text/pattern/package-summary.html commons.unkrig.de].  === Introduction ===  Surely you have used globs before (maybe even without knowing that they call them &amp;quot;globs&amp;quot;):   *.txt  dir/*.doc  execut?r.txt  Globs are a widely spread concept that is used throughout the UNIX, MICROSOFT and other &amp;quot;worlds&amp;quot;.  All implementations support at least th...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article documents the &amp;quot;Globs&amp;quot; feature implemented in [http://commons.unkrig.de/commons-text/apidocs/index.html?de/unkrig/commons/text/pattern/package-summary.html commons.unkrig.de].&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
Surely you have used globs before (maybe even without knowing that they call them &amp;quot;globs&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
 *.txt&lt;br /&gt;
 dir/*.doc&lt;br /&gt;
 execut?r.txt&lt;br /&gt;
&lt;br /&gt;
Globs are a widely spread concept that is used throughout the UNIX, MICROSOFT and other &amp;quot;worlds&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All implementations support at least the following elements:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Construct     !!Matches&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;    ||Any character except the file separator (&amp;quot;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;quot; and/or &amp;quot;&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;    ||Zero or more characters except the file separator&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;x&#039;&#039;&amp;lt;/tt&amp;gt;||The character &amp;lt;tt&amp;gt;&#039;&#039;x&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some implementations add more features:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Construct                                   !!Matches&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;[abc]&amp;lt;/tt&amp;gt;                              ||Exactly one of the characters &amp;quot;&amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;&amp;quot;, &amp;quot;&amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt;&amp;quot; and &amp;quot;&amp;lt;tt&amp;gt;c&amp;lt;/tt&amp;gt;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;[^abc]&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;or&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;[!abc]&amp;lt;/tt&amp;gt;||Any character &#039;&#039;except&#039;&#039; &amp;quot;&amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;&amp;quot;, &amp;quot;&amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt;&amp;quot; or &amp;quot;&amp;lt;tt&amp;gt;c&amp;lt;/tt&amp;gt;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;[A-Za-z]&amp;lt;/tt&amp;gt;                           ||Any (latin) letter&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;**&amp;lt;/tt&amp;gt;                                 ||Zero or more characters (&#039;&#039;including&#039;&#039; the file separator)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;\&#039;&#039;X&#039;&#039;&amp;lt;/tt&amp;gt;                             ||&amp;quot;&amp;lt;tt&amp;gt;&#039;&#039;X&#039;&#039;&amp;lt;/tt&amp;gt;&amp;quot;, even if &amp;quot;&amp;lt;tt&amp;gt;&#039;&#039;X&#039;&#039;&amp;lt;/tt&amp;gt;&amp;quot; is a meta character&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Since version 1.7 JAVA provides [http://docs.oracle.com/javase/7/docs/api/java/nio/file/FileSystem.html#getPathMatcher%28java.lang.String%29 its own implementation] of &amp;quot;glob matching&amp;quot;, which adds another (quite uncommon) construct:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Construct                              !!Matches&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;{&#039;&#039;alpha&#039;&#039;,&#039;&#039;beta&#039;&#039;,&#039;&#039;gamma&#039;&#039;}&amp;lt;/tt&amp;gt;||Any of &amp;quot;&amp;lt;tt&amp;gt;alpha&amp;lt;/tt&amp;gt;&amp;quot;, &amp;quot;&amp;lt;tt&amp;gt;beta&amp;lt;/tt&amp;gt;&amp;quot; or &amp;quot;&amp;lt;tt&amp;gt;gamma&amp;lt;/tt&amp;gt;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All in all, globs are very practical, though not very powerful. This is why &amp;lt;code&amp;gt;de.unkrig.commons&amp;lt;/code&amp;gt; provides yet another implementation, as follows:&lt;br /&gt;
&lt;br /&gt;
=== Regular expressions features ===&lt;br /&gt;
&lt;br /&gt;
First,&lt;br /&gt;
[http://commons.unkrig.de/commons-text/apidocs/index.html?de/unkrig/commons/text/pattern/Pattern2.html &amp;lt;code&amp;gt;de.unkrig.commons.text.pattern.Pattern2&amp;lt;/code&amp;gt;]&lt;br /&gt;
combines the simplicity of globs with the full power of&lt;br /&gt;
[http://docs.oracle.com/javase/7/docs/api/index.html?java/util/regex/Pattern.html JAVA regular expressions].&lt;br /&gt;
It does so by modifying a few characters in the glob before feeding it to &amp;lt;code&amp;gt;java.util.text.pattern.Pattern.compile()&amp;lt;/code&amp;gt;, making that effectively a glob compiler:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Glob construct!!Regex construct  !!Matches&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;    ||&amp;lt;tt&amp;gt;[^/\\!]*&amp;lt;/tt&amp;gt;||Any character except the file separator and &amp;quot;!&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;    ||&amp;lt;tt&amp;gt;[^/\\!]*&amp;lt;/tt&amp;gt;||Zero or more characters except the file separator and &amp;quot;!&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;**&amp;lt;/tt&amp;gt;   ||&amp;lt;tt&amp;gt;[^!]*&amp;lt;/tt&amp;gt;   ||Zero or more characters except &amp;quot;!&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;***&amp;lt;/tt&amp;gt;  ||&amp;lt;tt&amp;gt;.*&amp;lt;/tt&amp;gt;      ||Zero or more characters&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;||&amp;lt;tt&amp;gt;\.&amp;lt;/tt&amp;gt;||The dot is a literal (not a character class as in a regular expression)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If you have not yet worked with regular expressions: JAVA regular expressions are very powerful and introduce many constructs and meta characters. Find the complete reference documentation [http://docs.oracle.com/javase/7/docs/api/index.html?java/util/regex/Pattern.html here].&lt;br /&gt;
&lt;br /&gt;
Since &amp;quot;&amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;&amp;quot; and &amp;quot;&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;&amp;quot; are not quantifiers as in regular expression (&amp;quot;&amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;&amp;quot; == zero-or-one, &amp;quot;&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;&amp;quot; == zero-or-more), one has to use &amp;quot;&amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt;&amp;quot; and &amp;quot;&amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;&amp;quot; instead. The alternative notation for &amp;quot;&amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;&amp;quot; (&amp;quot;any character&amp;quot;) is &amp;quot;&amp;lt;tt&amp;gt;[^]&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the reference documentation [http://commons.unkrig.de/javadoc/index.html?de/unkrig/commons/text/pattern/Pattern2.html here].&lt;br /&gt;
&lt;br /&gt;
The API of&lt;br /&gt;
[http://commons.unkrig.de/commons-text/apidocs/index.html?de/unkrig/commons/text/pattern/Pattern2.html &amp;lt;code&amp;gt;de.unkrig.commons.text.pattern.Pattern2&amp;lt;/code&amp;gt;]&lt;br /&gt;
is totally compatible with that of&lt;br /&gt;
[http://docs.oracle.com/javase/7/docs/api/index.html?java/util/regex/Pattern.html &amp;lt;code&amp;gt;java.util.pattern.Pattern&amp;lt;/code&amp;gt;],&lt;br /&gt;
plus it adds a new compilation Flag &amp;lt;code&amp;gt;Pattern2.WILDCARD&amp;lt;/code&amp;gt; that modifies the expression syntax from regex to globs.&lt;br /&gt;
&lt;br /&gt;
=== Includes-Excludes ===&lt;br /&gt;
&lt;br /&gt;
Second, it adds &#039;&#039;includes-excludes&#039;&#039;. This involves two new meta characters, &amp;quot;&amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;&amp;quot;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Construct                         !!Matches&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;pattern1&#039;&#039;,&#039;&#039;pattern2&#039;&#039;&amp;lt;/tt&amp;gt;||Any string that matches &#039;&#039;pattern1&#039;&#039; or &#039;&#039;pattern2&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;pattern1&#039;&#039;~&#039;&#039;pattern2&#039;&#039;&amp;lt;/tt&amp;gt;||Any string that matches &#039;&#039;pattern1&#039;&#039;, but not &#039;&#039;pattern2&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~&#039;&#039;pattern1&#039;&#039;&amp;lt;/tt&amp;gt;            ||Any string that does &#039;&#039;not&#039;&#039; match &#039;&#039;pattern1&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;pattern1&#039;&#039;,&#039;&#039;pattern2&#039;&#039;~&#039;&#039;pattern3&#039;&#039;~&#039;&#039;pattern4&#039;&#039;,&#039;&#039;pattern5&#039;&#039;&amp;lt;/tt&amp;gt;||Any string that matches &#039;&#039;pattern1&#039;&#039; or &#039;&#039;pattern2&#039;&#039;, but not &#039;&#039;pattern3&#039;&#039; nor &#039;&#039;pattern4&#039;&#039;; plus any string that matches &#039;&#039;pattern5&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This may sound complicated, but the very simple rule is: The patterns are applied &#039;&#039;right-to-left&#039;&#039;, and the first match determines the result.&lt;br /&gt;
&lt;br /&gt;
This comes with [http://commons.unkrig.de/javadoc/index.html?de/unkrig/commons/text/pattern/Glob.html &amp;lt;tt&amp;gt;de.unkrig.commons.text.pattern.Glob.compile()&amp;lt;/tt&amp;gt;] and the new [http://commons.unkrig.de/javadoc/index.html?de/unkrig/commons/text/pattern/Glob.html &amp;lt;tt&amp;gt;INCLUDES_EXCLUDES&amp;lt;/tt&amp;gt;] compilation flag.&lt;br /&gt;
&lt;br /&gt;
=== Replacements ===&lt;br /&gt;
&lt;br /&gt;
Third, it adds &#039;&#039;replacements&#039;&#039;. This involves one new meta character, &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Construct               !!Matches                             !!Replaces with&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;*.c=$0.bak&amp;lt;/tt&amp;gt;     ||Any string ending with &amp;quot;&amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt;&amp;quot;||The original string plus &amp;quot;&amp;lt;tt&amp;gt;.bak&amp;lt;/tt&amp;gt;&amp;quot; (&amp;quot;&amp;lt;tt&amp;gt;$0&amp;lt;/tt&amp;gt;&amp;quot; represents the &amp;quot;entire match&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;(*).(*)=$1.$2$2&amp;lt;/tt&amp;gt;||Any string containing a dot         ||The original string, with the file name extension doubled&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This comes with the [http://commons.unkrig.de/javadoc/index.html?de/unkrig/commons/text/pattern/Glob.html &amp;lt;tt&amp;gt;Glob.replace()&amp;lt;/tt&amp;gt;] API.&lt;br /&gt;
&lt;br /&gt;
Notice that &amp;quot;&amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;&amp;quot; is a meta character &#039;&#039;only in the replacement&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Also notice that when combining replacements with includes-excludes (see above), replacements are specific for &#039;&#039;each&#039;&#039; include (while it does not make any sense to use replacements with excludes, though).&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
All these features can be combined mercilessly, e.g.:&lt;br /&gt;
&lt;br /&gt;
 *=$0$0~*.bak&lt;br /&gt;
 (*).docx{0,1}=$1.txt~*blabla*&lt;br /&gt;
&lt;br /&gt;
Using it is simple:&lt;br /&gt;
&lt;br /&gt;
 import de.unkrig.commons.text.pattern.Glob;&lt;br /&gt;
 import de.unkrig.commons.text.pattern.Pattern2;&lt;br /&gt;
 &lt;br /&gt;
 Glob glob = Glob.compile(&amp;quot;*.c=$0.C,*.h=$0.H&amp;quot;, Pattern2.WILDCARD | Glob.INCLUDES_EXCLUDES | Glob.REPLACEMENT);&lt;br /&gt;
 glob.match(&amp;quot;foo.c&amp;quot;);     // returns true&lt;br /&gt;
 glob.replace(&amp;quot;foo.h&amp;quot;);   // returns &amp;quot;foo.H&amp;quot;&lt;br /&gt;
 glob.replace(&amp;quot;foo.cpp&amp;quot;); // returns null&lt;br /&gt;
&lt;br /&gt;
Remember: The &amp;lt;tt&amp;gt;Pattern2.WILDCARD&amp;lt;/tt&amp;gt; modifies the regex compilation to understand wildcard characters. &amp;lt;tt&amp;gt;Glob.INCLUDES_EXCLUDES&amp;lt;/tt&amp;gt; activates the recognition of &amp;quot;&amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt;&amp;quot; and &amp;quot;&amp;lt;tt&amp;gt;~&amp;lt;/tt&amp;gt;&amp;quot;. Finally, &amp;lt;tt&amp;gt;Glob.REPLACEMENT&amp;lt;/tt&amp;gt; activates the recognition of &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=39</id>
		<title>Unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=39"/>
		<updated>2024-05-01T19:55:39Z</updated>

		<summary type="html">&lt;p&gt;Admin: Admin moved page Unkrig.de:Unkrig.de to Unkrig.de&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;font size=&amp;quot;+6&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Welcome to unkrig.de!&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;font color=&amp;quot;#777&amp;quot;&amp;gt;&#039;&#039;Where the fine software grows&#039;&#039;&amp;lt;/font&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[image:Javawordcloud.png|right]]&lt;br /&gt;
&lt;br /&gt;
== Preamble ==&lt;br /&gt;
&lt;br /&gt;
Hello out there!&lt;br /&gt;
&lt;br /&gt;
I am a professional programmer, and when I have time I work on several cool open source projects. Find them useful, interesting, inspiring - or contribute! To contact me, send email to &#039;arno att unkrig dott de&#039;.&lt;br /&gt;
&lt;br /&gt;
Cheers, Arno&lt;br /&gt;
&lt;br /&gt;
== Larger Projects ==&lt;br /&gt;
&lt;br /&gt;
=== [https://janino-compiler.github.io/janino/ Janino] ===&lt;br /&gt;
: A super-small, super-fast Java&amp;amp;trade; compiler for embedded applications where you want to compile code on-the-fly into byte code which is executed in the running JVM.&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/aunkrig/lfr LFR - Lightning-fast Regular Expressions for Java] ===&lt;br /&gt;
: A 99.9%-complete reimplementation of &amp;lt;code&amp;gt;java.util.regex&amp;lt;/code&amp;gt; (&amp;quot;JUR&amp;quot;) with better &amp;lt;code&amp;gt;match()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt; performance.&lt;br /&gt;
&lt;br /&gt;
=== [[Antology]] ===&lt;br /&gt;
: Some contributions to [http://ant.apache.org APACHE ANT], e.g. the &amp;lt;code&amp;gt;&amp;amp;lt;swingDialog&amp;gt;&amp;lt;/code&amp;gt; task which significantly enhances ANT&#039;s &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;gt;&amp;lt;/code&amp;gt; task.&lt;br /&gt;
&lt;br /&gt;
=== [[Zz.unkrig.de|ZZ Tools]] ===&lt;br /&gt;
: Enhanced versions of the widely known DIFF, FIND, GREP and PATCH command-line tools, which handle not only directories and files, but also archive and compressed files, and even nested archive and compressed files. They can even disassemble Java &amp;lt;code&amp;gt;.class&amp;lt;/code&amp;gt; files on-the fly and operate on the disassembly.&lt;br /&gt;
&lt;br /&gt;
=== [[Cs-contrib.unkrig.de|CheckStyle Contributions]] ===&lt;br /&gt;
: Additional checks, filters and quickfixes for [http://checkstyle.sourceforge.net/ CheckStyle] and [http://eclipse-cs.sourceforge.net/ Eclipse-CS].&lt;br /&gt;
&lt;br /&gt;
=== [[Commons.unkrig.de]] ===&lt;br /&gt;
: A versatile Java&amp;amp;trade; library, including a highly flexible HTTP and FTP server.&lt;br /&gt;
&lt;br /&gt;
== Smaller Projects ==&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/aunkrig/autoauth AUTOAUTH] ===&lt;br /&gt;
&lt;br /&gt;
An HTTP proxy that handles proxy authentication.&lt;br /&gt;
&lt;br /&gt;
=== [[Doclet|Doclets]] ===&lt;br /&gt;
&lt;br /&gt;
Doclets are a way to re-use the JAVADOC tool to do other things than just generate Java API documentation. I wrote a few of them for different purposes:&lt;br /&gt;
&lt;br /&gt;
===== [[ANT doclet|The ANT Doclet]] =====&lt;br /&gt;
: Generates JAVADOC-like HTML documentation for an ANTLIB, e.g. for [[Antology]] and the [[Zz.unkrig.de|ZZ tools]].&lt;br /&gt;
&lt;br /&gt;
===== [[Cs-doclet|The CheckStyle Doclet]] =====&lt;br /&gt;
: Generates the metadata files for CheckStyle and eclipse-cs from &#039;doc tags&#039; in the source code of your checks and filters. &lt;br /&gt;
&lt;br /&gt;
===== [[JAVADOC doclet|The JAVADOC Doclet]] =====&lt;br /&gt;
: A re-implementation of the JAVADOC standard doclet, basically a reference to show how to use the &amp;quot;[[No-template|no-template]]&amp;quot; framework.&lt;br /&gt;
&lt;br /&gt;
===== [[MAIN doclet|The MAIN Doclet]] =====&lt;br /&gt;
: Generates HTML documentation for a &amp;quot;main()&amp;quot; method - useful for command line tools with a set of command line options.&lt;br /&gt;
&lt;br /&gt;
=== [[Html2txt|html2txt]] ===&lt;br /&gt;
: A Java tool to convert HTML documents into plain text.&lt;br /&gt;
&lt;br /&gt;
=== [[JDisasm|jdisasm]] ===&lt;br /&gt;
: A disassembler for Java .class files.&lt;br /&gt;
&lt;br /&gt;
=== [[No-template|no-template]] ===&lt;br /&gt;
: A super-small Java library for templating, i.e. generating text files (HTML, XML, whatever) from a &amp;quot;template&amp;quot; text file.&lt;br /&gt;
&lt;br /&gt;
== Retired Projects ==&lt;br /&gt;
&lt;br /&gt;
These projects are no longer maintained and are only of limited use, e.g. because they work only with old Java versions.&lt;br /&gt;
&lt;br /&gt;
=== [[Loggifier.unkrig.de|Loggifier]] ===&lt;br /&gt;
: A tool for automatic injection of logging code into Java&amp;amp;trade; class files, making it unnecessary to mess up your code with hand-written logging.&lt;br /&gt;
&lt;br /&gt;
=== [[Cvstools.unkrig.de|Eclipse plug-in for extended CVS possibilities]] ===&lt;br /&gt;
&lt;br /&gt;
: An ECLIPSE plug-in that adds CVS functionality that is sometimes painfully missing from ECLIPSE&#039;s built-in CVS client.&lt;br /&gt;
&lt;br /&gt;
=== [[Subclipse.unkrig.de|Subclipse enhancements Eclipse plug-in]] ===&lt;br /&gt;
&lt;br /&gt;
: The often-missed &amp;lt;code&amp;gt;&amp;lt;de.unkrig.subclipse.svn&amp;gt;&amp;lt;/code&amp;gt; ANT task that uses the SUBCLIPSE client of the running ECLIPSE workbench.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=38</id>
		<title>Unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=38"/>
		<updated>2024-05-01T19:52:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: Admin moved page Main Page to Unkrig.de:Unkrig.de without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;font size=&amp;quot;+6&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Welcome to unkrig.de!&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;font color=&amp;quot;#777&amp;quot;&amp;gt;&#039;&#039;Where the fine software grows&#039;&#039;&amp;lt;/font&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[image:Javawordcloud.png|right]]&lt;br /&gt;
&lt;br /&gt;
== Preamble ==&lt;br /&gt;
&lt;br /&gt;
Hello out there!&lt;br /&gt;
&lt;br /&gt;
I am a professional programmer, and when I have time I work on several cool open source projects. Find them useful, interesting, inspiring - or contribute! To contact me, send email to &#039;arno att unkrig dott de&#039;.&lt;br /&gt;
&lt;br /&gt;
Cheers, Arno&lt;br /&gt;
&lt;br /&gt;
== Larger Projects ==&lt;br /&gt;
&lt;br /&gt;
=== [https://janino-compiler.github.io/janino/ Janino] ===&lt;br /&gt;
: A super-small, super-fast Java&amp;amp;trade; compiler for embedded applications where you want to compile code on-the-fly into byte code which is executed in the running JVM.&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/aunkrig/lfr LFR - Lightning-fast Regular Expressions for Java] ===&lt;br /&gt;
: A 99.9%-complete reimplementation of &amp;lt;code&amp;gt;java.util.regex&amp;lt;/code&amp;gt; (&amp;quot;JUR&amp;quot;) with better &amp;lt;code&amp;gt;match()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt; performance.&lt;br /&gt;
&lt;br /&gt;
=== [[Antology]] ===&lt;br /&gt;
: Some contributions to [http://ant.apache.org APACHE ANT], e.g. the &amp;lt;code&amp;gt;&amp;amp;lt;swingDialog&amp;gt;&amp;lt;/code&amp;gt; task which significantly enhances ANT&#039;s &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;gt;&amp;lt;/code&amp;gt; task.&lt;br /&gt;
&lt;br /&gt;
=== [[Zz.unkrig.de|ZZ Tools]] ===&lt;br /&gt;
: Enhanced versions of the widely known DIFF, FIND, GREP and PATCH command-line tools, which handle not only directories and files, but also archive and compressed files, and even nested archive and compressed files. They can even disassemble Java &amp;lt;code&amp;gt;.class&amp;lt;/code&amp;gt; files on-the fly and operate on the disassembly.&lt;br /&gt;
&lt;br /&gt;
=== [[Cs-contrib.unkrig.de|CheckStyle Contributions]] ===&lt;br /&gt;
: Additional checks, filters and quickfixes for [http://checkstyle.sourceforge.net/ CheckStyle] and [http://eclipse-cs.sourceforge.net/ Eclipse-CS].&lt;br /&gt;
&lt;br /&gt;
=== [[Commons.unkrig.de]] ===&lt;br /&gt;
: A versatile Java&amp;amp;trade; library, including a highly flexible HTTP and FTP server.&lt;br /&gt;
&lt;br /&gt;
== Smaller Projects ==&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/aunkrig/autoauth AUTOAUTH] ===&lt;br /&gt;
&lt;br /&gt;
An HTTP proxy that handles proxy authentication.&lt;br /&gt;
&lt;br /&gt;
=== [[Doclet|Doclets]] ===&lt;br /&gt;
&lt;br /&gt;
Doclets are a way to re-use the JAVADOC tool to do other things than just generate Java API documentation. I wrote a few of them for different purposes:&lt;br /&gt;
&lt;br /&gt;
===== [[ANT doclet|The ANT Doclet]] =====&lt;br /&gt;
: Generates JAVADOC-like HTML documentation for an ANTLIB, e.g. for [[Antology]] and the [[Zz.unkrig.de|ZZ tools]].&lt;br /&gt;
&lt;br /&gt;
===== [[Cs-doclet|The CheckStyle Doclet]] =====&lt;br /&gt;
: Generates the metadata files for CheckStyle and eclipse-cs from &#039;doc tags&#039; in the source code of your checks and filters. &lt;br /&gt;
&lt;br /&gt;
===== [[JAVADOC doclet|The JAVADOC Doclet]] =====&lt;br /&gt;
: A re-implementation of the JAVADOC standard doclet, basically a reference to show how to use the &amp;quot;[[No-template|no-template]]&amp;quot; framework.&lt;br /&gt;
&lt;br /&gt;
===== [[MAIN doclet|The MAIN Doclet]] =====&lt;br /&gt;
: Generates HTML documentation for a &amp;quot;main()&amp;quot; method - useful for command line tools with a set of command line options.&lt;br /&gt;
&lt;br /&gt;
=== [[Html2txt|html2txt]] ===&lt;br /&gt;
: A Java tool to convert HTML documents into plain text.&lt;br /&gt;
&lt;br /&gt;
=== [[JDisasm|jdisasm]] ===&lt;br /&gt;
: A disassembler for Java .class files.&lt;br /&gt;
&lt;br /&gt;
=== [[No-template|no-template]] ===&lt;br /&gt;
: A super-small Java library for templating, i.e. generating text files (HTML, XML, whatever) from a &amp;quot;template&amp;quot; text file.&lt;br /&gt;
&lt;br /&gt;
== Retired Projects ==&lt;br /&gt;
&lt;br /&gt;
These projects are no longer maintained and are only of limited use, e.g. because they work only with old Java versions.&lt;br /&gt;
&lt;br /&gt;
=== [[Loggifier.unkrig.de|Loggifier]] ===&lt;br /&gt;
: A tool for automatic injection of logging code into Java&amp;amp;trade; class files, making it unnecessary to mess up your code with hand-written logging.&lt;br /&gt;
&lt;br /&gt;
=== [[Cvstools.unkrig.de|Eclipse plug-in for extended CVS possibilities]] ===&lt;br /&gt;
&lt;br /&gt;
: An ECLIPSE plug-in that adds CVS functionality that is sometimes painfully missing from ECLIPSE&#039;s built-in CVS client.&lt;br /&gt;
&lt;br /&gt;
=== [[Subclipse.unkrig.de|Subclipse enhancements Eclipse plug-in]] ===&lt;br /&gt;
&lt;br /&gt;
: The often-missed &amp;lt;code&amp;gt;&amp;lt;de.unkrig.subclipse.svn&amp;gt;&amp;lt;/code&amp;gt; ANT task that uses the SUBCLIPSE client of the running ECLIPSE workbench.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=MediaWiki:Mainpage&amp;diff=37</id>
		<title>MediaWiki:Mainpage</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=MediaWiki:Mainpage&amp;diff=37"/>
		<updated>2024-05-01T19:50:49Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;Unkrig.de&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unkrig.de&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>