Jekyll2021-10-23T11:45:23+00:00https://www.zcode.dev/atom.xmlZCodeNavigating the digital world one day at a timeFilament Scale2021-10-10T00:00:00+00:002021-10-10T00:00:00+00:00https://www.zcode.dev/2021/10/10/filament-scale<p><img src="/img/posts/2021-10-10-filament-scale/picFinal.jpg" alt="center-aligned-image" class="align-center" /></p>
<p>Build a Filament Scale for the printer to help with getting the last bits out of each spool of filament without the fear of running out or having to change filament mid print. The scale connects to the Raspberry Pi to be used with a Octoprint Plugin.</p>
<h3 id="part-list">Part List</h3>
<ul>
<li><a href="https://www.aliexpress.com/item/1005001537354199.html">HX711 AD Module + Load Cell 2kg</a></li>
<li><a href="https://www.aliexpress.com/item/10000150053486.html">2 x M5 Bolt Screw</a></li>
<li><a href="https://www.aliexpress.com/item/10000150053486.html">2 x M4 Bolt Screw</a></li>
<li><a href="https://www.aliexpress.com/item/4000695518244.html">Filament Spool Holder</a></li>
</ul>
<p>The printed parts can be found on <a href="https://www.thingiverse.com/thing:5004512">Thingeverse</a></p>
<p>Optional</p>
<ul>
<li><a href="https://www.amazon.co.uk/gp/product/B0825KCPZQ">Plastic Storage Box</a></li>
<li><a href="https://www.amazon.co.uk/gp/product/B087T2GBPX">Silica Gel Desiccant Beads Reusable</a></li>
<li><a href="https://www.aliexpress.com/item/4000373039226.html">Mijia Bluetooth Thermometer 2</a></li>
<li><a href="https://www.aliexpress.com/item/4001021932385.html">Pneumatic Connectors</a></li>
</ul>
<h2 id="print">Print</h2>
<p>I used the following print oriantations for the two parts</p>
<p><img src="/img/posts/2021-10-10-filament-scale/scaleBase.jpg" alt="center-aligned-image" class="align-center" />
<img src="/img/posts/2021-10-10-filament-scale/scaleHolder.jpg" alt="center-aligned-image" class="align-center" /></p>
<h2 id="assembly">Assembly</h2>
<p><img src="/img/posts/2021-10-10-filament-scale/picAssembled.jpg" alt="center-aligned-image" class="align-center" /></p>
<p>This is fairly strait forward only bit that is bit tricky is wiring up everything. To wire up:</p>
<p>Load Cell to HX711</p>
<ul>
<li>Red: E+</li>
<li>Black: E-</li>
<li>Green: A-</li>
<li>White: A+</li>
</ul>
<p>HX711 to Raspberry Pi</p>
<ul>
<li>VCC to Raspberry Pi Pin 2 (5V)</li>
<li>GND to Raspberry Pi Pin 6 (GND)</li>
<li>DT to Raspberry Pi Pin 29 (GPIO 20)</li>
<li>SCK to Raspberry Pi Pin 31 (GPIO 21)</li>
</ul>
<p><img src="/img/posts/2021-10-10-filament-scale/PCB.jpg" alt="center-aligned-image" class="align-center" />
<img src="/img/posts/2021-10-10-filament-scale/picModule.jpg" alt="center-aligned-image" class="align-center" /></p>
<h2 id="octoprint">Octoprint</h2>
<p>I have made use of the following plugin in OctoPrint: <a href="https://plugins.octoprint.org/plugins/filament_scale/">Filament Scale</a>
You will require Python 3 or higher to runt he plugin. If you are on OctoPi 18 or higher you will be fine.</p>
<h2 id="final-result">Final Result</h2>
<p>I also placed the project inside of a box with some Silica Beads to keept everything nice and dry. I do get bit lazy sometimes to pack away everything between prints. This will help hopefully…</p>
<p><img src="/img/posts/2021-10-10-filament-scale/picFront.jpg" alt="center-aligned-image" class="align-center" />
<img src="/img/posts/2021-10-10-filament-scale/picOutside.jpg" alt="center-aligned-image" class="align-center" /></p>
<h2 id="sources">Sources</h2>
<ul>
<li><a href="https://www.reddit.com/r/3Dprinting/comments/4hlwse/empty_spool_weights_for_estimating_remaining/">Empty Fiament Spool Weights 1</a></li>
<li><a href="http://thrinter.com/empty-spool-weights/">Empty Fiament Spool Weights 2</a></li>
</ul>Java 11 Ubuntu setup Part 22019-02-09T00:00:00+00:002019-02-09T00:00:00+00:00https://www.zcode.dev/2019/02/09/java-11-part2<p>Quick addion of the things around Java 11 that is required to get your enviroment ready for development. See part one on the Java 11 installation first: <a href="/2018/10/22/java-11/">Part 1</a></p>
<h3 id="update-maven">Update Maven</h3>
<p>Getting the latest version of maven is highly recommended here is quick instruction on how to upgarde. apt does not seem to have the latest version.</p>
<p>Check the donwload page of maven for the latest version and copy the url of lates version : <a href="https://maven.apache.org/download.cgi">Maven Download Page</a>
Replace below with your version.</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">wget https://www-eu.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz <span class="nt">-P</span> /tmp
<span class="nb">sudo tar </span>xf /tmp/apache-maven-<span class="k">*</span>.tar.gz <span class="nt">-C</span> /opt
<span class="nb">sudo ln</span> <span class="nt">-s</span> /opt/apache-maven-3.8.1 /opt/maven</code></pre></figure>
<p>Setup the Enviroment variables:</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">sudo </span>nano /etc/profile.d/maven.sh</code></pre></figure>
<p>Past following config:</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">export </span><span class="nv">M2_HOME</span><span class="o">=</span>/opt/maven
<span class="nb">export </span><span class="nv">MAVEN_HOME</span><span class="o">=</span>/opt/maven
<span class="nb">export </span><span class="nv">PATH</span><span class="o">=</span><span class="k">${</span><span class="nv">M2_HOME</span><span class="k">}</span>/bin:<span class="k">${</span><span class="nv">PATH</span><span class="k">}</span></code></pre></figure>
<p>If you are running multiple version of java is recommend to use the maven config file to set the java home.</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">nano ~/.mavenrc</code></pre></figure>
<p>Past this content (check you java directory). Also makes it easy to comment out if you want to use Java 8 for other maven project.</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">JAVA_HOME</span><span class="o">=</span>/usr/lib/jvm/java-1.11.0-openjdk-amd64
<span class="c"># JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64</span></code></pre></figure>
<h2 id="maven-pomxml">Maven pom.xml</h2>
<p>It is also recommend using the latest maven compile by setting in pom.xml</p>
<figure class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="nt"><plugin></span>
<span class="nt"><groupId></span>org.apache.maven.plugins<span class="nt"></groupId></span>
<span class="nt"><artifactId></span>maven-compiler-plugin<span class="nt"></artifactId></span>
<span class="nt"><version></span>3.8.1<span class="nt"></version></span>
<span class="nt"><configuration></span>
<span class="nt"><release></span>11<span class="nt"></release></span>
<span class="nt"></configuration></span>
<span class="nt"></plugin></span></code></pre></figure>
<p>“release” is a new config argument for Java 9+. <a href="https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html">More Info</a>.
Can also be set with property maven.compiler.release</p>
<h2 id="sources">Sources</h2>
<ul>
<li><a href="https://linuxize.com/post/how-to-install-apache-maven-on-ubuntu-18-04/">Maven install</a></li>
<li><a href="https://winterbe.com/posts/2018/08/29/migrate-maven-projects-to-java-11-jigsaw/">Maven Java 11</a></li>
</ul>Quick addion of the things around Java 11 that is required to get your enviroment ready for development. See part one on the Java 11 installation first: Part 1Java 11 Installation and Setup2018-10-22T00:00:00+00:002018-10-22T00:00:00+00:00https://www.zcode.dev/2018/10/22/java-11<p>Updated: 2020-10-09</p>
<p>Java 11 is a LTS version, so should be the most popular version. I tested the steps below on Ubuntu/Mint/Arch.</p>
<h2 id="installation">Installation</h2>
<p>Here I will provide three option the Oracle, OpenJDK and AdoptOpenJDK version. I would recommend the AdoptOpenJDK.</p>
<h3 id="adoptopenjdk-11-recommended">AdoptOpenJDK 11 (Recommended)</h3>
<h4 id="ubuntumint">Ubuntu/Mint</h4>
<p>Add the following PPA and install as follow:</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">wget <span class="nt">-qO</span> - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | <span class="nb">sudo </span>apt-key add -
<span class="nb">sudo </span>apt <span class="nb">install </span>software-properties-common
<span class="nb">sudo </span>add-apt-repository <span class="nt">--yes</span> https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
<span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt <span class="nb">install </span>adoptopenjdk-11-hotspot</code></pre></figure>
<h4 id="arch">Arch</h4>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">pacman <span class="nt">-S</span> jdk11-adoptopenjdk</code></pre></figure>
<h3 id="openjdk-11">OpenJDK 11</h3>
<p>Add the following PPA and install as follow:</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt <span class="nb">install </span>software-properties-common
<span class="nb">sudo </span>add-apt-repository ppa:openjdk-r/ppa
<span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt <span class="nb">install </span>openjdk-11-jdk openjdk-11-source</code></pre></figure>
<h3 id="oracle-java-11">Oracle Java 11</h3>
<p>Add the following PPA and install as follow:</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt <span class="nb">install </span>software-properties-common
<span class="nb">sudo </span>add-apt-repository ppa:linuxuprising/java
<span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt <span class="nb">install </span>oracle-java11-installer</code></pre></figure>
<h2 id="switch-between-java-versions">Switch between Java versions</h2>
<p>List all installed version of Java.</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c"># Ubuntu/Mint/Debian</span>
update-java-alternatives <span class="nt">-l</span>
<span class="c"># Arch</span>
archlinux-java status</code></pre></figure>
<p>Selecting new version of Java.</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c"># Ubuntu/Mint/Debian</span>
<span class="nb">sudo </span>update-java-alternatives <span class="nt">-s</span> java-1.11.0-openjdk-amd64
<span class="c"># Arch</span>
archlinux-java <span class="nb">set </span>java-11-adoptopenjdk</code></pre></figure>
<p>Also noted that sometimes the JAVA_HOME is not set and causes issues with few apps. To fix this just set the JAVA home in /etc/enviroment or if that file is not in your distro set in ~/.bashrc. If you are setting in the /etc/enviroment you need to restart to load.</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">JAVA_HOME</span><span class="o">=</span><span class="s2">"/usr/lib/jvm/java-11-adoptopenjdk"</span></code></pre></figure>Updated: 2020-10-09Deploy Solidity Contract2018-10-03T00:00:00+00:002018-10-03T00:00:00+00:00https://www.zcode.dev/2018/10/03/deploy-solidity<p>This tutorial will show you how to deploy a solidity contract to Ropsten (Test Net).</p>
<h2 id="setup">Setup</h2>
<p>Installing node and npm, here is a <a href="https://www.sitepoint.com/beginners-guide-node-package-manager/">great tutorial</a> but most of you should already have this setup</p>
<p>Install web3 and solc.</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">npm <span class="nb">install</span> <span class="nt">-g</span> web3 solc fs</code></pre></figure>
<p>Register with https://infura.io
Endpoint</p>
<p>get test eth http://faucet.bitfwd.xyz/</p>
<h2 id="possible-issues">Possible issues</h2>
<h3 id="error-cannot-find-module-web3">Error: Cannot find module ‘web3’</h3>
<p>Could be that you not adding the node modules to your path
export NODE_PATH=/home/plouw/.node_modules_global/lib/node_modules</p>
<p>Make use of the <a href="https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/test/helpers/expectThrow.js">OpenZeppelin expectThrow script</a></p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="k">export</span> <span class="k">default</span> <span class="k">async</span> <span class="nx">promise</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">try</span> <span class="p">{</span>
<span class="k">await</span> <span class="nx">promise</span><span class="p">;</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// TODO: Check jump destination to destinguish between a throw</span>
<span class="c1">// and an actual invalid jump.</span>
<span class="kd">const</span> <span class="nx">invalidOpcode</span> <span class="o">=</span> <span class="nx">error</span><span class="p">.</span><span class="nx">message</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="dl">'</span><span class="s1">invalid opcode</span><span class="dl">'</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">;</span>
<span class="c1">// TODO: When we contract A calls contract B, and B throws, instead</span>
<span class="c1">// of an 'invalid jump', we get an 'out of gas' error. How do</span>
<span class="c1">// we distinguish this from an actual out of gas event? (The</span>
<span class="c1">// ganache log actually show an 'invalid jump' event.)</span>
<span class="kd">const</span> <span class="nx">outOfGas</span> <span class="o">=</span> <span class="nx">error</span><span class="p">.</span><span class="nx">message</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="dl">'</span><span class="s1">out of gas</span><span class="dl">'</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">revert</span> <span class="o">=</span> <span class="nx">error</span><span class="p">.</span><span class="nx">message</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="dl">'</span><span class="s1">revert</span><span class="dl">'</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">assert</span><span class="p">(</span>
<span class="nx">invalidOpcode</span> <span class="o">||</span> <span class="nx">outOfGas</span> <span class="o">||</span> <span class="nx">revert</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">Expected throw, got </span><span class="se">\'</span><span class="dl">'</span> <span class="o">+</span> <span class="nx">error</span> <span class="o">+</span> <span class="dl">'</span><span class="se">\'</span><span class="s1"> instead</span><span class="dl">'</span><span class="p">,</span>
<span class="p">);</span>
<span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx">assert</span><span class="p">.</span><span class="nx">fail</span><span class="p">(</span><span class="dl">'</span><span class="s1">Expected throw not received</span><span class="dl">'</span><span class="p">);</span>
<span class="p">};</span></code></pre></figure>
<p>In my test I have added that code to file in my test folder /helpers/expectThrow.js and have used as follow. Here the function getPeriodStartTimestamp is expected to throw when the value is 50000 or larger.</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="c1">// Import the helper script</span>
<span class="k">import</span> <span class="nx">expectThrow</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">./helpers/expectThrow</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">PeriodUtilWeek</span> <span class="o">=</span> <span class="nx">artifacts</span><span class="p">.</span><span class="nx">require</span><span class="p">(</span><span class="dl">"</span><span class="s2">./PeriodUtilWeek.sol</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">BigNumber</span> <span class="o">=</span> <span class="nx">web3</span><span class="p">.</span><span class="nx">BigNumber</span><span class="p">;</span>
<span class="nx">contract</span><span class="p">(</span><span class="dl">'</span><span class="s1">PeriodUtilWeek</span><span class="dl">'</span><span class="p">,</span><span class="kd">function</span><span class="p">(</span><span class="nx">accounts</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// Other tests</span>
<span class="nx">describe</span><span class="p">(</span><span class="dl">'</span><span class="s1">Test getPeriodStartTimestamp (Week)</span><span class="dl">'</span><span class="p">,</span> <span class="k">async</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">beforeEach</span><span class="p">(</span><span class="k">async</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">periodUtilWeek</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">PeriodUtilWeek</span><span class="p">.</span><span class="k">new</span><span class="p">();</span>
<span class="p">});</span>
<span class="nx">it</span><span class="p">(</span><span class="dl">'</span><span class="s1">Test exception</span><span class="dl">'</span><span class="p">,</span> <span class="k">async</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="c1">// Magic bit here!</span>
<span class="k">await</span> <span class="nx">expectThrow</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">periodUtilWeek</span><span class="p">.</span><span class="nx">getPeriodStartTimestamp</span><span class="p">(</span><span class="k">new</span> <span class="nx">BigNumber</span><span class="p">(</span><span class="dl">'</span><span class="s1">50000</span><span class="dl">'</span><span class="p">)));</span>
<span class="p">});</span>
<span class="p">});</span>
<span class="c1">// Loads more tests</span>
<span class="p">}</span></code></pre></figure>
<h2 id="fun-issue">Fun Issue</h2>
<p>Unexpected token <code class="language-plaintext highlighter-rouge">import</code>! This is because we need some Babel</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="o">/</span><span class="nx">home</span><span class="o">/</span><span class="nx">mmmmmm</span><span class="o">/</span><span class="nx">dev</span><span class="o">/</span><span class="nx">Project</span><span class="o">/</span><span class="nx">solidityWork</span><span class="o">/</span><span class="nx">profit</span><span class="o">/</span><span class="nx">test</span><span class="o">/</span><span class="nx">period_util_week</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">1</span>
<span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">exports</span><span class="p">,</span> <span class="nx">require</span><span class="p">,</span> <span class="nx">module</span><span class="p">,</span> <span class="nx">__filename</span><span class="p">,</span> <span class="nx">__dirname</span><span class="p">)</span> <span class="p">{</span> <span class="k">import</span> <span class="nx">expectThrow</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">./helpers/expectThrow</span><span class="dl">'</span><span class="p">;</span>
<span class="o">^^^^^^</span>
<span class="nx">SyntaxError</span><span class="p">:</span> <span class="nx">Unexpected</span> <span class="nx">token</span> <span class="k">import</span>
<span class="nx">at</span> <span class="nx">createScript</span> <span class="p">(</span><span class="nx">vm</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">80</span><span class="p">:</span><span class="mi">10</span><span class="p">)</span>
<span class="nx">at</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">runInThisContext</span> <span class="p">(</span><span class="nx">vm</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">139</span><span class="p">:</span><span class="mi">10</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">Module</span><span class="p">.</span><span class="nx">_compile</span> <span class="p">(</span><span class="nx">module</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">616</span><span class="p">:</span><span class="mi">28</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">loader</span> <span class="p">(</span><span class="sr">/home/mmmmmm</span><span class="o">/</span><span class="nx">dev</span><span class="o">/</span><span class="nx">Project</span><span class="o">/</span><span class="nx">solidityWork</span><span class="o">/</span><span class="nx">profit</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">babel</span><span class="o">-</span><span class="nx">register</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">node</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">144</span><span class="p">:</span><span class="mi">5</span><span class="p">)</span>
<span class="nx">at</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">require</span><span class="p">.</span><span class="nx">extensions</span><span class="p">.(</span><span class="nx">anonymous</span> <span class="kd">function</span><span class="p">)</span> <span class="p">[</span><span class="k">as</span> <span class="p">.</span><span class="nx">js</span><span class="p">]</span> <span class="p">(</span><span class="sr">/home/mmmmmm</span><span class="o">/</span><span class="nx">dev</span><span class="o">/</span><span class="nx">Project</span><span class="o">/</span><span class="nx">solidityWork</span><span class="o">/</span><span class="nx">profit</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">babel</span><span class="o">-</span><span class="nx">register</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">node</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">154</span><span class="p">:</span><span class="mi">7</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">Module</span><span class="p">.</span><span class="nx">load</span> <span class="p">(</span><span class="nx">module</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">565</span><span class="p">:</span><span class="mi">32</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">tryModuleLoad</span> <span class="p">(</span><span class="nx">module</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">505</span><span class="p">:</span><span class="mi">12</span><span class="p">)</span>
<span class="nx">at</span> <span class="nb">Function</span><span class="p">.</span><span class="nx">Module</span><span class="p">.</span><span class="nx">_load</span> <span class="p">(</span><span class="nx">module</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">497</span><span class="p">:</span><span class="mi">3</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">Module</span><span class="p">.</span><span class="nx">require</span> <span class="p">(</span><span class="nx">module</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">596</span><span class="p">:</span><span class="mi">17</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">require</span> <span class="p">(</span><span class="nx">internal</span><span class="o">/</span><span class="nx">module</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">11</span><span class="p">:</span><span class="mi">18</span><span class="p">)</span>
<span class="nx">at</span> <span class="o">/</span><span class="nx">home</span><span class="o">/</span><span class="nx">mmmmmm</span><span class="o">/</span><span class="p">.</span><span class="nx">node_modules_global</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">truffle</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">mocha</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">mocha</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">231</span><span class="p">:</span><span class="mi">27</span>
<span class="nx">at</span> <span class="nb">Array</span><span class="p">.</span><span class="nx">forEach</span> <span class="p">(</span><span class="o"><</span><span class="nx">anonymous</span><span class="o">></span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">Mocha</span><span class="p">.</span><span class="nx">loadFiles</span> <span class="p">(</span><span class="sr">/home/mmmmmm</span><span class="o">/</span><span class="p">.</span><span class="nx">node_modules_global</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">truffle</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">mocha</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">mocha</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">228</span><span class="p">:</span><span class="mi">14</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">Mocha</span><span class="p">.</span><span class="nx">run</span> <span class="p">(</span><span class="sr">/home/mmmmmm</span><span class="o">/</span><span class="p">.</span><span class="nx">node_modules_global</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">truffle</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">mocha</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">mocha</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">536</span><span class="p">:</span><span class="mi">10</span><span class="p">)</span>
<span class="nx">at</span> <span class="o">/</span><span class="nx">home</span><span class="o">/</span><span class="nx">mmmmmm</span><span class="o">/</span><span class="p">.</span><span class="nx">node_modules_global</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">truffle</span><span class="o">/</span><span class="nx">build</span><span class="o">/</span><span class="nx">webpack</span><span class="p">:</span><span class="o">/~</span><span class="sr">/truffle-core/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">test</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">125</span><span class="p">:</span><span class="mi">1</span>
<span class="nx">at</span> <span class="o"><</span><span class="nx">anonymous</span><span class="o">></span>
<span class="nx">at</span> <span class="nx">process</span><span class="p">.</span><span class="nx">_tickCallback</span> <span class="p">(</span><span class="nx">internal</span><span class="o">/</span><span class="nx">process</span><span class="o">/</span><span class="nx">next_tick</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">188</span><span class="p">:</span><span class="mi">7</span><span class="p">)</span></code></pre></figure>
<p>To fix this add the following dependencies by editing package.json and adding under “devDependencies” the following</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="s2">"babel-polyfill"</span>: <span class="s2">"^6.23.0"</span>,
<span class="s2">"babel-preset-es2015"</span>: <span class="s2">"^6.18.0"</span>,
<span class="s2">"babel-preset-stage-2"</span>: <span class="s2">"^6.18.0"</span>,
<span class="s2">"babel-preset-stage-3"</span>: <span class="s2">"^6.17.0"</span>,</code></pre></figure>
<p>Running npm install in the project directory to install the new packages</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">npm <span class="nb">install</span></code></pre></figure>
<p>Create a new file in the project directory call <code class="language-plaintext highlighter-rouge">.babelrc</code> and put the following in there</p>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="nl">"presets"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"es2015"</span><span class="p">,</span><span class="w"> </span><span class="s2">"stage-2"</span><span class="p">,</span><span class="w"> </span><span class="s2">"stage-3"</span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<p>Now when you run the <code class="language-plaintext highlighter-rouge">truffle test</code> all should work again without a error</p>
<h4 id="update-2018-06-11">Update (2018-06-11)</h4>
<p>Code coverage will stop working with same issue <code class="language-plaintext highlighter-rouge">SyntaxError: Unexpected token import</code>. To fix this add a network coverage to the truffle.js, see below example:</p>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="err">require('babel-register');</span><span class="w">
</span><span class="err">require('babel-polyfill');</span><span class="w">
</span><span class="err">module.exports</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">//</span><span class="w"> </span><span class="err">See</span><span class="w"> </span><span class="err"><http://truffleframework.com/docs/advanced/configuration></span><span class="w">
</span><span class="err">//</span><span class="w"> </span><span class="err">to</span><span class="w"> </span><span class="err">customize</span><span class="w"> </span><span class="err">your</span><span class="w"> </span><span class="err">Truffle</span><span class="w"> </span><span class="err">configuration!</span><span class="w">
</span><span class="err">networks:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">mainnet:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">host:</span><span class="w"> </span><span class="err">'localhost'</span><span class="p">,</span><span class="w">
</span><span class="err">port:</span><span class="w"> </span><span class="mi">8545</span><span class="p">,</span><span class="w">
</span><span class="err">network_id:</span><span class="w"> </span><span class="err">'</span><span class="mi">1</span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="err">Match</span><span class="w"> </span><span class="err">any</span><span class="w"> </span><span class="err">network</span><span class="w"> </span><span class="err">id</span><span class="w">
</span><span class="err">gas:</span><span class="w"> </span><span class="mi">3500000</span><span class="p">,</span><span class="w">
</span><span class="err">gasPrice:</span><span class="w"> </span><span class="mi">10000000000</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="err">development:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">host:</span><span class="w"> </span><span class="s2">"localhost"</span><span class="p">,</span><span class="w">
</span><span class="err">port:</span><span class="w"> </span><span class="mi">7545</span><span class="p">,</span><span class="w">
</span><span class="err">network_id:</span><span class="w"> </span><span class="s2">"*"</span><span class="p">,</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="err">Match</span><span class="w"> </span><span class="err">any</span><span class="w"> </span><span class="err">network</span><span class="w"> </span><span class="err">id</span><span class="w">
</span><span class="err">gas:</span><span class="w"> </span><span class="mi">4500000</span><span class="p">,</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="err">coverage:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">host:</span><span class="w"> </span><span class="s2">"localhost"</span><span class="p">,</span><span class="w">
</span><span class="err">port:</span><span class="w"> </span><span class="mi">7545</span><span class="p">,</span><span class="w">
</span><span class="err">network_id:</span><span class="w"> </span><span class="s2">"*"</span><span class="p">,</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="err">Match</span><span class="w"> </span><span class="err">any</span><span class="w"> </span><span class="err">network</span><span class="w"> </span><span class="err">id</span><span class="w">
</span><span class="err">gas:</span><span class="w"> </span><span class="mi">4500000</span><span class="p">,</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="err">ropsten</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">host:</span><span class="w"> </span><span class="s2">"127.0.0.1"</span><span class="p">,</span><span class="w">
</span><span class="err">port:</span><span class="w"> </span><span class="mi">8545</span><span class="p">,</span><span class="w">
</span><span class="err">network_id:</span><span class="w"> </span><span class="s2">"3"</span><span class="p">,</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="err">Match</span><span class="w"> </span><span class="err">any</span><span class="w"> </span><span class="err">network</span><span class="w"> </span><span class="err">id</span><span class="w">
</span><span class="err">gas:</span><span class="w"> </span><span class="mi">4500000</span><span class="p">,</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="err">dependencies:</span><span class="w"> </span><span class="p">{},</span><span class="w">
</span><span class="err">solc:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">optimizer:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">enabled:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
</span><span class="err">runs:</span><span class="w"> </span><span class="mi">200</span><span class="p">,</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">}</span><span class="err">;</span></code></pre></figure>This tutorial will show you how to deploy a solidity contract to Ropsten (Test Net).Truffle Expected Throw Test2018-06-08T00:00:00+00:002018-06-08T00:00:00+00:00https://www.zcode.dev/2018/06/08/truffle-expected-throw-test<p>When creating test cases to test your solidity code you will need to test conditions that causes throws. This will show you how to write those tests in javascript.</p>
<p>Make use of the <a href="https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/test/helpers/expectThrow.js">OpenZeppelin expectThrow script</a></p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="k">export</span> <span class="k">default</span> <span class="k">async</span> <span class="nx">promise</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">try</span> <span class="p">{</span>
<span class="k">await</span> <span class="nx">promise</span><span class="p">;</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// TODO: Check jump destination to destinguish between a throw</span>
<span class="c1">// and an actual invalid jump.</span>
<span class="kd">const</span> <span class="nx">invalidOpcode</span> <span class="o">=</span> <span class="nx">error</span><span class="p">.</span><span class="nx">message</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="dl">'</span><span class="s1">invalid opcode</span><span class="dl">'</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">;</span>
<span class="c1">// TODO: When we contract A calls contract B, and B throws, instead</span>
<span class="c1">// of an 'invalid jump', we get an 'out of gas' error. How do</span>
<span class="c1">// we distinguish this from an actual out of gas event? (The</span>
<span class="c1">// ganache log actually show an 'invalid jump' event.)</span>
<span class="kd">const</span> <span class="nx">outOfGas</span> <span class="o">=</span> <span class="nx">error</span><span class="p">.</span><span class="nx">message</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="dl">'</span><span class="s1">out of gas</span><span class="dl">'</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">revert</span> <span class="o">=</span> <span class="nx">error</span><span class="p">.</span><span class="nx">message</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="dl">'</span><span class="s1">revert</span><span class="dl">'</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">assert</span><span class="p">(</span>
<span class="nx">invalidOpcode</span> <span class="o">||</span> <span class="nx">outOfGas</span> <span class="o">||</span> <span class="nx">revert</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">Expected throw, got </span><span class="se">\'</span><span class="dl">'</span> <span class="o">+</span> <span class="nx">error</span> <span class="o">+</span> <span class="dl">'</span><span class="se">\'</span><span class="s1"> instead</span><span class="dl">'</span><span class="p">,</span>
<span class="p">);</span>
<span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx">assert</span><span class="p">.</span><span class="nx">fail</span><span class="p">(</span><span class="dl">'</span><span class="s1">Expected throw not received</span><span class="dl">'</span><span class="p">);</span>
<span class="p">};</span></code></pre></figure>
<p>In my test I have added that code to file in my test folder /helpers/expectThrow.js and have used as follow. Here the function getPeriodStartTimestamp is expected to throw when the value is 50000 or larger.</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="c1">// Import the helper script</span>
<span class="k">import</span> <span class="nx">expectThrow</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">./helpers/expectThrow</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">PeriodUtilWeek</span> <span class="o">=</span> <span class="nx">artifacts</span><span class="p">.</span><span class="nx">require</span><span class="p">(</span><span class="dl">"</span><span class="s2">./PeriodUtilWeek.sol</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">BigNumber</span> <span class="o">=</span> <span class="nx">web3</span><span class="p">.</span><span class="nx">BigNumber</span><span class="p">;</span>
<span class="nx">contract</span><span class="p">(</span><span class="dl">'</span><span class="s1">PeriodUtilWeek</span><span class="dl">'</span><span class="p">,</span><span class="kd">function</span><span class="p">(</span><span class="nx">accounts</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// Other tests</span>
<span class="nx">describe</span><span class="p">(</span><span class="dl">'</span><span class="s1">Test getPeriodStartTimestamp (Week)</span><span class="dl">'</span><span class="p">,</span> <span class="k">async</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">beforeEach</span><span class="p">(</span><span class="k">async</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">periodUtilWeek</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">PeriodUtilWeek</span><span class="p">.</span><span class="k">new</span><span class="p">();</span>
<span class="p">});</span>
<span class="nx">it</span><span class="p">(</span><span class="dl">'</span><span class="s1">Test exception</span><span class="dl">'</span><span class="p">,</span> <span class="k">async</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="c1">// Magic bit here!</span>
<span class="k">await</span> <span class="nx">expectThrow</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">periodUtilWeek</span><span class="p">.</span><span class="nx">getPeriodStartTimestamp</span><span class="p">(</span><span class="k">new</span> <span class="nx">BigNumber</span><span class="p">(</span><span class="dl">'</span><span class="s1">50000</span><span class="dl">'</span><span class="p">)));</span>
<span class="p">});</span>
<span class="p">});</span>
<span class="c1">// Loads more tests</span>
<span class="p">}</span></code></pre></figure>
<h2 id="fun-issue">Fun Issue</h2>
<p>Unexpected token <code class="language-plaintext highlighter-rouge">import</code>! This is because we need some Babel</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="o">/</span><span class="nx">home</span><span class="o">/</span><span class="nx">mmmmmm</span><span class="o">/</span><span class="nx">dev</span><span class="o">/</span><span class="nx">Project</span><span class="o">/</span><span class="nx">solidityWork</span><span class="o">/</span><span class="nx">profit</span><span class="o">/</span><span class="nx">test</span><span class="o">/</span><span class="nx">period_util_week</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">1</span>
<span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">exports</span><span class="p">,</span> <span class="nx">require</span><span class="p">,</span> <span class="nx">module</span><span class="p">,</span> <span class="nx">__filename</span><span class="p">,</span> <span class="nx">__dirname</span><span class="p">)</span> <span class="p">{</span> <span class="k">import</span> <span class="nx">expectThrow</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">./helpers/expectThrow</span><span class="dl">'</span><span class="p">;</span>
<span class="o">^^^^^^</span>
<span class="nx">SyntaxError</span><span class="p">:</span> <span class="nx">Unexpected</span> <span class="nx">token</span> <span class="k">import</span>
<span class="nx">at</span> <span class="nx">createScript</span> <span class="p">(</span><span class="nx">vm</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">80</span><span class="p">:</span><span class="mi">10</span><span class="p">)</span>
<span class="nx">at</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">runInThisContext</span> <span class="p">(</span><span class="nx">vm</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">139</span><span class="p">:</span><span class="mi">10</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">Module</span><span class="p">.</span><span class="nx">_compile</span> <span class="p">(</span><span class="nx">module</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">616</span><span class="p">:</span><span class="mi">28</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">loader</span> <span class="p">(</span><span class="sr">/home/mmmmmm</span><span class="o">/</span><span class="nx">dev</span><span class="o">/</span><span class="nx">Project</span><span class="o">/</span><span class="nx">solidityWork</span><span class="o">/</span><span class="nx">profit</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">babel</span><span class="o">-</span><span class="nx">register</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">node</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">144</span><span class="p">:</span><span class="mi">5</span><span class="p">)</span>
<span class="nx">at</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">require</span><span class="p">.</span><span class="nx">extensions</span><span class="p">.(</span><span class="nx">anonymous</span> <span class="kd">function</span><span class="p">)</span> <span class="p">[</span><span class="k">as</span> <span class="p">.</span><span class="nx">js</span><span class="p">]</span> <span class="p">(</span><span class="sr">/home/mmmmmm</span><span class="o">/</span><span class="nx">dev</span><span class="o">/</span><span class="nx">Project</span><span class="o">/</span><span class="nx">solidityWork</span><span class="o">/</span><span class="nx">profit</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">babel</span><span class="o">-</span><span class="nx">register</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">node</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">154</span><span class="p">:</span><span class="mi">7</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">Module</span><span class="p">.</span><span class="nx">load</span> <span class="p">(</span><span class="nx">module</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">565</span><span class="p">:</span><span class="mi">32</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">tryModuleLoad</span> <span class="p">(</span><span class="nx">module</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">505</span><span class="p">:</span><span class="mi">12</span><span class="p">)</span>
<span class="nx">at</span> <span class="nb">Function</span><span class="p">.</span><span class="nx">Module</span><span class="p">.</span><span class="nx">_load</span> <span class="p">(</span><span class="nx">module</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">497</span><span class="p">:</span><span class="mi">3</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">Module</span><span class="p">.</span><span class="nx">require</span> <span class="p">(</span><span class="nx">module</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">596</span><span class="p">:</span><span class="mi">17</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">require</span> <span class="p">(</span><span class="nx">internal</span><span class="o">/</span><span class="nx">module</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">11</span><span class="p">:</span><span class="mi">18</span><span class="p">)</span>
<span class="nx">at</span> <span class="o">/</span><span class="nx">home</span><span class="o">/</span><span class="nx">mmmmmm</span><span class="o">/</span><span class="p">.</span><span class="nx">node_modules_global</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">truffle</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">mocha</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">mocha</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">231</span><span class="p">:</span><span class="mi">27</span>
<span class="nx">at</span> <span class="nb">Array</span><span class="p">.</span><span class="nx">forEach</span> <span class="p">(</span><span class="o"><</span><span class="nx">anonymous</span><span class="o">></span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">Mocha</span><span class="p">.</span><span class="nx">loadFiles</span> <span class="p">(</span><span class="sr">/home/mmmmmm</span><span class="o">/</span><span class="p">.</span><span class="nx">node_modules_global</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">truffle</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">mocha</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">mocha</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">228</span><span class="p">:</span><span class="mi">14</span><span class="p">)</span>
<span class="nx">at</span> <span class="nx">Mocha</span><span class="p">.</span><span class="nx">run</span> <span class="p">(</span><span class="sr">/home/mmmmmm</span><span class="o">/</span><span class="p">.</span><span class="nx">node_modules_global</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">truffle</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">mocha</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">mocha</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">536</span><span class="p">:</span><span class="mi">10</span><span class="p">)</span>
<span class="nx">at</span> <span class="o">/</span><span class="nx">home</span><span class="o">/</span><span class="nx">mmmmmm</span><span class="o">/</span><span class="p">.</span><span class="nx">node_modules_global</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">truffle</span><span class="o">/</span><span class="nx">build</span><span class="o">/</span><span class="nx">webpack</span><span class="p">:</span><span class="o">/~</span><span class="sr">/truffle-core/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">test</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">125</span><span class="p">:</span><span class="mi">1</span>
<span class="nx">at</span> <span class="o"><</span><span class="nx">anonymous</span><span class="o">></span>
<span class="nx">at</span> <span class="nx">process</span><span class="p">.</span><span class="nx">_tickCallback</span> <span class="p">(</span><span class="nx">internal</span><span class="o">/</span><span class="nx">process</span><span class="o">/</span><span class="nx">next_tick</span><span class="p">.</span><span class="nx">js</span><span class="p">:</span><span class="mi">188</span><span class="p">:</span><span class="mi">7</span><span class="p">)</span></code></pre></figure>
<p>To fix this add the following dependencies by editing package.json and adding under “devDependencies” the following</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="s2">"babel-polyfill"</span>: <span class="s2">"^6.23.0"</span>,
<span class="s2">"babel-preset-es2015"</span>: <span class="s2">"^6.18.0"</span>,
<span class="s2">"babel-preset-stage-2"</span>: <span class="s2">"^6.18.0"</span>,
<span class="s2">"babel-preset-stage-3"</span>: <span class="s2">"^6.17.0"</span>,</code></pre></figure>
<p>Running npm install in the project directory to install the new packages</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">npm <span class="nb">install</span></code></pre></figure>
<p>Create a new file in the project directory call <code class="language-plaintext highlighter-rouge">.babelrc</code> and put the following in there</p>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="nl">"presets"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"es2015"</span><span class="p">,</span><span class="w"> </span><span class="s2">"stage-2"</span><span class="p">,</span><span class="w"> </span><span class="s2">"stage-3"</span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<p>Now when you run the <code class="language-plaintext highlighter-rouge">truffle test</code> all should work again without a error</p>
<h4 id="update-2018-06-11">Update (2018-06-11)</h4>
<p>Code coverage will stop working with same issue <code class="language-plaintext highlighter-rouge">SyntaxError: Unexpected token import</code>. To fix this add a network coverage to the truffle.js, see below example:</p>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="err">require('babel-register');</span><span class="w">
</span><span class="err">require('babel-polyfill');</span><span class="w">
</span><span class="err">module.exports</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">//</span><span class="w"> </span><span class="err">See</span><span class="w"> </span><span class="err"><http://truffleframework.com/docs/advanced/configuration></span><span class="w">
</span><span class="err">//</span><span class="w"> </span><span class="err">to</span><span class="w"> </span><span class="err">customize</span><span class="w"> </span><span class="err">your</span><span class="w"> </span><span class="err">Truffle</span><span class="w"> </span><span class="err">configuration!</span><span class="w">
</span><span class="err">networks:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">mainnet:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">host:</span><span class="w"> </span><span class="err">'localhost'</span><span class="p">,</span><span class="w">
</span><span class="err">port:</span><span class="w"> </span><span class="mi">8545</span><span class="p">,</span><span class="w">
</span><span class="err">network_id:</span><span class="w"> </span><span class="err">'</span><span class="mi">1</span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="err">Match</span><span class="w"> </span><span class="err">any</span><span class="w"> </span><span class="err">network</span><span class="w"> </span><span class="err">id</span><span class="w">
</span><span class="err">gas:</span><span class="w"> </span><span class="mi">3500000</span><span class="p">,</span><span class="w">
</span><span class="err">gasPrice:</span><span class="w"> </span><span class="mi">10000000000</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="err">development:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">host:</span><span class="w"> </span><span class="s2">"localhost"</span><span class="p">,</span><span class="w">
</span><span class="err">port:</span><span class="w"> </span><span class="mi">7545</span><span class="p">,</span><span class="w">
</span><span class="err">network_id:</span><span class="w"> </span><span class="s2">"*"</span><span class="p">,</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="err">Match</span><span class="w"> </span><span class="err">any</span><span class="w"> </span><span class="err">network</span><span class="w"> </span><span class="err">id</span><span class="w">
</span><span class="err">gas:</span><span class="w"> </span><span class="mi">4500000</span><span class="p">,</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="err">coverage:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">host:</span><span class="w"> </span><span class="s2">"localhost"</span><span class="p">,</span><span class="w">
</span><span class="err">port:</span><span class="w"> </span><span class="mi">7545</span><span class="p">,</span><span class="w">
</span><span class="err">network_id:</span><span class="w"> </span><span class="s2">"*"</span><span class="p">,</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="err">Match</span><span class="w"> </span><span class="err">any</span><span class="w"> </span><span class="err">network</span><span class="w"> </span><span class="err">id</span><span class="w">
</span><span class="err">gas:</span><span class="w"> </span><span class="mi">4500000</span><span class="p">,</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="err">ropsten</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">host:</span><span class="w"> </span><span class="s2">"127.0.0.1"</span><span class="p">,</span><span class="w">
</span><span class="err">port:</span><span class="w"> </span><span class="mi">8545</span><span class="p">,</span><span class="w">
</span><span class="err">network_id:</span><span class="w"> </span><span class="s2">"3"</span><span class="p">,</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="err">Match</span><span class="w"> </span><span class="err">any</span><span class="w"> </span><span class="err">network</span><span class="w"> </span><span class="err">id</span><span class="w">
</span><span class="err">gas:</span><span class="w"> </span><span class="mi">4500000</span><span class="p">,</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="err">dependencies:</span><span class="w"> </span><span class="p">{},</span><span class="w">
</span><span class="err">solc:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">optimizer:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">enabled:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
</span><span class="err">runs:</span><span class="w"> </span><span class="mi">200</span><span class="p">,</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">}</span><span class="err">;</span></code></pre></figure>When creating test cases to test your solidity code you will need to test conditions that causes throws. This will show you how to write those tests in javascript.Eclipse Run Swarm2018-06-01T00:00:00+00:002018-06-01T00:00:00+00:00https://www.zcode.dev/2018/06/01/vaadin-swarm<p>This will just quickly show you how to run a Wildfly Swarm application in Eclipse and also allow you to easily run the debugger.</p>
<ul>
<li>Open the Run Configuration.</li>
<li>Set the project to the Swarm project.</li>
<li>Set the Main class as <code class="language-plaintext highlighter-rouge">org.wildfly.swarm.Swarm</code></li>
<li>Run!</li>
</ul>
<p><img src="/img/posts/2018-06-01-vaadin-swarm/EclipseRunSwarm.png" alt="center-aligned-image" class="align-center" /></p>This will just quickly show you how to run a Wildfly Swarm application in Eclipse and also allow you to easily run the debugger.Solidity Truffle Quickstart2018-05-24T00:00:00+00:002018-05-24T00:00:00+00:00https://www.zcode.dev/2018/05/24/solidity-truffel-quickstart<p>This quick and dirty tutorial will show you how to create Ethereum Smart Contract project using truffle framework.</p>
<h2 id="installation">Installation</h2>
<p>Installing node and npm, here is a <a href="https://www.sitepoint.com/beginners-guide-node-package-manager/">great tutorial</a> but most of you should already have this setup</p>
<p>Install truffle framework</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">npm <span class="nb">install</span> <span class="nt">-g</span> truffle</code></pre></figure>
<h2 id="creating-the-project">Creating the project</h2>
<p>Create a folder to be used for the project files and and open terminal inside.</p>
<p>Initialize Truffle Framework - Creates the basic project layout</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">truffle init</code></pre></figure>
<p>Initialize npm</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">npm init <span class="nt">-y</span></code></pre></figure>
<p>Creating a contract in the <em>contracts</em> folder</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">truffle create contract <ArtifactName></code></pre></figure>
<p>Creating a contract test file in the <em>tests</em> folder</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">truffle create <span class="nb">test</span> <ArtifactName></code></pre></figure>
<h2 id="usefull-pacakges">Usefull Pacakges</h2>
<p>All these are optional but usefull for me</p>
<h4 id="openzeppelin">OpenZeppelin</h4>
<p>OpenZeppelin is a great library of ethereum smart contracts</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">npm <span class="nb">install</span> <span class="nt">-E</span> openzeppelin-solidity</code></pre></figure>
<h4 id="truffle-flattener">Truffle Flattener</h4>
<p>truffle-flattener is a tool to create single contract without any imports. This is usefull for when you sending your contract for audit or you want to deploy.</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">npm <span class="nb">install</span> <span class="nt">-g</span> truffle-flattener</code></pre></figure>
<p>To run</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">truffle-flattener <solidity-files> <span class="o">></span> <output-file></code></pre></figure>
<h4 id="solidity-coverage">Solidity-Coverage</h4>
<p>Solidity-Coverage is used to test code coverage of test cases</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">npm <span class="nb">install</span> <span class="nt">--save-dev</span> solidity-coverage</code></pre></figure>
<p>Configuration is done via a file <em>.solcover.js</em> in the root of the project.</p>
<ul>
<li>port - Port to run testrpc on / have truffle connect to</li>
<li>copyNodeModules - Copies specific node_modules packages into the coverage environment. If you using OpenZeppelin this is going to be needed.</li>
<li>skipFiles - Contracts to be skipped</li>
<li>norpc - Prevent solidity-coverage from launching its own testrpc</li>
</ul>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span>
<span class="na">port</span><span class="p">:</span> <span class="mi">8555</span><span class="p">,</span>
<span class="na">copyPackages</span><span class="p">:</span> <span class="p">[</span><span class="dl">'</span><span class="s1">openzeppelin-solidity</span><span class="dl">'</span><span class="p">],</span>
<span class="na">skipFiles</span><span class="p">:</span> <span class="p">[</span><span class="dl">'</span><span class="s1">Migrations.sol</span><span class="dl">'</span><span class="p">],</span>
<span class="na">norpc</span><span class="p">:</span> <span class="kc">true</span>
<span class="p">}</span></code></pre></figure>
<p>To run execute</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">./node_modules/.bin/solidity-coverage</code></pre></figure>
<h2 id="sources">Sources</h2>
<ul>
<li><a href="https://www.sitepoint.com/beginners-guide-node-package-manager/">npm installation tutorial</a></li>
<li><a href="https://truffleframework.com/docs/getting_started/installation">Truffle Documentation</a></li>
<li><a href="https://github.com/OpenZeppelin/openzeppelin-solidity">OpenZeppelin</a></li>
<li><a href="https://github.com/alcuadrado/truffle-flattener">Truffle-Flattener</a></li>
<li><a href="https://github.com/sc-forks/solidity-coverage">Solidity-Coverage</a></li>
</ul>This quick and dirty tutorial will show you how to create Ethereum Smart Contract project using truffle framework.Email alerts on login2018-04-26T00:00:00+00:002018-04-26T00:00:00+00:00https://www.zcode.dev/2018/04/26/email-alert-on-login<p>This quick tutorial will show you how to get email alerts when any user logs into your Linux box.</p>
<h2 id="sending-emails-from-command-line">Sending emails from command line</h2>
<p>This will allow you to send emails from command line.</p>
<p>Install ssmtp</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">sudo </span>apt-get <span class="nb">install </span>ssmtp mailutils</code></pre></figure>
<p>Edit the config file to set your usr/pwd/server/etc</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">sudo </span>nano /etc/ssmtp/ssmtp.conf</code></pre></figure>
<p>Example for how gmail setup would be</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">root</span><span class="o">=</span>username@gmail.com
<span class="nv">mailhub</span><span class="o">=</span>smtp.gmail.com:465
<span class="nv">rewriteDomain</span><span class="o">=</span>gmail.com
<span class="nv">AuthUser</span><span class="o">=</span>username
<span class="nv">AuthPass</span><span class="o">=</span>password
<span class="nv">FromLineOverride</span><span class="o">=</span>YES
<span class="nv">UseTLS</span><span class="o">=</span>YES</code></pre></figure>
<p>Test that everythings is working. This should send email to the provided email and a body of test</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">mail <span class="nt">-s</span> <span class="s2">"Subject here"</span> youremailhere@gmail.com <span class="o"><<<</span> <span class="nb">test</span></code></pre></figure>
<h2 id="setup-the-auto-send">Setup the auto send</h2>
<p>There are a few places you can add the command below to send a mail on user login. I just use /etc/profile. If you have better location please leave comment.</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">sudo </span>nano /etc/profile</code></pre></figure>
<p>Add the following to bottom of file</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="k">if</span> <span class="o">[</span> <span class="nt">-n</span> <span class="s2">"</span><span class="nv">$SSH_CLIENT</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
</span><span class="nv">TEXT</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">date</span><span class="si">)</span><span class="s2">: ssh login to </span><span class="k">${</span><span class="nv">USER</span><span class="k">}</span><span class="s2">@</span><span class="si">$(</span><span class="nb">hostname</span> <span class="nt">-f</span><span class="si">)</span><span class="s2">"</span>
<span class="nv">TEXT</span><span class="o">=</span><span class="s2">"</span><span class="nv">$TEXT</span><span class="s2"> from </span><span class="si">$(</span><span class="nb">echo</span> <span class="nv">$SSH_CLIENT</span>|awk <span class="s1">'{print $1}'</span><span class="si">)</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="nv">$TEXT</span>|mail <span class="nt">-s</span> <span class="s2">"SSH login to </span><span class="si">$(</span><span class="nb">hostname</span> <span class="nt">-f</span><span class="si">)</span><span class="s2">"</span> you@your.domain
<span class="k">fi</span></code></pre></figure>
<h2 id="bonus">Bonus</h2>
<p>If you have crontab jobs they will now be sending emails. Add the following line to the crontab</p>
<p>Edit crontab</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">crontab <span class="nt">-e</span></code></pre></figure>
<p>Add to the top of the file</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">MAILTO</span><span class="o">=</span>youremailhere@gmail.com</code></pre></figure>This quick tutorial will show you how to get email alerts when any user logs into your Linux box.Singleton with arguments2016-08-18T00:00:00+00:002016-08-18T00:00:00+00:00https://www.zcode.dev/2016/08/18/singleton-with-constructor-argument<p>Had a very unusual requirement where I needed to share singleton between projects that requires initialization arguments. These arguments are different based on what server it is started. In applications using CDI this was very easy but not all where using CDI and a lot of the projects where not under my control they where simply using the lib. Thread safty was also a concern and I wanted to avoid using synchronized. Here is the solution I came up with.</p>
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">package</span> <span class="nn">com.test</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.function.Supplier</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">InitOnce</span> <span class="o">{</span>
<span class="cm">/**
* Marked as final to prevent JIT reordering
*/</span>
<span class="kd">private</span> <span class="kd">final</span> <span class="nc">Supplier</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">theArgs</span><span class="o">;</span>
<span class="kd">private</span> <span class="nf">InitOnce</span><span class="o">(</span><span class="nc">Supplier</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">supplier</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">();</span>
<span class="k">this</span><span class="o">.</span><span class="na">theArgs</span> <span class="o">=</span> <span class="n">supplier</span><span class="o">;</span>
<span class="o">}</span>
<span class="cm">/**
* Uses the arguments to do something
*
* @return
*/</span>
<span class="kd">public</span> <span class="nc">String</span> <span class="nf">doSomething</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="s">"Something : "</span> <span class="o">+</span> <span class="n">theArgs</span><span class="o">.</span><span class="na">get</span><span class="o">();</span>
<span class="o">}</span>
<span class="cm">/**
* Initializes all the things
*
* @param someArgs
*/</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kd">synchronized</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="kd">final</span> <span class="nc">Supplier</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">someArgs</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">class</span> <span class="nc">InitOnceFactory</span> <span class="kd">implements</span> <span class="nc">Supplier</span><span class="o"><</span><span class="nc">InitOnce</span><span class="o">></span> <span class="o">{</span>
<span class="kd">private</span> <span class="kd">final</span> <span class="nc">InitOnce</span> <span class="n">initOnceInstance</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">InitOnce</span><span class="o">(</span><span class="n">someArgs</span><span class="o">);</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="nc">InitOnce</span> <span class="nf">get</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">initOnceInstance</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">(!</span><span class="nc">InitOnceFactory</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">isInstance</span><span class="o">(</span><span class="n">instance</span><span class="o">))</span> <span class="o">{</span>
<span class="n">instance</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">InitOnceFactory</span><span class="o">();</span>
<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nf">IllegalStateException</span><span class="o">(</span><span class="s">"Already Initialized"</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="nc">Supplier</span><span class="o"><</span><span class="nc">InitOnce</span><span class="o">></span> <span class="n">instance</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">InitOnceHolder</span><span class="o">();</span>
<span class="cm">/**
* Temp Placeholder supplier
*
*/</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kd">class</span> <span class="nc">InitOnceHolder</span> <span class="kd">implements</span> <span class="nc">Supplier</span><span class="o"><</span><span class="nc">InitOnce</span><span class="o">></span> <span class="o">{</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kd">synchronized</span> <span class="nc">InitOnce</span> <span class="nf">get</span><span class="o">()</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="nc">InitOnceHolder</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">isInstance</span><span class="o">(</span><span class="n">instance</span><span class="o">))</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nf">IllegalStateException</span><span class="o">(</span><span class="s">"Not Initialized"</span><span class="o">);</span>
<span class="k">return</span> <span class="n">instance</span><span class="o">.</span><span class="na">get</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="cm">/**
* Returns the instance
*
* @return
*/</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="nc">InitOnce</span> <span class="nf">getInstance</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">instance</span><span class="o">.</span><span class="na">get</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span></code></pre></figure>
<p>I know having a init function and not using a Factory is a bit messy but it works. Just remember to mark the arguments as final to prevent other threads from reading stale data in the begining. Synchronized blocks is only called on initialized and on the first getInstance() calls until the “instance” vairable is set and visible by all threads. After that is is just like normal Singleton.</p>
<p>To Use</p>
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">InitOnce</span><span class="o">.</span><span class="na">init</span><span class="o">(()</span> <span class="o">-></span> <span class="s">"GO COWS!!!"</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="nc">InitOnce</span><span class="o">.</span><span class="na">getInstance</span><span class="o">().</span><span class="na">doSomething</span><span class="o">());</span></code></pre></figure>Had a very unusual requirement where I needed to share singleton between projects that requires initialization arguments. These arguments are different based on what server it is started. In applications using CDI this was very easy but not all where using CDI and a lot of the projects where not under my control they where simply using the lib. Thread safty was also a concern and I wanted to avoid using synchronized. Here is the solution I came up with.Into the Future Thread - Part 22016-03-04T00:00:00+00:002016-03-04T00:00:00+00:00https://www.zcode.dev/2016/03/04/into-the-future-thread-part-2<p>Continuing with execution flow of Futures and thread. See <a href="/2016/03/02/into-the-future-thread/">Part 1</a> if you have not. I would like to highlight when future.get() completes in different scenarios. Firstly I know it is not best practice to use Futures in this way but I think it is still important to understand how the internals work.</p>
<p>Firstly I will do a basic Async (Future.thenApplyAsync) example, nothing special here.</p>
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">package</span> <span class="nn">com.test</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.concurrent.CompletableFuture</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.concurrent.ExecutionException</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.concurrent.ExecutorService</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.concurrent.Executors</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.concurrent.ThreadFactory</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.concurrent.atomic.AtomicInteger</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Test21Future</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">Thread</span> <span class="n">th1</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Thread</span><span class="o">(()</span> <span class="o">-></span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">task</span><span class="o">();</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">},</span> <span class="s">"master thread"</span><span class="o">);</span>
<span class="n">th1</span><span class="o">.</span><span class="na">start</span><span class="o">();</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">task</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">InterruptedException</span><span class="o">,</span> <span class="nc">ExecutionException</span> <span class="o">{</span>
<span class="nc">ExecutorService</span> <span class="n">exeService</span> <span class="o">=</span> <span class="nc">Executors</span><span class="o">.</span><span class="na">newFixedThreadPool</span><span class="o">(</span><span class="mi">6</span><span class="o">,</span> <span class="k">new</span> <span class="nc">ThreadFactory</span><span class="o">()</span> <span class="o">{</span>
<span class="kd">final</span> <span class="nc">AtomicInteger</span> <span class="n">counter</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">AtomicInteger</span><span class="o">();</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="nc">Thread</span> <span class="nf">newThread</span><span class="o">(</span><span class="nc">Runnable</span> <span class="n">r</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">r</span><span class="o">,</span> <span class="s">"PoolThread : "</span> <span class="o">+</span> <span class="n">counter</span><span class="o">.</span><span class="na">getAndIncrement</span><span class="o">());</span>
<span class="o">}</span>
<span class="o">});</span>
<span class="nc">CompletableFuture</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">future1</span> <span class="o">=</span> <span class="nc">CompletableFuture</span><span class="o">.</span><span class="na">supplyAsync</span><span class="o">(()</span> <span class="o">-></span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">sleep</span><span class="o">(</span><span class="mi">1000L</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</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="s">"Future 1 Return in Thread ["</span> <span class="o">+</span> <span class="nc">Thread</span><span class="o">.</span><span class="na">currentThread</span><span class="o">().</span><span class="na">getName</span><span class="o">()</span> <span class="o">+</span> <span class="s">"]"</span><span class="o">);</span>
<span class="k">return</span> <span class="s">"A"</span><span class="o">;</span>
<span class="o">},</span> <span class="n">exeService</span><span class="o">);</span>
<span class="nc">CompletableFuture</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">future2</span> <span class="o">=</span> <span class="n">future1</span><span class="o">.</span><span class="na">thenApplyAsync</span><span class="o">(</span><span class="n">a</span> <span class="o">-></span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">sleep</span><span class="o">(</span><span class="mi">2000L</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</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="s">"Future 2 Return in Thread ["</span> <span class="o">+</span> <span class="nc">Thread</span><span class="o">.</span><span class="na">currentThread</span><span class="o">().</span><span class="na">getName</span><span class="o">()</span> <span class="o">+</span> <span class="s">"]"</span><span class="o">);</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="s">"B"</span><span class="o">;</span>
<span class="o">},</span> <span class="n">exeService</span><span class="o">);</span>
<span class="nc">CompletableFuture</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">future3</span> <span class="o">=</span> <span class="n">future2</span><span class="o">.</span><span class="na">thenApplyAsync</span><span class="o">(</span><span class="n">a</span> <span class="o">-></span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">sleep</span><span class="o">(</span><span class="mi">2000L</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</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="s">"Future 3 Return in Thread ["</span> <span class="o">+</span> <span class="nc">Thread</span><span class="o">.</span><span class="na">currentThread</span><span class="o">().</span><span class="na">getName</span><span class="o">()</span> <span class="o">+</span> <span class="s">"]"</span><span class="o">);</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="s">"C"</span><span class="o">;</span>
<span class="o">},</span> <span class="n">exeService</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="s">"Starting the wait..."</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="s">"Future 1 Get : "</span> <span class="o">+</span> <span class="n">future1</span><span class="o">.</span><span class="na">get</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="s">"Future 2 Get : "</span> <span class="o">+</span> <span class="n">future2</span><span class="o">.</span><span class="na">get</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="s">"Future 3 Get : "</span> <span class="o">+</span> <span class="n">future3</span><span class="o">.</span><span class="na">get</span><span class="o">());</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">sleep</span><span class="o">(</span><span class="kt">long</span> <span class="n">time</span><span class="o">)</span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="nc">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="n">time</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">InterruptedException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">// TODO Auto-generated catch block</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span></code></pre></figure>
<p>Below is the output for the execution of above.</p>
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">Starting</span> <span class="n">the</span> <span class="n">wait</span><span class="o">...</span>
<span class="nc">Future</span> <span class="mi">1</span> <span class="nc">Return</span> <span class="n">in</span> <span class="nc">Thread</span> <span class="o">[</span><span class="nc">PoolThread</span> <span class="o">:</span> <span class="mi">0</span><span class="o">]</span>
<span class="nc">Future</span> <span class="mi">1</span> <span class="nc">Get</span> <span class="o">:</span> <span class="no">A</span>
<span class="nc">Future</span> <span class="mi">2</span> <span class="nc">Return</span> <span class="n">in</span> <span class="nc">Thread</span> <span class="o">[</span><span class="nc">PoolThread</span> <span class="o">:</span> <span class="mi">1</span><span class="o">]</span>
<span class="nc">Future</span> <span class="mi">2</span> <span class="nc">Get</span> <span class="o">:</span> <span class="no">AB</span>
<span class="nc">Future</span> <span class="mi">3</span> <span class="nc">Return</span> <span class="n">in</span> <span class="nc">Thread</span> <span class="o">[</span><span class="nc">PoolThread</span> <span class="o">:</span> <span class="mi">2</span><span class="o">]</span>
<span class="nc">Future</span> <span class="mi">3</span> <span class="nc">Get</span> <span class="o">:</span> <span class="no">ABC</span></code></pre></figure>
<p>Now as you expected as soon as the Future completes the get() block is removed and the code progresses. Also note how each future executes in a different thread since we use the Async method as discussed in Part 1.</p>
<p>Now things get interesting when you do not use Async (Future.thenApply()). Here is a example.</p>
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">package</span> <span class="nn">com.test</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.concurrent.CompletableFuture</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.concurrent.ExecutionException</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.concurrent.ExecutorService</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.concurrent.Executors</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.concurrent.ThreadFactory</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.concurrent.atomic.AtomicInteger</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Test21Future</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">Thread</span> <span class="n">th1</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Thread</span><span class="o">(()</span> <span class="o">-></span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">task</span><span class="o">();</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">},</span> <span class="s">"master thread"</span><span class="o">);</span>
<span class="n">th1</span><span class="o">.</span><span class="na">start</span><span class="o">();</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">task</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">InterruptedException</span><span class="o">,</span> <span class="nc">ExecutionException</span> <span class="o">{</span>
<span class="nc">ExecutorService</span> <span class="n">exeService</span> <span class="o">=</span> <span class="nc">Executors</span><span class="o">.</span><span class="na">newFixedThreadPool</span><span class="o">(</span><span class="mi">6</span><span class="o">,</span> <span class="k">new</span> <span class="nc">ThreadFactory</span><span class="o">()</span> <span class="o">{</span>
<span class="kd">final</span> <span class="nc">AtomicInteger</span> <span class="n">counter</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">AtomicInteger</span><span class="o">();</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="nc">Thread</span> <span class="nf">newThread</span><span class="o">(</span><span class="nc">Runnable</span> <span class="n">r</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">r</span><span class="o">,</span> <span class="s">"PoolThread : "</span> <span class="o">+</span> <span class="n">counter</span><span class="o">.</span><span class="na">getAndIncrement</span><span class="o">());</span>
<span class="o">}</span>
<span class="o">});</span>
<span class="nc">CompletableFuture</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">future1</span> <span class="o">=</span> <span class="nc">CompletableFuture</span><span class="o">.</span><span class="na">supplyAsync</span><span class="o">(()</span> <span class="o">-></span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">sleep</span><span class="o">(</span><span class="mi">1000L</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</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="s">"Future 1 Return in Thread ["</span> <span class="o">+</span> <span class="nc">Thread</span><span class="o">.</span><span class="na">currentThread</span><span class="o">().</span><span class="na">getName</span><span class="o">()</span> <span class="o">+</span> <span class="s">"]"</span><span class="o">);</span>
<span class="k">return</span> <span class="s">"A"</span><span class="o">;</span>
<span class="o">},</span> <span class="n">exeService</span><span class="o">);</span>
<span class="nc">CompletableFuture</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">future2</span> <span class="o">=</span> <span class="n">future1</span><span class="o">.</span><span class="na">thenApply</span><span class="o">(</span><span class="n">a</span> <span class="o">-></span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">sleep</span><span class="o">(</span><span class="mi">2000L</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</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="s">"Future 2 Return in Thread ["</span> <span class="o">+</span> <span class="nc">Thread</span><span class="o">.</span><span class="na">currentThread</span><span class="o">().</span><span class="na">getName</span><span class="o">()</span> <span class="o">+</span> <span class="s">"]"</span><span class="o">);</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="s">"B"</span><span class="o">;</span>
<span class="o">});</span>
<span class="nc">CompletableFuture</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">future3</span> <span class="o">=</span> <span class="n">future2</span><span class="o">.</span><span class="na">thenApply</span><span class="o">(</span><span class="n">a</span> <span class="o">-></span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">sleep</span><span class="o">(</span><span class="mi">2000L</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</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="s">"Future 3 Return in Thread ["</span> <span class="o">+</span> <span class="nc">Thread</span><span class="o">.</span><span class="na">currentThread</span><span class="o">().</span><span class="na">getName</span><span class="o">()</span> <span class="o">+</span> <span class="s">"]"</span><span class="o">);</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="s">"C"</span><span class="o">;</span>
<span class="o">});</span>
<span class="nc">CompletableFuture</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">future4</span> <span class="o">=</span> <span class="n">future3</span><span class="o">.</span><span class="na">thenApply</span><span class="o">(</span><span class="n">a</span> <span class="o">-></span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">sleep</span><span class="o">(</span><span class="mi">2000L</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</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="s">"Future 4 Return in Thread ["</span> <span class="o">+</span> <span class="nc">Thread</span><span class="o">.</span><span class="na">currentThread</span><span class="o">().</span><span class="na">getName</span><span class="o">()</span> <span class="o">+</span> <span class="s">"]"</span><span class="o">);</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="s">"D"</span><span class="o">;</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="s">"Starting the wait..."</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="s">"Future 1 Get : "</span> <span class="o">+</span> <span class="n">future1</span><span class="o">.</span><span class="na">get</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="s">"Future 2 Get : "</span> <span class="o">+</span> <span class="n">future2</span><span class="o">.</span><span class="na">get</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="s">"Future 3 Get : "</span> <span class="o">+</span> <span class="n">future3</span><span class="o">.</span><span class="na">get</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="s">"Future 4 Get : "</span> <span class="o">+</span> <span class="n">future4</span><span class="o">.</span><span class="na">get</span><span class="o">());</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">sleep</span><span class="o">(</span><span class="kt">long</span> <span class="n">time</span><span class="o">)</span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="nc">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="n">time</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">InterruptedException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">// TODO Auto-generated catch block</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span></code></pre></figure>
<p>Below is the output:</p>
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">Starting</span> <span class="n">the</span> <span class="n">wait</span><span class="o">...</span>
<span class="nc">Future</span> <span class="mi">1</span> <span class="nc">Return</span> <span class="n">in</span> <span class="nc">Thread</span> <span class="o">[</span><span class="nc">PoolThread</span> <span class="o">:</span> <span class="mi">0</span><span class="o">]</span>
<span class="nc">Future</span> <span class="mi">1</span> <span class="nc">Get</span> <span class="o">:</span> <span class="no">A</span>
<span class="nc">Future</span> <span class="mi">2</span> <span class="nc">Return</span> <span class="n">in</span> <span class="nc">Thread</span> <span class="o">[</span><span class="nc">PoolThread</span> <span class="o">:</span> <span class="mi">0</span><span class="o">]</span>
<span class="nc">Future</span> <span class="mi">3</span> <span class="nc">Return</span> <span class="n">in</span> <span class="nc">Thread</span> <span class="o">[</span><span class="nc">PoolThread</span> <span class="o">:</span> <span class="mi">0</span><span class="o">]</span>
<span class="nc">Future</span> <span class="mi">4</span> <span class="nc">Return</span> <span class="n">in</span> <span class="nc">Thread</span> <span class="o">[</span><span class="nc">PoolThread</span> <span class="o">:</span> <span class="mi">0</span><span class="o">]</span>
<span class="nc">Future</span> <span class="mi">2</span> <span class="nc">Get</span> <span class="o">:</span> <span class="no">AB</span>
<span class="nc">Future</span> <span class="mi">3</span> <span class="nc">Get</span> <span class="o">:</span> <span class="no">ABC</span>
<span class="nc">Future</span> <span class="mi">4</span> <span class="nc">Get</span> <span class="o">:</span> <span class="no">ABCD</span></code></pre></figure>
<p>As you can see here Future 2, 3 and 4 block on the get call until the last future (Future 4) completes. Future 1 will unblock on the get as expected since it is a Async call but since Future 2, 3 and 4 is not they will block.</p>
<p>It is a bit of a oddity to note about Futures.</p>Continuing with execution flow of Futures and thread. See Part 1 if you have not. I would like to highlight when future.get() completes in different scenarios. Firstly I know it is not best practice to use Futures in this way but I think it is still important to understand how the internals work.