<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Courier New";}
span.apple-converted-space
{mso-style-name:apple-converted-space;}
span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:"Consolas",serif;}
span.pl-k
{mso-style-name:pl-k;}
span.pl-smi
{mso-style-name:pl-smi;}
span.pl-s1
{mso-style-name:pl-s1;}
span.pl-en
{mso-style-name:pl-en;}
span.EmailStyle25
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
--></style>
</head>
<body lang="en-CZ" link="blue" vlink="purple" style="word-wrap:break-word;-webkit-nbsp-mode: space;line-break:after-white-space">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Actual ClassPrinter is very monolithic by intention. It has been written for the very base purpose of seeing the content of ClassModel or individual MethodModel in human-readable form
(as well as machine-readable). The implementation traverses the models and prints formatted output using custom internal templates. The monolithic printer code gives me a chance to reflect all changes in one single class and many changes are instantly handled
during refactoring. Additional API/SPI layers would make it very complex, painful for maintenance and a nightmare for testing.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">What you propose is to transform actual models (ClassModel, MethodModel…) into a kind of “printable models” and then implement various transformers of these printable models to provide
formatted output.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">I think that another “printable” SPI layer is a bit of overkill, as anyone can already implement consumer of the actual Classfile API models to print whatever is needed.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Purpose of ClassPrinter and its tight integration with Classfile API is to provide the one standard and integrated printer (or set of printers), just a bit extended version of toString()
method, and also javap-like embedded tool (all in one).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Providing structured text output in these three different formats is a key to simplify parsing of the printed output and search for expected fragments in automated tests (in contrast
to complex regexps used to parse actual javap outputs). <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">JSON and XML can be parsed by many tools and libraries, while YAML advantage is to be the closest to human perception of a structured text out of the three.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Specification of verbosity levels is also a key as some use cases need to print just brief info for very large number of classes, while some need full trace of a huge single class.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Adam<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:36.0pt">
<b><span style="font-size:12.0pt;color:black">From: </span></b><span style="font-size:12.0pt;color:black">Brian Goetz <brian.goetz@oracle.com><br>
<b>Date: </b>Thursday, 21 July 2022 15:57<br>
<b>To: </b>Adam Sotona <adam.sotona@oracle.com><br>
<b>Cc: </b>classfile-api-dev@openjdk.org <classfile-api-dev@openjdk.org><br>
<b>Subject: </b>Re: Classfile API proposal to integrate basic print functionality directly to ClassModel and MethodModel<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt">I am all for finding the right home / API for ClassPrinter; thet it is the only class in “util” is kind of a red flag. But I’d like to consider a few other directions first. <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt">Pushing things into ClassModel is moving in the “more monolithic” direction; this is evidenced by the fact that you have to feed it multiple kinds of options (both formatting kind and verbosity degrees) at the
top, and that information flows down through the traversal of the tree. This means that users can’t easily reuse or influence small pieces of the traversal. I’d like to explore a direction where we expose the constituent parts in a way the user can mix and
match, or substitute their own. <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt">The essence of CP is to take the tree of elements, which has many dozens of element types, and turn it into a much simpler tree, one which has a few kinds of nodes which vary by structure: key-value pairs, blocks,
tables. Having reduced the complexity of the element tree to one that only exposes structure/arity, it is more amenable to shoveling into a hierarchical text format. <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt">I might lean towards something like first turning the ClassModel into a tree of Map<String, Node>, where Node could be a key-value pair, a list of nodes, or a Map<String, Node>. This can be parameterize by the
Verbosity enum. Then visit this Map with a format-specific traversal that shovels into JSON, XML, or YAML, using the key names to produce the JSON keys / XML element names / YAML paragraph names, and the type of the value to determine whether the payload
is a scalar/array/obejct (YAML), simple element / complex element (XML), etc. <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt">The current ClassPrinter complects traversal, filtering, element recognition, low-level format details, and high-level format structure. I think these can be teased apart into individual concerns. <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><o:p> </o:p></p>
</div>
<div>
<div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal" style="margin-left:36.0pt">On Jul 21, 2022, at 6:17 AM, Adam Sotona <<a href="mailto:adam.sotona@oracle.com">adam.sotona@oracle.com</a>> wrote:<o:p></o:p></p>
</div>
<p class="MsoNormal" style="margin-left:36.0pt"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span lang="EN-US">Hi,</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span lang="EN-US">I would like to propose removal of solo class jdk.classfile.util.ClassPrinter (as the only class remaining in jdk.classfile.util package).</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span lang="EN-US">And integrate print functionality directly to ClassModel:</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> <span class="apple-converted-space"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">/**</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696"> *<span class="apple-converted-space"> </span><b>Print</b></span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">this</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">classfile.</span></b><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696"> *</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696"> *<span class="apple-converted-space"> </span><b>@param</b></span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:black">output<span class="apple-converted-space"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">handler</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">to</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">receive</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">printed</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">text</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696"> *<span class="apple-converted-space"> </span><b>@param</b></span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:black">printOptions<span class="apple-converted-space"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">optional</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">print</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">configuration</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> <span class="apple-converted-space"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">*/</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> <span class="apple-converted-space"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">default</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">void</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:black">print</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black">(Consumer<String>
output, PrintOption... printOptions) {</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> <span class="apple-converted-space"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">new</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:black">ClassPrinterImpl(output,
printOptions).printClass(</span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">this</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">);</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> }</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span lang="EN-US"> </span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span lang="EN-US">And to MethodModel:</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span lang="EN-US"> </span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<pre style="margin-left:36.0pt;background:white"><span style="color:black"> </span><span class="pl-k"><span style="color:#969696">/**</span></span><o:p></o:p></pre>
<pre style="margin-left:36.0pt;background:white"><span class="pl-k"><span style="color:#969696"> * </span></span><span class="pl-smi"><b><span style="color:#969696">Print</span></b></span><span style="color:black"> </span><span class="pl-smi"><b><span style="color:#969696">this</span></b></span><span style="color:black"> </span><span class="pl-smi"><b><span style="color:#969696">method.</span></b></span><o:p></o:p></pre>
<pre style="margin-left:36.0pt;background:white"><span class="pl-k"><span style="color:#969696"> *</span></span><o:p></o:p></pre>
<pre style="margin-left:36.0pt;background:white"><span class="pl-k"><span style="color:#969696"> * </span></span><span class="pl-smi"><b><span style="color:#969696">@param</span></b></span><span style="color:black"> output </span><span class="pl-k"><span style="color:#969696">handler</span></span><span style="color:black"> </span><span class="pl-k"><span style="color:#969696">to</span></span><span style="color:black"> </span><span class="pl-k"><span style="color:#969696">receive</span></span><span style="color:black"> </span><span class="pl-k"><span style="color:#969696">printed</span></span><span style="color:black"> </span><span class="pl-k"><span style="color:#969696">text</span></span><o:p></o:p></pre>
<pre style="margin-left:36.0pt;background:white"><span class="pl-k"><span style="color:#969696"> * </span></span><span class="pl-smi"><b><span style="color:#969696">@param</span></b></span><span style="color:black"> printOptions </span><span class="pl-k"><span style="color:#969696">optional</span></span><span style="color:black"> </span><span class="pl-k"><span style="color:#969696">print</span></span><span style="color:black"> </span><span class="pl-k"><span style="color:#969696">configuration</span></span><o:p></o:p></pre>
<pre style="margin-left:36.0pt;background:white"><span style="color:black"> </span><span class="pl-k"><span style="color:#969696">*/</span></span><o:p></o:p></pre>
<pre style="margin-left:36.0pt;background:white"><span style="color:black"> </span><span class="pl-s1"><span style="color:#336BDD">default</span></span><span style="color:black"> </span><span class="pl-s1"><span style="color:#336BDD">void</span></span><span style="color:black"> <span class="pl-en"><b>print</b></span>(Consumer<String> output, PrintOption... printOptions) {</span><o:p></o:p></pre>
<pre style="margin-left:36.0pt;background:white"><span style="color:black"> </span><span class="pl-s1"><span style="color:#336BDD">new</span></span><span style="color:black"> ClassPrinterImpl(output, printOptions).printMethod(</span><span class="pl-s1"><span style="color:#336BDD">this</span></span><span style="color:black">);</span><o:p></o:p></pre>
<pre style="margin-left:36.0pt;background:white"><span style="color:black"> }</span><o:p></o:p></pre>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span lang="EN-US"> </span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span lang="EN-US">With help of very simple PrintOption:</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">/**</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">* <span class="apple-converted-space"> </span><b>An</b></span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">option</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">that</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">affects</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">the</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">printing.</span></b><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">*/</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">public</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">sealed</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">interface</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:black">PrintOption</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:black">{</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> <span class="apple-converted-space"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">/**</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696"> *<span class="apple-converted-space"> </span><b>Selection</b></span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">of</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">available</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">print</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">output</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">formats.</span></b><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> <span class="apple-converted-space"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">*/</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> <span class="apple-converted-space"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">public</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">enum</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black">Format</span></i></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">implements</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:black">PrintOption
{</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> <span class="apple-converted-space"> </span></span><i><span style="font-size:10.0pt;font-family:"Courier New";color:#CE54B8">JSON</span></i><span style="font-size:10.0pt;font-family:"Courier New";color:black">,<span class="apple-converted-space"> </span></span><i><span style="font-size:10.0pt;font-family:"Courier New";color:#CE54B8">XML</span></i><span style="font-size:10.0pt;font-family:"Courier New";color:black">,<span class="apple-converted-space"> </span></span><i><span style="font-size:10.0pt;font-family:"Courier New";color:#CE54B8">YAML</span></i><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> }</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> <span class="apple-converted-space"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">/**</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696"> *<span class="apple-converted-space"> </span><b>Verbosity</b></span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">level</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">of</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">the</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">print.</span></b><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> <span class="apple-converted-space"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">*/</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> <span class="apple-converted-space"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">public</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">enum</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black">Verbosity</span></i></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">implements</span><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> </span></span><span style="font-size:10.0pt;font-family:"Courier New";color:black">PrintOption
{</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> <span class="apple-converted-space"> </span></span><i><span style="font-size:10.0pt;font-family:"Courier New";color:#CE54B8">MEMBERS_ONLY</span></i><span style="font-size:10.0pt;font-family:"Courier New";color:black">,<span class="apple-converted-space"> </span></span><i><span style="font-size:10.0pt;font-family:"Courier New";color:#CE54B8">CRITICAL_ATTRIBUTES</span></i><span style="font-size:10.0pt;font-family:"Courier New";color:black">,<span class="apple-converted-space"> </span></span><i><span style="font-size:10.0pt;font-family:"Courier New";color:#CE54B8">TRACE_ALL</span></i><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"> }</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt;background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">}</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"> <span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span lang="EN-US">Any comments are welcome.</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span lang="EN-US"> </span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span lang="EN-US">Thanks,</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span lang="EN-US">Adam</span><span style="font-size:12.0pt"><o:p></o:p></span></p>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal" style="margin-left:36.0pt"><o:p> </o:p></p>
</div>
</div>
</body>
</html>