<?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=Aunkrig</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=Aunkrig"/>
	<link rel="alternate" type="text/html" href="https://unkrig.de/w/Special:Contributions/Aunkrig"/>
	<updated>2026-05-04T15:55:32Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Html2txt&amp;diff=49</id>
		<title>Html2txt</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Html2txt&amp;diff=49"/>
		<updated>2024-05-02T17:00:46Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: /* Change Log */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Cs-doclet&amp;diff=48</id>
		<title>Cs-doclet</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Cs-doclet&amp;diff=48"/>
		<updated>2024-05-02T16:47:40Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: /* Source code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Cs-doclet is a [http://docs.oracle.com/javase/8/docs/technotes/guides/javadoc/ JAVADOC doclet] that generates the metadata files for [http://checkstyle.sourceforge.net/ CheckStyle] and [http://eclipse-cs.sourceforge.net/ eclipse-cs] from annotations and [http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDJGIJB doc tags] in the source code of your checks and filters.&lt;br /&gt;
&lt;br /&gt;
This doclet is useful only for authors of CheckStyle extensions, like [[Cs-contrib.unkrig.de|cs-contrib]].&lt;br /&gt;
&lt;br /&gt;
== Intended audience ==&lt;br /&gt;
&lt;br /&gt;
This tool is useful for the development of [http://checkstyle.sourceforge.net/ CheckStyle] checks and filters, and for their integration in [http://eclipse-cs.sourceforge.net/ eclipse-cs] and [http://www.mediawiki.org/wiki/MediaWiki MediaWiki].&lt;br /&gt;
&lt;br /&gt;
== Extending CheckStyle ==&lt;br /&gt;
&lt;br /&gt;
CheckStyle comes with an API to [http://checkstyle.sourceforge.net/writingchecks.html extend] it with custom checks and filters. Here is a completely useless, yet typical example of a custom check:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/ColorCheck.java&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 package com.pany.cs.checks;&lt;br /&gt;
 &lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.Check;&lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.DetailAST;&lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.TokenTypes;&lt;br /&gt;
 &lt;br /&gt;
 public&lt;br /&gt;
 class ColorCheck extends Check {&lt;br /&gt;
 &lt;br /&gt;
     public void&lt;br /&gt;
     setColor(String value) { this.color = value; }&lt;br /&gt;
     private String color = &amp;quot;Yellow&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     @Override public int[]&lt;br /&gt;
     getDefaultTokens() { return new int[] { TokenTypes.ANNOTATION }; }&lt;br /&gt;
 &lt;br /&gt;
     @Override public void&lt;br /&gt;
     visitToken(DetailAST ast) { this.log(ast, &amp;quot;theColorIs&amp;quot;, this.color); }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The CheckStyle extension API supports internationalization be means of &amp;quot;messages.properties&amp;quot; files:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/messages.properties&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 theColorIs = The color is &#039;&#039;{0}&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/messages_de.properties&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 theColorIs = Die Farbe ist &#039;&#039;{0}&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To make use of this check, you&#039;d write a &amp;quot;CheckStyle configuration file&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;checkstyle-config.xml&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE module PUBLIC &amp;quot;-//Puppy Crawl//DTD Check Configuration 1.3//EN&amp;quot; &amp;quot;http://www.puppycrawl.com/dtds/configuration_1_3.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;module name=&amp;quot;Checker&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;property name=&amp;quot;severity&amp;quot; value=&amp;quot;warning&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;module name=&amp;quot;TreeWalker&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;module name=&amp;quot;com.pany: ColorCheck&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;property name=&amp;quot;color&amp;quot; value=&amp;quot;blue&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/module&amp;gt;&lt;br /&gt;
   &amp;lt;/module&amp;gt;&lt;br /&gt;
 &amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
, and execute CheckStyle on a target project, e.g. on the example project itself:&lt;br /&gt;
&lt;br /&gt;
 $ javac -d bin src/com/pany/cs/checks/ColorCheck.java&lt;br /&gt;
 $ java -classpath &#039;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;bin&amp;lt;/span&amp;gt;;path/to/checkstyle-6.1-all.jar&#039; \&lt;br /&gt;
 &amp;gt; com.puppycrawl.tools.checkstyle.Main \&lt;br /&gt;
 &amp;gt; -c checkstyle-config.xml \&lt;br /&gt;
 &amp;gt; -r src&lt;br /&gt;
 Starting audit...&lt;br /&gt;
 C:\dev\EclipseWS\de.unkrig.cs-contrib\foo\src\com\pany\cs\checks\ColorCheck.java:14:5: warning: The color is &#039;blue&#039;&lt;br /&gt;
 C:\dev\EclipseWS\de.unkrig.cs-contrib\foo\src\com\pany\cs\checks\ColorCheck.java:17:5: warning: The color is &#039;blue&#039;&lt;br /&gt;
 Audit done.&lt;br /&gt;
 $&lt;br /&gt;
&lt;br /&gt;
(We get the two warnings because there are two &amp;quot;@Override&amp;quot; annotations in the code.)&lt;br /&gt;
&lt;br /&gt;
Obviously, the Java code and the &amp;quot;messages.properties&amp;quot; files must be kept in sync with the Java code at all times, which is naturally very error-prone.&lt;br /&gt;
&lt;br /&gt;
Cs-doclet facilitates the task by generating the &amp;quot;messages.properties&amp;quot; file from annotations in the source code:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/MyCheck.java&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 package com.pany.cs.checks;&lt;br /&gt;
 &lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.Check;&lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.DetailAST;&lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.TokenTypes;&lt;br /&gt;
 &lt;br /&gt;
 public&lt;br /&gt;
 class ColorCheck extends Check {&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;@Message(&amp;quot;The color is &#039;&#039;{0}&#039;&#039;&amp;quot;)&lt;br /&gt;
     private static final String MESSAGE_KEY_THE_COLOR_IS = &amp;quot;theColorIs&amp;quot;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     public void&lt;br /&gt;
     setColor(String value) { this.color = value; }&lt;br /&gt;
     private String color = &amp;quot;Yellow&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     @Override public int[]&lt;br /&gt;
     getDefaultTokens() { return new int[] { TokenTypes.ANNOTATION }; }&lt;br /&gt;
 &lt;br /&gt;
     @Override public void&lt;br /&gt;
     visitToken(DetailAST ast) { this.log(ast, &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;MESSAGE_KEY_THE_COLOR_IS&amp;lt;/span&amp;gt;, this.color); }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
To generate the &amp;quot;messages.properties&amp;quot; file, you&#039;d run JAVADOC with the cs-doclet and the &amp;quot;-messages.properties-dir&amp;quot; command line option:&lt;br /&gt;
 $ javadoc \&lt;br /&gt;
 &amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;-doclet de.unkrig.doclet.cs.CsDoclet&amp;lt;/span&amp;gt; \&lt;br /&gt;
 &amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;-docletpath &amp;quot;path/to/cs-doclet.jar;bin;path/to/checkstyle-6.1-all.jar;path/to/net.sf.eclipsecs.core-6.1.jar&amp;quot;&amp;lt;/span&amp;gt; \&lt;br /&gt;
 &amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;-messages.properties-dir src&amp;lt;/span&amp;gt; \&lt;br /&gt;
 &amp;gt; -sourcepath src \&lt;br /&gt;
 &amp;gt; -classpath ../net.sf.checkstyle-6.1/checkstyle-6.1/checkstyle-6.1-all.jar \&lt;br /&gt;
 &amp;gt; com.pany.cs.checks&lt;br /&gt;
 Loading source files for package com.pany.cs.checks...&lt;br /&gt;
 Constructing Javadoc information...&lt;br /&gt;
 $&lt;br /&gt;
&lt;br /&gt;
Notice that both &amp;quot;checkstyle.jar&amp;quot; and &amp;quot;net.sf.eclipsecs-core.jar&amp;quot; must be on the &amp;quot;-docletpath&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The generated &amp;quot;src/com/pany/cs/checks/messages.properties&amp;quot; file looks like this:&lt;br /&gt;
&lt;br /&gt;
 # This file was generated by the CS doclet; see http://cs-doclet.unkrig.de/&lt;br /&gt;
 &lt;br /&gt;
 # Custom check messages, in alphabetical order.&lt;br /&gt;
 &lt;br /&gt;
 # --------------- com.pany: ColorCheck ---------------&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;theColorIs&amp;lt;/span&amp;gt; = &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;The color is &#039;&#039;{0}&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And voilà! All the messages are where they belong: In the source code.&lt;br /&gt;
&lt;br /&gt;
== Integrating with eclipse-cs ==&lt;br /&gt;
&lt;br /&gt;
When you integrate your checks with eclipse-cs, then you learn that you have to write two more metadata files:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;checkstyle-metadata.xml&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE checkstyle-metadata PUBLIC&lt;br /&gt;
 &amp;quot;-//eclipse-cs//DTD Check Metadata 1.1//EN&amp;quot;&lt;br /&gt;
 &amp;quot;http://eclipse-cs.sourceforge.net/dtds/checkstyle-metadata_1_1.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;checkstyle-metadata&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;rule-group-metadata name=&amp;quot;%Whitespace.group&amp;quot; priority=&amp;quot;999&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;rule-metadata&lt;br /&gt;
             internal-name=&amp;quot;com.pany.cs.checks.ColorCheck&amp;quot;&lt;br /&gt;
             parent=&amp;quot;TreeWalker&amp;quot;&lt;br /&gt;
             name=&amp;quot;%ColorCheck.name&amp;quot;&lt;br /&gt;
         &amp;gt;&lt;br /&gt;
             &amp;lt;alternative-name internal-name=&amp;quot;com.pany.cs.checks.ColorCheck&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;description&amp;gt;%ColorCheck.desc&amp;lt;/description&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
             &amp;lt;property-metadata&lt;br /&gt;
                 name=&amp;quot;color&amp;quot;&lt;br /&gt;
                 datatype=&amp;quot;String&amp;quot;&lt;br /&gt;
                 default-value=&amp;quot;Yellow&amp;quot;&lt;br /&gt;
             &amp;gt;&lt;br /&gt;
                 &amp;lt;description&amp;gt;%ColorCheck.color&amp;lt;/description&amp;gt;&lt;br /&gt;
             &amp;lt;/property-metadata&amp;gt;&lt;br /&gt;
             &amp;lt;message-key key=&amp;quot;theColorIs&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/rule-metadata&amp;gt;&lt;br /&gt;
     &amp;lt;/rule-group-metadata&amp;gt;&lt;br /&gt;
 &amp;lt;/checkstyle-metadata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;checkstyle-metadata.properties&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 Whitespace.group = Whitespace&lt;br /&gt;
 ColorCheck.name = com.pany: ColorCheck&lt;br /&gt;
 ColorCheck.desc =\&lt;br /&gt;
     A completely useless check which merely prints a (localizable) message each \&lt;br /&gt;
     time it encounters an annotation.&lt;br /&gt;
 ColorCheck.color = A completely useless check parameter.&lt;br /&gt;
&lt;br /&gt;
Tedious, isn&#039;t it? Well, you can tell cs-doclet to also generate &#039;&#039;these&#039;&#039; files from annotations (and doc comments):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/MyCheck.java&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 // File &amp;quot;src/com/pany/cs/ColorCheck.java&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
 package com.pany.cs.checks;&lt;br /&gt;
 &lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.Check;&lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.DetailAST;&lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.TokenTypes;&lt;br /&gt;
 &lt;br /&gt;
 import de.unkrig.csdoclet.StringRuleProperty;&lt;br /&gt;
 import de.unkrig.csdoclet.Rule;&lt;br /&gt;
 &lt;br /&gt;
 /**&lt;br /&gt;
  * &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;A completely useless check which merely prints a&amp;lt;/span&amp;gt;&lt;br /&gt;
  * &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;(localizable) message each time it encounters an annotation.&amp;lt;/span&amp;gt;&lt;br /&gt;
  */&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;@Rule(&lt;br /&gt;
     group      = &amp;quot;%Whitespace.group&amp;quot;,&lt;br /&gt;
     groupName  = &amp;quot;Whitespace&amp;quot;,&lt;br /&gt;
     name       = &amp;quot;com.pany: ColorCheck&amp;quot;,&lt;br /&gt;
     parent     = &amp;quot;TreeWalker&amp;quot;&lt;br /&gt;
 )&amp;lt;/span&amp;gt;&lt;br /&gt;
 public&lt;br /&gt;
 class ColorCheck extends Check {&lt;br /&gt;
 &lt;br /&gt;
     @Message(&amp;quot;The color is &#039;&#039;{0}&#039;&#039;&amp;quot;)&lt;br /&gt;
     private static final String MESSAGE_KEY_THE_COLOR_IS = &amp;quot;theColorIs&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     /**&lt;br /&gt;
      * &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;A completely useless check parameter&amp;lt;/span&amp;gt;.&lt;br /&gt;
      */&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;@StringRuleProperty(defaultValue = DEFAULT_COLOR)&amp;lt;/span&amp;gt;&lt;br /&gt;
     public void&lt;br /&gt;
     setColor(String value) { this.color = value; }&lt;br /&gt;
 &lt;br /&gt;
     private String color = &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;DEFAULT_COLOR&amp;lt;/span&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;private static final String DEFAULT_COLOR = &amp;quot;Yellow&amp;quot;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     @Override public int[]&lt;br /&gt;
     getDefaultTokens() { return new int[] { TokenTypes.ANNOTATION }; }&lt;br /&gt;
 &lt;br /&gt;
     @Override public void&lt;br /&gt;
     visitToken(DetailAST ast) { this.log(ast, MESSAGE_KEY_THE_COLOR_IS, this.color); }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 $ javadoc \&lt;br /&gt;
 &amp;gt; -doclet de.unkrig.doclet.cs.CsDoclet \&lt;br /&gt;
 &amp;gt; -docletpath &amp;quot;path/to/cs-doclet.jar;bin;path/to/checkstyle-6.1-all.jar;path/to/net.sf.eclipsecs.core-6.1.jar&amp;quot; \&lt;br /&gt;
 &amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;-checkstyle-metadata.properties-dir src&amp;lt;/span&amp;gt; \&lt;br /&gt;
 &amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;-checkstyle-metadata.xml-dir src&amp;lt;/span&amp;gt; \&lt;br /&gt;
 &amp;gt; -messages.properties-dir src \&lt;br /&gt;
 &amp;gt; -sourcepath src \&lt;br /&gt;
 &amp;gt; -classpath ../net.sf.checkstyle-6.1/checkstyle-6.1/checkstyle-6.1-all.jar \&lt;br /&gt;
 &amp;gt; com.pany.cs.checks&lt;br /&gt;
 Loading source files for package com.pany.cs.checks...&lt;br /&gt;
 Constructing Javadoc information...&lt;br /&gt;
 $&lt;br /&gt;
&lt;br /&gt;
And you&#039;ll get:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/checkstyle-metadata.properties&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 # This file was generated by the CS doclet; see http://cs-doclet.unkrig.de/&lt;br /&gt;
 &lt;br /&gt;
 # Rule groups:&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Whitespace.group&amp;lt;/span&amp;gt; = &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Whitespace&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 # Custom checks, in alphabetical order.&lt;br /&gt;
 &lt;br /&gt;
 # --------------- &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;com.pany: ColorCheck&amp;lt;/span&amp;gt; ---------------&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ColorCheck.name&amp;lt;/span&amp;gt; = &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;com.pany: ColorCheck&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ColorCheck.desc&amp;lt;/span&amp;gt; =\&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;A completely useless check which merely prints a (localizable) message each time it encounters an annotation.&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ColorCheck.color&amp;lt;/span&amp;gt;                                  = &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;A completely useless check parameter.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/checkstyle-metadata.xml&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE checkstyle-metadata PUBLIC&lt;br /&gt;
 &amp;quot;-//eclipse-cs//DTD Check Metadata 1.1//EN&amp;quot;&lt;br /&gt;
 &amp;quot;http://eclipse-cs.sourceforge.net/dtds/checkstyle-metadata_1_1.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;checkstyle-metadata&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;amp;lt;!-- This file was generated by the CS doclet; see http://cs-doclet.unkrig.de/ --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;amp;lt;!-- ColorCheck --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;rule-group-metadata name=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;%Whitespace.group&amp;lt;/span&amp;gt;&amp;quot; priority=&amp;quot;999&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;rule-metadata&lt;br /&gt;
             internal-name=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;com.pany.cs.checks.ColorCheck&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
             parent=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;TreeWalker&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
             name=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;%ColorCheck.name&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
         &amp;gt;&lt;br /&gt;
             &amp;lt;alternative-name internal-name=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;com.pany.cs.checks.ColorCheck&amp;lt;/span&amp;gt;&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;description&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;%ColorCheck.desc&amp;lt;/span&amp;gt;&amp;lt;/description&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
             &amp;lt;property-metadata&lt;br /&gt;
                 name=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;color&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
                 datatype=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;String&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
                 default-value=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Yellow&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
             &amp;gt;&lt;br /&gt;
                 &amp;lt;description&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;%ColorCheck.color&amp;lt;/span&amp;gt;&amp;lt;/description&amp;gt;&lt;br /&gt;
             &amp;lt;/property-metadata&amp;gt;&lt;br /&gt;
             &amp;lt;message-key key=&amp;quot;theColorIs&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/rule-metadata&amp;gt;&lt;br /&gt;
     &amp;lt;/rule-group-metadata&amp;gt;&lt;br /&gt;
 &amp;lt;/checkstyle-metadata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Javadoc-like documentation ==&lt;br /&gt;
&lt;br /&gt;
Typically, you will also want to publish human-readable documentation for your checks and filters, which is more or less identical with the text in the eclipse-cs metadata files. This is also possible with the &amp;quot;-d&amp;quot; command line option:&lt;br /&gt;
&lt;br /&gt;
 $ javadoc \&lt;br /&gt;
 &amp;gt; -doclet de.unkrig.doclet.cs.CsDoclet \&lt;br /&gt;
 &amp;gt; -docletpath &amp;quot;path/to/cs-doclet.jar;bin;path/to/checkstyle-6.1-all.jar;path/to/net.sf.eclipsecs.core-6.1.jar&amp;quot; \&lt;br /&gt;
 &amp;gt; -d ./csdoc \&lt;br /&gt;
 &amp;gt; -sourcepath src \&lt;br /&gt;
 &amp;gt; -classpath ../net.sf.checkstyle-6.1/checkstyle-6.1/checkstyle-6.1-all.jar \&lt;br /&gt;
 &amp;gt; com.pany.cs.checks&lt;br /&gt;
 Loading source files for package com.pany.cs.checks...&lt;br /&gt;
 Constructing Javadoc information...&lt;br /&gt;
 $&lt;br /&gt;
&lt;br /&gt;
This will generate a Javadoc-like HTML documentation for all checks and filters that are declared in the given Java packages.&lt;br /&gt;
&lt;br /&gt;
And you&#039;re done!&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
Before, you had to write one Java file and four more or less redundant metadata files per check; now you merely have to throw in a few annotations and doc comments and generate all four metadata files from the source code&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
The source code for the plug-in is here:&lt;br /&gt;
&lt;br /&gt;
    https://github.com/aunkrig/doclet-cs&lt;br /&gt;
    https://github.com/aunkrig/doclet-cs-annotation&lt;br /&gt;
&lt;br /&gt;
== Change log ==&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.2 2022-01-27&lt;br /&gt;
:* Ignore all standard doclet options; this makes this doclet more robust in environments that absolutely want to pass &amp;quot;standard options&amp;quot; to JAVADOC, e.g. APACHE MAVEN.&lt;br /&gt;
:* Render a list of related rules in the description of each quickfix.&lt;br /&gt;
:* Render a list of related quickfixes in the description of each check.&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.1 2022-01-25&lt;br /&gt;
:* Added the &amp;quot;-help&amp;quot; command line option. (Previously, the MAINDOC document generated by the POM was unused.)&lt;br /&gt;
:* &amp;quot;-messages.properties-dir&amp;quot; command line option worked only when option &amp;quot;-checkstyle-metadata.properties&amp;quot; was also given.&lt;br /&gt;
&lt;br /&gt;
; Version 1.1.0 2020-01-22&lt;br /&gt;
:* Type of annocation attribute &amp;quot;Rule.quickfixes&amp;quot; changed from &amp;quot;Class[]&amp;quot; to &amp;quot;String[]&amp;quot; to avoid compile-time dependencies from the CS extension to the ECLIPSECS wrapper of the CS extension.&lt;br /&gt;
:* Added support for CheckStyle version 8.5. (CheckStyle Version 8.2 had breaking changes!)&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=ANT_doclet&amp;diff=47</id>
		<title>ANT doclet</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=ANT_doclet&amp;diff=47"/>
		<updated>2024-05-02T16:41:19Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: /* Change Log */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
[[File:antdoc-ant-contrib.png|border|500px]]&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Doclet command line options:&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;directory&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Where to create documentation in HTML format (optional).&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  The effective file name is:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  &amp;lt;code&amp;gt;&amp;amp;lt;dest-dir&amp;amp;gt;/&amp;amp;lt;ant-type-group&amp;amp;gt;/&amp;amp;lt;ant-type&amp;amp;gt;.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  The default destination directory is &amp;quot;&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-splitindex&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Splits the index file into multiple files, alphabetically, one file per letter, plus a file for any index&lt;br /&gt;
entries that start with non-alphabetical characters.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-docencoding&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;charset&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The charset to use when writing the HTML files. The default is the JVM default charset, &amp;quot;${file.encoding}&amp;quot;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-charset&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;name&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The HTML character set for this document.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-doctitle&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;html-text&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The title to place near the top of the overview summary file. The text specified in the title tag is placed as&lt;br /&gt;
a centered, level-one heading directly beneath the top navigation bar. The title tag can contain HTML tags and&lt;br /&gt;
white space.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-header&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The header text to be placed at the top of each output file. The header is placed to the right of the upper&lt;br /&gt;
navigation bar. The header can contain HTML tags and white space.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-footer&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The footer text to be placed at the bottom of each output file. The footer value is placed to the right of the&lt;br /&gt;
lower navigation bar. The footer value can contain HTML tags and white space.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-top&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The text to be placed at the top of each output file.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-bottom&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The text to be placed at the bottom of each output file. The text is placed at the bottom of the page,&lt;br /&gt;
underneath the lower navigation bar. The text can contain HTML tags and white space.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-quiet&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Suppress normal output.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-notimestamp&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Suppresses the time stamp, which is hidden in an HTML comment in the generated HTML near the top of each page.&lt;br /&gt;
This is useful when you want to run the javadoc command on two source bases and get the differences between diff&lt;br /&gt;
them, because it prevents time stamps from causing a diff (which would otherwise be a diff on every page).&lt;br /&gt;
The time stamp includes the javadoc command release number.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-antlib-file&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;file&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The ANTLIB file to parse, see &amp;lt;a href=&amp;quot;https://ant.apache.org/manual/Types/antlib.html&amp;quot;&amp;gt;the documentation of&lt;br /&gt;
the ANTLIB concept&amp;lt;/a&amp;gt;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-antlib-resource&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;name&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The name of an ANTLIB resource to parse, see &amp;lt;a href=&amp;quot;https://ant.apache.org/manual/Types/antlib.html&amp;quot;&amp;gt;the&lt;br /&gt;
documentation of the ANTLIB concept&amp;lt;/a&amp;gt;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-link&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;external-documentation-url&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;See &amp;lt;a href=&amp;quot;http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDEDJFI&amp;quot;&amp;gt;the JAVADOC&lt;br /&gt;
tool documentation for the &amp;quot;-link&amp;quot; command line option&amp;lt;/a&amp;gt;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-linkoffline&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;external-documentation-url&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;package-list-location&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;See &amp;lt;a href=&amp;quot;http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDFIIJH&amp;quot;&amp;gt;the JAVADOC&lt;br /&gt;
tool documentation for the &amp;quot;-linkofflin&amp;quot; command line option&amp;lt;/a&amp;gt;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-tag&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;spec&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;For compatibility with the standard JAVADOC doclet; ignored.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-theme&amp;lt;/code&amp;gt; JAVA7|JAVA8&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Which style sheets and resources to use.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-sourcepath&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;source-path&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Takes also effect for loading ANTLIB resources.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-classpath&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;class-path&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Takes also effect for loading ANTLIB resources.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-windowtitle&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;See &amp;lt;a href=&amp;quot;http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDBIEEI&amp;quot;&amp;gt;the JAVADOC&lt;br /&gt;
tool documentation for the &amp;quot;-windowtitle&amp;quot; command line option&amp;lt;/a&amp;gt;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/dl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Supported tags:&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  The following block tags may appear in the DOC comment of a class declaration that maps to an ANT type:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;dl&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.typeGroupName &amp;lt;var&amp;gt;type-group-name&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    The name of the &amp;quot;type group&amp;quot; that the type belongs to, e.g. &amp;quot;&amp;lt;code&amp;gt;Task&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.typeGroupSubdir &amp;lt;var&amp;gt;dir-name&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    The name of the subdirectory that contains the documentation of all ANT types of the type group; e.g.&lt;br /&gt;
    &amp;quot;&amp;lt;code&amp;gt;tasks&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.typeGroupHeading &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    The heading to display above the list of types; e.g. &amp;quot;&amp;lt;code&amp;gt;Tasks&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.typeTitleMf &amp;lt;var&amp;gt;message-format&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    The message format to use to render the heading on each type details page; e.g. &amp;lt;code&amp;gt;&amp;quot;Task&lt;br /&gt;
    &amp;amp;amp;quot;&amp;amp;amp;lt;{0}&amp;amp;amp;gt;&amp;amp;amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.typeHeadingMf &amp;lt;var&amp;gt;message-format&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    The message format to use to render the title (i.e. the tooltip) of the heading on each type details page;&lt;br /&gt;
    e.g. &amp;lt;code&amp;gt;&amp;quot;Task &amp;amp;amp;amp;quot;&amp;amp;amp;lt;code&amp;amp;gt;&amp;amp;amp;lt;{0}&amp;amp;amp;gt;&amp;amp;amp;lt;/code&amp;amp;gt;&amp;amp;amp;amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.group &amp;lt;var&amp;gt;group-name&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    Attributes (or subelements) with equal &amp;lt;var&amp;gt;group-name&amp;lt;/var&amp;gt; are grouped, and the &amp;lt;var&amp;gt;group-name&amp;lt;/var&amp;gt; is rendered as a heading above the group.&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.subelementOrder inheritedFirst}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    Enforces that the subelements &amp;lt;em&amp;gt;inherited&amp;lt;/em&amp;gt; from superclasses appear &amp;lt;em&amp;gt;before&amp;lt;/em&amp;gt; the non-inherited.&lt;br /&gt;
    The default is that the subelements in their &amp;quot;natural&amp;quot; order.&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
&amp;lt;/dl&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
=== Basics ===&lt;br /&gt;
&lt;br /&gt;
The doclet parses the &amp;quot;[https://github.com/aunkrig/antology/blob/master/antology/src/main/resources/de/unkrig/antology/ant.xml ANTLIB file]&amp;quot; of your ANTLIB to identify all the tasks, types, chainable readers etc. that the ANTLIB implements. Then it finds the attribut setter and subelement adder methods, just like ANT would do. Eventually it generates one HTML page for each task, type, chainable reader etc., plus various overview, summary, index and frameset pages; very similar to what the standard JAVADOC servlet does for a set of Java classes.&lt;br /&gt;
&lt;br /&gt;
References to attribute setter and subelement adder methods are not rendered as &amp;quot;&amp;lt;Code&amp;gt;setFoo(String)&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;addPerson(Person)&amp;lt;/code&amp;gt;&amp;quot;, but like &amp;quot;&amp;lt;code&amp;gt;foo=...&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;&amp;lt;person&amp;gt;&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Links to the various standard ANT types are recognized and rendered appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Related attributes ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you want to document multiple attributes &#039;&#039;together&#039;&#039;, i.e. have only &#039;&#039;one&#039;&#039; description. To get that, write a doc comment with a description for the &#039;&#039;first&#039;&#039; setter, and for the other setters a doc comment with a &#039;&#039;sole&#039;&#039; @see tag that refers to the first setter. Here is an [http://antology.unkrig.de/antdoc/tasks/swingLookAndFeel.html#attributes_summary example].&lt;br /&gt;
&lt;br /&gt;
=== Grouping of attributes and subelements ===&lt;br /&gt;
&lt;br /&gt;
Attribute setter methods (&amp;quot;&amp;lt;code&amp;gt;set*()&amp;lt;/code&amp;gt;&amp;quot;) and subelement adder methods (&amp;quot;&amp;lt;code&amp;gt;add*()&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;addConfigured*()&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;create*()&amp;lt;/code&amp;gt;&amp;quot;) can have a &amp;quot;&amp;lt;code&amp;gt;@ant.group&amp;lt;/code&amp;gt; &#039;&#039;group-name&#039;&#039;&amp;quot; block tag in their DOC comment. If at least one attribute setter method (resp. subelement adder method) has such a block tag, then the attributes (resp. subelements) are grouped by &#039;&#039;group-name&#039;&#039;, and each group gets a respective heading, and the subelements without a &amp;lt;code&amp;gt;@ant.group&amp;lt;/code&amp;gt; go into a group &amp;quot;Other&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attribute value documentation ===&lt;br /&gt;
&lt;br /&gt;
The ANT doclet visualizes the meaning, the possible values and the default values for each attribute. The meaning is derived from the method parameter type and name (or the &amp;lt;code&amp;gt;@ant.valueExplanation&amp;lt;/code&amp;gt; block tag); the possible values (for enums) from the enum constants, and the (optional) default value from the method parameter type and the &amp;lt;code&amp;gt;@ant.defaultValue&amp;lt;/code&amp;gt; block tag.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;@ant.mandatory&amp;lt;/code&amp;gt; block tag appends &amp;quot; (mandatory)&amp;quot; to the attribute description title.&lt;br /&gt;
&lt;br /&gt;
=== Custom type groups ===&lt;br /&gt;
&lt;br /&gt;
The ANT doclet analyzes the types and, based on the interfaces they implement, assigns them to &amp;quot;type groups&amp;quot;, which will later appear in the left-hand-side frame. The well-known type groups are: &amp;quot;Tasks&amp;quot;, &amp;quot;Resource collections&amp;quot;, &amp;quot;Chainable readers&amp;quot;, &amp;quot;Conditions and &amp;quot;Other types&amp;quot;. It is also possible to assign types to your own custom type groups, by adding the following block tags to the type:&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * This type lives in a custom &amp;quot;type group&amp;quot;. For this example, we re-use the values for the &amp;quot;Tasks&amp;quot; type group -- please use your own instead.&lt;br /&gt;
  *&lt;br /&gt;
  * @ant.typeGroupSubdir  tasks&lt;br /&gt;
  * @ant.typeGroupName    Task&lt;br /&gt;
  * @ant.typeGroupHeading Tasks&lt;br /&gt;
  * @ant.typeTitleMf      Task &amp;quot;&amp;amp;amp;lt;{0}&amp;amp;amp;gt;&amp;quot;&lt;br /&gt;
  * @ant.typeHeadingMf    &amp;amp;lt;code&amp;gt;&amp;amp;amp;lt;{0}&amp;amp;amp;gt;&amp;amp;lt;/code&amp;gt;&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
=== Ordering of subelements ===&lt;br /&gt;
&lt;br /&gt;
If an ANT type (e.g. a task) or a subelement has this block tag&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * @ant.subelementOrder inheritedFirst&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
, then the subelements inherited from superclasses and interfaces are rendered &#039;&#039;before&#039;&#039; the subelements of the actual class. The default behavior is the other way round.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
The doclet JAR file is [https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&amp;amp;g=de.unkrig&amp;amp;a=doclet-ant&amp;amp;v=LATEST&amp;amp;c=jar-with-dependencies here].&lt;br /&gt;
&lt;br /&gt;
Find the source code for the doclet [https://github.com/aunkrig/doclet-ant here].&lt;br /&gt;
&lt;br /&gt;
== Change Log ==&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.7, 2018-10-29:&lt;br /&gt;
:* Fixed up links to attribute setters of ad hoc-subelements.&lt;br /&gt;
:* ttribute default values: Display control characters as &amp;quot;&amp;amp;#xxx;&amp;quot;, e.g.: delimiter=&amp;quot;delimiter-characters|, &amp;amp;#9;&amp;amp;#13;&amp;amp;#10;&amp;quot;&lt;br /&gt;
:* Fixed one NPE.&lt;br /&gt;
:* Added the &amp;quot;-tag&amp;quot; command line option for compatibility with the standard JAVADOC doclet.&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.6, 2016-12-12:&lt;br /&gt;
:* Command line processing is now &amp;quot;@CommandLineOption&amp;quot;-based.&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.5, 2016-11-25:&lt;br /&gt;
:* ANTLIB includes are now looked up through the javadoc sourcepath AND the javadoc classpath.&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.4, 2016-11-15:&lt;br /&gt;
:* The &amp;quot;-doctitle&amp;quot; command line option had no effect.&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.3, 2016-11-07:&lt;br /&gt;
:* Allow for multiple &amp;quot;-antlib-file&amp;quot; options.&lt;br /&gt;
:* Also process NESTED antlib files.&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
The ANT doclet is available under the terms of the &amp;quot;new BSD license&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015, Arno Unkrig&lt;br /&gt;
All rights reserved.&lt;br /&gt;
&lt;br /&gt;
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:&lt;br /&gt;
&lt;br /&gt;
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.&lt;br /&gt;
&lt;br /&gt;
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.&lt;br /&gt;
&lt;br /&gt;
* Neither the name of no-template nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.&lt;br /&gt;
&lt;br /&gt;
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Commons.unkrig.de&amp;diff=46</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=46"/>
		<updated>2024-05-02T16:04:23Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: /* Change Log */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=45</id>
		<title>Unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=45"/>
		<updated>2024-05-02T15:39:18Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: /* Retired Projects */&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;
=== [[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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=44</id>
		<title>Unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=44"/>
		<updated>2024-05-02T15:38:59Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: /* Larger Projects */&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;
=== [[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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Zz.unkrig.de&amp;diff=43</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=43"/>
		<updated>2024-05-02T15:23:49Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Subclipse.unkrig.de&amp;diff=36</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=36"/>
		<updated>2024-05-01T19:22:42Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;== Introduction ==  This ECLIPSE plug-in adds an additional ANT task &amp;#039;de.unkrig.subclipse.svn&amp;#039; which is available in ANT builds which have the option &amp;#039;Run in the same JRE as the workspace&amp;#039; set.  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.  == Download and Installation ==  Within ECLIPSE, download and install the feature from the update site   http://subclipse.unkrig.d...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=File:Ant_Task.jpg&amp;diff=35</id>
		<title>File:Ant Task.jpg</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=File:Ant_Task.jpg&amp;diff=35"/>
		<updated>2024-05-01T19:18:36Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=File:Custom_CVS_Command_Dialog.jpg&amp;diff=34</id>
		<title>File:Custom CVS Command Dialog.jpg</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=File:Custom_CVS_Command_Dialog.jpg&amp;diff=34"/>
		<updated>2024-05-01T19:18:04Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=File:CVS_Tools_Menu_Remote.jpg&amp;diff=33</id>
		<title>File:CVS Tools Menu Remote.jpg</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=File:CVS_Tools_Menu_Remote.jpg&amp;diff=33"/>
		<updated>2024-05-01T19:16:25Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=File:CVS_Tools_Menu.jpg&amp;diff=32</id>
		<title>File:CVS Tools Menu.jpg</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=File:CVS_Tools_Menu.jpg&amp;diff=32"/>
		<updated>2024-05-01T19:14:57Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Cvstools.unkrig.de&amp;diff=31</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=31"/>
		<updated>2024-05-01T19:14:07Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;CVS Tools - an ECLIPSE plug-in for advanced CVS operations&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;  == Overview ==  A nice little ECLIPSE plug-in that adds CVS functionality that is sometimes painfully missing from ECLIPSE&amp;#039;s built-in CVS client.  == Custom CVS command user interface == * A &amp;quot;CVS Tools...&amp;quot; entry in the popup menus of all resources that are under CVS control. 400x400px * A &amp;quot;CVS Tools...&amp;quot; entry in the popup menu of all remote resources in the &amp;quot;CVS Repo...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Loggifier.unkrig.de_/_Tools_/_Java_agent&amp;diff=30</id>
		<title>Loggifier.unkrig.de / Tools / Java agent</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Loggifier.unkrig.de_/_Tools_/_Java_agent&amp;diff=30"/>
		<updated>2024-05-01T19:12:49Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;Probably the most convenient way to loggify classes at runtime is to start the JVM with the following command line option:    $ java -javaagent:path/to/de.unkrig.loggifier.jar ...  The LOGGIFIER plugs into the [http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html &amp;quot;Java programming language agents&amp;quot; API] (available since Java 5) and implements loggification at class-loading time.  The agent interprets its argument as (newline-separated) loggif...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Probably the most convenient way to loggify classes at runtime is to start the JVM with the following command line option:&lt;br /&gt;
&lt;br /&gt;
  $ java -javaagent:path/to/de.unkrig.loggifier.jar ...&lt;br /&gt;
&lt;br /&gt;
The LOGGIFIER plugs into the [http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html &amp;quot;Java programming language agents&amp;quot; API] (available since Java 5) and implements loggification at class-loading time.&lt;br /&gt;
&lt;br /&gt;
The agent interprets its argument as (newline-separated) loggification rules:&lt;br /&gt;
&lt;br /&gt;
  $ java &#039;-javaagent:path/to/de.unkrig.loggifier.jar&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;=CLINIT=INFO&lt;br /&gt;
  &amp;gt; ALL=FINER&amp;lt;/span&amp;gt;&#039; ...&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Loggifier.unkrig.de_/_Tools_/_LoggifyingClassLoader&amp;diff=29</id>
		<title>Loggifier.unkrig.de / Tools / LoggifyingClassLoader</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Loggifier.unkrig.de_/_Tools_/_LoggifyingClassLoader&amp;diff=29"/>
		<updated>2024-05-01T19:12:09Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;From inside a running JVM, you can load loggified classes with the help of the &amp;lt;code&amp;gt;de.unkrig.loggifier.LoggifyingClassLoader&amp;lt;/code&amp;gt;.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;From inside a running JVM, you can load loggified classes with the help of the &amp;lt;code&amp;gt;de.unkrig.loggifier.LoggifyingClassLoader&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Loggifier.unkrig.de_/_Tools_/_Ant_task&amp;diff=28</id>
		<title>Loggifier.unkrig.de / Tools / Ant task</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Loggifier.unkrig.de_/_Tools_/_Ant_task&amp;diff=28"/>
		<updated>2024-05-01T19:11:19Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;LOGGIFIER defines a new task &amp;quot;&amp;amp;lt;de.unkrig.loggifier&amp;gt;&amp;quot; that loggifies your code just like the command line tool. See the example to see how to make the new task accessible from inside your ANT script.  == Attributes ==  ;selector=&amp;#039;&amp;#039;glob&amp;#039;&amp;#039;         :Which class files to instrument, e.g. &amp;quot;~**Test*.class&amp;quot;. Default is &amp;quot;all files&amp;quot;. ;out=&amp;#039;&amp;#039;file&amp;#039;&amp;#039;              :Where to write the output file or directory. Default is to perform an &amp;quot;in-place&amp;quot; loggification. ;keepOrig...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;LOGGIFIER defines a new task &amp;quot;&amp;amp;lt;de.unkrig.loggifier&amp;gt;&amp;quot; that loggifies your code just like the command line tool. See the [[#Example|example]] to see how to make the new task accessible from inside your ANT script.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
;selector=&#039;&#039;glob&#039;&#039;         :Which class files to instrument, e.g. &amp;quot;~**Test*.class&amp;quot;. Default is &amp;quot;all files&amp;quot;.&lt;br /&gt;
;out=&#039;&#039;file&#039;&#039;              :Where to write the output file or directory. Default is to perform an &amp;quot;in-place&amp;quot; loggification.&lt;br /&gt;
;keepOriginals=&#039;&#039;boolean&#039;&#039; :Keep copies of the original files (e.g. &amp;lt;code&amp;gt;.MyClass.class.orig&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.MyJar.jar.orig&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Subelements ==&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;rule&amp;gt;&#039;&#039;text&#039;&#039;&amp;lt;/rule&amp;gt;                :A loggification rule, e.g. &#039;STORE=FINE&#039;&lt;br /&gt;
;Resource Collection (&amp;lt;fileset&amp;gt; etc.) :The files to loggify (.class, .jar, .war, .ear, ...)&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;project&amp;gt;&lt;br /&gt;
      &amp;lt;taskdef classpath=&amp;quot;lib/de.unkrig.loggifier.jar&amp;quot; resource=&amp;quot;de/unkrig/loggifier/ant.properties&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
      &amp;lt;target name=&amp;quot;default&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;de.unkrig.loggifier&amp;gt;&lt;br /&gt;
              &amp;lt;rule&amp;gt;ALL=FINE&amp;lt;/rule&amp;gt;&lt;br /&gt;
              &amp;lt;fileset file=&amp;quot;bin/Main.class&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/de.unkrig.loggifier&amp;gt;&lt;br /&gt;
      &amp;lt;/target&amp;gt;&lt;br /&gt;
  &amp;lt;/project&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=File:Loggifer_project_properties_page.png&amp;diff=27</id>
		<title>File:Loggifer project properties page.png</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=File:Loggifer_project_properties_page.png&amp;diff=27"/>
		<updated>2024-05-01T19:09:11Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Loggifier.unkrig.de_/_Tools_/_Eclipse_plug-in&amp;diff=26</id>
		<title>Loggifier.unkrig.de / Tools / Eclipse plug-in</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Loggifier.unkrig.de_/_Tools_/_Eclipse_plug-in&amp;diff=26"/>
		<updated>2024-05-01T19:08:28Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;When the plug-in is installed (see below), you will find a new page in the &amp;#039;Project Properties&amp;#039; dialog:  File:Loggifer_project_properties_page.png  Here you can enable and configure loggification for the project.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When the plug-in is installed (see below), you will find a new page in the &#039;Project Properties&#039; dialog:&lt;br /&gt;
&lt;br /&gt;
[[File:Loggifer_project_properties_page.png]]&lt;br /&gt;
&lt;br /&gt;
Here you can enable and configure loggification for the project.&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Loggifier.unkrig.de_/_Tools_/_Command_line_tool&amp;diff=25</id>
		<title>Loggifier.unkrig.de / Tools / Command line tool</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Loggifier.unkrig.de_/_Tools_/_Command_line_tool&amp;diff=25"/>
		<updated>2024-05-01T19:07:46Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;Running the LOGGIFIER command line tool with the &amp;#039;&amp;lt;code&amp;gt;-help&amp;lt;/code&amp;gt;&amp;#039; option explains its usage:    Implants logging code into Java class files, and also into class files in   directory trees, ZIP format files (.zip, .jar, .war, .ear, ...) and nested ZIP   format files (e.g. .war in .ear).      Usage:     java de.unkrig.loggifier.Main [ &amp;amp;lt;option&amp;gt; ] ... &amp;amp;lt;file-or-dir&amp;gt;   Transforms the given &amp;lt;file-or-dir&amp;gt; in-place.     java de.unkrig.loggifier.Main [ &amp;amp;lt;option&amp;gt; ] ......&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Running the LOGGIFIER command line tool with the &#039;&amp;lt;code&amp;gt;-help&amp;lt;/code&amp;gt;&#039; option explains its usage:&lt;br /&gt;
&lt;br /&gt;
  Implants logging code into Java class files, and also into class files in&lt;br /&gt;
  directory trees, ZIP format files (.zip, .jar, .war, .ear, ...) and nested ZIP&lt;br /&gt;
  format files (e.g. .war in .ear).&lt;br /&gt;
  &lt;br /&gt;
  Usage:&lt;br /&gt;
    java de.unkrig.loggifier.Main [ &amp;amp;lt;option&amp;gt; ] ... &amp;amp;lt;file-or-dir&amp;gt;&lt;br /&gt;
  Transforms the given &amp;lt;file-or-dir&amp;gt; in-place.&lt;br /&gt;
    java de.unkrig.loggifier.Main [ &amp;amp;lt;option&amp;gt; ] ... &amp;lt;file-or-dir&amp;gt; ... &amp;lt;dir&amp;gt;&lt;br /&gt;
  Transforms the given &amp;lt;file-or-dir&amp;gt;s into files-and-dirs with the same names in &amp;amp;lt;dir&amp;gt;.&lt;br /&gt;
    java de.unkrig.loggifier.Main [ &amp;amp;lt;option&amp;gt; ] ... &amp;lt;file-or-dir&amp;gt; &amp;amp;lt;file-or-new-dir&amp;gt;&lt;br /&gt;
  Transforms the given &amp;lt;file-or-dir&amp;gt; into &amp;lt;file-or-new-dir&amp;gt;.&lt;br /&gt;
  &lt;br /&gt;
  Valid options:&lt;br /&gt;
    -help           Shows this text.&lt;br /&gt;
    -keep           Keep copies of original files (iff transforming in-place).&lt;br /&gt;
    -selector &amp;lt;glob&amp;gt;&lt;br /&gt;
                    Loggify only classes matching the &amp;amp;lt;glob&amp;gt;.&lt;br /&gt;
    -logging-system &amp;lt;id&amp;gt;&lt;br /&gt;
                    Style of the logging code to inject.&lt;br /&gt;
                    &amp;lt;id&amp;gt; is &#039;jre14&#039;, &#039;log4j&#039;, &#039;log4j2&#039; or &#039;slf4j&#039;. The default is&lt;br /&gt;
                    to guess, based on the classes on the classpath.&lt;br /&gt;
    -rule &amp;lt;rule&amp;gt;    Add the given loggification rule (format see below).&lt;br /&gt;
    -nowarn -quiet -verbose -debug&lt;br /&gt;
    -log &amp;lt;level&amp;gt;:&amp;lt;logger&amp;gt;:&amp;lt;handler&amp;gt;:&amp;lt;formatter&amp;gt;:&amp;lt;format&amp;gt;&lt;br /&gt;
                    Configure the log output of this command line tool.&lt;br /&gt;
 &lt;br /&gt;
  The loggification rule format is as follows:&lt;br /&gt;
    &amp;lt;action&amp;gt;[,&amp;lt;action&amp;gt;]...=&amp;lt;level&amp;gt;[:&amp;lt;expression&amp;gt;]&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;action&amp;gt;:     One of [ALOAD, ARITH, ASTORE, CAST, CATCH, CLINIT, CONST,&lt;br /&gt;
                CONVERT, ENTRY, GET, INVOKE, INSTANCEOF, LENGTH,&lt;br /&gt;
                LOAD, NEW, PUT, RESULT, RETURN, STORE, SWITCH, THROW].&lt;br /&gt;
  &amp;lt;level&amp;gt;:      One of [OFF SEVERE WARNING INFO CONFIG FINE FINER FINEST].&lt;br /&gt;
  &amp;lt;expression&amp;gt;: E.g. &#039;(&amp;lt;eq&amp;gt; || &amp;lt;eq&amp;gt;) &amp;amp;&amp;amp; !&amp;lt;eq&amp;gt;&#039;, where&lt;br /&gt;
  &amp;lt;eq&amp;gt;:         &#039;&amp;amp;lt;var&amp;gt; == &amp;lt;glob&amp;gt;&#039;, where&lt;br /&gt;
  &amp;amp;lt;var&amp;gt;:        is one of [action source classAccess class methodAccess method&lt;br /&gt;
                line type classAndField variable].&lt;br /&gt;
                For actions [CAST INSTANCEOF NEW] also &#039;type&#039;.&lt;br /&gt;
                For actions [GET PUT] also &#039;classAndField&#039;.&lt;br /&gt;
                For actions [LOAD STORE] also &#039;name&#039;.&lt;br /&gt;
  &amp;lt;glob&amp;gt;:       is a &#039;glob pattern&#039; in single quotes like &#039;*main*&#039;.&lt;br /&gt;
  &lt;br /&gt;
  The exit status is 1 iff errors occurred during loggification.&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Loggifier.unkrig.de&amp;diff=24</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=24"/>
		<updated>2024-05-01T19:06:54Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;== Motivation ==  Have you ever wondered how much cleaner your code would look if it weren&amp;#039;t littered with all that logging code? And, when you&amp;#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?  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.  == Overview ==  The concept of LOGGIFIER is as follows:  * Relevant...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=No-template&amp;diff=23</id>
		<title>No-template</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=No-template&amp;diff=23"/>
		<updated>2024-05-01T19:06:04Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;A super-small Java library for templating, i.e. generating text files (HTML, XML, whatever) from a &amp;quot;template&amp;quot; text file.  The project home page is [https://github.com/aunkrig/no-template here].&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=JDisasm&amp;diff=22</id>
		<title>JDisasm</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=JDisasm&amp;diff=22"/>
		<updated>2024-05-01T19:05:02Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;A disassembler for Java .class files.  Currently supports .class files up to and including version 8.  The project home page is [https://github.com/aunkrig/jdisasm here].  == Change Log ==  ;Version 1.0.6 (2020-11-06): :* 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;. :* Changed license URL from &amp;quot;https://raw.githubusercontent.com/janino-com...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=MAIN_doclet&amp;diff=21</id>
		<title>MAIN doclet</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=MAIN_doclet&amp;diff=21"/>
		<updated>2024-05-01T19:03:39Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;This doclet creates 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.  == Usage ==  &amp;lt;html&amp;gt;  &amp;lt;h3&amp;gt;Doclet command line options:&amp;lt;/h3&amp;gt;  &amp;lt;dl&amp;gt;   &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;dest-dir&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;   &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;--destination&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;dest-dir&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;   &amp;lt;dd&amp;gt;Where to create the HTML files. &amp;lt;p&amp;gt;   The effective file name is: &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;   &amp;lt;code&amp;gt;&amp;amp;lt;dest-dir&amp;amp;gt;/&amp;amp;lt;pkg&amp;amp;gt;/&amp;amp;lt;class&amp;amp;gt;.&amp;amp;lt;method&amp;amp;gt;.html&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;   Th...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This doclet creates 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.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Doclet command line options:&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;dest-dir&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;--destination&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;dest-dir&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Where to create the HTML files.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  The effective file name is:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  &amp;lt;code&amp;gt;&amp;amp;lt;dest-dir&amp;amp;gt;/&amp;amp;lt;pkg&amp;amp;gt;/&amp;amp;lt;class&amp;amp;gt;.&amp;amp;lt;method&amp;amp;gt;.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  The default destination directory is &amp;quot;&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;--method&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;method&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The signature of the method to document. The default is &amp;quot;main(String[])&amp;quot;; for a doclet, you may want to&lt;br /&gt;
specify &amp;lt;code&amp;gt;&amp;quot;start(RootDoc)&amp;quot;&amp;lt;/code&amp;gt;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;--docencoding&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;charset&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The charset to use when writing the HTML files. The default is the JVM default charset, &amp;quot;${file.encoding}&amp;quot;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;--charset&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;name&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The HTML character set for this document.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  If set, then the following tag appears in the &amp;lt;code&amp;gt;&amp;amp;lt;head&amp;amp;gt;&amp;lt;/code&amp;gt; of all generated documents:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  &amp;lt;code&amp;gt;&amp;amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;var&amp;gt;charset&amp;lt;/var&amp;gt;&amp;lt;code&amp;gt;&amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;--doctitle&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;title&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The title to place near the top of the output file.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;--quiet&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Suppresse normal output.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;--bottom&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;For compatibility with the JAVADOC standard doclet; ignored.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;--linkoffline&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;ext-doc-url&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;package-list-loc&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;For compatibility with the JAVADOC standard doclet; ignored.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;--windowtitle&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;title&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;For compatibility with the JAVADOC standard doclet; ignored.&amp;lt;/dd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/dl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Supported inline tags:&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;a name=&amp;quot;main.commandLineOptions&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;main.commandLineOptions}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;main.commandLineOptions&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;group-name&amp;lt;/var&amp;gt;&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    Documentation for all command line options, generated from &amp;lt;code&amp;gt;&amp;lt;a href=&amp;quot;http://commons.unkrig.de/javadoc/commons-util/de/unkrig/commons/util/annotation/CommandLineOption.html&amp;quot;&amp;gt;&amp;amp;#64;CommandLineOption&amp;lt;/a&amp;gt;&amp;lt;/code&amp;gt;-annotated&lt;br /&gt;
    setter methods.&amp;lt;br /&amp;gt;&lt;br /&gt;
    If a &amp;lt;var&amp;gt;group-name&amp;lt;/var&amp;gt; is given, then only those options appear which have a&lt;br /&gt;
    &amp;lt;a href=&amp;quot;#main.commandLineOptionGroup&amp;quot;&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;main.commandLineOptionGroup}&amp;lt;/code&amp;gt; block tag&amp;lt;/a&amp;gt; with&lt;br /&gt;
    equal &amp;lt;var&amp;gt;group-name&amp;lt;/var&amp;gt;; otherwise, only those options appear which have &amp;lt;em&amp;gt;no&amp;lt;/em&amp;gt;&lt;br /&gt;
    &amp;lt;code&amp;gt;{&amp;amp;#64;main.commandLineOptionGroup}&amp;lt;/code&amp;gt; block tag.&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;code &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;literal &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;value &amp;lt;var&amp;gt;package&amp;lt;/var&amp;gt;.&amp;lt;var&amp;gt;class&amp;lt;/var&amp;gt;#&amp;lt;var&amp;gt;field&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;link      &amp;lt;var&amp;gt;package&amp;lt;/var&amp;gt;.&amp;lt;var&amp;gt;class&amp;lt;/var&amp;gt;#&amp;lt;var&amp;gt;member&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;linkplain &amp;lt;var&amp;gt;package&amp;lt;/var&amp;gt;.&amp;lt;var&amp;gt;class&amp;lt;/var&amp;gt;#&amp;lt;var&amp;gt;member&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;docRoot}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    &amp;lt;a href=&amp;quot;http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javadoc.html#javadoctags&amp;quot;&amp;gt;Same as for&lt;br /&gt;
    the standard doclet&amp;lt;/a&amp;gt;.&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;constantsof      &amp;lt;var&amp;gt;package&amp;lt;/var&amp;gt;.&amp;lt;var&amp;gt;enum-type&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;constantsofplain &amp;lt;var&amp;gt;package&amp;lt;/var&amp;gt;.&amp;lt;var&amp;gt;enum-type&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    Links to all constants of the designated enum type, separated with &amp;quot;&amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt;&amp;quot; (a comma and a space).&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
&amp;lt;/dl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Supported block tags:&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&lt;br /&gt;
    &amp;lt;a name=&amp;quot;main.commandLineOptionGroup&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;main.commandLineOptionGroup}&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;group-name&amp;lt;/var&amp;gt;&lt;br /&gt;
  &amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    Assigns this command line option setter method to a &amp;quot;group&amp;quot;; see &amp;lt;a&lt;br /&gt;
    href=&amp;quot;#main.commandLineOptions&amp;quot;&amp;gt;the &amp;lt;code&amp;gt;{&amp;amp;#64;main.commandLineOptions}&amp;lt;/code&amp;gt; inline tag&amp;lt;/a&amp;gt;.&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
&amp;lt;/dl&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
Download the all-inclusive JAR file [https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&amp;amp;g=de.unkrig&amp;amp;a=doclet-main&amp;amp;v=LATEST&amp;amp;c=jar-with-dependencies here].&lt;br /&gt;
&lt;br /&gt;
Find the source code [https://github.com/aunkrig/maindoc here].&lt;br /&gt;
&lt;br /&gt;
== Change Log ==&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.5, 2018-11-23:&lt;br /&gt;
:* Also honor the options&#039; &amp;quot;@CommandLineOption(cardinality=...)&amp;quot;, e.g. by appending &amp;quot; (mandatory)&amp;quot; to the term of Cardinality.MANDATORY options.&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.4, 2018-10-18:&lt;br /&gt;
:* Enum @CommonsLineOption method parameter: Use &amp;quot;CONST1|CONST2|CONST3&amp;quot; as the command line argument placeholder.&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;
:* &amp;quot;html2txt&amp;quot; is now a dependency of the &amp;quot;exec-plugin&amp;quot;, not of the project.&lt;br /&gt;
:* No more warnings about classes without a &amp;quot;main()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
The MAIN doclet is available under the terms of the &amp;quot;new BSD license&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015, Arno Unkrig&lt;br /&gt;
All rights reserved.&lt;br /&gt;
&lt;br /&gt;
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:&lt;br /&gt;
&lt;br /&gt;
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.&lt;br /&gt;
&lt;br /&gt;
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.&lt;br /&gt;
&lt;br /&gt;
* Neither the name of no-template nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.&lt;br /&gt;
&lt;br /&gt;
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=File:Usage.txt.jpg&amp;diff=20</id>
		<title>File:Usage.txt.jpg</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=File:Usage.txt.jpg&amp;diff=20"/>
		<updated>2024-05-01T18:59:06Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=File:Main.main.jpg&amp;diff=19</id>
		<title>File:Main.main.jpg</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=File:Main.main.jpg&amp;diff=19"/>
		<updated>2024-05-01T18:56:33Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Html2txt&amp;diff=18</id>
		<title>Html2txt</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Html2txt&amp;diff=18"/>
		<updated>2024-05-01T18:55:34Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;A tool to convert HTML documents into plain text.  For example this HTML code  File:Main.main.jpg  is rendered like this:  File:usage.txt.jpg  For a complete description of the supported HTML inline elements, see &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;.  For a complete description of the supported HTML block elements, see &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://html2txt.unkrig.de/javad...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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.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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=JAVADOC_doclet&amp;diff=17</id>
		<title>JAVADOC doclet</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=JAVADOC_doclet&amp;diff=17"/>
		<updated>2024-05-01T18:54:38Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;A drop-in replacement for the standard JAVADOC doclet that is part of the JAVADOC utility which ships with the JDK. It implements many, but not all options of the original doclet.  The main motivation was to demonstrate the capabilities of the no-template framework; in particular its abstract templates that render &amp;quot;javadocish&amp;quot; pages. Effectively, this doclet re-implements the JDK&amp;#039;s standard JAVADOC doclet with only 4900 lines of code (including tons of co...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A drop-in replacement for the standard JAVADOC doclet that is part of the JAVADOC utility which ships with the JDK. It implements many, but not all options of the original doclet.&lt;br /&gt;
&lt;br /&gt;
The main motivation was to demonstrate the capabilities of the [[No-template|no-template]] framework; in particular its abstract templates that render &amp;quot;javadocish&amp;quot; pages. Effectively, this doclet re-implements the JDK&#039;s standard JAVADOC doclet with only 4900 lines of code (including tons of comments).&lt;br /&gt;
&lt;br /&gt;
After all, JAVADOC is *the* reference application of a doclet, and anybody who wants to write a doclet knows it and has an idea of how to get from the JAVADOC doclet to *his* doclet.&lt;br /&gt;
&lt;br /&gt;
=== Getting started ===&lt;br /&gt;
&lt;br /&gt;
To use this doclet, you must run the JAVADOC utility exactly as usual, but pass &amp;lt;code&amp;gt;-doclet&amp;lt;/code&amp;gt; and &amp;lt;tt&amp;gt;-docletpath&amp;lt;/tt&amp;gt; command line options to replace the built-in doclet with the new one.&lt;br /&gt;
&lt;br /&gt;
=== Doclet Options ===&lt;br /&gt;
&lt;br /&gt;
; -d &#039;&#039;dest-dir&#039;&#039;&lt;br /&gt;
: Same as [https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDBDAED the -d option of the original JAVADOC doclet].&lt;br /&gt;
&lt;br /&gt;
; -windowtitle &#039;&#039;text&#039;&#039;&lt;br /&gt;
: Same as [https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDBIEEI the -windowtitle option of the original JAVADOC doclet].&lt;br /&gt;
&lt;br /&gt;
; -doctitle &#039;&#039;text&#039;&#039;&lt;br /&gt;
: Same as [https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDJGBIE the -doctitle option of the original JAVADOC doclet].&lt;br /&gt;
&lt;br /&gt;
; -header &#039;&#039;text&#039;&#039;&lt;br /&gt;
: Same as [https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDDAEGD the -header option of the original JAVADOC doclet].&lt;br /&gt;
&lt;br /&gt;
; -footer &#039;&#039;text&#039;&#039;&lt;br /&gt;
: Same as [https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDFACCA the -footer option of the original JAVADOC doclet].&lt;br /&gt;
&lt;br /&gt;
; -top &#039;&#039;text&#039;&#039;&lt;br /&gt;
: Same as [https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDHHGBF the -top option of the original JAVADOC doclet].&lt;br /&gt;
&lt;br /&gt;
; -bottom &#039;&#039;text&#039;&#039;&lt;br /&gt;
: Same as [https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDECAJE the -bottom option of the original JAVADOC doclet].&lt;br /&gt;
&lt;br /&gt;
; -notimestamp&lt;br /&gt;
: Same as [https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDGBABE the -notimestamp option of the original JAVADOC doclet].&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
&lt;br /&gt;
Find the source code [https://svn.code.sf.net/p/loggifier/code/trunk/de.unkrig.doclet.javadoc here].&lt;br /&gt;
&lt;br /&gt;
Ready-to-use binaries are not (yet) available.&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Cs-doclet&amp;diff=16</id>
		<title>Cs-doclet</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Cs-doclet&amp;diff=16"/>
		<updated>2024-05-01T18:52:55Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;== Abstract ==  Cs-doclet is a [http://docs.oracle.com/javase/8/docs/technotes/guides/javadoc/ JAVADOC doclet] that generates the metadata files for [http://checkstyle.sourceforge.net/ CheckStyle] and [http://eclipse-cs.sourceforge.net/ eclipse-cs] from annotations and [http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDJGIJB doc tags] in the source code of your checks and filters.  This doclet is useful only for authors of CheckStyle extensions...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Cs-doclet is a [http://docs.oracle.com/javase/8/docs/technotes/guides/javadoc/ JAVADOC doclet] that generates the metadata files for [http://checkstyle.sourceforge.net/ CheckStyle] and [http://eclipse-cs.sourceforge.net/ eclipse-cs] from annotations and [http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDJGIJB doc tags] in the source code of your checks and filters.&lt;br /&gt;
&lt;br /&gt;
This doclet is useful only for authors of CheckStyle extensions, like [[Cs-contrib.unkrig.de|cs-contrib]].&lt;br /&gt;
&lt;br /&gt;
== Intended audience ==&lt;br /&gt;
&lt;br /&gt;
This tool is useful for the development of [http://checkstyle.sourceforge.net/ CheckStyle] checks and filters, and for their integration in [http://eclipse-cs.sourceforge.net/ eclipse-cs] and [http://www.mediawiki.org/wiki/MediaWiki MediaWiki].&lt;br /&gt;
&lt;br /&gt;
== Extending CheckStyle ==&lt;br /&gt;
&lt;br /&gt;
CheckStyle comes with an API to [http://checkstyle.sourceforge.net/writingchecks.html extend] it with custom checks and filters. Here is a completely useless, yet typical example of a custom check:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/ColorCheck.java&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 package com.pany.cs.checks;&lt;br /&gt;
 &lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.Check;&lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.DetailAST;&lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.TokenTypes;&lt;br /&gt;
 &lt;br /&gt;
 public&lt;br /&gt;
 class ColorCheck extends Check {&lt;br /&gt;
 &lt;br /&gt;
     public void&lt;br /&gt;
     setColor(String value) { this.color = value; }&lt;br /&gt;
     private String color = &amp;quot;Yellow&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     @Override public int[]&lt;br /&gt;
     getDefaultTokens() { return new int[] { TokenTypes.ANNOTATION }; }&lt;br /&gt;
 &lt;br /&gt;
     @Override public void&lt;br /&gt;
     visitToken(DetailAST ast) { this.log(ast, &amp;quot;theColorIs&amp;quot;, this.color); }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The CheckStyle extension API supports internationalization be means of &amp;quot;messages.properties&amp;quot; files:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/messages.properties&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 theColorIs = The color is &#039;&#039;{0}&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/messages_de.properties&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 theColorIs = Die Farbe ist &#039;&#039;{0}&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To make use of this check, you&#039;d write a &amp;quot;CheckStyle configuration file&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;checkstyle-config.xml&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE module PUBLIC &amp;quot;-//Puppy Crawl//DTD Check Configuration 1.3//EN&amp;quot; &amp;quot;http://www.puppycrawl.com/dtds/configuration_1_3.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;module name=&amp;quot;Checker&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;property name=&amp;quot;severity&amp;quot; value=&amp;quot;warning&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;module name=&amp;quot;TreeWalker&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;module name=&amp;quot;com.pany: ColorCheck&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;property name=&amp;quot;color&amp;quot; value=&amp;quot;blue&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/module&amp;gt;&lt;br /&gt;
   &amp;lt;/module&amp;gt;&lt;br /&gt;
 &amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
, and execute CheckStyle on a target project, e.g. on the example project itself:&lt;br /&gt;
&lt;br /&gt;
 $ javac -d bin src/com/pany/cs/checks/ColorCheck.java&lt;br /&gt;
 $ java -classpath &#039;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;bin&amp;lt;/span&amp;gt;;path/to/checkstyle-6.1-all.jar&#039; \&lt;br /&gt;
 &amp;gt; com.puppycrawl.tools.checkstyle.Main \&lt;br /&gt;
 &amp;gt; -c checkstyle-config.xml \&lt;br /&gt;
 &amp;gt; -r src&lt;br /&gt;
 Starting audit...&lt;br /&gt;
 C:\dev\EclipseWS\de.unkrig.cs-contrib\foo\src\com\pany\cs\checks\ColorCheck.java:14:5: warning: The color is &#039;blue&#039;&lt;br /&gt;
 C:\dev\EclipseWS\de.unkrig.cs-contrib\foo\src\com\pany\cs\checks\ColorCheck.java:17:5: warning: The color is &#039;blue&#039;&lt;br /&gt;
 Audit done.&lt;br /&gt;
 $&lt;br /&gt;
&lt;br /&gt;
(We get the two warnings because there are two &amp;quot;@Override&amp;quot; annotations in the code.)&lt;br /&gt;
&lt;br /&gt;
Obviously, the Java code and the &amp;quot;messages.properties&amp;quot; files must be kept in sync with the Java code at all times, which is naturally very error-prone.&lt;br /&gt;
&lt;br /&gt;
Cs-doclet facilitates the task by generating the &amp;quot;messages.properties&amp;quot; file from annotations in the source code:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/MyCheck.java&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 package com.pany.cs.checks;&lt;br /&gt;
 &lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.Check;&lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.DetailAST;&lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.TokenTypes;&lt;br /&gt;
 &lt;br /&gt;
 public&lt;br /&gt;
 class ColorCheck extends Check {&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;@Message(&amp;quot;The color is &#039;&#039;{0}&#039;&#039;&amp;quot;)&lt;br /&gt;
     private static final String MESSAGE_KEY_THE_COLOR_IS = &amp;quot;theColorIs&amp;quot;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     public void&lt;br /&gt;
     setColor(String value) { this.color = value; }&lt;br /&gt;
     private String color = &amp;quot;Yellow&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     @Override public int[]&lt;br /&gt;
     getDefaultTokens() { return new int[] { TokenTypes.ANNOTATION }; }&lt;br /&gt;
 &lt;br /&gt;
     @Override public void&lt;br /&gt;
     visitToken(DetailAST ast) { this.log(ast, &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;MESSAGE_KEY_THE_COLOR_IS&amp;lt;/span&amp;gt;, this.color); }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
To generate the &amp;quot;messages.properties&amp;quot; file, you&#039;d run JAVADOC with the cs-doclet and the &amp;quot;-messages.properties-dir&amp;quot; command line option:&lt;br /&gt;
 $ javadoc \&lt;br /&gt;
 &amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;-doclet de.unkrig.doclet.cs.CsDoclet&amp;lt;/span&amp;gt; \&lt;br /&gt;
 &amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;-docletpath &amp;quot;path/to/cs-doclet.jar;bin;path/to/checkstyle-6.1-all.jar;path/to/net.sf.eclipsecs.core-6.1.jar&amp;quot;&amp;lt;/span&amp;gt; \&lt;br /&gt;
 &amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;-messages.properties-dir src&amp;lt;/span&amp;gt; \&lt;br /&gt;
 &amp;gt; -sourcepath src \&lt;br /&gt;
 &amp;gt; -classpath ../net.sf.checkstyle-6.1/checkstyle-6.1/checkstyle-6.1-all.jar \&lt;br /&gt;
 &amp;gt; com.pany.cs.checks&lt;br /&gt;
 Loading source files for package com.pany.cs.checks...&lt;br /&gt;
 Constructing Javadoc information...&lt;br /&gt;
 $&lt;br /&gt;
&lt;br /&gt;
Notice that both &amp;quot;checkstyle.jar&amp;quot; and &amp;quot;net.sf.eclipsecs-core.jar&amp;quot; must be on the &amp;quot;-docletpath&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The generated &amp;quot;src/com/pany/cs/checks/messages.properties&amp;quot; file looks like this:&lt;br /&gt;
&lt;br /&gt;
 # This file was generated by the CS doclet; see http://cs-doclet.unkrig.de/&lt;br /&gt;
 &lt;br /&gt;
 # Custom check messages, in alphabetical order.&lt;br /&gt;
 &lt;br /&gt;
 # --------------- com.pany: ColorCheck ---------------&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;theColorIs&amp;lt;/span&amp;gt; = &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;The color is &#039;&#039;{0}&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And voilà! All the messages are where they belong: In the source code.&lt;br /&gt;
&lt;br /&gt;
== Integrating with eclipse-cs ==&lt;br /&gt;
&lt;br /&gt;
When you integrate your checks with eclipse-cs, then you learn that you have to write two more metadata files:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;checkstyle-metadata.xml&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE checkstyle-metadata PUBLIC&lt;br /&gt;
 &amp;quot;-//eclipse-cs//DTD Check Metadata 1.1//EN&amp;quot;&lt;br /&gt;
 &amp;quot;http://eclipse-cs.sourceforge.net/dtds/checkstyle-metadata_1_1.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;checkstyle-metadata&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;rule-group-metadata name=&amp;quot;%Whitespace.group&amp;quot; priority=&amp;quot;999&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;rule-metadata&lt;br /&gt;
             internal-name=&amp;quot;com.pany.cs.checks.ColorCheck&amp;quot;&lt;br /&gt;
             parent=&amp;quot;TreeWalker&amp;quot;&lt;br /&gt;
             name=&amp;quot;%ColorCheck.name&amp;quot;&lt;br /&gt;
         &amp;gt;&lt;br /&gt;
             &amp;lt;alternative-name internal-name=&amp;quot;com.pany.cs.checks.ColorCheck&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;description&amp;gt;%ColorCheck.desc&amp;lt;/description&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
             &amp;lt;property-metadata&lt;br /&gt;
                 name=&amp;quot;color&amp;quot;&lt;br /&gt;
                 datatype=&amp;quot;String&amp;quot;&lt;br /&gt;
                 default-value=&amp;quot;Yellow&amp;quot;&lt;br /&gt;
             &amp;gt;&lt;br /&gt;
                 &amp;lt;description&amp;gt;%ColorCheck.color&amp;lt;/description&amp;gt;&lt;br /&gt;
             &amp;lt;/property-metadata&amp;gt;&lt;br /&gt;
             &amp;lt;message-key key=&amp;quot;theColorIs&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/rule-metadata&amp;gt;&lt;br /&gt;
     &amp;lt;/rule-group-metadata&amp;gt;&lt;br /&gt;
 &amp;lt;/checkstyle-metadata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;checkstyle-metadata.properties&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 Whitespace.group = Whitespace&lt;br /&gt;
 ColorCheck.name = com.pany: ColorCheck&lt;br /&gt;
 ColorCheck.desc =\&lt;br /&gt;
     A completely useless check which merely prints a (localizable) message each \&lt;br /&gt;
     time it encounters an annotation.&lt;br /&gt;
 ColorCheck.color = A completely useless check parameter.&lt;br /&gt;
&lt;br /&gt;
Tedious, isn&#039;t it? Well, you can tell cs-doclet to also generate &#039;&#039;these&#039;&#039; files from annotations (and doc comments):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/MyCheck.java&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 // File &amp;quot;src/com/pany/cs/ColorCheck.java&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
 package com.pany.cs.checks;&lt;br /&gt;
 &lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.Check;&lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.DetailAST;&lt;br /&gt;
 import com.puppycrawl.tools.checkstyle.api.TokenTypes;&lt;br /&gt;
 &lt;br /&gt;
 import de.unkrig.csdoclet.StringRuleProperty;&lt;br /&gt;
 import de.unkrig.csdoclet.Rule;&lt;br /&gt;
 &lt;br /&gt;
 /**&lt;br /&gt;
  * &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;A completely useless check which merely prints a&amp;lt;/span&amp;gt;&lt;br /&gt;
  * &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;(localizable) message each time it encounters an annotation.&amp;lt;/span&amp;gt;&lt;br /&gt;
  */&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;@Rule(&lt;br /&gt;
     group      = &amp;quot;%Whitespace.group&amp;quot;,&lt;br /&gt;
     groupName  = &amp;quot;Whitespace&amp;quot;,&lt;br /&gt;
     name       = &amp;quot;com.pany: ColorCheck&amp;quot;,&lt;br /&gt;
     parent     = &amp;quot;TreeWalker&amp;quot;&lt;br /&gt;
 )&amp;lt;/span&amp;gt;&lt;br /&gt;
 public&lt;br /&gt;
 class ColorCheck extends Check {&lt;br /&gt;
 &lt;br /&gt;
     @Message(&amp;quot;The color is &#039;&#039;{0}&#039;&#039;&amp;quot;)&lt;br /&gt;
     private static final String MESSAGE_KEY_THE_COLOR_IS = &amp;quot;theColorIs&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     /**&lt;br /&gt;
      * &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;A completely useless check parameter&amp;lt;/span&amp;gt;.&lt;br /&gt;
      */&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;@StringRuleProperty(defaultValue = DEFAULT_COLOR)&amp;lt;/span&amp;gt;&lt;br /&gt;
     public void&lt;br /&gt;
     setColor(String value) { this.color = value; }&lt;br /&gt;
 &lt;br /&gt;
     private String color = &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;DEFAULT_COLOR&amp;lt;/span&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;private static final String DEFAULT_COLOR = &amp;quot;Yellow&amp;quot;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     @Override public int[]&lt;br /&gt;
     getDefaultTokens() { return new int[] { TokenTypes.ANNOTATION }; }&lt;br /&gt;
 &lt;br /&gt;
     @Override public void&lt;br /&gt;
     visitToken(DetailAST ast) { this.log(ast, MESSAGE_KEY_THE_COLOR_IS, this.color); }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 $ javadoc \&lt;br /&gt;
 &amp;gt; -doclet de.unkrig.doclet.cs.CsDoclet \&lt;br /&gt;
 &amp;gt; -docletpath &amp;quot;path/to/cs-doclet.jar;bin;path/to/checkstyle-6.1-all.jar;path/to/net.sf.eclipsecs.core-6.1.jar&amp;quot; \&lt;br /&gt;
 &amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;-checkstyle-metadata.properties-dir src&amp;lt;/span&amp;gt; \&lt;br /&gt;
 &amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;-checkstyle-metadata.xml-dir src&amp;lt;/span&amp;gt; \&lt;br /&gt;
 &amp;gt; -messages.properties-dir src \&lt;br /&gt;
 &amp;gt; -sourcepath src \&lt;br /&gt;
 &amp;gt; -classpath ../net.sf.checkstyle-6.1/checkstyle-6.1/checkstyle-6.1-all.jar \&lt;br /&gt;
 &amp;gt; com.pany.cs.checks&lt;br /&gt;
 Loading source files for package com.pany.cs.checks...&lt;br /&gt;
 Constructing Javadoc information...&lt;br /&gt;
 $&lt;br /&gt;
&lt;br /&gt;
And you&#039;ll get:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/checkstyle-metadata.properties&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 # This file was generated by the CS doclet; see http://cs-doclet.unkrig.de/&lt;br /&gt;
 &lt;br /&gt;
 # Rule groups:&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Whitespace.group&amp;lt;/span&amp;gt; = &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Whitespace&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 # Custom checks, in alphabetical order.&lt;br /&gt;
 &lt;br /&gt;
 # --------------- &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;com.pany: ColorCheck&amp;lt;/span&amp;gt; ---------------&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ColorCheck.name&amp;lt;/span&amp;gt; = &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;com.pany: ColorCheck&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ColorCheck.desc&amp;lt;/span&amp;gt; =\&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;A completely useless check which merely prints a (localizable) message each time it encounters an annotation.&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ColorCheck.color&amp;lt;/span&amp;gt;                                  = &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;A completely useless check parameter.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File &amp;quot;src/com/pany/cs/checks/checkstyle-metadata.xml&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE checkstyle-metadata PUBLIC&lt;br /&gt;
 &amp;quot;-//eclipse-cs//DTD Check Metadata 1.1//EN&amp;quot;&lt;br /&gt;
 &amp;quot;http://eclipse-cs.sourceforge.net/dtds/checkstyle-metadata_1_1.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;checkstyle-metadata&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;amp;lt;!-- This file was generated by the CS doclet; see http://cs-doclet.unkrig.de/ --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;amp;lt;!-- ColorCheck --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;rule-group-metadata name=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;%Whitespace.group&amp;lt;/span&amp;gt;&amp;quot; priority=&amp;quot;999&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;rule-metadata&lt;br /&gt;
             internal-name=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;com.pany.cs.checks.ColorCheck&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
             parent=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;TreeWalker&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
             name=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;%ColorCheck.name&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
         &amp;gt;&lt;br /&gt;
             &amp;lt;alternative-name internal-name=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;com.pany.cs.checks.ColorCheck&amp;lt;/span&amp;gt;&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;description&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;%ColorCheck.desc&amp;lt;/span&amp;gt;&amp;lt;/description&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
             &amp;lt;property-metadata&lt;br /&gt;
                 name=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;color&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
                 datatype=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;String&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
                 default-value=&amp;quot;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Yellow&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
             &amp;gt;&lt;br /&gt;
                 &amp;lt;description&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;%ColorCheck.color&amp;lt;/span&amp;gt;&amp;lt;/description&amp;gt;&lt;br /&gt;
             &amp;lt;/property-metadata&amp;gt;&lt;br /&gt;
             &amp;lt;message-key key=&amp;quot;theColorIs&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/rule-metadata&amp;gt;&lt;br /&gt;
     &amp;lt;/rule-group-metadata&amp;gt;&lt;br /&gt;
 &amp;lt;/checkstyle-metadata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Javadoc-like documentation ==&lt;br /&gt;
&lt;br /&gt;
Typically, you will also want to publish human-readable documentation for your checks and filters, which is more or less identical with the text in the eclipse-cs metadata files. This is also possible with the &amp;quot;-d&amp;quot; command line option:&lt;br /&gt;
&lt;br /&gt;
 $ javadoc \&lt;br /&gt;
 &amp;gt; -doclet de.unkrig.doclet.cs.CsDoclet \&lt;br /&gt;
 &amp;gt; -docletpath &amp;quot;path/to/cs-doclet.jar;bin;path/to/checkstyle-6.1-all.jar;path/to/net.sf.eclipsecs.core-6.1.jar&amp;quot; \&lt;br /&gt;
 &amp;gt; -d ./csdoc \&lt;br /&gt;
 &amp;gt; -sourcepath src \&lt;br /&gt;
 &amp;gt; -classpath ../net.sf.checkstyle-6.1/checkstyle-6.1/checkstyle-6.1-all.jar \&lt;br /&gt;
 &amp;gt; com.pany.cs.checks&lt;br /&gt;
 Loading source files for package com.pany.cs.checks...&lt;br /&gt;
 Constructing Javadoc information...&lt;br /&gt;
 $&lt;br /&gt;
&lt;br /&gt;
This will generate a Javadoc-like HTML documentation for all checks and filters that are declared in the given Java packages.&lt;br /&gt;
&lt;br /&gt;
And you&#039;re done!&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
Before, you had to write one Java file and four more or less redundant metadata files per check; now you merely have to throw in a few annotations and doc comments and generate all four metadata files from the source code&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
The source code for the plug-in is here:&lt;br /&gt;
&lt;br /&gt;
    https://github.com/aunkrig/doclet-cs&lt;br /&gt;
    https://github.com/aunkrig/doclet-cs-annotation&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=File:Antdoc-ant-contrib.png&amp;diff=15</id>
		<title>File:Antdoc-ant-contrib.png</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=File:Antdoc-ant-contrib.png&amp;diff=15"/>
		<updated>2024-05-01T18:35:28Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=ANT_doclet&amp;diff=14</id>
		<title>ANT doclet</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=ANT_doclet&amp;diff=14"/>
		<updated>2024-05-01T18:33:56Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;Generates (JAVADOC-like) HTML documentation for [http://ant.apache.org APACHE ANT] antlibs.  The motivation for writing this doclet is to ease the maintenance of the documentation for the Antology antlib:  500px  == Usage ==  &amp;lt;html&amp;gt;  &amp;lt;h3&amp;gt;Doclet command line options:&amp;lt;/h3&amp;gt;  &amp;lt;dl&amp;gt;   &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;directory&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;   &amp;lt;dd&amp;gt;Where to create documentation in HTML format (optional). &amp;lt;p&amp;gt;   The effective file name is: &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
[[File:antdoc-ant-contrib.png|border|500px]]&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Doclet command line options:&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;directory&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Where to create documentation in HTML format (optional).&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  The effective file name is:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  &amp;lt;code&amp;gt;&amp;amp;lt;dest-dir&amp;amp;gt;/&amp;amp;lt;ant-type-group&amp;amp;gt;/&amp;amp;lt;ant-type&amp;amp;gt;.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  The default destination directory is &amp;quot;&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-splitindex&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Splits the index file into multiple files, alphabetically, one file per letter, plus a file for any index&lt;br /&gt;
entries that start with non-alphabetical characters.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-docencoding&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;charset&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The charset to use when writing the HTML files. The default is the JVM default charset, &amp;quot;${file.encoding}&amp;quot;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-charset&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;name&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The HTML character set for this document.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-doctitle&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;html-text&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The title to place near the top of the overview summary file. The text specified in the title tag is placed as&lt;br /&gt;
a centered, level-one heading directly beneath the top navigation bar. The title tag can contain HTML tags and&lt;br /&gt;
white space.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-header&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The header text to be placed at the top of each output file. The header is placed to the right of the upper&lt;br /&gt;
navigation bar. The header can contain HTML tags and white space.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-footer&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The footer text to be placed at the bottom of each output file. The footer value is placed to the right of the&lt;br /&gt;
lower navigation bar. The footer value can contain HTML tags and white space.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-top&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The text to be placed at the top of each output file.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-bottom&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The text to be placed at the bottom of each output file. The text is placed at the bottom of the page,&lt;br /&gt;
underneath the lower navigation bar. The text can contain HTML tags and white space.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-quiet&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Suppress normal output.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-notimestamp&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Suppresses the time stamp, which is hidden in an HTML comment in the generated HTML near the top of each page.&lt;br /&gt;
This is useful when you want to run the javadoc command on two source bases and get the differences between diff&lt;br /&gt;
them, because it prevents time stamps from causing a diff (which would otherwise be a diff on every page).&lt;br /&gt;
The time stamp includes the javadoc command release number.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-antlib-file&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;file&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The ANTLIB file to parse, see &amp;lt;a href=&amp;quot;https://ant.apache.org/manual/Types/antlib.html&amp;quot;&amp;gt;the documentation of&lt;br /&gt;
the ANTLIB concept&amp;lt;/a&amp;gt;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-antlib-resource&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;name&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;The name of an ANTLIB resource to parse, see &amp;lt;a href=&amp;quot;https://ant.apache.org/manual/Types/antlib.html&amp;quot;&amp;gt;the&lt;br /&gt;
documentation of the ANTLIB concept&amp;lt;/a&amp;gt;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-link&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;external-documentation-url&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;See &amp;lt;a href=&amp;quot;http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDEDJFI&amp;quot;&amp;gt;the JAVADOC&lt;br /&gt;
tool documentation for the &amp;quot;-link&amp;quot; command line option&amp;lt;/a&amp;gt;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-linkoffline&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;external-documentation-url&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;package-list-location&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;See &amp;lt;a href=&amp;quot;http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDFIIJH&amp;quot;&amp;gt;the JAVADOC&lt;br /&gt;
tool documentation for the &amp;quot;-linkofflin&amp;quot; command line option&amp;lt;/a&amp;gt;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-tag&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;spec&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;For compatibility with the standard JAVADOC doclet; ignored.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-theme&amp;lt;/code&amp;gt; JAVA7|JAVA8&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Which style sheets and resources to use.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-sourcepath&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;source-path&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Takes also effect for loading ANTLIB resources.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-classpath&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;class-path&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;Takes also effect for loading ANTLIB resources.&amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;-windowtitle&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;See &amp;lt;a href=&amp;quot;http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDBIEEI&amp;quot;&amp;gt;the JAVADOC&lt;br /&gt;
tool documentation for the &amp;quot;-windowtitle&amp;quot; command line option&amp;lt;/a&amp;gt;.&amp;lt;/dd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/dl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Supported tags:&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  The following block tags may appear in the DOC comment of a class declaration that maps to an ANT type:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;dl&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.typeGroupName &amp;lt;var&amp;gt;type-group-name&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    The name of the &amp;quot;type group&amp;quot; that the type belongs to, e.g. &amp;quot;&amp;lt;code&amp;gt;Task&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.typeGroupSubdir &amp;lt;var&amp;gt;dir-name&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    The name of the subdirectory that contains the documentation of all ANT types of the type group; e.g.&lt;br /&gt;
    &amp;quot;&amp;lt;code&amp;gt;tasks&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.typeGroupHeading &amp;lt;var&amp;gt;text&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    The heading to display above the list of types; e.g. &amp;quot;&amp;lt;code&amp;gt;Tasks&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.typeTitleMf &amp;lt;var&amp;gt;message-format&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    The message format to use to render the heading on each type details page; e.g. &amp;lt;code&amp;gt;&amp;quot;Task&lt;br /&gt;
    &amp;amp;amp;quot;&amp;amp;amp;lt;{0}&amp;amp;amp;gt;&amp;amp;amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.typeHeadingMf &amp;lt;var&amp;gt;message-format&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    The message format to use to render the title (i.e. the tooltip) of the heading on each type details page;&lt;br /&gt;
    e.g. &amp;lt;code&amp;gt;&amp;quot;Task &amp;amp;amp;amp;quot;&amp;amp;amp;lt;code&amp;amp;gt;&amp;amp;amp;lt;{0}&amp;amp;amp;gt;&amp;amp;amp;lt;/code&amp;amp;gt;&amp;amp;amp;amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.group &amp;lt;var&amp;gt;group-name&amp;lt;/var&amp;gt;}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    Attributes (or subelements) with equal &amp;lt;var&amp;gt;group-name&amp;lt;/var&amp;gt; are grouped, and the &amp;lt;var&amp;gt;group-name&amp;lt;/var&amp;gt; is rendered as a heading above the group.&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
  &amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;{&amp;amp;#64;ant.subelementOrder inheritedFirst}&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
  &amp;lt;dd&amp;gt;&lt;br /&gt;
    Enforces that the subelements &amp;lt;em&amp;gt;inherited&amp;lt;/em&amp;gt; from superclasses appear &amp;lt;em&amp;gt;before&amp;lt;/em&amp;gt; the non-inherited.&lt;br /&gt;
    The default is that the subelements in their &amp;quot;natural&amp;quot; order.&lt;br /&gt;
  &amp;lt;/dd&amp;gt;&lt;br /&gt;
&amp;lt;/dl&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
=== Basics ===&lt;br /&gt;
&lt;br /&gt;
The doclet parses the &amp;quot;[https://github.com/aunkrig/antology/blob/master/antology/src/main/resources/de/unkrig/antology/ant.xml ANTLIB file]&amp;quot; of your ANTLIB to identify all the tasks, types, chainable readers etc. that the ANTLIB implements. Then it finds the attribut setter and subelement adder methods, just like ANT would do. Eventually it generates one HTML page for each task, type, chainable reader etc., plus various overview, summary, index and frameset pages; very similar to what the standard JAVADOC servlet does for a set of Java classes.&lt;br /&gt;
&lt;br /&gt;
References to attribute setter and subelement adder methods are not rendered as &amp;quot;&amp;lt;Code&amp;gt;setFoo(String)&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;addPerson(Person)&amp;lt;/code&amp;gt;&amp;quot;, but like &amp;quot;&amp;lt;code&amp;gt;foo=...&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;&amp;lt;person&amp;gt;&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Links to the various standard ANT types are recognized and rendered appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Related attributes ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you want to document multiple attributes &#039;&#039;together&#039;&#039;, i.e. have only &#039;&#039;one&#039;&#039; description. To get that, write a doc comment with a description for the &#039;&#039;first&#039;&#039; setter, and for the other setters a doc comment with a &#039;&#039;sole&#039;&#039; @see tag that refers to the first setter. Here is an [http://antology.unkrig.de/antdoc/tasks/swingLookAndFeel.html#attributes_summary example].&lt;br /&gt;
&lt;br /&gt;
=== Grouping of attributes and subelements ===&lt;br /&gt;
&lt;br /&gt;
Attribute setter methods (&amp;quot;&amp;lt;code&amp;gt;set*()&amp;lt;/code&amp;gt;&amp;quot;) and subelement adder methods (&amp;quot;&amp;lt;code&amp;gt;add*()&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;addConfigured*()&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;create*()&amp;lt;/code&amp;gt;&amp;quot;) can have a &amp;quot;&amp;lt;code&amp;gt;@ant.group&amp;lt;/code&amp;gt; &#039;&#039;group-name&#039;&#039;&amp;quot; block tag in their DOC comment. If at least one attribute setter method (resp. subelement adder method) has such a block tag, then the attributes (resp. subelements) are grouped by &#039;&#039;group-name&#039;&#039;, and each group gets a respective heading, and the subelements without a &amp;lt;code&amp;gt;@ant.group&amp;lt;/code&amp;gt; go into a group &amp;quot;Other&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attribute value documentation ===&lt;br /&gt;
&lt;br /&gt;
The ANT doclet visualizes the meaning, the possible values and the default values for each attribute. The meaning is derived from the method parameter type and name (or the &amp;lt;code&amp;gt;@ant.valueExplanation&amp;lt;/code&amp;gt; block tag); the possible values (for enums) from the enum constants, and the (optional) default value from the method parameter type and the &amp;lt;code&amp;gt;@ant.defaultValue&amp;lt;/code&amp;gt; block tag.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;@ant.mandatory&amp;lt;/code&amp;gt; block tag appends &amp;quot; (mandatory)&amp;quot; to the attribute description title.&lt;br /&gt;
&lt;br /&gt;
=== Custom type groups ===&lt;br /&gt;
&lt;br /&gt;
The ANT doclet analyzes the types and, based on the interfaces they implement, assigns them to &amp;quot;type groups&amp;quot;, which will later appear in the left-hand-side frame. The well-known type groups are: &amp;quot;Tasks&amp;quot;, &amp;quot;Resource collections&amp;quot;, &amp;quot;Chainable readers&amp;quot;, &amp;quot;Conditions and &amp;quot;Other types&amp;quot;. It is also possible to assign types to your own custom type groups, by adding the following block tags to the type:&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * This type lives in a custom &amp;quot;type group&amp;quot;. For this example, we re-use the values for the &amp;quot;Tasks&amp;quot; type group -- please use your own instead.&lt;br /&gt;
  *&lt;br /&gt;
  * @ant.typeGroupSubdir  tasks&lt;br /&gt;
  * @ant.typeGroupName    Task&lt;br /&gt;
  * @ant.typeGroupHeading Tasks&lt;br /&gt;
  * @ant.typeTitleMf      Task &amp;quot;&amp;amp;amp;lt;{0}&amp;amp;amp;gt;&amp;quot;&lt;br /&gt;
  * @ant.typeHeadingMf    &amp;amp;lt;code&amp;gt;&amp;amp;amp;lt;{0}&amp;amp;amp;gt;&amp;amp;lt;/code&amp;gt;&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
=== Ordering of subelements ===&lt;br /&gt;
&lt;br /&gt;
If an ANT type (e.g. a task) or a subelement has this block tag&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * @ant.subelementOrder inheritedFirst&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
, then the subelements inherited from superclasses and interfaces are rendered &#039;&#039;before&#039;&#039; the subelements of the actual class. The default behavior is the other way round.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
The doclet JAR file is [https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&amp;amp;g=de.unkrig&amp;amp;a=doclet-ant&amp;amp;v=LATEST&amp;amp;c=jar-with-dependencies here].&lt;br /&gt;
&lt;br /&gt;
Find the source code for the doclet [https://github.com/aunkrig/doclet-ant here].&lt;br /&gt;
&lt;br /&gt;
== Change Log ==&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.5, 2016-11-25:&lt;br /&gt;
:* ANTLIB includes are now looked up through the javadoc sourcepath AND the javadoc classpath.&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.4, 2016-11-15:&lt;br /&gt;
:* The &amp;quot;-doctitle&amp;quot; command line option had no effect.&lt;br /&gt;
&lt;br /&gt;
; Version 1.0.3, 2016-11-07:&lt;br /&gt;
:* Allow for multiple &amp;quot;-antlib-file&amp;quot; options.&lt;br /&gt;
:* Also process NESTED antlib files.&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
The ANT doclet is available under the terms of the &amp;quot;new BSD license&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015, Arno Unkrig&lt;br /&gt;
All rights reserved.&lt;br /&gt;
&lt;br /&gt;
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:&lt;br /&gt;
&lt;br /&gt;
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.&lt;br /&gt;
&lt;br /&gt;
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.&lt;br /&gt;
&lt;br /&gt;
* Neither the name of no-template nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.&lt;br /&gt;
&lt;br /&gt;
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Doclet&amp;diff=13</id>
		<title>Doclet</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Doclet&amp;diff=13"/>
		<updated>2024-05-01T18:33:09Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;This site makes several doclets publicly available which I wrote for my personal needs, but are hopefully useful for others. Enjoy!  == The ANT Doclet ==  Generates (JAVADOC-like) HTML documentation for [http://ant.apache.org APACHE ANT] antlibs.  The motivation for writing this doclet is to ease the maintenance of the documentation for the Antology antlib.  Read more...  == The CheckStyle Doclet ==  Generates (JAVADOC-like) HTML documentation and the...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Commons.unkrig.de&amp;diff=12</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=12"/>
		<updated>2024-05-01T18:31:57Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;&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. It extends and integrates seamlessly with the standard JDK library.  == Overview ==  &amp;lt;tt&amp;gt;de.unkrig.commons&amp;lt;/tt&amp;gt; is structured in several modules who&amp;#039;s names are aligned to the related packages in the JDK libraries.  == Module Details ==  === commons-asm ===  Helper classes that are useful in the context of [http://forge.ow2.org/projects/asm/ ASM], a Ja...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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.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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Cs-contrib.unkrig.de&amp;diff=11</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=11"/>
		<updated>2024-05-01T18:30:34Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;&amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;checkstyle, checks, filters, quickfixes&amp;quot;&amp;gt;&amp;lt;/meta&amp;gt; &amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;Custom checks, filters and quickfixes for checkstyle and eclipse-cs&amp;quot;&amp;gt;&amp;lt;/meta&amp;gt; = Introduction = This project adds custom checks, filters and quickfixes for [http://checkstyle.sourceforge.net/ CheckStyle] and [http://eclipse-cs.sourceforge.net/ Eclipse-CS].  This project uses the CS doclet (internally) to generate its CheckStyle and eclipse-cs meta...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;checkstyle, checks, filters, quickfixes&amp;quot;&amp;gt;&amp;lt;/meta&amp;gt;&lt;br /&gt;
&amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;Custom checks, filters and quickfixes for checkstyle and eclipse-cs&amp;quot;&amp;gt;&amp;lt;/meta&amp;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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Zz.unkrig.de&amp;diff=10</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=10"/>
		<updated>2024-05-01T18:25:10Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;&amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;java, compressed, archive, zip, zipped, nested&amp;quot;&amp;gt;&amp;lt;/meta&amp;gt; &amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;A set of command-line tools that handle not only directories and files, but also archive and compressed files, and even nested archive files&amp;quot;&amp;gt;&amp;lt;/meta&amp;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-th...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;java, compressed, archive, zip, zipped, nested&amp;quot;&amp;gt;&amp;lt;/meta&amp;gt;&lt;br /&gt;
&amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;A set of command-line tools that handle not only directories and files, but also archive and compressed files, and even nested archive files&amp;quot;&amp;gt;&amp;lt;/meta&amp;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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=New_BSD_License&amp;diff=9</id>
		<title>New BSD License</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=New_BSD_License&amp;diff=9"/>
		<updated>2024-05-01T18:23:26Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:  # Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution....&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Redistribution and use in source and binary forms, with or without modification, are permitted provided that the&lt;br /&gt;
following conditions are met:&lt;br /&gt;
&lt;br /&gt;
# Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.&lt;br /&gt;
# Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.&lt;br /&gt;
# Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.&lt;br /&gt;
&lt;br /&gt;
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES,&lt;br /&gt;
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE&lt;br /&gt;
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,&lt;br /&gt;
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR&lt;br /&gt;
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,&lt;br /&gt;
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE&lt;br /&gt;
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Antology_Change_Log&amp;diff=8</id>
		<title>Antology Change Log</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Antology_Change_Log&amp;diff=8"/>
		<updated>2024-05-01T18:22:34Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;===Version 2.0.6, 2019-08-05=== * 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. * Added the &amp;quot;replacementExpression=...&amp;quot; to complement the &amp;quot;replacementString=...&amp;quot;.  ===Version 2.0.5, 2018-11-16=== * Added the &amp;quot;&amp;lt;httpsUrlConnections&amp;gt;&amp;quot; task. * Added the &amp;quot;&amp;lt;cookieHandler&amp;gt;&amp;lt;print /&amp;gt;&amp;lt;/cookieHandler&amp;gt;&amp;quot; task. * Added the &amp;quot;&amp;lt;replaceAll pattern=... replacementString=... /&amp;gt;&amp;quot; filter reader. * Added the &amp;quot;&amp;lt;cookieHa...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Version 2.0.6, 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;
* Added the &amp;quot;replacementExpression=...&amp;quot; to complement the &amp;quot;replacementString=...&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Version 2.0.5, 2018-11-16===&lt;br /&gt;
* Added the &amp;quot;&amp;lt;httpsUrlConnections&amp;gt;&amp;quot; task.&lt;br /&gt;
* Added the &amp;quot;&amp;lt;cookieHandler&amp;gt;&amp;lt;print /&amp;gt;&amp;lt;/cookieHandler&amp;gt;&amp;quot; task.&lt;br /&gt;
* Added the &amp;quot;&amp;lt;replaceAll pattern=... replacementString=... /&amp;gt;&amp;quot; filter reader.&lt;br /&gt;
* Added the &amp;quot;&amp;lt;cookieHandler&amp;gt;&amp;lt;print /&amp;gt;&amp;lt;/cookieHandler&amp;gt;&amp;quot; task.&lt;br /&gt;
* &amp;lt;setCookieHandlerTask&amp;gt;: Don&#039;t clear the cookie store on repeated executions.&lt;br /&gt;
* Added the &amp;quot;&amp;lt;httpsUrlConnections&amp;gt;&amp;quot; task.&lt;br /&gt;
* Added the &amp;quot;&amp;lt;replaceAll pattern=... replacementString=... /&amp;gt;&amp;quot; filter reader.&lt;br /&gt;
&lt;br /&gt;
===Version 2.0.4, 2017-12-06===&lt;br /&gt;
* Tasks &amp;lt;follow&amp;gt; and &amp;lt;urlConnection&amp;gt;: Added attributes &#039;direct=&amp;quot;true&amp;quot;, &#039;httpProxy=&amp;quot;host:port&amp;quot;&#039; and &#039;socksProxy=&amp;quot;host:port&amp;quot;&#039;, which override the &amp;quot;http[s].proxy(Host|Port)&amp;quot; system properties.&lt;br /&gt;
* 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;
* Fixed the well-known security hole in JPasswordField: You can&#039;t set the password without converting it to a String.&lt;br /&gt;
* CustomAuthenticator: Treat port number &amp;quot;-1&amp;quot; as &amp;quot;missing&amp;quot;.&lt;br /&gt;
* Task &amp;lt;setAuthenticator&amp;gt;: Added the &amp;quot;deny=...&amp;quot; attribute for the &amp;lt;credentials&amp;gt; subelement.&lt;br /&gt;
&lt;br /&gt;
===Version 2.0.3, 2017-01-27===&lt;br /&gt;
* Switched from ANT 1.8.4 to 1.9.8.&lt;br /&gt;
* &amp;lt;forEach2&amp;gt;: The default for the &amp;quot;delimiter&amp;quot;, which was previously changed from &amp;quot;,&amp;quot; to &amp;quot;, \t\r\n&amp;quot;, was reverted, and a new attribut &amp;quot;trim&amp;quot; was added.&lt;br /&gt;
* Extracted the Authenticator from the &amp;lt;setAuthenticator&amp;gt; task to an independent compilation unit.&lt;br /&gt;
* The keystore of &amp;lt;setAuthenticator&amp;gt; is now (optionally) protectable with a &amp;quot;master password&amp;quot;.&lt;br /&gt;
* Extracted the UserNamePasswordStore to &amp;quot;de.unkrig.commons.lang.security&amp;quot;.&lt;br /&gt;
* &amp;lt;setAuthenticator&amp;gt;: Credentials can now optionally be stored in a file &amp;quot;${user.home}/.antology_setAuthenticator_credentials&amp;quot;.&lt;br /&gt;
* &amp;lt;ftp2&amp;gt;: Now also using the java.net.Authenticator for authentication.&lt;br /&gt;
* &amp;lt;setAuthenticator&amp;gt;: Multiple executions now AUGMENT credentials (instead of replacing them).&lt;br /&gt;
* &amp;lt;setAuthenticator&amp;gt;: Password authentications are now cached across executions, so the user is prompted at most ONCE for each &amp;lt;credentials&amp;gt; subelement.&lt;br /&gt;
* Changed the default delimiter from &amp;quot;,&amp;quot; to &amp;quot;, \t\r\n&amp;quot;.&lt;br /&gt;
* Task &amp;lt;ftp2&amp;gt;, method &amp;quot;sendFile()&amp;quot;: Fix for an obvious bug in ANT 1.8.4: Verbose message &amp;quot;transferring a to b&amp;quot; swapped &amp;quot;a&amp;quot; and &amp;quot;b&amp;quot; (maybe the code was copied from method &amp;quot;getFile()&amp;quot;!?).&lt;br /&gt;
&lt;br /&gt;
===Version 2.0.2, 2016-11-15===&lt;br /&gt;
* Added a small ANT build script that uploads the generated ANTDOC to a public web site.&lt;br /&gt;
* Fixed some commons-net test cases, so they succeed also in IPv6 environments.&lt;br /&gt;
&lt;br /&gt;
===Version 2.0.1, 2016-10-17===&lt;br /&gt;
* Fixed the ANTDOC generation.&lt;br /&gt;
&lt;br /&gt;
===Version 2.0.0, 2016-10-14===&lt;br /&gt;
* Renamed the project from &amp;quot;de.unkrig.ant-contrib&amp;quot; to &amp;quot;antology&amp;quot;.&lt;br /&gt;
* Moved the source repository from &amp;quot;https://svn.code.sf.net/p/loggifier/code/trunk/de.unkrig.ant-contrib&amp;quot; to &amp;quot;https://github.com/aunkrig/antology/trunk/antology&amp;quot;.&lt;br /&gt;
* Changed the build system from ANT to MAVEN.&lt;br /&gt;
* Renamed Java packages from &amp;quot;de.unkrig.antcontrib&amp;quot; to &amp;quot;de.unkrig.antology&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Version 1.1.6, 2016-06-17:===&lt;br /&gt;
* Added the &amp;quot;&amp;lt;swingLookAndFeel&amp;gt;&amp;quot; task.&lt;br /&gt;
&lt;br /&gt;
===Version 1.1.5, 2015-12-09:===&lt;br /&gt;
* &amp;lt;setAuthenticator&amp;gt;: The user/password dialog was unusable on one particular machine - added a workaround.&lt;br /&gt;
* The call to &amp;quot;setDoOutput(true)&amp;quot; was previously lost, inhibiting any POST and PUT requests.&lt;br /&gt;
&lt;br /&gt;
===Version 1.1.4, 2015-12-02:===&lt;br /&gt;
* Output of the subtasks of &amp;quot;&amp;lt;forEach2&amp;gt;&amp;quot; and &amp;quot;&amp;lt;throughput&amp;gt;&amp;quot; now appears prefixed with &amp;quot;| &amp;quot;.&lt;br /&gt;
* &amp;lt;urlConnection&amp;gt;: In case of an exception, also report the duration of the attempt.&lt;br /&gt;
* &amp;lt;setAuthenticator&amp;gt;: Restored the original behavior where &amp;quot;no &amp;lt;credential&amp;gt; subelements&amp;quot; means &amp;quot;Always ask for user name AND password&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Version 1.1.3, 2015-09-25:===&lt;br /&gt;
* Added ANTDOC generation to the build process.&lt;br /&gt;
* Fixed Dario&#039;s NPE in the &amp;lt;jsonProperty&amp;gt; task (again, sigh).&lt;br /&gt;
&lt;br /&gt;
===Version 1.1.2, 2015-09-24:===&lt;br /&gt;
* &amp;lt;jsonProperty&amp;gt; task: Fixed an NPE.&lt;br /&gt;
* &amp;lt;swingDialog&amp;gt; task: May contain character data as an alternative to the &amp;lt;label&amp;gt;, &amp;lt;text&amp;gt;, &amp;lt;textField&amp;gt;, &amp;lt;textArea&amp;gt;, &amp;lt;checkbox&amp;gt;, &amp;lt;radioButton&amp;gt;, &amp;lt;list&amp;gt; and &amp;lt;separator&amp;gt; subelements.&lt;br /&gt;
* &amp;lt;swingDialog&amp;gt; task: Subelement &amp;lt;list&amp;gt; now has an attribute &amp;quot;visibleRowCount=...&amp;quot; to fix its vertical size.&lt;br /&gt;
&lt;br /&gt;
===Version 1.1.1, 2015-09-23:===&lt;br /&gt;
* &amp;lt;swingDialog&amp;gt;: Label, Checkbox and RadioButton tags may now contain literal text, as an alternative to the &amp;quot;text=...&amp;quot; attribute. Particularly useful in connection with HTML label text and CDATA sections.&lt;br /&gt;
&lt;br /&gt;
===Version 1.1.0, 2015-09-11:===&lt;br /&gt;
* &amp;lt;setAuthenticator&amp;gt;: The authenticator now returns &amp;quot;null&amp;quot; when no &amp;quot;&amp;lt;credentials&amp;gt;&amp;quot; matches (instead of &amp;quot;user=null, password=null&amp;quot;).&lt;br /&gt;
* Added the &amp;quot;&amp;lt;ftp2&amp;gt;&amp;quot; task, which extends the &amp;quot;&amp;lt;ftp&amp;gt;&amp;quot; task with proxy capabilities.&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.18, 2015-05-05:===&lt;br /&gt;
* &amp;lt;swingDialog&amp;gt; / &amp;lt;textField&amp;gt;: Added the &amp;quot;label&amp;quot; attribute which makes it possible to have labels LEFT from a text field.&lt;br /&gt;
* &amp;lt;swingDialog&amp;gt; / &amp;lt;textField&amp;gt;: Added the &amp;quot;labelWidth&amp;quot; attribute to be able to align multiple labelled text fields vertically.&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.17, 2015-04-17:===&lt;br /&gt;
* &amp;lt;swingDialog&amp;gt;: Added the &amp;quot;&amp;lt;textArea&amp;gt;&amp;quot; subelement.&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.16, 2015-04-07:===&lt;br /&gt;
* &amp;lt;swingDialog&amp;gt;: Added the &#039;labels=&amp;quot;...&amp;quot;&#039; attribute so that the list can display text different from the &#039;values=&amp;quot;...&amp;quot;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.15, June 25 2014:===&lt;br /&gt;
* &amp;lt;urlConnection&amp;gt;&amp;lt;jsonAsproperties&amp;gt;: Response was always decoded with charset &#039;ISO-8859-1&#039; instead of the connection&#039;s charset (reponse header &#039;Content-Type&#039;).&lt;br /&gt;
* Added the &#039;&amp;lt;tee&amp;gt;&#039; filter reader.&lt;br /&gt;
* &amp;lt;forEach2&amp;gt;, &amp;lt;throughput&amp;gt;: Added &#039;currentQuantity=&amp;quot;...&amp;quot;&#039; attribute.&lt;br /&gt;
* &amp;lt;forEach2&amp;gt;, &amp;lt;throughput&amp;gt;: Report cumulated throughput iff previousQuantity is known.&lt;br /&gt;
* &amp;lt;setAuthenticator&amp;gt;: Shorten very long URLs when displayed in the authentication dialog.&lt;br /&gt;
* &amp;lt;urlConnection&amp;gt;: Added &#039;append=&amp;quot;true&amp;quot;&#039; attribute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.14, May 1 2014:===&lt;br /&gt;
* Moved the &amp;lt;log&amp;gt;, &amp;lt;logging&amp;gt; and &amp;lt;simpleLogging&amp;gt; tasks from &#039;de.unkrig.commons.util&#039; to &#039;de.unkrig.antcontrib&#039;.&lt;br /&gt;
* &amp;lt;logging&amp;gt;: Removed attribute &#039;parent=&amp;quot;...&amp;quot;&#039;; added attribute &#039;clearFilter=&amp;quot;true&amp;quot;&#039;.&lt;br /&gt;
* &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;
* ANT-CONTRIB now uses &#039;de.unkrig.commons&#039; - which is possible since the &#039;de.unkrig.commons&#039; classes are renamed by JARJAR.&lt;br /&gt;
* Moved JSON-related classes from &#039;de.unkrig.antcontrib&#039; to &#039;de.unkrig.commons.text.json&#039;.&lt;br /&gt;
* Moved &#039;Duration&#039;, &#039;PointOfTime&#039; and &#039;TimeInterval&#039; from &#039;de.unkrig.antcontrib.util&#039; to &#039;de.unkrig.commons.util.time&#039;.&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.13, Apr 07 2014:===&lt;br /&gt;
* &amp;lt;forEach2&amp;gt;, &amp;lt;throughput&amp;gt;: Added automatic singularization of quantity unit.&lt;br /&gt;
* &amp;lt;forEach2&amp;gt;: Added substitution of &#039;@{param}&#039;.&lt;br /&gt;
* &amp;lt;throughput&amp;gt;: Removed redundant &#039;quantityUnit&#039; in beforeMessage and afterMessage.&lt;br /&gt;
* &amp;lt;urlConnection&amp;gt;: Fixed the code for deleting partially written files (previously, half-READ files were deleted).&lt;br /&gt;
* Added resource collection &#039;&amp;lt;resourceTransformer&amp;gt;&#039;.&lt;br /&gt;
* &amp;lt;retry2&amp;gt;: Print locations when reporting nested task failure.&lt;br /&gt;
* &amp;lt;forEach2&amp;gt;: Added &#039;count=&amp;quot;N&amp;quot;&#039; attribute&lt;br /&gt;
* &amp;lt;forEach2&amp;gt;: Loop indefinitely (until FAIL or BREAK) if none of &#039;count&#039;, &#039;list&#039; and Iterable are configured.&lt;br /&gt;
* &amp;lt;forEach2&amp;gt;: Added attribute &#039;quantityUnit=&amp;quot;...&amp;quot;&#039;.&lt;br /&gt;
* &amp;lt;throughput&amp;gt;: Eliminated some &#039;division by zero&#039; problems (resulted in ugly &#039;NaN&#039; percentages).&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.12, Mar 11 2014:===&lt;br /&gt;
* Added new resource collection &#039;&amp;lt;literalResource&amp;gt;&#039;.&lt;br /&gt;
* &amp;lt;forEach2&amp;gt;: Added &#039;message=...&#039; and &#039;showEta=...&#039; which enable a throughput analysis in the style of &amp;lt;throughput&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.11, Mar 06 2014:===&lt;br /&gt;
* &amp;lt;urlConnection&amp;gt; and &amp;lt;jsonAsProperties&amp;gt; tasks: Left-pad array indexes with zeros to make life easier for ANT (which has no numeric sorting feature).&lt;br /&gt;
* &amp;lt;throughput&amp;gt; task: Added the &#039;before message&#039; feature.&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.10, Feb 24 2014:===&lt;br /&gt;
* Added the &#039;&amp;lt;forEach2&amp;gt;&#039; &#039;&amp;lt;break&amp;gt; and &#039;&amp;lt;continue&amp;gt;&#039; tasks.  &lt;br /&gt;
* Added the &#039;&amp;lt;retry2&amp;gt;&#039; task.&lt;br /&gt;
* &#039;Duration&#039; no longer recognizes the &#039;mm:ss&#039; pattern because the ambiguity with &#039;hh:mm&#039; is extremely confusing. Use &#039;hh:mm:ss&#039; instead.&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.9, Feb 23 2014:===&lt;br /&gt;
* &amp;lt;swingDialog&amp;gt;: Added the &#039;enabled=...&#039; attribute to &#039;&amp;lt;text&amp;gt;&#039;, &#039;&amp;lt;checkbox&amp;gt;&#039; and &#039;&amp;lt;list&amp;gt;&#039;.&lt;br /&gt;
* &amp;lt;resourceCollectionDelta&amp;gt;: Update the &#039;delta state&#039; only when the RCD has been completely iterated. The latter is a strong indicator that the processing of the RCD was successful.&lt;br /&gt;
* Added the &#039;&amp;lt;resourceNames&amp;gt;&#039; resource collection.&lt;br /&gt;
* Added the &#039;&amp;lt;throughput&amp;gt;&#039; task.&lt;br /&gt;
* Added the &#039;&amp;lt;every&amp;gt;&#039;, &#039;&amp;lt;false&amp;gt;&#039;, &#039;&amp;lt;successful&amp;gt;&#039; and &#039;&amp;lt;true&amp;gt;&#039; conditions.&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.8, Jan 23 2014:===&lt;br /&gt;
* &amp;lt;swingDialog&amp;gt;: Added the &#039;defaultIndices=...&#039; attribute.&lt;br /&gt;
* &amp;lt;swingDialog&amp;gt;: Added the &#039;focus=true&#039; attribute for the subelements.&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.7, Dec 29 2013:===&lt;br /&gt;
* &amp;lt;urlConnection&amp;gt;: Added subelement &#039;&amp;lt;formField name=... value=...&amp;gt;&#039; to UrlElement, making HTML form submission easier.&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.6, Dec 13 2013:===&lt;br /&gt;
* Added the &#039;&amp;lt;nslookup&amp;gt;&#039; task.&lt;br /&gt;
* Added the &#039;&amp;lt;follow&amp;gt;&#039; task.&lt;br /&gt;
* Added the &#039;&amp;lt;resourceCollectionDelta&amp;gt;&#039; type.&lt;br /&gt;
* &amp;lt;urlConnection&amp;gt;: addConfiguredMultipartFormData: N different entries appeared as N time the FIRST entry.&lt;br /&gt;
* Added the &#039;&amp;lt;progress&amp;gt;&#039; FilterReader.&lt;br /&gt;
* &amp;lt;setAuthenticator&amp;gt;: Set the keyboard focus on the user name field.&lt;br /&gt;
* &amp;lt;urlConnection&amp;gt;: &amp;lt;filterchain&amp;gt; was ignored.&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.5, Nov 20 2013:===&lt;br /&gt;
* Removed the &#039;de.unkrig.ant-contrib.&#039; prefix from the task and type names.&lt;br /&gt;
* Added the &amp;lt;jsonProperty&amp;gt; task which parses a JSON document into a set of properties, in analogy with the &amp;lt;xmlproperty&amp;gt; standard ANT task.&lt;br /&gt;
* Added the &amp;lt;setCookieHandler&amp;gt; task which enables cookie processing for HttpURLConnections, including the &amp;lt;urlConnection&amp;gt; task.&lt;br /&gt;
* Added the &#039;followRedirects2=true&#039; attribute to the &#039;&amp;lt;urlConnection&amp;gt;&#039; task for enhanced HTTP redirection handling.&lt;br /&gt;
* Default behavior for &#039;&amp;lt;urlConnection&amp;gt;&amp;lt;input&amp;gt;&#039; is now to copy the input to STDOUT.&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.4, Nov 11 2013:===&lt;br /&gt;
(No change log available.)&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.3, Oct 18 2013:===&lt;br /&gt;
(No change log available.)&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.2, Oct 17 2013:===&lt;br /&gt;
(No change log available.)&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.1, Jun 14 2013:===&lt;br /&gt;
(No change log available.)&lt;br /&gt;
&lt;br /&gt;
===Version 1.0.0, May 30 2013:===&lt;br /&gt;
(No change log available.)&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Ant-contrib.unkrig.de&amp;diff=7</id>
		<title>Ant-contrib.unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Ant-contrib.unkrig.de&amp;diff=7"/>
		<updated>2024-05-01T18:21:32Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;This project was renamed to &amp;quot;Antology&amp;quot; to get rid of the constant confusion with the (related, but otherwise independent) &amp;quot;[http://ant-contrib.sourceforge.net/ ant-contrib]&amp;quot; project on SOURCEFORGE.  As a consequence, in all your ANT build scripts, you have to change    &amp;lt;taskdef resource=&amp;quot;de/unkrig/antcontrib/ant.xml&amp;quot; classpath=&amp;quot;path/to/de.unkrig.ant-contrib.jar&amp;quot; /&amp;gt;  to    &amp;lt;taskdef resource=&amp;quot;de/unkrig/antology/ant.xml&amp;quot; classpath=&amp;quot;path/to/antology-x.y.z-jar-with-depend...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This project was renamed to &amp;quot;[[Antology]]&amp;quot; to get rid of the constant confusion with the (related, but otherwise independent) &amp;quot;[http://ant-contrib.sourceforge.net/ ant-contrib]&amp;quot; project on SOURCEFORGE.&lt;br /&gt;
&lt;br /&gt;
As a consequence, in all your ANT build scripts, you have to change&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;taskdef resource=&amp;quot;de/unkrig/antcontrib/ant.xml&amp;quot; classpath=&amp;quot;path/to/de.unkrig.ant-contrib.jar&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to&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;
. That&#039;s all, folks!&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Antology&amp;diff=6</id>
		<title>Antology</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Antology&amp;diff=6"/>
		<updated>2024-05-01T18:20:29Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: Created page with &amp;quot;&amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;apache, ant, antlib, library, extension, tasks, types, filters&amp;quot;&amp;gt;&amp;lt;/meta&amp;gt; &amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;A library for APACHE ANT that contributes many useful, resource collections, and other types&amp;quot;&amp;gt;&amp;lt;/meta&amp;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].  ANTOLOGY was formerly known as &amp;quot;Ant-contrib....&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;apache, ant, antlib, library, extension, tasks, types, filters&amp;quot;&amp;gt;&amp;lt;/meta&amp;gt;&lt;br /&gt;
&amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;A library for APACHE ANT that contributes many useful, resource collections, and other types&amp;quot;&amp;gt;&amp;lt;/meta&amp;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>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=File:Javawordcloud.png&amp;diff=5</id>
		<title>File:Javawordcloud.png</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=File:Javawordcloud.png&amp;diff=5"/>
		<updated>2024-05-01T18:13:05Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aunkrig</name></author>
	</entry>
	<entry>
		<id>https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=4</id>
		<title>Unkrig.de</title>
		<link rel="alternate" type="text/html" href="https://unkrig.de/w/index.php?title=Unkrig.de&amp;diff=4"/>
		<updated>2024-05-01T18:10:45Z</updated>

		<summary type="html">&lt;p&gt;Aunkrig: &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>Aunkrig</name></author>
	</entry>
</feed>