<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.baremetalcode.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.baremetalcode.com/" rel="alternate" type="text/html" /><updated>2024-10-29T10:18:36+00:00</updated><id>https://www.baremetalcode.com/feed.xml</id><title type="html">/bare_metal_code</title><author><name>Johnny X</name></author><entry><title type="html">Java Generics</title><link href="https://www.baremetalcode.com/bmc-showcase-note-generics/" rel="alternate" type="text/html" title="Java Generics" /><published>2023-06-26T00:00:00+00:00</published><updated>2023-06-26T00:00:00+00:00</updated><id>https://www.baremetalcode.com/bmc-showcase-note-generics</id><content type="html" xml:base="https://www.baremetalcode.com/bmc-showcase-note-generics/"><![CDATA[<p>this note is about java generics</p>

<hr />

<h2 id="intro-to-generics">intro to generics</h2>

<p>generics are a way to use types as parameters in classes, interfaces and methods. If we take a method for example, it will receive a type
input.</p>

<p><a href="https://docs.oracle.com/javase/tutorial/java/generics/index.html">formal definition and tutorial from Oracle</a></p>

<p>you can read from <strong>Oracle</strong> above, or follow though these smaller notes.<br />
I will not cover everything on generics, but will cover enough to illustrate how generics power BMC_Anvil.</p>

<h3 id="very-basics-a-generic-method">very basics: a generic method</h3>

<p>Let’s illustrate:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">GenericExample</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="o">&lt;</span><span class="no">E</span><span class="o">&gt;</span> <span class="nc">String</span> <span class="nf">testX</span><span class="o">(</span><span class="no">E</span> <span class="n">myGenericType</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">myGenericType</span><span class="o">.</span><span class="na">getClass</span><span class="o">().</span><span class="na">getSimpleName</span><span class="o">();</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>the simple method above takes some type and returns which class it is. Note how we also declare the <code class="language-plaintext highlighter-rouge">E</code> between angle brackets before the
return type. This is how we tell the compiler that the <code class="language-plaintext highlighter-rouge">E</code> type is “<em>owned</em>” by the method.</p>

<p>If we call that method with a <code class="language-plaintext highlighter-rouge">String</code> it will return “String”.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">GenericExample</span> <span class="o">{</span>
    <span class="kt">void</span> <span class="nf">callTestX</span><span class="o">()</span> <span class="o">{</span>
        <span class="nc">String</span> <span class="n">demo</span> <span class="o">=</span> <span class="s">""</span><span class="o">;</span>
        <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">testX</span><span class="o">(</span><span class="n">demo</span><span class="o">));</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>String
</code></pre></div></div>

<p>if we call it with an <code class="language-plaintext highlighter-rouge">Integer</code>…</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">GenericExample</span> <span class="o">{</span>
    <span class="kt">void</span> <span class="nf">callTestX</span><span class="o">()</span> <span class="o">{</span>
        <span class="nc">Integer</span> <span class="n">demo</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span>
        <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">testX</span><span class="o">(</span><span class="n">demo</span><span class="o">));</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>Integer
</code></pre></div></div>

<h3 id="basics-a-generic-class">basics: a generic class</h3>

<p>the example above shows how the method can receive “anything”. But generics are not anything, in fact they are proper types that have strong
compile time checks. Because they have type we can avoid casts and when dealing with methods we can rest assured they are type safe.</p>

<p>generics can be used as inputs, as well as return types and class parameters. Let’s see what a class parameter means.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">GenericCoord</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="o">{</span>

    <span class="kd">private</span> <span class="no">T</span> <span class="n">x</span><span class="o">;</span>
    <span class="kd">private</span> <span class="no">T</span> <span class="n">y</span><span class="o">;</span>

    <span class="c1">// getters and setters</span>
    <span class="kd">public</span> <span class="no">T</span> <span class="nf">getX</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">x</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="no">T</span> <span class="nf">getY</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">y</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setX</span><span class="o">(</span><span class="kd">final</span> <span class="no">T</span> <span class="n">x</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">x</span> <span class="o">=</span> <span class="n">x</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setY</span><span class="o">(</span><span class="kd">final</span> <span class="no">T</span> <span class="n">y</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">y</span> <span class="o">=</span> <span class="n">y</span><span class="o">;</span>
    <span class="o">}</span>

<span class="o">}</span>
</code></pre></div></div>

<p>the above class can hold a pair of coordinates. Note how a single parameter <code class="language-plaintext highlighter-rouge">T</code>, is used as the type for our coordinates in X and Y.
Remember that a generic is type safe, so if T is a <code class="language-plaintext highlighter-rouge">Double</code> then both x and y are <code class="language-plaintext highlighter-rouge">Double</code></p>

<p>I mentioned on the previous section that a method with generic parameters needed to declare the generic <code class="language-plaintext highlighter-rouge">T</code> between angled brackets before
the return type, yet here on the setter we are not declaring it. That’s because the setter method does not “own” the generic type, and it is
referring to the one declared by the class itself! You can of course add a Type owned only by the method in addition to the ones from the
class like this for example:<br />
<code class="language-plaintext highlighter-rouge">public &lt;U&gt; void setX(final T x, final U other){}</code></p>

<p>Let’s see how we instantiate a class like the above.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">DemoGeneric</span> <span class="o">{</span>
    <span class="nc">GenericCoord</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">intCoord</span>    <span class="o">=</span> <span class="k">new</span> <span class="nc">GenericCoord</span><span class="o">&lt;&gt;();</span>
    <span class="nc">GenericCoord</span><span class="o">&lt;</span><span class="nc">Long</span><span class="o">&gt;</span>    <span class="n">longCoord</span>   <span class="o">=</span> <span class="k">new</span> <span class="nc">GenericCoord</span><span class="o">&lt;&gt;();</span>
    <span class="nc">GenericCoord</span><span class="o">&lt;</span><span class="nc">Double</span><span class="o">&gt;</span>  <span class="n">doubleCoord</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">GenericCoord</span><span class="o">&lt;&gt;();</span>    
    
    <span class="n">intCoord</span><span class="o">.</span><span class="na">setX</span><span class="o">(</span><span class="mi">20</span><span class="o">);</span> <span class="c1">//OK</span>
    <span class="n">longCoord</span><span class="o">.</span><span class="na">setX</span><span class="o">(</span><span class="mi">20L</span><span class="o">);</span> <span class="c1">//OK</span>
    <span class="n">doubleCoord</span><span class="o">.</span><span class="na">setX</span><span class="o">(</span><span class="s">"fail"</span><span class="o">);</span> <span class="c1">//ERROR</span>

    <span class="nc">Integer</span> <span class="n">intX</span> <span class="o">=</span> <span class="n">intCoord</span><span class="o">.</span><span class="na">getX</span><span class="o">();</span> <span class="c1">//OK</span>

<span class="o">}</span>
</code></pre></div></div>

<p>you just need to specify which type your generic class will work with, and you have type safety on your code. When we try to set a <code class="language-plaintext highlighter-rouge">String</code>
for a class instantiated with a <code class="language-plaintext highlighter-rouge">Double</code>, the compiler will complain with the following error:</p>
<blockquote>
  <p><code class="language-plaintext highlighter-rouge">java: incompatible types: java.lang.String cannot be converted to java.lang.Double</code></p>
</blockquote>

<p>let’s make it easier to understand.<br />
when we write <code class="language-plaintext highlighter-rouge">GenericCoord&lt;Double&gt; intCoord = new GenericCoord&lt;&gt;();</code> it’s as if the <code class="language-plaintext highlighter-rouge">GenericCoord</code> class would have been written like so:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">GenericCoord</span> <span class="o">{</span>

    <span class="kd">private</span> <span class="nc">Double</span> <span class="n">x</span><span class="o">;</span>
    <span class="kd">private</span> <span class="nc">Double</span> <span class="n">y</span><span class="o">;</span>

    <span class="c1">// getters and setters</span>


    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setY</span><span class="o">(</span><span class="kd">final</span> <span class="nc">Double</span> <span class="n">y</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">y</span> <span class="o">=</span> <span class="n">y</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setX</span><span class="o">(</span><span class="kd">final</span> <span class="nc">Double</span> <span class="n">x</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">x</span> <span class="o">=</span> <span class="n">x</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="nc">Double</span> <span class="nf">getX</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">x</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="nc">Double</span> <span class="nf">getY</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">y</span><span class="o">;</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>it is as if we replaced the generic <code class="language-plaintext highlighter-rouge">T</code> with the proper <code class="language-plaintext highlighter-rouge">Double</code> type we made explicit when we declared the variable, therefore when we then
asked to set x with a <code class="language-plaintext highlighter-rouge">String</code> the compiler came to the rescue!</p>

<h3 id="mid-difficulty-bounds">mid-difficulty: bounds</h3>

<p>the <code class="language-plaintext highlighter-rouge">GenericCoord</code> is a fine example of the need for bounds. We want to be able to describe coordinates with a pair of numerical values, not
with <code class="language-plaintext highlighter-rouge">String</code> or anything else. But a <code class="language-plaintext highlighter-rouge">T</code> can be anything… we need to put some sort of bounds to what our generic construct can accept.
Let’s see an example:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">GenericCoord</span><span class="o">&lt;</span><span class="no">T</span> <span class="kd">extends</span> <span class="nc">Number</span><span class="o">&gt;</span> <span class="o">{</span>

    <span class="kd">private</span> <span class="no">T</span> <span class="n">x</span><span class="o">;</span>
    <span class="kd">private</span> <span class="no">T</span> <span class="n">y</span><span class="o">;</span>

    <span class="c1">// getters and setters</span>
    <span class="kd">public</span> <span class="no">T</span> <span class="nf">getX</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">x</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="no">T</span> <span class="nf">getY</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">y</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setX</span><span class="o">(</span><span class="kd">final</span> <span class="no">T</span> <span class="n">x</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">x</span> <span class="o">=</span> <span class="n">x</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setY</span><span class="o">(</span><span class="kd">final</span> <span class="no">T</span> <span class="n">y</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">y</span> <span class="o">=</span> <span class="n">y</span><span class="o">;</span>
    <span class="o">}</span>

<span class="o">}</span>
</code></pre></div></div>

<p>what we are now telling the compiler is that the generic coordinates can be only types that extend <code class="language-plaintext highlighter-rouge">Number</code>.
ie: <code class="language-plaintext highlighter-rouge">Integer</code>, <code class="language-plaintext highlighter-rouge">Double</code>, <code class="language-plaintext highlighter-rouge">Long</code>, etc. The below code will generate a compile time error:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">GenericCoord</span><span class="o">&lt;</span><span class="nc">String</span><span class="o">&gt;</span>  <span class="n">stringCoord</span><span class="o">=</span><span class="k">new</span> <span class="nc">GenericCoord</span><span class="o">&lt;&gt;();</span>
</code></pre></div></div>

<p>given that <code class="language-plaintext highlighter-rouge">String</code> does not extend <code class="language-plaintext highlighter-rouge">Number</code>, it is not a valid type for our <code class="language-plaintext highlighter-rouge">GenericCoord</code> class and the compiler will emit the following
compile time error:</p>
<blockquote>
  <p>java: type argument java.lang.String is not within bounds of type-variable T
<br /><br />
java: incompatible types: cannot infer type arguments for com.bmc.GenericCoord&lt;&gt;<br />
reason: inference variable T has incompatible bounds<br />
equality constraints: java.lang.String<br />
upper bounds: java.lang.Number<br /></p>
</blockquote>

<p>as you can see we are given a descriptive error telling us that a <code class="language-plaintext highlighter-rouge">String</code> is not a <code class="language-plaintext highlighter-rouge">Number</code> as upper bound. An upper bound violation reads
like the following:</p>

<blockquote>
  <p><code class="language-plaintext highlighter-rouge">String</code> does not extend <code class="language-plaintext highlighter-rouge">Number</code></p>
</blockquote>

<p>in a general case, there is an upper bound violation when the type passed does not extend the type constrain we declared.</p>

<p>a lower bound is the opposite but applies to type arguments which we are not going to use. It will work like so:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">DemoGeneric</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">lowerBound</span><span class="o">(</span><span class="nc">List</span><span class="o">&lt;?</span> <span class="kd">super</span> <span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">input</span><span class="o">)</span> <span class="o">{</span>
        <span class="c1">//code here</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>the above sets <code class="language-plaintext highlighter-rouge">Integer</code> and all it’s super classes as the accepted type, ergo, <code class="language-plaintext highlighter-rouge">Integer</code>, <code class="language-plaintext highlighter-rouge">Number</code>, <code class="language-plaintext highlighter-rouge">Object</code>.</p>

<h2 id="generics-in-the-application">generics in the application</h2>

<h3 id="intro">intro</h3>

<p><strong>BMC_Anvil</strong> relies heavily on generics.</p>

<p>combined with abstract classes, generics are a powerhouse of reusability while enforcing type safety.</p>

<p>we’ve seen already in the <a href="/bmc-showcase-note-oop-inheritance">OOP - inheritance note</a> how extending classes allows for code reusability,
with generics we can take that technique to another level, it is not only reusability in a <em>lines of code sense</em>, is reusing concepts too.</p>

<p>a concept can be <strong>“persisting data”</strong>, or <strong>“queuing a message”</strong>, or <strong>“reacting to a given event”</strong>, or…</p>

<p>let’s use the <strong>“persisting data”</strong> concept for this article…</p>

<p>in <strong>Quarkus Panache</strong> or <strong>SpringBoot Data</strong>, both using <code class="language-plaintext highlighter-rouge">repositories</code>, each <strong>Entity</strong> has its own repository that inherits the basic
operations fromm the framework, such as finding data by id, deleting, persisting, updating, etc… All those common operations are reused
via implementing a given framework interface.</p>

<p>say, as it is the in <strong>BMC_Anvil</strong>, that we have many Entities, and we want to implement a delete via id operation on all
their corresponding services. In that scenario we will need a service for each Entity that will call the corresponding <code class="language-plaintext highlighter-rouge">delete</code> method on
the corresponding repository. Same procedure for finding an Entity by its <strong>id</strong>, or for finding all entities, or all entities paged…</p>

<p>well… it feels like we are doing the exact same thing on different <strong>X</strong> entities, and expecting the corresponding <strong>Y</strong> result…</p>

<h3 id="a-1st-example-from-panache">a 1st example from <code class="language-plaintext highlighter-rouge">Panache</code></h3>

<p>it would be really convenient to think of the persistence of data as a concept, and reuse it somehow. We know that each <code class="language-plaintext highlighter-rouge">panache</code> repository
knows how to persist data to the database just by getting 2 things the entity type, and the id type. For example, it would know how to
persist a <code class="language-plaintext highlighter-rouge">Card</code> that has a <code class="language-plaintext highlighter-rouge">UUID</code> as pk.</p>

<p>a <code class="language-plaintext highlighter-rouge">Panache</code> repository that will know how to handle the above data will look like this:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">CardRepository</span> <span class="kd">implements</span> <span class="nc">PanacheRepositoryBase</span><span class="o">&lt;</span><span class="nc">CardRepository</span><span class="o">,</span> <span class="no">UUID</span><span class="o">&gt;</span> <span class="o">{</span>
<span class="o">}</span>
</code></pre></div></div>

<h3 id="usage-in-bmc_anvil">usage in <strong>BMC_Anvil</strong></h3>

<p>how to use the types as parameters discussed before to make something of that technique then…</p>

<p>I insisted of thinking the persistence commonality as a “concept”, if we check
the <a href="https://www.merriam-webster.com/dictionary/concept">2nd definition of concept</a>, it reads as follows:</p>

<blockquote>
  <p>2 : an abstract or <strong>generic</strong> idea generalized from particular instances</p>
</blockquote>

<p>is it not the perfect fit for all this?! Feels written by an OOP developer!</p>]]></content><author><name>Johnny X</name></author><summary type="html"><![CDATA[This note is about java generics]]></summary></entry><entry><title type="html">Java Functions</title><link href="https://www.baremetalcode.com/bmc-showcase-note-functions/" rel="alternate" type="text/html" title="Java Functions" /><published>2023-06-18T00:00:00+00:00</published><updated>2023-06-18T00:00:00+00:00</updated><id>https://www.baremetalcode.com/bmc-showcase-note-functions</id><content type="html" xml:base="https://www.baremetalcode.com/bmc-showcase-note-functions/"><![CDATA[<p>This note is about using functions in a java</p>

<hr />

<h2 id="intro-functional-programming">intro: functional programming</h2>

<p>there is a <a href="https://en.wikipedia.org/wiki/Functional_programming">formal definition for functional programing</a></p>
<blockquote>
  <p><strong><em>In computer science, functional programming is a programming paradigm where programs are constructed by applying and composing
functions. It is a declarative programming paradigm in which function definitions are trees of expressions that map values to other
values, rather than a sequence of imperative statements which update the running state of the program.</em></strong></p>
</blockquote>

<p>but I am taking the liberty of making a personal interpretation that I already mentioned
in <a href="/language-java-reactive-functional-pipelines/#what-i-understand-as-functional">this article about functional reactive pipelines</a></p>

<blockquote>
  <p>thou the above is ok, I understand functional programming like this: <strong><em>it is programing by delegation</em></strong></p>
</blockquote>

<h2 id="a-simple-function">a simple <code class="language-plaintext highlighter-rouge">Function</code></h2>

<p>in BMC_Anvil most of the code is already functional-like given that I am using
the <a href="https://smallrye.io/smallrye-mutiny/2.2.0/reference/what-is-reactive-programming/">reactive paradigm</a>, but I created a small utility on
the <code class="language-plaintext highlighter-rouge">Pageable</code> class to illustrate how the <code class="language-plaintext highlighter-rouge">Function</code> interface can be used by ourselves.</p>

<p>this example is a simple example, and I’ll build a few more complex ones to illustrate chaining and how <code class="language-plaintext highlighter-rouge">Functions</code> can be used on <code class="language-plaintext highlighter-rouge">Streams</code>
or methods</p>

<p>let’s examine a Function:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Pageable</span> <span class="o">{</span>
    <span class="kd">private</span> <span class="kd">final</span> <span class="nc">ToIntFunction</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">checkPageSize</span> <span class="o">=</span> <span class="o">(</span><span class="n">pageSize</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="n">max</span><span class="o">(</span><span class="n">min</span><span class="o">(</span><span class="n">pageSize</span><span class="o">,</span> <span class="no">MAX_PAGE_SIZE</span><span class="o">),</span> <span class="no">MIN_PAGE_SIZE</span><span class="o">);</span>

<span class="o">}</span>
</code></pre></div></div>

<p>a <code class="language-plaintext highlighter-rouge">Function</code> in java is itself a type that represents a function, and it comprises one argument and one result. In our case,
the <code class="language-plaintext highlighter-rouge">ToIntFunction</code> is a specialization that is telling us that the return type is an int, so we don’t need to specify the return type.</p>

<p>in this simple example the <code class="language-plaintext highlighter-rouge">Function</code> checkPageSize receives a page size as an Integer and returns a page size between the minimum or
maximum configured. If the page size is between boundaries, it returns the page size or the corresponding max / min when over /
underflowing.</p>

<p>let’s examine how it is used:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Pageable</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="nf">Pageable</span><span class="o">(</span><span class="kd">final</span> <span class="nc">String</span> <span class="n">sortBy</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">String</span> <span class="n">sortDir</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">Integer</span> <span class="n">pageIx</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">Integer</span> <span class="n">pageSize</span><span class="o">)</span> <span class="o">{</span>
        <span class="c1">// omitted code here</span>
        <span class="k">this</span><span class="o">.</span><span class="na">page</span> <span class="o">=</span> <span class="nc">Optional</span><span class="o">.</span><span class="na">ofNullable</span><span class="o">(</span><span class="n">pageIx</span><span class="o">)</span>
                <span class="o">.</span><span class="na">map</span><span class="o">(</span><span class="n">index</span> <span class="o">-&gt;</span> <span class="nc">Page</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="n">max</span><span class="o">(</span><span class="n">index</span><span class="o">,</span> <span class="mi">0</span><span class="o">),</span> <span class="n">checkPageSize</span><span class="o">.</span><span class="na">applyAsInt</span><span class="o">(</span><span class="n">pageSize</span><span class="o">)))</span>
                <span class="o">.</span><span class="na">orElseGet</span><span class="o">(()</span> <span class="o">-&gt;</span> <span class="nc">Page</span><span class="o">.</span><span class="na">ofSize</span><span class="o">(</span><span class="n">pageSize</span><span class="o">));</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>all <code class="language-plaintext highlighter-rouge">Function</code> have an <code class="language-plaintext highlighter-rouge">apply()</code> method and in this case an <code class="language-plaintext highlighter-rouge">applyAsInt()</code>, just like a method, you pass the corresponding argument and
that’s it.</p>

<h2 id="outro">outro</h2>

<p>in the above case using a <code class="language-plaintext highlighter-rouge">Function</code> instead of a method achieves little. I’m going to add more complex and useful examples of function
shortly.</p>]]></content><author><name>Johnny X</name></author><summary type="html"><![CDATA[This note is about using java functions]]></summary></entry><entry><title type="html">Java Reflection</title><link href="https://www.baremetalcode.com/bmc-showcase-note-reflection/" rel="alternate" type="text/html" title="Java Reflection" /><published>2023-06-18T00:00:00+00:00</published><updated>2023-06-18T00:00:00+00:00</updated><id>https://www.baremetalcode.com/bmc-showcase-note-reflection</id><content type="html" xml:base="https://www.baremetalcode.com/bmc-showcase-note-reflection/"><![CDATA[<p>this note is about using java reflection</p>

<hr />

<p>reflection is a feature in java that allows to introspect / modify properties of classes fields and methods. It also allows to instantiate
classes or call methods among other things</p>

<p>it can come in handy to manipulate the internals of a software when they are unknown at compile time. This is an advanced feature to use
carefully as it can make the code difficult to understand and alienate less experienced contributors on large codebases.</p>

<h2 id="motivation">motivation</h2>

<p>in BMC_Anvil we have many endpoints and data types that can be updated by an end user like cards, comments, labels, user
data, etc.</p>

<p>every time we want to update a single simple field we would need to do something like this</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">DemoUpdate</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">updateUser</span><span class="o">(</span><span class="nc">User</span> <span class="n">user</span><span class="o">,</span> <span class="nc">String</span> <span class="n">fieldToUpdate</span><span class="o">,</span> <span class="nc">String</span> <span class="n">newValue</span><span class="o">)</span> <span class="o">{</span>

        <span class="k">switch</span> <span class="o">(</span><span class="n">fieldToUpdate</span><span class="o">)</span> <span class="o">{</span>
            <span class="k">case</span> <span class="s">"firstName"</span> <span class="o">-&gt;</span> <span class="n">user</span><span class="o">.</span><span class="na">setFirstName</span><span class="o">(</span><span class="n">newValue</span><span class="o">);</span>
            <span class="k">case</span> <span class="s">"lastName"</span> <span class="o">-&gt;</span> <span class="n">user</span><span class="o">.</span><span class="na">setLastName</span><span class="o">(</span><span class="n">newValue</span><span class="o">);</span>
            <span class="k">case</span> <span class="s">"age"</span> <span class="o">-&gt;</span> <span class="n">user</span><span class="o">.</span><span class="na">setAge</span><span class="o">(</span><span class="nc">Integer</span><span class="o">.</span><span class="na">valueOf</span><span class="o">(</span><span class="n">newValue</span><span class="o">));</span>
            <span class="k">case</span> <span class="s">"etc"</span> <span class="o">-&gt;</span> <span class="n">user</span><span class="o">.</span><span class="na">setEtc</span><span class="o">(</span><span class="n">newValue</span><span class="o">);</span>

            <span class="k">default</span> <span class="o">-&gt;</span> <span class="k">throw</span> <span class="k">new</span> <span class="nc">IllegalStateException</span><span class="o">(</span><span class="s">"Unexpected value for field: "</span> <span class="o">+</span> <span class="n">fieldToUpdate</span><span class="o">);</span>
        <span class="o">}</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>this is fine, it’s straightforward and each single field is updated calling its corresponding method.</p>

<p>there is a caveat I have not mentioned to start simple that is… we are in a full reactive context, which means the code always starts
and ends with a Uni and the flow should not be interrupted, or it will never subscribe therefor it won’t execute…</p>

<p>what we would really need to update a single simple field is more like to be as below:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">DemoUpdate2</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="nc">Uni</span><span class="o">&lt;</span><span class="nc">Void</span><span class="o">&gt;</span> <span class="nf">updateUser</span><span class="o">(</span><span class="kd">final</span> <span class="nc">User</span> <span class="n">user</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">String</span> <span class="n">fieldToUpdate</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">String</span> <span class="n">newValue</span><span class="o">)</span> <span class="o">{</span>

        <span class="k">return</span> <span class="nf">switch</span> <span class="o">(</span><span class="n">fieldToUpdate</span><span class="o">)</span> <span class="o">{</span>
            <span class="k">case</span> <span class="s">"firstName"</span> <span class="o">-&gt;</span> <span class="o">{</span>
                <span class="n">user</span><span class="o">.</span><span class="na">setFirstName</span><span class="o">(</span><span class="n">newValue</span><span class="o">);</span>
                <span class="n">yield</span> <span class="nc">Uni</span><span class="o">.</span><span class="na">createFrom</span><span class="o">().</span><span class="na">voidItem</span><span class="o">();</span>
            <span class="o">}</span>
            <span class="k">case</span> <span class="s">"lastName"</span> <span class="o">-&gt;</span> <span class="o">{</span>
                <span class="n">user</span><span class="o">.</span><span class="na">setLastName</span><span class="o">(</span><span class="n">newValue</span><span class="o">);</span>
                <span class="n">yield</span> <span class="nc">Uni</span><span class="o">.</span><span class="na">createFrom</span><span class="o">().</span><span class="na">voidItem</span><span class="o">();</span>
            <span class="o">}</span>
            <span class="k">case</span> <span class="s">"age"</span> <span class="o">-&gt;</span> <span class="o">{</span>
                <span class="n">user</span><span class="o">.</span><span class="na">setAge</span><span class="o">(</span><span class="nc">Integer</span><span class="o">.</span><span class="na">valueOf</span><span class="o">(</span><span class="n">newValue</span><span class="o">));</span>
                <span class="n">yield</span> <span class="nc">Uni</span><span class="o">.</span><span class="na">createFrom</span><span class="o">().</span><span class="na">voidItem</span><span class="o">();</span>
            <span class="o">}</span>
            <span class="k">case</span> <span class="s">"etc"</span> <span class="o">-&gt;</span> <span class="o">{</span>
                <span class="n">user</span><span class="o">.</span><span class="na">setEtc</span><span class="o">(</span><span class="n">newValue</span><span class="o">);</span>
                <span class="n">yield</span> <span class="nc">Uni</span><span class="o">.</span><span class="na">createFrom</span><span class="o">().</span><span class="na">voidItem</span><span class="o">();</span>
            <span class="o">}</span>

            <span class="k">default</span> <span class="o">-&gt;</span> <span class="k">throw</span> <span class="k">new</span> <span class="nc">IllegalStateException</span><span class="o">(</span><span class="s">"Unexpected value for field: "</span> <span class="o">+</span> <span class="n">fieldToUpdate</span><span class="o">);</span>
        <span class="o">};</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>that’s not very pretty, but it is necessary in our context.<br /></p>

<p>we could also try this:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">DemoUpdate2</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="nc">Uni</span><span class="o">&lt;</span><span class="nc">Void</span><span class="o">&gt;</span> <span class="nf">updateUser</span><span class="o">(</span><span class="kd">final</span> <span class="nc">User</span> <span class="n">user</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">String</span> <span class="n">fieldToUpdate</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">String</span> <span class="n">newValue</span><span class="o">)</span> <span class="o">{</span>

        <span class="k">switch</span> <span class="o">(</span><span class="n">fieldToUpdate</span><span class="o">)</span> <span class="o">{</span>
            <span class="k">case</span> <span class="s">"firstName"</span> <span class="o">-&gt;</span> <span class="n">user</span><span class="o">.</span><span class="na">setFirstName</span><span class="o">(</span><span class="n">newValue</span><span class="o">);</span>
            <span class="k">case</span> <span class="s">"lastName"</span> <span class="o">-&gt;</span> <span class="n">user</span><span class="o">.</span><span class="na">setLastName</span><span class="o">(</span><span class="n">newValue</span><span class="o">);</span>
            <span class="k">case</span> <span class="s">"age"</span> <span class="o">-&gt;</span> <span class="n">user</span><span class="o">.</span><span class="na">setAge</span><span class="o">(</span><span class="nc">Integer</span><span class="o">.</span><span class="na">valueOf</span><span class="o">(</span><span class="n">newValue</span><span class="o">));</span>
            <span class="k">case</span> <span class="s">"etc"</span> <span class="o">-&gt;</span> <span class="n">user</span><span class="o">.</span><span class="na">setEtc</span><span class="o">(</span><span class="n">newValue</span><span class="o">);</span>

            <span class="k">default</span> <span class="o">-&gt;</span> <span class="k">throw</span> <span class="k">new</span> <span class="nc">IllegalStateException</span><span class="o">(</span><span class="s">"Unexpected value for field: "</span> <span class="o">+</span> <span class="n">fieldToUpdate</span><span class="o">);</span>
        <span class="o">}</span>

        <span class="k">return</span> <span class="nc">Uni</span><span class="o">.</span><span class="na">createFrom</span><span class="o">().</span><span class="na">voidItem</span><span class="o">();</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>which is a perfect solution, as it will set what we want, and at the end it keeps the <code class="language-plaintext highlighter-rouge">Uni</code> chain going.</p>

<blockquote>
  <p><strong>showcase note:</strong>
this being a showcase, a few solutions such as this one, are explicitly coded as examples of tech and as skills demonstration.</p>
</blockquote>

<p>for the sake of technology, let’s explore a way to directly return the switch and have a method that will take care of updating anything we
want while also keeping the <code class="language-plaintext highlighter-rouge">Uni</code> flow.</p>

<p>We would need to we reuse the simple statement <code class="language-plaintext highlighter-rouge">yield Uni.createFrom().voidItem();</code>. There has to be a way to wrap the <code class="language-plaintext highlighter-rouge">setter</code> we want to
invoke in a method that will return always our <code class="language-plaintext highlighter-rouge">Uni</code>, but going down that path it would create so many methods for each setter.</p>

<h2 id="reflection-implementation">reflection implementation</h2>

<p>it would be nice to have a way to pass any object and then tell java to invoke a given method with a given value… something like this…</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">FooReflection</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="nc">Uni</span><span class="o">&lt;</span><span class="nc">Void</span><span class="o">&gt;</span> <span class="nf">invokeOnDemand</span><span class="o">(</span><span class="kd">final</span> <span class="nc">User</span> <span class="n">user</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">String</span> <span class="n">method</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">String</span> <span class="n">value</span><span class="o">)</span> <span class="o">{</span>
        <span class="c1">//implementation omitted </span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>the above is impossible to use directly as there is no direct way to call a method programmatically within the boundaries of a <code class="language-plaintext highlighter-rouge">User</code>
object. Each method has to be explicitly called.</p>

<p>there is a second obstacle… the method above expects a user and a string value. What if we want to update a card, a label, a board with
something different from a <code class="language-plaintext highlighter-rouge">String</code>. The idea of method above is of no use.</p>

<p>here is when this gets more complex and interesting… reflection and generics to the rescue.</p>

<blockquote>
  <p><strong>teaching note:</strong> <br />
generics is explained on <a href="/bmc-showcase-note-generics">its own article</a>, we are going to focus on <code class="language-plaintext highlighter-rouge">Reflection</code> only here.</p>
</blockquote>

<p>let’s examine how can we achieve calling any setter with any simple value on any one of our dataTypes:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">BasicPersistenceService</span><span class="o">&lt;</span><span class="no">D</span><span class="o">,</span> <span class="no">E</span><span class="o">&gt;</span> <span class="o">{</span>

    <span class="nd">@WithTransaction</span>
    <span class="nd">@SneakyThrows</span>
    <span class="kd">protected</span> <span class="nc">Uni</span><span class="o">&lt;</span><span class="nc">Void</span><span class="o">&gt;</span> <span class="nf">updateInPlace</span><span class="o">(</span><span class="kd">final</span> <span class="no">E</span> <span class="n">toUpdate</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">MethodNames</span> <span class="n">methodName</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">Object</span> <span class="n">value</span><span class="o">)</span> <span class="o">{</span>
        <span class="nc">Method</span> <span class="n">m</span> <span class="o">=</span> <span class="n">toUpdate</span><span class="o">.</span><span class="na">getClass</span><span class="o">().</span><span class="na">getMethod</span><span class="o">(</span><span class="n">methodName</span><span class="o">.</span><span class="na">getMethodName</span><span class="o">(),</span> <span class="n">value</span><span class="o">.</span><span class="na">getClass</span><span class="o">());</span>
        <span class="n">m</span><span class="o">.</span><span class="na">invoke</span><span class="o">(</span><span class="n">toUpdate</span><span class="o">,</span> <span class="n">value</span><span class="o">);</span>

        <span class="k">return</span> <span class="nc">Uni</span><span class="o">.</span><span class="na">createFrom</span><span class="o">().</span><span class="na">voidItem</span><span class="o">();</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>the generic<code class="language-plaintext highlighter-rouge">E</code> is determined by each implementing class at construction time, it tells which entity type is in use for the particular
implementation, it’s the entity type we are going to update.</p>

<p>looking at the method signature we have:</p>

<ul>
  <li>the <code class="language-plaintext highlighter-rouge">E</code>ntity to update, it can be anything.</li>
  <li>the method we want to call.</li>
  <li>the new value we want to set that can also be any type.</li>
</ul>

<p>when we examine the method’s body we get into reflection territory.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">Method</span> <span class="n">m</span><span class="o">=</span><span class="n">toUpdate</span><span class="o">.</span><span class="na">getClass</span><span class="o">().</span><span class="na">getMethod</span><span class="o">(</span><span class="n">methods</span><span class="o">.</span><span class="na">getMethodName</span><span class="o">(),</span><span class="n">value</span><span class="o">.</span><span class="na">getClass</span><span class="o">());</span>
</code></pre></div></div>

<p>the above line of code does the following:</p>

<ul>
  <li>it takes whatever entity to update we pass to it and acquires its class</li>
  <li>once we have what class we are dealing with, we want now to get a specific method from that class</li>
</ul>

<p>the <code class="language-plaintext highlighter-rouge">getMethod()</code> method takes the method’s name we want to call as 1st argument and an array (<code class="language-plaintext highlighter-rouge">...</code>) of data types as second. Between the 2
parameters we can define a single specific method to call from the given class.</p>

<ul>
  <li>the <code class="language-plaintext highlighter-rouge">MethodNames</code> is only an enum that holds the possible method names we want to call.</li>
  <li>the value in itself can give us its class type by calling on the <code class="language-plaintext highlighter-rouge">getClass()</code> method.</li>
</ul>

<p>that first line is in charge of getting the method we want to call, to update our given entity. Let’s see how we actually call it:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">m</span><span class="o">.</span><span class="na">invoke</span><span class="o">(</span><span class="n">toUpdate</span><span class="o">,</span><span class="n">value</span><span class="o">);</span>
</code></pre></div></div>

<p>what we got is a <code class="language-plaintext highlighter-rouge">Method</code> itself, to invoke it on a particular object and not another we call it by passing to the invoking method, the
actual instantiated object and the value.<br />
The above code is the same as <code class="language-plaintext highlighter-rouge">user.setCallSign("Maverick")</code> or <code class="language-plaintext highlighter-rouge">label.setName("John")</code> or <code class="language-plaintext highlighter-rouge">card.setDescription("description here)</code>
or <code class="language-plaintext highlighter-rouge">board.setIsFavorite(true)</code>.</p>

<p>the full method itself, returns a <code class="language-plaintext highlighter-rouge">Uni&lt;Void&gt;</code>.</p>

<h2 id="usage">usage</h2>

<p>to use this the update method from the very beginning now will look like this:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">UserService</span> <span class="kd">extends</span> <span class="nc">BasicPersistenceService</span><span class="o">&lt;</span><span class="nc">UserDto</span><span class="o">,</span> <span class="nc">UserEntity</span><span class="o">&gt;</span> <span class="o">{</span>

    <span class="kd">public</span> <span class="nc">Uni</span><span class="o">&lt;</span><span class="nc">Void</span><span class="o">&gt;</span> <span class="nf">update</span><span class="o">(</span><span class="kd">final</span> <span class="nc">UserEntity</span> <span class="n">toUpdate</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">String</span> <span class="n">key</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">String</span> <span class="n">value</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="nf">switch</span> <span class="o">(</span><span class="n">key</span><span class="o">)</span> <span class="o">{</span>
            <span class="k">case</span> <span class="s">"email"</span> <span class="o">-&gt;</span> <span class="n">updateInPlace</span><span class="o">(</span><span class="n">toUpdate</span><span class="o">,</span> <span class="no">SET_EMAIL</span><span class="o">,</span> <span class="n">value</span><span class="o">.</span><span class="na">toLowerCase</span><span class="o">());</span>
            <span class="k">case</span> <span class="s">"callSign"</span> <span class="o">-&gt;</span> <span class="n">updateInPlace</span><span class="o">(</span><span class="n">toUpdate</span><span class="o">,</span> <span class="no">SET_CALL_SIGN</span><span class="o">,</span> <span class="n">value</span><span class="o">);</span>
            <span class="k">case</span> <span class="s">"avatar"</span> <span class="o">-&gt;</span> <span class="n">updateInPlace</span><span class="o">(</span><span class="n">toUpdate</span><span class="o">,</span> <span class="no">SET_AVATAR</span><span class="o">,</span> <span class="n">value</span><span class="o">);</span>

            <span class="k">default</span> <span class="o">-&gt;</span> <span class="k">throw</span> <span class="k">new</span> <span class="nc">IllegalStateException</span><span class="o">(</span><span class="s">"Unexpected value: "</span> <span class="o">+</span> <span class="n">key</span><span class="o">);</span>
        <span class="o">};</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>now instead of explicitly calling the method we pass it as a variable and let reflection do the rest.</p>

<h2 id="corollary">corollary</h2>

<p>as you can see this is extremely powerful. We didn’t need to code at all what method to call on which object for each update possibility.</p>

<p>the technique allowed us to have a simple update method to update every entity and to also reuse the common code every update needs.</p>

<h3 id="debugging">debugging</h3>

<p>debugging is straightforward as a breakpoint reveals everything we are working with.</p>

<p>check how it looks like on an IDE:</p>

<figure>
    <a href="/assets/images/reflection_debugging.jpeg"><img src="/assets/images/reflection_debugging.jpeg" alt="reflection debugging" /></a>
  	<figcaption>reflection debugging</figcaption>
</figure>

<p>you can see how the generic <code class="language-plaintext highlighter-rouge">E</code>, resolves to the proper <code class="language-plaintext highlighter-rouge">CardEntity</code> type and the method is also correctly resolved as <code class="language-plaintext highlighter-rouge">SetDescription</code> with
a
single parameter of type <code class="language-plaintext highlighter-rouge">String</code></p>]]></content><author><name>Johnny X</name></author><summary type="html"><![CDATA[This note is about using java reflection techniques]]></summary></entry><entry><title type="html">Handling REST endpoints with a map</title><link href="https://www.baremetalcode.com/bmc-showcase-note-rest-maps-on-endpoints/" rel="alternate" type="text/html" title="Handling REST endpoints with a map" /><published>2023-06-06T00:00:00+00:00</published><updated>2023-06-06T00:00:00+00:00</updated><id>https://www.baremetalcode.com/bmc-showcase-note-rest-maps-on-endpoints</id><content type="html" xml:base="https://www.baremetalcode.com/bmc-showcase-note-rest-maps-on-endpoints/"><![CDATA[<p>This note is about using some tricks on REST resources.</p>

<hr />

<h2 id="intro">intro</h2>

<p>when dealing with certain entities in <strong>BMC_Anvil</strong> we find ourselves wanting to get all the entities present in a given
collection.<br />
for example, all users in an account, in a project, in a board, assigned to a card, etc.</p>

<p>taking the <strong>user REST resource</strong> as an example, we could go 2 ways about that requirement:</p>

<ol>
  <li>we could add a query parameter that will allow to specify from which collection / collectionId we want the users from:
    <ul>
      <li>ie: <code class="language-plaintext highlighter-rouge">localhost:8080/v1/users?collection=[COLLECTION_NAME]&amp;collectionid=[COLLECTION_ID]&amp;pagingParams=...</code></li>
    </ul>
  </li>
  <li>we could build a path with the collection name and id:
    <ul>
      <li>ie: <code class="language-plaintext highlighter-rouge">localhost:8080/v1/users/[COLLECTION_NAME]/[COLLECTION_ID]?pagingParams=...</code></li>
    </ul>
  </li>
</ol>

<p>although I chose option number 2, let’s look closer at both options.</p>

<h2 id="query-parameters-option">query parameters option</h2>

<p>this is a tried and true way for passing filters from an endpoint. Using query parameter the urls will become:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">localhost:8080/v1/users?collection=project&amp;collectionid=fb90e4cf-c725-426a-9066-07ae2577a3aa&amp;pagingParams=...</code></li>
  <li><code class="language-plaintext highlighter-rouge">localhost:8080/v1/users?collection=board&amp;collectionid=fb90e4cf-c725-426a-9066-07ae2577a3aa&amp;pagingParams=...</code></li>
  <li>…</li>
</ul>

<p>this approach has to make explicit the collection and collection id we want the users from. There is a nice advantage which is that we
only use a single endpoint path and vary the query parameter to filter users.</p>

<h2 id="distinct-paths-option">distinct paths option</h2>

<p>this is another tried and true approach. Using path parameters the urls will become:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">localhost:8080/v1/users/project/fb90e4cf-c725-426a-9066-07ae2577a3aa?pagingParams=...</code></li>
  <li><code class="language-plaintext highlighter-rouge">localhost:8080/v1/users/board/fb90e4cf-c725-426a-9066-07ae2577a3aa?pagingParams=...</code></li>
  <li>…</li>
</ul>

<p>this approach makes the collection / collectionId implicit on the url itself. There is a disadvantage which is that each collection will
“generate” a dedicated endpoint path.</p>

<p>there is a personal preference of reading the url and right away knowing what it is about.<br />
I relate this approach is akin the needle gauges in cars, you know what speed you’re going from the corner of your eye, while the 1st
approach is like having a digital speedometer, you need to actually read the speed.<br />
with the first approach you would actually need to look for the collection query param and collection id query parameter.</p>

<p>the second approach also means you have distinct paths to which apply statistics, scores and logs of all sorts in a very easy way.</p>

<h3 id="mapping-the-parameters-to-url-path-params">mapping the parameters to url path params</h3>

<p>the distinct path option can be achieved with path parameters, which will still have the benefit of coding a single method to handle all
possible collections. By having 2 path parameters, our <code class="language-plaintext highlighter-rouge">@Path</code> will look like this:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@GET</span>
<span class="nd">@Path</span><span class="o">(</span><span class="s">"{collection}/{collectionId}"</span><span class="o">)</span>
</code></pre></div></div>

<p>and we are all set! right? not yet…</p>

<p>if we leave things like that, (and the same will happen with the query parameter approach) the collection parameter is free in the open for
anybody to start poking our back end, and many poking bots will have a field day. There may not be any sensitive data to retrieve, but our
database will just work for nothing wasting time and resources.</p>

<p>a way to protect against that with little effort is as follows:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nd">@Path</span><span class="o">(</span><span class="s">"v1/users"</span><span class="o">)</span>
<span class="nd">@Produces</span><span class="o">(</span><span class="s">"application/json"</span><span class="o">)</span>
<span class="nd">@JBossLog</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">UserResource</span> <span class="kd">extends</span> <span class="nc">BasicOpsResource</span><span class="o">&lt;</span><span class="nc">UserDto</span><span class="o">,</span> <span class="nc">UserEntity</span><span class="o">&gt;</span> <span class="o">{</span>

    <span class="kd">private</span> <span class="kd">final</span> <span class="nc">UserService</span> <span class="n">userService</span><span class="o">;</span>

    <span class="kd">private</span> <span class="kd">final</span> <span class="nc">UserRepository</span> <span class="n">userRepo</span><span class="o">;</span>

    <span class="kd">private</span> <span class="kd">final</span> <span class="nc">Map</span><span class="o">&lt;</span><span class="nc">String</span><span class="o">,</span> <span class="nc">String</span><span class="o">&gt;</span> <span class="n">userSupportedCollections</span> <span class="o">=</span> <span class="n">ofEntries</span><span class="o">(</span>
            <span class="k">new</span> <span class="nc">SimpleImmutableEntry</span><span class="o">&lt;&gt;(</span><span class="s">"project"</span><span class="o">,</span> <span class="s">"projects"</span><span class="o">),</span>
            <span class="k">new</span> <span class="nc">SimpleImmutableEntry</span><span class="o">&lt;&gt;(</span><span class="s">"account"</span><span class="o">,</span> <span class="s">"accounts"</span><span class="o">),</span>
            <span class="k">new</span> <span class="nc">SimpleImmutableEntry</span><span class="o">&lt;&gt;(</span><span class="s">"board"</span><span class="o">,</span> <span class="s">"boards"</span><span class="o">),</span>
            <span class="k">new</span> <span class="nc">SimpleImmutableEntry</span><span class="o">&lt;&gt;(</span><span class="s">"sprint"</span><span class="o">,</span> <span class="s">"sprints"</span><span class="o">),</span>
            <span class="k">new</span> <span class="nc">SimpleImmutableEntry</span><span class="o">&lt;&gt;(</span><span class="s">"assignedCard"</span><span class="o">,</span> <span class="s">"assignedCards"</span><span class="o">),</span>
            <span class="k">new</span> <span class="nc">SimpleImmutableEntry</span><span class="o">&lt;&gt;(</span><span class="s">"watchingCard"</span><span class="o">,</span> <span class="s">"watchingCards"</span><span class="o">),</span>
            <span class="k">new</span> <span class="nc">SimpleImmutableEntry</span><span class="o">&lt;&gt;(</span><span class="s">"department"</span><span class="o">,</span> <span class="s">"departments"</span><span class="o">),</span>
            <span class="k">new</span> <span class="nc">SimpleImmutableEntry</span><span class="o">&lt;&gt;(</span><span class="s">"retroBoard"</span><span class="o">,</span> <span class="s">"retroBoards"</span><span class="o">)</span>
    <span class="o">);</span>

    <span class="kd">public</span> <span class="nf">UserResource</span><span class="o">(</span><span class="kd">final</span> <span class="nc">UserService</span> <span class="n">userService</span><span class="o">,</span> <span class="nc">UserRepository</span> <span class="n">userRepo</span><span class="o">)</span> <span class="o">{</span>
        <span class="kd">super</span><span class="o">(</span><span class="n">userService</span><span class="o">);</span>
        <span class="k">this</span><span class="o">.</span><span class="na">userService</span> <span class="o">=</span> <span class="n">userService</span><span class="o">;</span>
        <span class="k">this</span><span class="o">.</span><span class="na">userRepo</span> <span class="o">=</span> <span class="n">userRepo</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="nd">@GET</span>
    <span class="nd">@Path</span><span class="o">(</span><span class="s">"{collection}/{collectionId}"</span><span class="o">)</span>
    <span class="kd">public</span> <span class="nc">Uni</span><span class="o">&lt;</span><span class="nc">Response</span><span class="o">&gt;</span> <span class="nf">findAllByCollectionId</span><span class="o">(</span><span class="kd">final</span> <span class="nc">String</span> <span class="n">collection</span><span class="o">,</span> <span class="kd">final</span> <span class="no">UUID</span> <span class="n">collectionId</span><span class="o">,</span>
                                               <span class="nd">@QueryParam</span><span class="o">(</span><span class="n">value</span> <span class="o">=</span> <span class="s">"sortBy"</span><span class="o">)</span> <span class="nd">@NotNull</span> <span class="kd">final</span> <span class="nc">String</span> <span class="n">sortBy</span><span class="o">,</span>
                                               <span class="nd">@QueryParam</span><span class="o">(</span><span class="n">value</span> <span class="o">=</span> <span class="s">"sortDir"</span><span class="o">)</span> <span class="kd">final</span> <span class="nc">String</span> <span class="n">sortDir</span><span class="o">,</span>
                                               <span class="nd">@QueryParam</span><span class="o">(</span><span class="n">value</span> <span class="o">=</span> <span class="s">"pageIx"</span><span class="o">)</span> <span class="kd">final</span> <span class="nc">Integer</span> <span class="n">pageIx</span><span class="o">,</span>
                                               <span class="nd">@QueryParam</span><span class="o">(</span><span class="n">value</span> <span class="o">=</span> <span class="s">"pageSize"</span><span class="o">)</span> <span class="nd">@NotNull</span> <span class="kd">final</span> <span class="nc">Integer</span> <span class="n">pageSize</span><span class="o">)</span> <span class="o">{</span>

        <span class="nc">String</span> <span class="n">collections</span> <span class="o">=</span> <span class="n">userSupportedCollections</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">collection</span><span class="o">);</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">collections</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
            <span class="k">return</span> <span class="nc">Uni</span><span class="o">.</span><span class="na">createFrom</span><span class="o">().</span><span class="na">item</span><span class="o">(</span><span class="nc">Response</span><span class="o">.</span><span class="na">ok</span><span class="o">().</span><span class="na">status</span><span class="o">(</span><span class="no">NOT_FOUND</span><span class="o">).</span><span class="na">build</span><span class="o">());</span>
        <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
            <span class="k">return</span> <span class="n">userService</span><span class="o">.</span><span class="na">findAllInCollectionId</span><span class="o">(</span><span class="n">collections</span><span class="o">,</span> <span class="n">collectionId</span><span class="o">,</span> <span class="k">new</span> <span class="nc">Pageable</span><span class="o">(</span><span class="n">sortBy</span><span class="o">,</span> <span class="n">sortDir</span><span class="o">,</span> <span class="n">pageIx</span><span class="o">,</span>
                            <span class="n">pageSize</span><span class="o">))</span>
                    <span class="o">.</span><span class="na">map</span><span class="o">(</span><span class="n">userDtos</span> <span class="o">-&gt;</span> <span class="nc">Response</span><span class="o">.</span><span class="na">ok</span><span class="o">(</span><span class="n">userDtos</span><span class="o">).</span><span class="na">build</span><span class="o">());</span>
        <span class="o">}</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>this REST resource handles the <code class="language-plaintext highlighter-rouge">/v1/users/**</code> path.</p>

<p>we have a map of all the collections we want to support that has the path parameter received from the web as key and the corresponding name
of the collection in the <code class="language-plaintext highlighter-rouge">UserEntity</code> as value. This was implemented as a <code class="language-plaintext highlighter-rouge">Map</code> for front end flexibility, it can perfectly be a <code class="language-plaintext highlighter-rouge">Set</code>.</p>

<p>the first thing that happens when receiving a request is checking if we support that collection, if we do, we pass down the request to the
service, if we don’t, we just return a <code class="language-plaintext highlighter-rouge">404</code> to the caller.</p>

<p>the nice thing about the <code class="language-plaintext highlighter-rouge">Map</code>, or a <code class="language-plaintext highlighter-rouge">Set</code> if you prefer, is that it also allows to see at a glance which collections we are supporting.
Removing or adding another
collection is a single line of code requiring no logic at all.</p>

<p>If you are feeling bold, the supported collections could also be externalized, and we won’t even need to recompile the project to manage
those user’s paths.</p>

<h2 id="how-far-can-we-go">how far can we go?</h2>

<p>I chose the <code class="language-plaintext highlighter-rouge">{collection}/{collectionId}</code> for efficiency and readability of the code and the resulting endpoints paths.</p>

<p>we could think that the double path parameter can apply to anything and make a <code class="language-plaintext highlighter-rouge">Map</code> that will filter out the rogue attempts to query
non-existing data.</p>

<p>let’s see an example that is <strong>not</strong> part of <strong>BMC_Anvil</strong></p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nd">@Path</span><span class="o">(</span><span class="s">"v1"</span><span class="o">)</span>
<span class="nd">@Produces</span><span class="o">(</span><span class="s">"application/json"</span><span class="o">)</span>
<span class="nd">@JBossLog</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">SingleEntityResource</span> <span class="o">{</span>

    <span class="kd">private</span> <span class="kd">final</span> <span class="nc">SuperService</span> <span class="n">superService</span><span class="o">;</span>

    <span class="nc">Set</span><span class="o">&lt;</span><span class="nc">String</span><span class="o">&gt;</span> <span class="n">entitiesSupported</span> <span class="o">=</span> <span class="nc">Set</span><span class="o">.</span><span class="na">of</span><span class="o">(</span>
            <span class="s">"user"</span><span class="o">,</span>
            <span class="s">"account"</span><span class="o">,</span>
            <span class="s">"project"</span><span class="o">,</span>
            <span class="s">"card"</span><span class="o">,</span>
            <span class="s">"etc..."</span>
    <span class="o">);</span>

    <span class="kd">public</span> <span class="nf">SingleEntityResource</span><span class="o">(</span><span class="kd">final</span> <span class="nc">SuperService</span> <span class="n">superService</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">superService</span> <span class="o">=</span> <span class="n">superService</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="nd">@GET</span>
    <span class="nd">@Path</span><span class="o">(</span><span class="s">"{entity}/{entityId}"</span><span class="o">)</span>
    <span class="kd">public</span> <span class="nc">Uni</span><span class="o">&lt;</span><span class="nc">Response</span><span class="o">&gt;</span> <span class="nf">findEntityById</span><span class="o">(</span><span class="kd">final</span> <span class="nc">String</span> <span class="n">entity</span><span class="o">,</span> <span class="kd">final</span> <span class="no">UUID</span> <span class="n">entityId</span><span class="o">)</span> <span class="o">{</span>

        <span class="k">if</span> <span class="o">(!</span><span class="n">entitiesSupported</span><span class="o">.</span><span class="na">contains</span><span class="o">(</span><span class="n">entity</span><span class="o">))</span> <span class="o">{</span>
            <span class="k">return</span> <span class="nc">Uni</span><span class="o">.</span><span class="na">createFrom</span><span class="o">().</span><span class="na">item</span><span class="o">(</span><span class="nc">Response</span><span class="o">.</span><span class="na">ok</span><span class="o">().</span><span class="na">status</span><span class="o">(</span><span class="no">NOT_FOUND</span><span class="o">).</span><span class="na">build</span><span class="o">());</span>
        <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
            <span class="k">return</span> <span class="n">superService</span><span class="o">.</span><span class="na">findbyId</span><span class="o">(</span><span class="n">entityId</span><span class="o">)</span>
                    <span class="o">.</span><span class="na">map</span><span class="o">(</span><span class="n">resultDto</span> <span class="o">-&gt;</span> <span class="nc">Response</span><span class="o">.</span><span class="na">ok</span><span class="o">(</span><span class="n">resultDto</span><span class="o">).</span><span class="na">build</span><span class="o">());</span>
        <span class="o">}</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>the above resource will handle every <strong>“byId”</strong> request from the application which of course seems nice, but now this resource can return
basically any type of data instead of a <strong>“single concern”</strong> data, which is something of a hot-chilli-ice-cream kind of practice.</p>

<p>not only I would advise against a single resource retuning so many different entities / dtos because of the data disparity, but it will also
be very confusing having some of the user data returned by the <strong>user resource</strong> and some other by this “general purpose multi-data
resource”.</p>

<p>single concern practices are our friends (pinch of salt here as always…).</p>

<p>so… if the above is not an option how to make it effective to call on <code class="language-plaintext highlighter-rouge">{entity}/{id}</code> as it is basically the “same call” for every entity?</p>

<p>there actually is a way to benefit from just having a method to handle all the <strong>“byId”</strong> requests that is tied to each corresponding
resource, and takes care of only one “single concern” data without mixing matching code nor data.</p>

<p>check the <a href="/bmc-showcase-note-oop-inheritance/#the-basic-ops-resource">OOP - inheritance note</a> and read about the <strong>BasicOpsResource.java</strong></p>]]></content><author><name>Johnny X</name></author><summary type="html"><![CDATA[This note is about using some tricks on REST resources]]></summary></entry><entry><title type="html">Quarkus configuration utilities</title><link href="https://www.baremetalcode.com/bmc-showcase-note-configuration/" rel="alternate" type="text/html" title="Quarkus configuration utilities" /><published>2023-06-02T00:00:00+00:00</published><updated>2023-06-02T00:00:00+00:00</updated><id>https://www.baremetalcode.com/bmc-showcase-note-configuration</id><content type="html" xml:base="https://www.baremetalcode.com/bmc-showcase-note-configuration/"><![CDATA[<p>This note is about configuring an application within Quarkus ecosystem and using YAML instead of properties</p>

<p>references:</p>

<ul>
  <li><a href="https://quarkus.io/version/main/guides/config-yaml">config-yaml</a></li>
  <li><a href="https://quarkus.io/version/main/guides/config-reference">config-reference</a></li>
  <li><a href="https://quarkus.io/version/main/guides/config-mappings">config-mappings</a></li>
</ul>

<hr />

<h2 id="yaml">YAML</h2>

<p>to use yaml config to a quarkus app you only need to add the corresponding dependency to the project.</p>

<p>maven:</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nt">&lt;dependency&gt;</span>
    <span class="nt">&lt;groupId&gt;</span>io.quarkus<span class="nt">&lt;/groupId&gt;</span>
    <span class="nt">&lt;artifactId&gt;</span>quarkus-config-yaml<span class="nt">&lt;/artifactId&gt;</span>
<span class="nt">&lt;/dependency&gt;</span>
</code></pre></div></div>

<p>and that is basically it.</p>

<h2 id="profiles-with-quarkus">profiles with quarkus</h2>

<p>with <code class="language-plaintext highlighter-rouge">yaml</code> as configuration source if you want to add profiles you just prepend the properties to configure with the profile %name between
double quotes.</p>

<p>for example:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"</span><span class="s">%dev"</span><span class="err">:</span>
  <span class="na">quarkus</span><span class="pi">:</span>
    <span class="na">http</span><span class="pi">:</span>
      <span class="na">cors</span><span class="pi">:</span>
        <span class="na">~</span><span class="pi">:</span> <span class="no">true</span>
        <span class="na">origins</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/.*/"</span>
        <span class="na">access-control-allow-credentials</span><span class="pi">:</span> <span class="no">true</span>
</code></pre></div></div>

<p>this tells quarkus how to configure <code class="language-plaintext highlighter-rouge">cors</code> when running on <code class="language-plaintext highlighter-rouge">dev</code>.</p>

<p>I chose that property as it has something significant… the <code class="language-plaintext highlighter-rouge">~</code> character.<br />
as <code class="language-plaintext highlighter-rouge">cors</code> is a property in itself and the prefix of the other properties, we use the <code class="language-plaintext highlighter-rouge">~</code> as a <code class="language-plaintext highlighter-rouge">null</code> key, to overcome the <code class="language-plaintext highlighter-rouge">YAML</code> format
namespace limitation.</p>

<p>NOT SUPPORTED!</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"</span><span class="s">%dev"</span><span class="err">:</span>
  <span class="na">quarkus</span><span class="pi">:</span>
    <span class="na">http</span><span class="pi">:</span>
      <span class="na">cors</span><span class="pi">:</span> <span class="no">true</span> <span class="c1">#invalid</span>
        <span class="na">origins</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/.*/"</span>
        <span class="na">access-control-allow-credentials</span><span class="pi">:</span> <span class="no">true</span>
</code></pre></div></div>

<p>the above code, which is not supported by <code class="language-plaintext highlighter-rouge">YAML</code>, is te reason for the <code class="language-plaintext highlighter-rouge">~</code> when configuring properties that are both properties and
prefixes.</p>

<h2 id="from-yaml-to-code">from YAML to code</h2>

<p>in order to be able to use the configuration files to configure our own code, <code class="language-plaintext highlighter-rouge">Quarkus</code> makes it just as easy as <code class="language-plaintext highlighter-rouge">SpringBoot</code> to do it.</p>

<p>let’s examine a few lines in the <code class="language-plaintext highlighter-rouge">application.yaml</code> file.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">obfuscation</span><span class="pi">:</span>
  <span class="na">cities</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s">new_york</span>
    <span class="pi">-</span> <span class="s">angeles</span>
    <span class="pi">-</span> <span class="s">chicago</span>
    <span class="pi">-</span> <span class="s">houston</span>
    <span class="pi">-</span> <span class="s">phoenix</span>
    <span class="pi">-</span> <span class="s">philly</span>
    <span class="pi">-</span> <span class="s">antonio</span>
  <span class="c1"># [full list truncated]</span>
  <span class="na">alphabet</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s">alpha</span>
    <span class="pi">-</span> <span class="s">bravo</span>
    <span class="pi">-</span> <span class="s">charlie</span>
    <span class="pi">-</span> <span class="s">delta</span>
    <span class="pi">-</span> <span class="s">echo</span>
    <span class="pi">-</span> <span class="s">foxtrot</span>
    <span class="pi">-</span> <span class="s">golf</span>
  <span class="c1"># [full list truncated]</span>
</code></pre></div></div>

<p>when deleting a user we want to do a soft delete (inactivation) and not a hard delete (full record deletion) so we can keep track of who
created a given ticket for example, even if after they leave the project. The list above will be used to replace user’s data with “fantasy”
data.</p>

<p>what I did then was to generate a list of future fake name / lastname and put it on the properties file under obfuscation. To add
a little more complexity I broke the list into 2. Just for showcase.</p>

<h3 id="mapping-the-properties-into-code">mapping the properties into code.</h3>

<p>to get those 2 list of names we just need to do the as follows.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nd">@ConfigMapping</span><span class="o">(</span><span class="n">prefix</span> <span class="o">=</span> <span class="s">"obfuscation"</span><span class="o">)</span>
<span class="kd">public</span> <span class="kd">interface</span> <span class="nc">ObfuscationConfig</span> <span class="o">{</span>

    <span class="nc">List</span><span class="o">&lt;</span><span class="nc">String</span><span class="o">&gt;</span> <span class="nf">cities</span><span class="o">();</span>

    <span class="nc">List</span><span class="o">&lt;</span><span class="nc">String</span><span class="o">&gt;</span> <span class="nf">alphabet</span><span class="o">();</span>

<span class="o">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">Quarkus</code> (<code class="language-plaintext highlighter-rouge">SmallRye</code> Config lib in this case), requires the annotation <code class="language-plaintext highlighter-rouge">@ConfigMapping</code> and pass the prefix of our properties.</p>

<p>given that cities and alphabet are a list of names (String), we create 2 methods that return a <code class="language-plaintext highlighter-rouge">List&lt;String&gt;</code>, take no parameters and are named
just like our source properties.</p>

<h3 id="accessing-the-mapped-properties">accessing the mapped properties</h3>

<p>the <code class="language-plaintext highlighter-rouge">@ConfigMapping</code> annotation allows for CDI, so to use the properties mapped as methods on our interface, we just inject it where
needed.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nd">@ApplicationScoped</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">SecurityUtils</span> <span class="o">{</span>

    <span class="kd">private</span> <span class="kd">final</span> <span class="nc">Random</span> <span class="n">random</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Random</span><span class="o">();</span>

    <span class="kd">private</span> <span class="kd">final</span> <span class="nc">ObfuscationConfig</span> <span class="n">config</span><span class="o">;</span>

    <span class="c1">// constructor DI</span>
    <span class="kd">public</span> <span class="nf">SecurityUtils</span><span class="o">(</span><span class="kd">final</span> <span class="nc">ObfuscationConfig</span> <span class="n">config</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">config</span> <span class="o">=</span> <span class="n">config</span><span class="o">;</span>
    <span class="o">}</span>


    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">obfuscateUser</span><span class="o">(</span><span class="kd">final</span> <span class="nc">UserEntity</span> <span class="n">user</span><span class="o">)</span> <span class="o">{</span>

        <span class="nc">List</span><span class="o">&lt;</span><span class="nc">String</span><span class="o">&gt;</span> <span class="n">cities</span>  <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="na">cities</span><span class="o">();</span>
        <span class="nc">List</span><span class="o">&lt;</span><span class="nc">String</span><span class="o">&gt;</span> <span class="n">letters</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="na">alphabet</span><span class="o">();</span>

        <span class="nc">String</span> <span class="n">firstName</span> <span class="o">=</span> <span class="n">letters</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">random</span><span class="o">.</span><span class="na">nextInt</span><span class="o">(</span><span class="n">letters</span><span class="o">.</span><span class="na">size</span><span class="o">()));</span>
        <span class="nc">String</span> <span class="n">lastName</span>  <span class="o">=</span> <span class="n">cities</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">random</span><span class="o">.</span><span class="na">nextInt</span><span class="o">(</span><span class="n">cities</span><span class="o">.</span><span class="na">size</span><span class="o">()));</span>
        <span class="nc">String</span> <span class="n">email</span>     <span class="o">=</span> <span class="n">firstName</span> <span class="o">+</span> <span class="s">"@"</span> <span class="o">+</span> <span class="n">lastName</span> <span class="o">+</span> <span class="s">".com"</span><span class="o">;</span>

        <span class="n">user</span><span class="o">.</span><span class="na">setEmail</span><span class="o">(</span><span class="n">email</span><span class="o">);</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>that’s a little fun utility to showcase how properties are mapped and accessed within <code class="language-plaintext highlighter-rouge">Quarkus</code>.</p>]]></content><author><name>Johnny X</name></author><summary type="html"><![CDATA[This note is about configuring a Quarkus app]]></summary></entry><entry><title type="html">Hibernate simple entities</title><link href="https://www.baremetalcode.com/bmc-showcase-note-hbn-complex-mappings/" rel="alternate" type="text/html" title="Hibernate simple entities" /><published>2023-06-02T00:00:00+00:00</published><updated>2023-06-02T00:00:00+00:00</updated><id>https://www.baremetalcode.com/bmc-showcase-note-hbn-complex-mappings</id><content type="html" xml:base="https://www.baremetalcode.com/bmc-showcase-note-hbn-complex-mappings/"><![CDATA[<p>This note is about hibernate simple entities.</p>

<p>references:</p>

<ul>
  <li>web:
    <ul>
      <li><a href="https://vladmihalcea.com/">Vlad Mihalcea’s blog</a></li>
      <li><a href="https://thorben-janssen.com/">thorben jansen’s blog</a></li>
      <li><a href="https://hibernate.org/orm/">hibernate orm</a></li>
      <li><a href="https://hibernate.org/reactive/">hibernate reactive</a></li>
      <li><a href="https://quarkus.io/guides/hibernate-reactive-panache">quarkus reactive hibernate with panache</a></li>
      <li><a href="https://www.postgresql.org/docs/current/index.html">postgreSQL docs - current</a></li>
    </ul>
  </li>
  <li>paperback book:
    <ul>
      <li><a href="https://vladmihalcea.com/books/high-performance-java-persistence/">Vlad Mihalcea’s high performance java persistence</a></li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="intro">intro</h2>]]></content><author><name>Johnny X</name></author><summary type="html"><![CDATA[This note is about managing simple entities with hibernate]]></summary></entry><entry><title type="html">Hibernate inheritance</title><link href="https://www.baremetalcode.com/bmc-showcase-note-hbn-inheritance/" rel="alternate" type="text/html" title="Hibernate inheritance" /><published>2023-06-02T00:00:00+00:00</published><updated>2023-06-02T00:00:00+00:00</updated><id>https://www.baremetalcode.com/bmc-showcase-note-hbn-inheritance</id><content type="html" xml:base="https://www.baremetalcode.com/bmc-showcase-note-hbn-inheritance/"><![CDATA[<p>This note is about using inheritance on entities.</p>

<p>references:</p>

<ul>
  <li>web:
    <ul>
      <li><a href="https://vladmihalcea.com/">Vlad Mihalcea’s blog</a></li>
      <li><a href="https://thorben-janssen.com/">thorben jansen’s blog</a></li>
      <li><a href="https://hibernate.org/orm/">hibernate orm</a></li>
      <li><a href="https://hibernate.org/reactive/">hibernate reactive</a></li>
      <li><a href="https://quarkus.io/guides/hibernate-reactive-panache">quarkus reactive hibernate with panache</a></li>
      <li><a href="https://www.postgresql.org/docs/current/index.html">postgreSQL docs - current</a></li>
    </ul>
  </li>
  <li>paperback book:
    <ul>
      <li><a href="https://vladmihalcea.com/books/high-performance-java-persistence/">Vlad Mihalcea’s high performance java persistence</a></li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="intro">intro</h2>

<p>we already saw inheritance in the <a href="/bmc-showcase-note-oop-inheritance">OOP - inheritance note</a>, and inheritance in the entities world is
about the same, with a few twists to consider.</p>

<h2 id="inheritance-in-the-realm-of-orm">inheritance in the realm of orm</h2>

<p>let’s dive into how I use inheritance in <strong>BMC_Anvil</strong> with an example.</p>

<h3 id="the-base-class">the base class</h3>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nd">@MappedSuperclass</span>
<span class="nd">@Getter</span>
<span class="nd">@Setter</span>
<span class="nd">@EqualsAndHashCode</span><span class="o">(</span><span class="n">onlyExplicitlyIncluded</span> <span class="o">=</span> <span class="kc">true</span><span class="o">)</span>
<span class="kd">public</span> <span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">BaseEntity</span> <span class="o">{</span>

    <span class="nd">@Id</span>
    <span class="nd">@EqualsAndHashCode</span><span class="o">.</span><span class="na">Include</span>
    <span class="kd">private</span> <span class="no">UUID</span> <span class="n">id</span><span class="o">;</span>

    <span class="nd">@ManyToOne</span><span class="o">(</span><span class="n">fetch</span> <span class="o">=</span> <span class="no">LAZY</span><span class="o">)</span>
    <span class="kd">private</span> <span class="nc">UserEntity</span> <span class="n">createdBy</span><span class="o">;</span>

    <span class="nd">@CreationTimestamp</span>
    <span class="nd">@Column</span><span class="o">(</span><span class="n">updatable</span> <span class="o">=</span> <span class="kc">false</span><span class="o">)</span>
    <span class="kd">private</span> <span class="nc">LocalDateTime</span> <span class="n">createdAt</span><span class="o">;</span>

    <span class="nd">@UpdateTimestamp</span>
    <span class="kd">private</span> <span class="nc">LocalDateTime</span> <span class="n">updatedAt</span><span class="o">;</span>

<span class="o">}</span>
</code></pre></div></div>

<p>this is an abstract class, and we already know from the <a href="/bmc-showcase-note-oop-inheritance">OOP - inheritance note</a> that abstract classes
cannot be instantiated. This is exactly our purpose here as we do not want rogue instances of <code class="language-plaintext highlighter-rouge">BaseEntity</code> running around. The only purpose
of this class is to serve as basis for others.</p>

<p>not only that… this class is not marked as an <code class="language-plaintext highlighter-rouge">@Entity</code> itself so there won’t be a table for it on the database, instead this class is
annotated as <code class="language-plaintext highlighter-rouge">@MappedSuperClass</code>.</p>

<p><code class="language-plaintext highlighter-rouge">@MappedSuperClass</code> indicates that mapping information from this class is applied to the inheriting entities. This means that each entity
class that extends from this <code class="language-plaintext highlighter-rouge">BaseEntity</code> inherits all 4 fields:</p>

<ul>
  <li><strong>UUID id</strong>: as the id</li>
  <li><strong>UserEntity createdBy</strong>: as the creator of a given record</li>
  <li><strong>LocalDateTime createdAt</strong>: as the date-time of creation</li>
  <li><strong>LocalDateTime updated</strong>: as the date-time of update</li>
</ul>

<p>when you think about this approach, I wanted every table to have creation and update info, the user responsible for creating a given record
and the id type shared across all records will be of the uuid kind.</p>

<h3 id="the-extending-class">the extending class</h3>

<p>let’s check how the above is used by examining a class that extends from <code class="language-plaintext highlighter-rouge">BaseEntity</code>.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nd">@Entity</span>
<span class="nd">@Table</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"comment"</span><span class="o">)</span>
<span class="nd">@Getter</span>
<span class="nd">@Setter</span>
<span class="nd">@EqualsAndHashCode</span><span class="o">(</span><span class="n">onlyExplicitlyIncluded</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="n">callSuper</span> <span class="o">=</span> <span class="kc">true</span><span class="o">)</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">CommentEntity</span> <span class="kd">extends</span> <span class="nc">BaseEntity</span> <span class="o">{</span>

    <span class="nd">@Column</span><span class="o">(</span><span class="n">columnDefinition</span> <span class="o">=</span> <span class="s">"text"</span><span class="o">)</span>
    <span class="kd">private</span> <span class="nc">String</span> <span class="n">comment</span><span class="o">;</span>

    <span class="nd">@ManyToOne</span>
    <span class="kd">private</span> <span class="nc">CardEntity</span> <span class="n">card</span><span class="o">;</span>

<span class="o">}</span>
</code></pre></div></div>

<p>the <code class="language-plaintext highlighter-rouge">CommentEntity</code> extends the <code class="language-plaintext highlighter-rouge">BaseEntity</code> and that is it, nothing else is required from the classes that inherit from <code class="language-plaintext highlighter-rouge">BaseEntity</code>.<br />
when looking at the db, this class will have id, createdBy, createdAt and updatedAt fields.</p>

<h2 id="inheritance-purpose-on-entities">inheritance purpose on entities</h2>

<p>as stated on the <a href="/bmc-showcase-note-oop-inheritance">OOP - inheritance note</a>, code reusability is a big topic when using inheritance. It is
true in general, and it is true here too. When you care for the amount of code we save ourselves from repeating on each entity, it can be in
the hundreds.</p>

<p>there is something that is subtle in the case of entities and inheritance. It is not just avoiding repetition per se or making contracts for
inheritors.<br />
it is modeling our tables with shared properties and commonality. What I meant to convey by using this approach is that I want every table
to have a creator, and timestamps. A database inheritance of sorts.</p>

<h2 id="cascading-inheritance-on-entities">cascading inheritance on entities</h2>

<p>just like with common inheritance, cascading inheritance is supported.</p>

<p>in <strong>BMC_Anvil</strong> we have 3 very distinct entity types.</p>

<ul>
  <li><strong>catalogs</strong>: these are common datasets used by the application and by the record entities, ie: labels, statuses, seniority, etc.</li>
  <li><strong>records</strong>: this is the data we actually want to track, the meat of the app, ie: accounts, cards, projects, etc.</li>
  <li><strong>other</strong>: entities that won’t fall into any of the above 2 categories, ie: changelogs, time tracking, configuration, comments, etc.</li>
</ul>

<p>catalogs will have in common:</p>

<ul>
  <li>name</li>
  <li>description</li>
  <li>isSystem: a boolean indicating if a record is isSystem reserved or not</li>
</ul>

<p>records will have in common:</p>

<ul>
  <li>name</li>
  <li>description</li>
  <li>coverImage</li>
</ul>

<p>let’s see how cascading inheritance will work with an example.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nd">@MappedSuperclass</span>
<span class="nd">@Getter</span>
<span class="nd">@Setter</span>
<span class="nd">@EqualsAndHashCode</span><span class="o">(</span><span class="n">onlyExplicitlyIncluded</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="n">callSuper</span> <span class="o">=</span> <span class="kc">true</span><span class="o">)</span>
<span class="kd">public</span> <span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">BaseCatalogEntity</span> <span class="kd">extends</span> <span class="nc">BaseEntity</span> <span class="o">{</span>

    <span class="nd">@Column</span><span class="o">(</span><span class="n">unique</span> <span class="o">=</span> <span class="kc">true</span><span class="o">)</span>
    <span class="kd">private</span> <span class="nc">String</span> <span class="n">name</span><span class="o">;</span>

    <span class="nd">@Column</span><span class="o">(</span><span class="n">columnDefinition</span> <span class="o">=</span> <span class="s">"boolean default false"</span><span class="o">)</span>
    <span class="kd">private</span> <span class="nc">Boolean</span> <span class="n">isSystem</span><span class="o">;</span>

    <span class="kd">private</span> <span class="nc">String</span> <span class="n">description</span><span class="o">;</span>

<span class="o">}</span>
</code></pre></div></div>

<p>this class extends the <code class="language-plaintext highlighter-rouge">BaseEntity</code> as we said before and is itself annotated with <code class="language-plaintext highlighter-rouge">@MappedSuperClass</code>. It means its associations will pass
down to any class that extends from it</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nd">@Entity</span>
<span class="nd">@Table</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"seniority"</span><span class="o">)</span>
<span class="nd">@Getter</span>
<span class="nd">@Setter</span>
<span class="nd">@EqualsAndHashCode</span><span class="o">(</span><span class="n">onlyExplicitlyIncluded</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="n">callSuper</span> <span class="o">=</span> <span class="kc">true</span><span class="o">)</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">SeniorityEntity</span> <span class="kd">extends</span> <span class="nc">BaseCatalogEntity</span> <span class="o">{</span>

    <span class="nd">@OneToMany</span><span class="o">(</span><span class="n">mappedBy</span> <span class="o">=</span> <span class="s">"seniority"</span><span class="o">,</span> <span class="n">cascade</span> <span class="o">=</span> <span class="no">ALL</span><span class="o">)</span>
    <span class="kd">public</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="nc">UserEntity</span><span class="o">&gt;</span> <span class="n">users</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">HashSet</span><span class="o">&lt;&gt;();</span>

    <span class="kd">private</span> <span class="kt">short</span> <span class="n">level</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>

<p>here a <code class="language-plaintext highlighter-rouge">SeniorityEntity</code> class extends the <code class="language-plaintext highlighter-rouge">BaseCatalogEntity</code>, declaring its own fields and inheriting then:</p>

<ul>
  <li>from <code class="language-plaintext highlighter-rouge">BaseEntity</code>:
    <ul>
      <li>id</li>
      <li>createdBy</li>
      <li>createdAt</li>
      <li>updatedAt</li>
    </ul>
  </li>
  <li>from <code class="language-plaintext highlighter-rouge">BaseCatalogEntity</code>:
    <ul>
      <li>name</li>
      <li>description</li>
      <li>isSystem</li>
    </ul>
  </li>
</ul>

<p>this catalog entity and all catalogs will now have that shape on the database, the same will apply to records with their own inherited
fields.</p>

<h2 id="note-on-multiple-cascading-inheritance">note on multiple cascading inheritance</h2>

<p>as u can see from above, <code class="language-plaintext highlighter-rouge">BaseCatalogEntity</code> share <strong>name</strong> and <strong>description</strong> with the base records entity… we cannot move them to
the <code class="language-plaintext highlighter-rouge">BaseEntity</code> or it will be specialized beyond what we want from it. Why not extract those 2 fields into another class and inherit from
that new one before creating the <code class="language-plaintext highlighter-rouge">BaseCatalogEntity</code> or the base records one?</p>

<p>as stated in <a href="/bmc-showcase-note-oop-inheritance">OOP - inheritance note</a>, probably a cascade of 3 classes is enough and I am respecting
that for readability’s sake.</p>]]></content><author><name>Johnny X</name></author><summary type="html"><![CDATA[This note is about using inheritance on entities with hibernate]]></summary></entry><entry><title type="html">Hibernate reactive and persistence introduction</title><link href="https://www.baremetalcode.com/bmc-showcase-note-hbn-intro-reactive/" rel="alternate" type="text/html" title="Hibernate reactive and persistence introduction" /><published>2023-06-02T00:00:00+00:00</published><updated>2023-06-02T00:00:00+00:00</updated><id>https://www.baremetalcode.com/bmc-showcase-note-hbn-intro-reactive</id><content type="html" xml:base="https://www.baremetalcode.com/bmc-showcase-note-hbn-intro-reactive/"><![CDATA[<p>This note is an introduction to the application’s data stack.</p>

<p>references:</p>

<ul>
  <li>web:
    <ul>
      <li><a href="https://vladmihalcea.com/">Vlad Mihalcea’s blog</a></li>
      <li><a href="https://thorben-janssen.com/">thorben jansen’s blog</a></li>
      <li><a href="https://hibernate.org/orm/">hibernate orm</a></li>
      <li><a href="https://hibernate.org/reactive/">hibernate reactive</a></li>
      <li><a href="https://quarkus.io/guides/hibernate-reactive-panache">quarkus reactive hibernate with panache</a></li>
      <li><a href="https://www.postgresql.org/docs/current/index.html">postgreSQL docs - current</a></li>
    </ul>
  </li>
  <li>paperback book:
    <ul>
      <li><a href="https://vladmihalcea.com/books/high-performance-java-persistence/">Vlad Mihalcea’s high performance java persistence</a></li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="intro-to-bmc_anvils-persistence-stack">intro to <strong>BMC_Anvil</strong>’s persistence stack</h2>

<p><strong>BMC_Anvil</strong>’s data access stack is built
around <code class="language-plaintext highlighter-rouge">hibernate reactive </code> + <code class="language-plaintext highlighter-rouge">panache</code> + <code class="language-plaintext highlighter-rouge">reactive postgreSQL client</code> +
<code class="language-plaintext highlighter-rouge">postgeSQL 15.3</code> db</p>

<p>as stated on other places everything that can be reactive was chosen over the classic flavour.</p>

<h3 id="panache">Panache</h3>

<p>panache could be seen as the <code class="language-plaintext highlighter-rouge">Quarkus</code> equivalent for <code class="language-plaintext highlighter-rouge">SpringData</code>. It simplifies boilerplate code and offers 2 flavours for data access</p>

<ul>
  <li>the repository pattern:
    <ul>
      <li>abstracts all data access logic in an interface away from the domain objects</li>
      <li><a href="https://martinfowler.com/eaaCatalog/repository.html">martinfowler’s repository definition</a></li>
    </ul>
  </li>
  <li>the active record pattern:
    <ul>
      <li>implements the data access on the domain object itself</li>
      <li><a href="https://www.martinfowler.com/eaaCatalog/activeRecord.html">martinfowler’s repository definition</a></li>
    </ul>
  </li>
</ul>

<p>I chose for the data access layer the repository approach, it extracts all logic to repositories making very clear and clean the data
modeling by the entity and the data access by the repository itself.<br /></p>

<blockquote>
  <p><strong>showcase note</strong>:<br />
I will not have a specific showcase for the active record approach on the app itself as it will be very disruptive, and services and
resources will all have to be coded differently for the active record <code class="language-plaintext highlighter-rouge">Entity</code>.</p>
</blockquote>

<p>the example below from quarkus guides illustrates how the <code class="language-plaintext highlighter-rouge">active record</code> approach works with <code class="language-plaintext highlighter-rouge">panache</code> library:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">io.quarkus.hibernate.reactive.panache.PanacheEntity</span><span class="o">;</span>

<span class="nd">@Entity</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Person</span> <span class="kd">extends</span> <span class="nc">PanacheEntity</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="nc">String</span>    <span class="n">name</span><span class="o">;</span>
    <span class="kd">public</span> <span class="nc">LocalDate</span> <span class="n">birth</span><span class="o">;</span>
    <span class="kd">public</span> <span class="nc">Status</span>    <span class="n">status</span><span class="o">;</span>

    <span class="kd">public</span> <span class="kd">static</span> <span class="nc">Uni</span><span class="o">&lt;</span><span class="nc">Person</span><span class="o">&gt;</span> <span class="nf">findByName</span><span class="o">(</span><span class="nc">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="nf">find</span><span class="o">(</span><span class="s">"name"</span><span class="o">,</span> <span class="n">name</span><span class="o">).</span><span class="na">firstResult</span><span class="o">();</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kd">static</span> <span class="nc">Uni</span><span class="o">&lt;</span><span class="nc">List</span><span class="o">&lt;</span><span class="nc">Person</span><span class="o">&gt;&gt;</span> <span class="nf">findAlive</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="nf">list</span><span class="o">(</span><span class="s">"status"</span><span class="o">,</span> <span class="nc">Status</span><span class="o">.</span><span class="na">Alive</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kd">static</span> <span class="nc">Uni</span><span class="o">&lt;</span><span class="nc">Long</span><span class="o">&gt;</span> <span class="nf">deleteStefs</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="nf">delete</span><span class="o">(</span><span class="s">"name"</span><span class="o">,</span> <span class="s">"Stef"</span><span class="o">);</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>a given <code class="language-plaintext highlighter-rouge">entity</code> extends a <code class="language-plaintext highlighter-rouge">PanacheEntity</code> which is the one encapsulating all basic <strong>CRUD</strong> data access.</p>

<h2 id="hibernate-6x-reactive">hibernate 6.x reactive</h2>

<p>for the
moment, <code class="language-plaintext highlighter-rouge">Quarkus</code> <a href="https://quarkus.io/guides/hibernate-reactive-panache">claims hibernate reactive to be the only Jakarta (JPA) implementation</a></p>

<p>it is basically the same as the classic implementation with a few minor differences regarding access to the <code class="language-plaintext highlighter-rouge">EntityManager</code> and how loading
lazy collections is achieved.</p>

<p>we are going to see both peculiarities in other notes.</p>

<p>if you are coming from <code class="language-plaintext highlighter-rouge">hibernate 5.x</code> series you will see some core changes:</p>

<ul>
  <li>JPA3 - Jakarta: moving to eclipse’s foundation specification means everything under <code class="language-plaintext highlighter-rouge">javax.persistence</code> now lives
under <code class="language-plaintext highlighter-rouge">jakarta.persistence</code></li>
  <li>no more hibernate own criteria API</li>
  <li><code class="language-plaintext highlighter-rouge">ResultTransformer</code> split into 2</li>
</ul>

<p>there are a few more that are non-breaking changes like the above.</p>

<p>if you are thinking about updating from <code class="language-plaintext highlighter-rouge">hibernate</code> 5.x to 6.x try
reading <a href="https://thorben-janssen.com/things-to-know-when-migrating-to-hibernate-6-x/">thorben jansen’s note on migrating to hibernate 6</a>
first</p>

<h2 id="postgresql">postgreSQL</h2>

<p>in the free relational databases, I used <code class="language-plaintext highlighter-rouge">MySQL</code> for years with fantastic results, support and great features. I think in the benchmark
world it also ranks among the fastest ones if not the fastest.</p>

<p>so, why postgreSQL?</p>

<p>at early stages I used both databases, and at some point I started trying <code class="language-plaintext highlighter-rouge">Quarkus</code>’s live reload (dev mode) and found it awesome to iterate
and experiment and debug. It turns out to be that when reloading the slowest part of the bootstrap was dropping and recreating all the DB
with the seeded data. While MySQL took several seconds, PostgreSQL takes 2 seconds at most. That leaned me to PostgreSQL, you can hook
up any DB of your choice.</p>

<h3 id="and-then-using-a-db-specific-feature">and then using a DB specific feature…</h3>

<p>I read a while ago that using everything in an agnostic ultra compatible fashion is paramount to be able to switch implementations,
databases in this case.<br />
if I were to use a <code class="language-plaintext highlighter-rouge">MySQL</code> specific functionality, I won’t be able to just swap databases…</p>

<p>I read a while ago that using everything in an agnostic ultra compatible fashion is at some point throwing away the benefits a specific
implementation offers.<br />
like having a tow truck and not loading more than xxx bags because they would not fit in a ferrari.</p>

<p>in this case, I did just that… I used a <code class="language-plaintext highlighter-rouge">postgreSQL</code> specific DataType
the <a href="https://www.postgresql.org/docs/current/datatype-uuid.html">UUID data type</a></p>

<p>I wanted to use <code class="language-plaintext highlighter-rouge">UUID</code>s as entities PKs instead of auto generated sequences of numbers.</p>

<p>the advantage is that UUIDs are native to <code class="language-plaintext highlighter-rouge">PostgreSQL</code>, and they are fast to operate with… blazing fast compared to uuids stored as
characters. Not only they are fast, but they are also footprint storage small. A char version of a <code class="language-plaintext highlighter-rouge">UUID</code> will be considerably larger
(2x +1 byte) than the 128-bit(16 bytes) size of <code class="language-plaintext highlighter-rouge">PostgreSQL</code> <code class="language-plaintext highlighter-rouge">UUID</code> type!</p>

<p>it is disputed that generating a <code class="language-plaintext highlighter-rouge">UUID</code> is slower than increasing an int in a sequence on large sets, but I am not fan of using
autoincrement sequences, nor having hibernate generate the sequence for me, which will be commented on a later note.</p>

<p>with <code class="language-plaintext highlighter-rouge">MySQL</code>, <code class="language-plaintext highlighter-rouge">UUID</code> support is achieved by means of <a href="https://dev.mysql.com/blog-archive/mysql-8-0-uuid-support/">supporting UUID functions</a></p>

<p>if you like <code class="language-plaintext highlighter-rouge">MySQL</code> there is the <a href="https://mariadb.com/kb/en/uuid-data-type/">UUID data Type offered by MariaDB</a></p>]]></content><author><name>Johnny X</name></author><summary type="html"><![CDATA[This note is an introduction to the application's data stack]]></summary></entry><entry><title type="html">Hibernate simple entities</title><link href="https://www.baremetalcode.com/bmc-showcase-note-hbn-named-queries/" rel="alternate" type="text/html" title="Hibernate simple entities" /><published>2023-06-02T00:00:00+00:00</published><updated>2023-06-02T00:00:00+00:00</updated><id>https://www.baremetalcode.com/bmc-showcase-note-hbn-named-queries</id><content type="html" xml:base="https://www.baremetalcode.com/bmc-showcase-note-hbn-named-queries/"><![CDATA[<p>This note is about hibernate simple entities.</p>

<p>references:</p>

<ul>
  <li>web:
    <ul>
      <li><a href="https://vladmihalcea.com/">Vlad Mihalcea’s blog</a></li>
      <li><a href="https://thorben-janssen.com/">thorben jansen’s blog</a></li>
      <li><a href="https://hibernate.org/orm/">hibernate orm</a></li>
      <li><a href="https://hibernate.org/reactive/">hibernate reactive</a></li>
      <li><a href="https://quarkus.io/guides/hibernate-reactive-panache">quarkus reactive hibernate with panache</a></li>
      <li><a href="https://www.postgresql.org/docs/current/index.html">postgreSQL docs - current</a></li>
    </ul>
  </li>
  <li>paperback book:
    <ul>
      <li><a href="https://vladmihalcea.com/books/high-performance-java-persistence/">Vlad Mihalcea’s high performance java persistence</a></li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="intro">intro</h2>]]></content><author><name>Johnny X</name></author><summary type="html"><![CDATA[This note is about managing simple entities with hibernate]]></summary></entry><entry><title type="html">Hibernate simple entities</title><link href="https://www.baremetalcode.com/bmc-showcase-note-hbn-native-queries/" rel="alternate" type="text/html" title="Hibernate simple entities" /><published>2023-06-02T00:00:00+00:00</published><updated>2023-06-02T00:00:00+00:00</updated><id>https://www.baremetalcode.com/bmc-showcase-note-hbn-native-queries</id><content type="html" xml:base="https://www.baremetalcode.com/bmc-showcase-note-hbn-native-queries/"><![CDATA[<p>This note is about hibernate simple entities.</p>

<p>references:</p>

<ul>
  <li>web:
    <ul>
      <li><a href="https://vladmihalcea.com/">Vlad Mihalcea’s blog</a></li>
      <li><a href="https://thorben-janssen.com/">thorben jansen’s blog</a></li>
      <li><a href="https://hibernate.org/orm/">hibernate orm</a></li>
      <li><a href="https://hibernate.org/reactive/">hibernate reactive</a></li>
      <li><a href="https://quarkus.io/guides/hibernate-reactive-panache">quarkus reactive hibernate with panache</a></li>
      <li><a href="https://www.postgresql.org/docs/current/index.html">postgreSQL docs - current</a></li>
    </ul>
  </li>
  <li>paperback book:
    <ul>
      <li><a href="https://vladmihalcea.com/books/high-performance-java-persistence/">Vlad Mihalcea’s high performance java persistence</a></li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="intro">intro</h2>]]></content><author><name>Johnny X</name></author><summary type="html"><![CDATA[This note is about managing simple entities with hibernate]]></summary></entry></feed>