<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java on Shaaf's blog</title><link>https://shaaf.dev/tags/java/</link><description>Recent content in Java on Shaaf's blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 14 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://shaaf.dev/tags/java/index.xml" rel="self" type="application/rss+xml"/><item><title>Modernizing Legacy Code with Konveyor AI: From EJB to Kubernetes</title><link>https://shaaf.dev/post/2026-04-15-konveyor-ai-for-every-language-and-the-future-of-applications-modernization/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2026-04-15-konveyor-ai-for-every-language-and-the-future-of-applications-modernization/</guid><description>&lt;p>I always enjoy participating in KubeCon. This time it was at the RAI center in Amsterdam. I have been to many conferences and the ones that are the best IMHO are the ones that are very community focused. For example DevNexus for Java, GeeCon for Geeks ;), and obviously KubeCon for everything Kubernetes. And obvsiouly making new friends and connections is a great way of learning from all the cool stuff thats going on. Thats probably enough name dropping for a wednesday ;)&lt;/p></description></item><item><title>Nano Agent, Mega Senses: Adding LSP to the 260-Line Coding Agent</title><link>https://shaaf.dev/post/2026-04-09-nano-agent-mega-senses-adding-lsp-to-the-260-line-coding-agent/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2026-04-09-nano-agent-mega-senses-adding-lsp-to-the-260-line-coding-agent/</guid><description>&lt;p>Learn, learn, and learn more—that’s the name of the game. Coding agents are innovating fast; things are getting bigger and, quite often, bloated. To understand what an agent is actually doing, I’ve found it’s best to go back to the basics. It takes a bit more time, but the expertise you gain along the way sets you up for the long haul.&amp;quot; So here I read &lt;a href="https://xam.dk/blog/nanocode-coding-agent-in-260-lines-of-java/">Max&amp;rsquo;s&lt;/a> post and thought, how about add some more things to this. Fetching ideas&amp;hellip; done.. Lets add LSP support.&lt;/p></description></item><item><title>Using LLMs and MCP to generate static code analysis rules</title><link>https://shaaf.dev/post/2026-03-29-using-llms-and-mcp-to-generate-static-code-analysis-rules/</link><pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2026-03-29-using-llms-and-mcp-to-generate-static-code-analysis-rules/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Scribe&lt;/strong> is a &lt;a href="https://modelcontextprotocol.io/">Model Context Protocol (MCP)&lt;/a> server that exposes a single tool: &lt;strong>&lt;code>executeKantraOperation&lt;/code>&lt;/strong>. That tool turns structured parameters into &lt;strong>YAML rules&lt;/strong> compatible with &lt;a href="https://konveyor.io/">Konveyor&lt;/a> / &lt;a href="https://github.com/konveyor/kantra">Kantra&lt;/a>—the static analysis pipeline used for application migration and modernization. This post describes what Scribe does, how it is wired, and concrete examples you can copy.&lt;/p>&lt;/blockquote>
&lt;p>Static code analyzers are great at what they do. Having the ability to write custom rules is important because it can cover multiple usecases such as, if an organization has their own framework or libraries that do not exist in the public domain. Or to look for patterns or anti-patterns or even best practises such as exceptions, logging etc. It can get quite cumbersome to write these rules and test them. While every conference in the world today buzzes of the word &lt;strong>AI&lt;/strong>, how about we put it to real practise and provide this valuable feature with LLMs. Hence the advent of Scribe MCP server that will write Konveyor Kantra rules for an LLM.&lt;/p></description></item><item><title>Adding Rust Support and Some Major updates to My Neovim Config</title><link>https://shaaf.dev/post/2026-03-09-neovim-rust-update/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2026-03-09-neovim-rust-update/</guid><description>&lt;p>It&amp;rsquo;s been about 8 months since my &lt;a href="https://shaaf.dev/post/2025-07-17-neovim4java/">last update on neovim4j&lt;/a>, and the config has evolved significantly. The name &amp;ldquo;neovim4j&amp;rdquo; is now a bit of a misnomer—while it started as a Java-focused setup, it&amp;rsquo;s grown into a polyglot development environment.&lt;/p>
&lt;h2 id="rust-support-">Rust Support 🦀&lt;/h2>
&lt;p>The biggest addition is comprehensive &lt;strong>Rust support&lt;/strong>. I&amp;rsquo;ve integrated:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>rustaceanvim&lt;/strong> for advanced LSP features powered by rust-analyzer&lt;/li>
&lt;li>&lt;strong>crates.nvim&lt;/strong> for smart Cargo.toml management and dependency completion&lt;/li>
&lt;li>&lt;strong>codelldb&lt;/strong> debugger integration&lt;/li>
&lt;li>&lt;strong>neotest&lt;/strong> for running Rust tests directly in the editor&lt;/li>
&lt;/ul>
&lt;p>The Rust setup mirrors the Java tooling quality—full LSP, debugging, and testing all working seamlessly. Semantic highlighting is disabled in favor of Treesitter for more colorful syntax highlighting.&lt;/p></description></item><item><title>Java+LLMs: A hands-on guide to building LLM Apps in Java</title><link>https://shaaf.dev/post/2026-03-05-handson-guide-to-building-llm-apps-in-java-jakartaee/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2026-03-05-handson-guide-to-building-llm-apps-in-java-jakartaee/</guid><description>&lt;p>I had the pleasure to present about building &lt;a href="https://dev.java/learn/">Java&lt;/a> applications using LLMs together with &lt;a href="https://x.com/bazlur_rahman">Bazlur&lt;/a> at &lt;a href="https://2025.geecon.org/">GeeCon 2025&lt;/a>. The weather was amazing and &lt;a href="https://en.wikipedia.org/wiki/Krak%C3%B3w">Krakow&lt;/a> is a beautiful historical city.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Zm6uhQNki_Q?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video">&lt;/iframe>
 &lt;/div>

&lt;h1 id="key-topics-covered">Key Topics Covered&lt;/h1>
&lt;p>Here are the key topics from the video with direct links to those sections:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3DZm6uhQNki_Q%26t%3D251s">LangChain4j Basics&lt;/a>:&lt;/strong> An introduction to the framework, demonstrating how it abstracts communication with various LLMs like OpenAI and Gemini using builder patterns.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3DZm6uhQNki_Q%26t%3D443s">Prompt Engineering&lt;/a>:&lt;/strong> The speakers explain the difference between &lt;strong>System Prompts&lt;/strong> (defining the AI&amp;rsquo;s behavior/personality) and &lt;strong>User Prompts&lt;/strong> (the specific query).&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3DZm6uhQNki_Q%26t%3D547s">AI Services &amp;amp; Streaming&lt;/a>:&lt;/strong> A look at how to create high-level interfaces for AI interactions, including streaming responses for real-time chat experiences.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3DZm6uhQNki_Q%26t%3D720s">Memory Management&lt;/a>:&lt;/strong> How to provide LLMs with context from previous conversations using providers like &lt;code>MessageWindowChatMemory&lt;/code> and storing history in databases.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3DZm6uhQNki_Q%26t%3D904s">Tools (Function Calling)&lt;/a>:&lt;/strong> A deep dive into how LLMs can trigger Java methods to perform specific tasks, such as fetching web content or compiling Java code.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3DZm6uhQNki_Q%26t%3D1306s">Jakarta EE Project Generator&lt;/a>:&lt;/strong> A demonstration of using an LLM tool to generate a complete Jakarta EE project structure via a chat interface.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3DZm6uhQNki_Q%26t%3D1635s">Retrieval-Augmented Generation (RAG)&lt;/a>:&lt;/strong> Using &lt;strong>PGVector&lt;/strong> and embedding models to store and retrieve private data efficiently.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3DZm6uhQNki_Q%26t%3D1784s">Chunking and Tokenization&lt;/a>:&lt;/strong> The importance of segmenting data so the AI receives the right context without exceeding token limits.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3DZm6uhQNki_Q%26t%3D2387s">Model Context Protocol (MCP)&lt;/a>:&lt;/strong> An introduction to the standard for connecting AI models to external data sources and tools.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3DZm6uhQNki_Q%26t%3D2948s">Q&amp;amp;A Session&lt;/a>:&lt;/strong> Discussions on prompt injection, guardrails, and testing non-deterministic AI outputs.&lt;/li>
&lt;/ul>
&lt;p>Next up we are both busy building a workshop about Langchain4j and its integration with Spring. If you are interested in learning more join us at &lt;a href="https://jnation.pt">JNation.pt&lt;/a>. Bring your laptop the session will be 180 minutes and lots to code about ;)&lt;/p></description></item><item><title>Two Essential Patterns for Building MCP Servers</title><link>https://shaaf.dev/post/2026-01-08-two-essential-patterns-for-buildingm-mcp-servers/</link><pubDate>Thu, 08 Jan 2026 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2026-01-08-two-essential-patterns-for-buildingm-mcp-servers/</guid><description>&lt;p>When building Model Context Protocol (MCP) servers, I learned two critical design patterns the hard way. What started as a straightforward implementation of a Keycloak administration server quickly became unwieldy—until I discovered &lt;strong>Intent Multiplexing&lt;/strong> and the &lt;strong>Command Pattern&lt;/strong>. Together, these patterns transformed a maintenance nightmare into an elegant, extensible architecture.&lt;/p>
&lt;p>This post shares those lessons so you can avoid the same pitfalls.&lt;/p>
&lt;p>Replicate each operation from your API and viola! you have a tool explosion. And that might not seem evident in the first place, but becomes a serious problem. An LLM might not be able to handle that large context, it might even start to halluncinate.&lt;/p></description></item><item><title>Keycloak MCP Server: Manage Identity with Natural Language</title><link>https://shaaf.dev/post/2026-01-02-keycloak-mcp-server/</link><pubDate>Fri, 02 Jan 2026 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2026-01-02-keycloak-mcp-server/</guid><description>&lt;p>There is always a distinct thrill in learning something new and immediately putting it to the test. My journey with Model Context Protocol (MCP) servers began with a basic &amp;lsquo;books API&amp;rsquo; demo, but I quickly wanted to take it a step further and build something with real-world utility. Since I enjoy working with &lt;a href="https://www.keycloak.org/">Keycloak&lt;/a>, I thought: Why not create an MCP server for it?&lt;/p>
&lt;p>The vision was simple: enable developers to just &amp;lsquo;chat&amp;rsquo; with Keycloak. There are so many standard tasks—setting up new users, groups, clients, and browser workflows—that could be streamlined through conversation. For those unfamiliar, Keycloak is an open-source identity and access management solution. I released the &lt;a href="https://dzone.com/articles/keycloak-mcp-server-tools-quarkus">first experimental version this past summer&lt;/a>, and since then, the wave of constructive community feedback has been incredible. That momentum is exactly what gets me excited to keep building.&lt;/p></description></item><item><title>Complete local setup development guide for Konveyor Analyzer-lsp 🚀</title><link>https://shaaf.dev/post/2025-09-08-complete-local-setup-development-guide-for-konveyor-analyzer-lsp/</link><pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2025-09-08-complete-local-setup-development-guide-for-konveyor-analyzer-lsp/</guid><description>&lt;blockquote>
&lt;p>Build, test, and develop Kantra rules locally with full JDT-LS and multi-language provider support. Some content in this post was generated using an LLM.&lt;/p>&lt;/blockquote>
&lt;p>Modernizing large, complex codebases is a significant challenge. Identifying migration blockers, deprecated APIs, and technology-specific patterns requires deep, accurate code analysis. The Konveyor Analyzer LSP is engineered to solve this problem by providing a flexible and powerful static analysis engine. It uniquely leverages the Language Server Protocol (LSP) to tap into rich, IDE-level code intelligence for multiple languages.&lt;/p></description></item><item><title>My first 6 hours with Rust</title><link>https://shaaf.dev/post/my-first-6-hours-with-rust/</link><pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/my-first-6-hours-with-rust/</guid><description>&lt;p>&lt;strong>TLDR&lt;/strong>; I took a day off from work today, although still most of my time I ended up doing my travel expenses. Talk about priorities. I am the one to blame here totally. 😄&lt;/p>
&lt;p>So come around lunch time, thats when all the fluids are ready to do something different. I ended up exploring some basics about Rust. I heard a friend once said, if a prominent person (wonder who that is..) says billions over and over again, somehow people just start believing in billions. Anyways I am totally sold by my youtube feed to explore this a bit. What is this rust thing? And before I go any further, just to let you know I like programming languages and problem solving. I am not hung up on one language. I appreciate them all. Except MS access (oops)&lt;/p></description></item><item><title>Think in Graphs, Not Just Chains: JGraphlet for TaskPipelines</title><link>https://shaaf.dev/post/2025-08-25-think-in-graphs-not-just-chains-jgraphlet-for-taskpipelines/</link><pubDate>Mon, 25 Aug 2025 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2025-08-25-think-in-graphs-not-just-chains-jgraphlet-for-taskpipelines/</guid><description>&lt;p>&lt;strong>JGraphlet&lt;/strong> is a tiny, zero-dependency library for building task pipelines in Java. Its power comes not from a long list of features, but from a small set of core design principles that work together in harmony.&lt;/p>
&lt;p>At the heart of JGraphlet is simplicity, backed by a &lt;strong>Graph&lt;/strong>, Add Tasks to a pipeline and connect them to create your graph.
Each &lt;code>Task&lt;/code> has an input and ouput, A &lt;code>TaskPipeline&lt;/code> builds and executes a pipeline while managing the I/O for each &lt;code>Task&lt;/code>. For example a &lt;code>Map&lt;/code> for Fan-in, a &lt;code>Record&lt;/code> for your own data model etc. A Taskpipeline also has a &lt;code>PipelineContext&lt;/code> to share the data between Tasks, and furthermore Tasks can also be cached, so the computation doenst need to take place again and again.
You can choose how your Task pipeline flow should be, and you can choose whether it should be a &lt;code>SyncTask&lt;/code> or Async. By default all Tasks are Async.&lt;/p></description></item><item><title>Neovim for Java Developers: A Match is made</title><link>https://shaaf.dev/post/2025-07-17-neovim4java/</link><pubDate>Thu, 17 Jul 2025 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2025-07-17-neovim4java/</guid><description>&lt;blockquote>
&lt;p>There are some major changes to my setup. read the latest here: &lt;a href="https://shaaf.dev/post/2026-03-09-neovim-rust-update/">https://shaaf.dev/post/2026-03-09-neovim-rust-update/&lt;/a>&lt;/p>&lt;/blockquote>
&lt;p>Are you a Java developer who is mesmerized by the power and efficiency of Vim? Do you want to try your development experience to the next level? I mean hands-off the mouse style! If so, you&amp;rsquo;re in for a treat! In this post, I am going to dive into the world of &lt;a href="https://neovim.io/">Neovim&lt;/a> and explore how you can transform it into a Java IDE. To be honest its a learning journey. And the more I experience learning it, I feel like I really need to share how cool this thing really is!&lt;/p></description></item><item><title>Static Code analysis tutorial with Konveyor and Kantra part - 1</title><link>https://shaaf.dev/post/2025-07-15-static-code-analysis-for-java-with-konveyor-kantra-cli-1/</link><pubDate>Mon, 14 Jul 2025 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2025-07-15-static-code-analysis-for-java-with-konveyor-kantra-cli-1/</guid><description>&lt;p>Konveyor Kantra CLI is a command-line tool for analyzing and transforming application source code to aid modernization and migration. It performs static code analysis to detect issues. Kantra can also extract metadata, generate deployment assets (e.g., Kubernetes manifests), and runs via containers or natively. It supports multiple languages e.g. Java, Go, .Net and Node.js and integrates with CI/CD pipelines. Kantra is the foundation for automated, LLM-powered app modernization workflows like &lt;em>&lt;a href="https://konveyor.io/components/kai/">Konveyor AI (Kai)&lt;/a>&lt;/em>.&lt;/p></description></item><item><title>A Keycloak example - building my first MCP server Tools with Quarkus</title><link>https://shaaf.dev/post/2025-05-12-keycloak-mcp-server-quarkus/</link><pubDate>Mon, 12 May 2025 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2025-05-12-keycloak-mcp-server-quarkus/</guid><description>&lt;p>Recently I wrote an article about &amp;ldquo;&lt;a href="https://www.infoq.com/news/2025/05/mcp-within-java-ecosystem/">Adoption of the Model Context Protocol Within the Java Ecosystem&lt;/a>&amp;rdquo;. Now it was also time to start experimenting with writing an MCP Server myself (well maybe not the &lt;a href="https://youtu.be/LCzeb61bU9A?si=7mwaSEcaoEWuUB2z&amp;amp;t=5255">first time&lt;/a>).
Certainly I don&amp;rsquo;t want to be left out of all the cool things being demonstrated by the community. The goal for me is to learn, and creating perhaps a more practical example. In this post I am going to choose &lt;a href="https://www.keycloak.org/">Keycloak&lt;/a>, and write an experimental MCP server implementation for keycloak. The post is also to spark interest around this topic. Will it be useful to have an MCP server for Keycloak?&lt;/p></description></item><item><title>TechTalk - Java + LLMs: A hands-on guide to building LLM Apps in Java with Jakarta</title><link>https://shaaf.dev/post/2025-04-23-jakarta-tech-talk-llm-apps-java/</link><pubDate>Wed, 23 Apr 2025 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2025-04-23-jakarta-tech-talk-llm-apps-java/</guid><description>&lt;p>&lt;a href="https://docs.langchain4j.dev/">Langchain4j&lt;/a> is my favorite framework for working with large language models and &lt;a href="https://dev.java/learn/">Java&lt;/a>. In the last couple of weeks, both &lt;a href="https://x.com/bazlur_rahman">Bazlur&lt;/a> and I have presented to multiple user groups and &lt;a href="https://shaaf.dev/conferences/">conferences&lt;/a>. This week, we had the privilege of presenting at the Jakarta Tech Talk, which both of us were looking very much forward to.&lt;/p>
&lt;p>We now have so much demo code on the topic that we cannot present all the variations in one hour. We are still building along as we learn &lt;a href="https://github.com/learnj-ai/llm-jakarta">here&lt;/a>.&lt;/p></description></item><item><title>A Quarkus minio tutorial - Store and retrieve objects from Minio</title><link>https://shaaf.dev/post/2025-04-02-a-quarkus-minio-tutorial-store-and-retrieve-objects-from-minio/</link><pubDate>Fri, 14 Mar 2025 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2025-04-02-a-quarkus-minio-tutorial-store-and-retrieve-objects-from-minio/</guid><description>&lt;p>Consider a web application that needs to store user-generated content, such as images, videos, and documents. Instead of storing them in a file systems or using a database, the web application can use an object store. An object store can handle objects as a single unit, providing metadata about each object and abstracting away from the underlying storage which can be local or distributed. In this blog post I will explain a local setup for minio using docker. I also use Quarkus as the framework of choice for cloud native applications. and I use the minio SDK which is pretty awesome to work with together with Quarkus. Let&amp;rsquo;s do this :)&lt;/p></description></item><item><title>Migrating JavaEE apps using Generative AI and Konveyor AI</title><link>https://shaaf.dev/post/2025-02-22-migrating-javaee-to-quarkus-using-konveyor-ai/</link><pubDate>Sat, 22 Feb 2025 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2025-02-22-migrating-javaee-to-quarkus-using-konveyor-ai/</guid><description>&lt;p>&lt;a href="https://github.com/konveyor/kai">Konveyor AI&lt;/a> is a tool used to migrate Java applications to different Java frameworks, such as from JavaEE to &lt;a href="https://quarkus.io/">Quarkus&lt;/a> or &lt;a href="https://spring.io/">Spring&lt;/a> or from Spring 5 to 6, using Generative AI and static code analysis. I wrote a detailed post about this last year for the &lt;a href="https://www.javaadvent.com/2024/12/java-migrations-argh-and-now-large-language-models.html">Java Advent Calendar&lt;/a>.&lt;/p>
&lt;p>Most recently, we have all been hard at work, bringing a preview for our community of users. In this post, I will outline how you can install and configure Konveyor AI using &lt;a href="https://openai.com/">OpenAI&lt;/a> and make meaningful generations. However, I have chosen OpenAI for the sake of simplicity in this post. Users can choose many other models, which are documented &lt;a href="https://github.com/konveyor/kai/blob/main/docs/llm_selection.md">here&lt;/a>.&lt;/p></description></item><item><title>Java + LLMs: A hands-on guide to building LLM Apps in Java with Jakarta</title><link>https://shaaf.dev/post/2025-02-05-a-handson-guide-to-building-llm-apps-in-java-with-jakarta/</link><pubDate>Tue, 04 Feb 2025 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2025-02-05-a-handson-guide-to-building-llm-apps-in-java-with-jakarta/</guid><description>&lt;p>&lt;a href="https://foojay.io/">Java&lt;/a> is an amazing language to work with. Millions of developers use it for daily work routines, and many mission-critical applications run on Java today. Whether we talk about banks, stock exchanges, or space, Java is prevalent and a language of choice.&lt;/p>
&lt;p>With the advent of Large Language Models(LLM), new opportunities are at play. While Python has been the dominating language runtime for apparent reasons, there is a misconception that creating applications, agents, or other components for LLMs should also be done in Python. Most of the integration in LLMs is achieved by using REST API. Java is not short on anything in that space. System integration has been pretty awesome in Java, with many tools in that space. So why not Java?&lt;/p></description></item><item><title>Embracing the Future of Application Modernization with KAI</title><link>https://shaaf.dev/post/2024-07-23-embracing-the-future-of-app-mod-with-konveyor-ai/</link><pubDate>Tue, 23 Jul 2024 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2024-07-23-embracing-the-future-of-app-mod-with-konveyor-ai/</guid><description>&lt;p>&lt;a href="https://www.konveyor.io">Konveyor’s&lt;/a> main strength lies in its comprehensive approach to migration and modernization. At the core of &lt;a href="https://www.konveyor.io">Konveyor’s&lt;/a> functionality is its powerful analysis engine. This engine performs static source code analysis, identifying anti-patterns and issues that might hinder the application’s operation on a target platform. Utilizing community standards like the Language Server Protocol, Konveyor&amp;rsquo;s analysis engine uses rules designed to aid in various migration scenarios. Users can also create custom rules to address specific migration needs, enhancing Konveyor&amp;rsquo;s flexibility and adaptability.&lt;/p></description></item><item><title>Building a Resilient Cart Service with Quarkus and Infinispan Cache: A Step-by-Step Guide</title><link>https://shaaf.dev/post/2024-07-22-building-a-resilient-cart-service-with-quarkus-and-infinispan-a-step-by-step-guide/</link><pubDate>Mon, 22 Jul 2024 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2024-07-22-building-a-resilient-cart-service-with-quarkus-and-infinispan-a-step-by-step-guide/</guid><description>&lt;p>The article is a comprehensive guide on creating, deploying, and managing the &lt;a href="https://github.com/sshaaf/coolstore-quarkus">coolstore&lt;/a> cart service using Quarkus and &lt;a href="https://infinispan.org/">Infinispan&lt;/a>. The guide details building the cart-service with &lt;a href="https://quarkus.io/">Quarkus&lt;/a>, packaging it, and deploying it to &lt;a href="https://www.redhat.com/en/technologies/cloud-computing/openshift">OpenShift&lt;/a>.
It covers single-site deployment with Infinispan cache configuration and extends to cross-site clustering for data replication and fault tolerance across multiple data centers.
The article also addresses schema management and implementing fault tolerance with &lt;a href="https://smallrye.io/docs/smallrye-fault-tolerance/6.2.0/index.html">Smallrye Fault Tolerance&lt;/a> for fallback mechanisms acorss multiple site deployments.&lt;/p></description></item><item><title>Ensure Secure and Up-to-date Projects with the Outdated Maven Plugin</title><link>https://shaaf.dev/post/2024-07-14-check-java-dependencies-outdated-maven-artifacts/</link><pubDate>Sun, 14 Jul 2024 00:00:00 +0000</pubDate><guid>https://shaaf.dev/post/2024-07-14-check-java-dependencies-outdated-maven-artifacts/</guid><description>&lt;p>It&amp;rsquo;s not an early Sunday morning. Sipping some Coffee and going through my feed and I find this gem that &lt;a href="https://mastodon.online/@myfear/112783939377718420">@Markus Eisele&lt;/a> just posted.
Well at first I saw the post as &amp;ldquo;Outdated Maven Plugin&amp;rdquo;, and I am like what does that mean? Anyways going into the git repo I see its a new project by &lt;a href="https://giovds.com/">Giovanni van der Schelde&lt;/a>.&lt;/p>
&lt;blockquote>
&lt;p>Stay up-to-date and secure with The Outdated Maven Plugin!
The Outdated Maven Plugin is a tool designed to help developers identify outdated dependencies in their Maven projects.
By scanning the dependencies of your project, this plugin determines if they are no longer actively maintained
based on a user-defined threshold of inactivity in years. This ensures that your project remains up-to-date with the
latest and most secure versions of its dependencies.&lt;/p></description></item><item><title>Java monitoring: Exploring Cryostat 2.4 features on OpenShift</title><link>https://shaaf.dev/post/2023-12-18-java-monitoring-exploring-cryostat-24-features-openshift/</link><pubDate>Mon, 18 Dec 2023 09:28:11 +0200</pubDate><guid>https://shaaf.dev/post/2023-12-18-java-monitoring-exploring-cryostat-24-features-openshift/</guid><description>&lt;blockquote>
&lt;p>&lt;em>Orignally posted at&lt;/em> &lt;a href="https://developers.redhat.com/articles/2023/12/18/java-monitoring-exploring-cryostat-24-features-openshift">Red Hat Developers&lt;/a>&lt;/p>&lt;/blockquote>
&lt;p>&lt;a href="https://developers.redhat.com/products/cryostat/overview">Red Hat&amp;rsquo;s latest build of Cryostat 2.4&lt;/a>, designed specifically for the &lt;a href="https://developers.redhat.com/products/openshift/overview">Red Hat OpenShift Container Platform&lt;/a>, brings a wealth of features and enhancements that cater to various monitoring needs for &lt;a href="https://developers.redhat.com/java">Java&lt;/a> applications.&lt;/p>
&lt;p>At its core, Cryostat 2.4 excels in comprehensive Java Flight Recorder (JFR) data management. Users can effortlessly start, stop, retrieve, archive, import, and export JFR data, all through an intuitive web console or an accessible HTTP API. This enhances the ease with which developers can handle JVM performance data. Moreover, Cryostat 2.4 provides flexibility in terms of data storage and analysis. Users can store and analyze JFR data directly on their Red Hat OpenShift or export it to external monitoring applications for a deeper dive into the data.&lt;/p></description></item><item><title>Whats New for developers in JDK 21</title><link>https://shaaf.dev/post/2023-09-21-whats-new-developers-jdk-21/</link><pubDate>Thu, 21 Sep 2023 09:28:11 +0200</pubDate><guid>https://shaaf.dev/post/2023-09-21-whats-new-developers-jdk-21/</guid><description>&lt;blockquote>
&lt;p>&lt;em>Orignally posted at&lt;/em> &lt;a href="hhttps://developers.redhat.com/articles/2023/09/21/whats-new-developers-jdk-21">Red Hat Developers&lt;/a>&lt;/p>&lt;/blockquote>
&lt;p>In an exciting development for&lt;a href="https://developers.redhat.com/java"> Java&lt;/a> developers, this September 19th marked the release of JDK 21. This release contains many new capabilities that benefit the Java ecosystem, including virtual threads, record patterns, and sequenced collections. There are also some interesting features in the preview for JDK 21, such as string templates, scoped values, and structured concurrency. This article highlights six new features in this release.&lt;/p></description></item><item><title>error: --enable-preview must be used with either -source or --release</title><link>https://shaaf.dev/post/2023-09-07-error--enable-preview-must-be-used-with-either-source-or--release/</link><pubDate>Thu, 07 Sep 2023 15:00:48 +0200</pubDate><guid>https://shaaf.dev/post/2023-09-07-error--enable-preview-must-be-used-with-either-source-or--release/</guid><description>&lt;p>The JDK 21 release is well underway likely to drop around September 19th, and its not GA yet. further more it provides preview features.&lt;/p>
&lt;p>It was time for downloading one of the releases and giving it a try. Well I have given it a try some weeks ago so I already had it installed.
e.g.&lt;/p>
&lt;pre tabindex="0">&lt;code>openjdk version &amp;#34;21-ea&amp;#34; 2023-09-19
OpenJDK Runtime Environment (build 21-ea+26-2328)
OpenJDK 64-Bit Server VM (build 21-ea+26-2328, mixed mode, sharing)
&lt;/code>&lt;/pre>&lt;p>The fun thing though is that there are couple of very cool features that are still in preview. e.g. I tried to use the StringTemplates mentioned in the &lt;a href="https://www.infoq.com/news/2023/04/java-gets-a-boost-with-string/">InfoQ blog&lt;/a>&lt;/p></description></item><item><title>Processing images in Java with OpenCV and Quarkus</title><link>https://shaaf.dev/post/2022-04-11-processing-images-in-java-with-opencv-and-quarkus/</link><pubDate>Mon, 11 Apr 2022 07:07:22 +0200</pubDate><guid>https://shaaf.dev/post/2022-04-11-processing-images-in-java-with-opencv-and-quarkus/</guid><description>&lt;p>If you are into Computer vision, you probably are familiar with &lt;a href="https://opencv.org/">OpenCV&lt;/a>. Its an amazing library that has almost everything one needs to do 2D and 3D processing and much more. Gesture recognition, face detection, Motion tracking, think of anything related to image processing and OpenCV can be your goto. Its based on the BSD license, so you can just download it and start using it.&lt;/p>
&lt;p>OpenCV is written in C, and there are nice Java bindings for it too. If you are a Java developer like me and dont want to get into all the loading and building native bindings etc., then read on. In this article I will show how you can use OpenCV with the popular new framework Quarkus, without worrying about installing libraries or reloading the entire app.&lt;/p></description></item><item><title>SQL cache stores and more in Data Grid 8.3</title><link>https://shaaf.dev/post/2022-02-24-sql-cache-stores-and-more-data-grid-83/</link><pubDate>Thu, 24 Feb 2022 07:07:22 +0200</pubDate><guid>https://shaaf.dev/post/2022-02-24-sql-cache-stores-and-more-data-grid-83/</guid><description>&lt;blockquote>
&lt;p>&lt;em>Orignally posted at&lt;/em> &lt;a href="https://developers.redhat.com/articles/2022/02/24/sql-cache-stores-and-more-data-grid-83">Red Hat Developers&lt;/a>&lt;/p>&lt;/blockquote>
&lt;p>&lt;a href="https://developers.redhat.com/products/datagrid/overview">Red Hat Data Grid&lt;/a> is a distributed, cloud-based datastore offering very fast response times as an in-memory database. The latest version, Data Grid 8.3, features cross-site replication with more observability and two new types of SQL cache store for scaling applications with large datasets. This version also brings improved security, support for Helm charts, and a better command-line interface (CLI).&lt;/p>
&lt;p>This article is an overview of new features and enhancements in this latest version of Red Hat Data Grid.&lt;/p></description></item><item><title>What's new for developers in Java 18</title><link>https://shaaf.dev/post/2022-01-27-whats-new-for-developers-in-java-18/</link><pubDate>Thu, 27 Jan 2022 07:07:22 +0200</pubDate><guid>https://shaaf.dev/post/2022-01-27-whats-new-for-developers-in-java-18/</guid><description>&lt;blockquote>
&lt;p>&lt;em>Orignally posted at&lt;/em> &lt;a href="https://developers.redhat.com/articles/2022/01/27/whats-new-developers-java-18#">Red Hat Developers&lt;/a>&lt;/p>&lt;/blockquote>
&lt;p>In exciting news for &lt;a href="https://developers.redhat.com/topics/enterprise-java">Java&lt;/a> developers, Java 18 forked off from the main line &lt;a href="https://www.infoq.com/news/2021/12/java-news-roundup-dec06-2021/">at the end of last year&lt;/a> and has entered &lt;a href="https://openjdk.java.net/projects/jdk/18/">Rampdown Phase Two&lt;/a>. This article highlights some of the features that developers can look for in the upcoming Java 18 release, including the new simple web server module, a more sophisticated way to annotate your Javadocs, and the &lt;code>–finalization=disabled&lt;/code> option, which lets you test how a Java application will behave when finalization is removed in a future release. See the end of the article for where to download Java 18 in early access builds.&lt;/p></description></item><item><title>Deploy Quarkus everywhere with Red Hat Enterprise Linux (RHEL)</title><link>https://shaaf.dev/post/2021-05-17-deploy-quarkus-everywhere/</link><pubDate>Fri, 07 May 2021 07:07:22 +0200</pubDate><guid>https://shaaf.dev/post/2021-05-17-deploy-quarkus-everywhere/</guid><description>&lt;blockquote>
&lt;p>&lt;em>Orignally posted at&lt;/em> &lt;a href="https://developers.redhat.com/blog/2021/04/07/deploy-quarkus-everywhere-with-red-hat-enterprise-linux-rhel#">Red Hat Developers&lt;/a>&lt;/p>&lt;/blockquote>
&lt;p>Java is one of the most used languages out there and has been in the&lt;a href="https://www.tiobe.com/tiobe-index/?hid=B4E841AA3BF5CD6D546F03D321E49994&amp;amp;wordfence_lh=1"> top three&lt;/a> for the last two decades. Java powers millions of applications across verticals and platforms. Linux is widely deployed in data centers, Edge networks, and Cloud. Today we announce the availability of Quarkus for all our Red Hat Enterprise Linux (RHEL) customers. If you are running RHEL, you can now also run Red Hat Build of Quarkus (RHBQ). By doing this, we enable our customers, partners, and software vendors to use RHBQ in their applications with ease and furthermore enable them to deploy Quarkus for multiple use-cases for Java on Linux. If you are developing applications on a Kubernetes platform like Openshift, you can also use RHBQ with it, and this was&lt;a href="https://www.redhat.com/en/blog/introducing-quarkus-red-hat-openshift"> announced&lt;/a> last year. What is Quarkus and how can I develop and deploy it on RHEL? Learn more in this post.&lt;/p></description></item><item><title>Creating and deploying a Java 8 runtime container image</title><link>https://shaaf.dev/post/2019-02-26-create-java-8-runtime-container-image/</link><pubDate>Tue, 26 Feb 2019 07:07:22 +0200</pubDate><guid>https://shaaf.dev/post/2019-02-26-create-java-8-runtime-container-image/</guid><description>&lt;blockquote>
&lt;p>&lt;em>Orignally posted at&lt;/em> &lt;a href="https://developers.redhat.com/blog/2019/02/26/create-java-8-runtime-container-image">Red Hat Developers&lt;/a>&lt;/p>&lt;/blockquote>
&lt;p>A Java runtime environment should be able to run compiled source code, whereas a development kit, for example, OpenJDK, would include all the libraries/binaries to compile and run the source code. Essentially the latter is a superset of the runtime environment. More details on OpenJDK support and lifecycle can be found &lt;a href="https://access.redhat.com/articles/1299013">here&lt;/a>.&lt;/p>
&lt;p>Red Hat ships and supports container images with OpenJDK for both Java 8 and 11. More details are &lt;a href="https://access.redhat.com/containers/#/search/openjdk">here&lt;/a>. If you are using Red Hat Middleware, the s2i images shipped are also useful to deploy, for example, on Red Hat Openshift Container Platform.&lt;/p></description></item><item><title>Getting started with JBehave in 8 steps.</title><link>https://shaaf.dev/post/2009-08-12-getting-started-with-jbehave-in-8-steps/</link><pubDate>Wed, 12 Aug 2009 16:13:30 +0200</pubDate><guid>https://shaaf.dev/post/2009-08-12-getting-started-with-jbehave-in-8-steps/</guid><description>&lt;p>This post is about JBehave and how to quickly get started with it. If you would like to know about BDD please use the following link.
&lt;a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">What is Behavioral Driven Development?&lt;/a>&lt;/p>
&lt;p>Today I have used JBehave for the first time. It does have some convincing factors for instance diving requirements into scenarios which map pretty nicely to the tests that are written with in the Steps. Thus it seems like it would be easier for Stakeholder/s to use it as a good guideline for the initial requirements. Its always quite usual to come up to some disagreements about the development however the tool does help to bring forth the ease for stake holders who really dont have to get into writing code but will have a technical jargon to communicate through to the developers in shape of scenarios.&lt;/p></description></item><item><title>Logging with log4J isDebugEnabled</title><link>https://shaaf.dev/post/2009-08-12-logging-with-log4j-isdebugenabled/</link><pubDate>Wed, 12 Aug 2009 14:39:52 +0200</pubDate><guid>https://shaaf.dev/post/2009-08-12-logging-with-log4j-isdebugenabled/</guid><description>&lt;p>Excerpt: Alot of times I have seen the questions popping up whether to use isDebugEnabled property or not. Arguably most of the times or rather always about performance. Some of the stuff that I feel important about using it follows.&lt;/p>
&lt;p>Alot of times I have seen the questions popping up whether to use isDebugEnabled property or not. Arguably most of the times or rather always about performance. Some of the stuff that I feel important about using it follows.&lt;/p></description></item><item><title>Calling wsadmin scripts from ant</title><link>https://shaaf.dev/post/2008-12-11-calling-wsadmin-scripts-from-ant/</link><pubDate>Thu, 11 Dec 2008 10:17:46 +0100</pubDate><guid>https://shaaf.dev/post/2008-12-11-calling-wsadmin-scripts-from-ant/</guid><description>&lt;p>You can simply add the following to a target.
For the following wsadmin should be in your PATH env.&lt;/p>
&lt;pre>&lt;code>&amp;lt; exec dir=&amp;quot;.&amp;quot; executable=&amp;quot;wsadmin.bat&amp;quot; logError=&amp;quot;true&amp;quot; failonerror=&amp;quot;true&amp;quot; output=&amp;quot;wsconfig.out&amp;quot; &amp;gt;
	&amp;lt; arg line=&amp;quot;-lang jython -f ../../createQFactory.py&amp;quot;/ &amp;gt;
&amp;lt; /exec &amp;gt;
&lt;/code>&lt;/pre>
&lt;p>All output will be logged to wsconfig.out&lt;/p></description></item><item><title>Command, Singleton, JMenuItem, JButton, AbstractButton - One Listener for the app</title><link>https://shaaf.dev/post/2008-11-17-command-singleton-jmenuitem-jbutton-abstractbutton-one-listener-for-the-app/</link><pubDate>Mon, 17 Nov 2008 21:17:24 +0100</pubDate><guid>https://shaaf.dev/post/2008-11-17-command-singleton-jmenuitem-jbutton-abstractbutton-one-listener-for-the-app/</guid><description>&lt;p>Here I would like to demonstrate a simple use of JMenuItems being used with Single Listener for the entire system.
A simple sample of use would probably be SingleInstance Desktop Application.&lt;/p>
&lt;p>Lets see how that is done here.&lt;/p>
&lt;ol>
&lt;li>First lets create a OneListener class that should be able to listen to ActionEvents and also be able to add Commands to itself. Please refer to my previous post on Command,Singleton if you would like to see more about this patterns and there usage.&lt;/li>
&lt;/ol>
&lt;pre tabindex="0">&lt;code>	package com.shaafshah.jmenus;

	import java.awt.event.ActionEvent;
	import java.awt.event.ActionListener;
	import java.util.ArrayList;
	import javax.swing.AbstractButton;

	// Implements the ActionListener and is a Singleton also.

	public class OneListener implements ActionListener{

		private static OneListener oneListener = null;

		// Holds the list of all commands registered to this listener
		private ArrayList&amp;lt;Command&amp;gt; commandList = null;

		// A private constructor
		private OneListener(){
			commandList = new ArrayList&amp;lt;Command&amp;gt;();
		}

		// Ensuring one instance.
		public static OneListener getInstance(){
			if(oneListener != null)
				return oneListener;
			else return oneListener = new OneListener();
		}

		// Add the command and add myself as the listener
		public void addCommand(Command command){
			commandList.add(command);
		 ((AbstractButton)command).addActionListener(this);
		}


		// All Events hit here.
		@Override
		public void actionPerformed(ActionEvent e) {
			((Command)e.getSource()).execute();
		}

	}
&lt;/code>&lt;/pre>&lt;p>In the above code, the addCommand method adds the command Object and adds a listener to it.
Now how is that possible.
Basically because I am categorizing my UI objects as Commands with in the system having some UI. And I am also assuming that these commands are Currently AbstractButton i.e. JMenuItem, JButton. Lets have a look at the Command Interface and its Implementation.&lt;/p></description></item><item><title>Doing the Locale - Danmark</title><link>https://shaaf.dev/post/2008-11-12-doing-the-locale-danmark/</link><pubDate>Wed, 12 Nov 2008 14:52:08 +0100</pubDate><guid>https://shaaf.dev/post/2008-11-12-doing-the-locale-danmark/</guid><description>&lt;p>The following illustrates how to get the Number format working with a danish locale.&lt;/p>
&lt;pre tabindex="0">&lt;code>	import java.text.NumberFormat;
	import java.util.Currency;
	import java.util.Locale;


	public class TestLocale {

	public static void main(String args[]){
		// Create a Locale for Danmark
		Locale DANMARK = new Locale(&amp;#34;da&amp;#34;,&amp;#34;DK&amp;#34;);

 		// get the currency instance for this locale.
 		Currency krone = Currency.getInstance(DANMARK);

 		// Get a Number format for the locale.
 		NumberFormat krFormat = NumberFormat.getCurrencyInstance(DANMARK);
 		// A symbol for the currency
 		String symbol = krFormat.getCurrency().getSymbol();
 		// A double amount
 		double amount = 10000.25;
		// print it out after formatting.
 		System.out.println(krFormat.format(amount));
 		}
	}
&lt;/code>&lt;/pre></description></item><item><title>How to read a file from the JAR?</title><link>https://shaaf.dev/post/2008-10-31-how-to-read-a-file-from-the-jar/</link><pubDate>Fri, 31 Oct 2008 20:57:54 +0100</pubDate><guid>https://shaaf.dev/post/2008-10-31-how-to-read-a-file-from-the-jar/</guid><description>&lt;p>Someone just asked me this question today. And I thought might as well put it down for info.&lt;/p>
&lt;pre tabindex="0">&lt;code> 	public TestReadFileFromJar() throws FileNotFoundException, IOException {
 	InputStream is = getClass().getResource(&amp;#34;txtData/states.properties&amp;#34;);
 	read(is);
	}
&lt;/code>&lt;/pre>&lt;p>In the case above txtData is placed in the jar on the root. Remmember to add the path with the &amp;ldquo;/&amp;rdquo;&lt;/p></description></item><item><title>Command</title><link>https://shaaf.dev/post/2008-10-31-command/</link><pubDate>Fri, 31 Oct 2008 20:45:04 +0100</pubDate><guid>https://shaaf.dev/post/2008-10-31-command/</guid><description>&lt;p>By using the command pattern you are seperating the operation from the invoking object. And just because of that it becomes easier to change the command without chagning the caller/s.
This means that you could use Command pattern when you might have the following situation&lt;/p>
&lt;p>You want to parameterize objects to perform an action
You want to specify, execute and queue requests at different times.&lt;/p>
&lt;p>Just to quickly start you need a command object, An interface will keep it easy going in this case, thus providing you with the option of extending other classes e.g. Swing MenuItem or Button.
Below the execute Method is the one invoked to do something when this command is called or asked to do its stuff.
Where as the getCommandName is assumed as a unique name how ever I am sure we can always come up with a better implementation for uniqueness.&lt;/p></description></item><item><title>Implementing the adapter</title><link>https://shaaf.dev/post/2008-10-29-implementing-the-adapter/</link><pubDate>Wed, 29 Oct 2008 20:47:56 +0100</pubDate><guid>https://shaaf.dev/post/2008-10-29-implementing-the-adapter/</guid><description>&lt;p>Typically when implementing an interface you would have to implement all the methods that exist in that interface. A very good example is the MouseListener in the java Swing. When you need to implement more then one method where as typically you might be catching only one of them. Saying that you would also find a Mouse Adapter provided as well. Some of us use that often. And that is part of the Adapter pattern. It makes life easier for me sometimes.&lt;/p></description></item><item><title>wasprofile -create -delete</title><link>https://shaaf.dev/post/2008-10-24-wasprofile-create-delete/</link><pubDate>Fri, 24 Oct 2008 13:38:00 +0200</pubDate><guid>https://shaaf.dev/post/2008-10-24-wasprofile-create-delete/</guid><description>&lt;p>Sometimes you require to do things silently, without any questions asked and &amp;ldquo;Just Do It&amp;rdquo; attitude is required.&lt;/p>
&lt;p>I often find my self with this problem.&lt;/p>
&lt;p>If you want to delete or create a Websphere profile from your command line try the following. (I have tried on RSA only)&lt;/p>
&lt;pre>&lt;code># deleteing a profile
wasprofile -delete -profileName MyProfile
&lt;/code>&lt;/pre>
&lt;p>You should get the following message on deletion&lt;/p>
&lt;pre>&lt;code>INSTCONFSUCCESS: Success: The profile no longer exists.
&lt;/code>&lt;/pre>
&lt;p>Creating a websphere profile&lt;/p></description></item><item><title>Abstract Factory pattern</title><link>https://shaaf.dev/post/2008-10-10-abstract-factory-pattern/</link><pubDate>Fri, 10 Oct 2008 10:20:10 +0200</pubDate><guid>https://shaaf.dev/post/2008-10-10-abstract-factory-pattern/</guid><description>&lt;p>Factories have been a key pattern in building applications, its fascinatingly simple, effective and to the point. When starting to learn a design oriented approach to applications or API, I would always recommend a factory pattern as one of the key starting notes of highlight in your design.&lt;/p>
&lt;p>So today I am talking about the Abstract Factory pattern. Its not an &amp;ldquo;abstract&amp;rdquo; class or object that you call a pattern. But its a Factory of facotries and that is what exactly makes it so much wordingly abstract. Having &amp;ldquo;abstract&amp;rdquo; classes is there but just some other side of the coin.&lt;/p></description></item><item><title>Crocus - CSV Reader</title><link>https://shaaf.dev/post/2008-10-03-crocus-csv-reader/</link><pubDate>Fri, 03 Oct 2008 23:38:42 +0200</pubDate><guid>https://shaaf.dev/post/2008-10-03-crocus-csv-reader/</guid><description>&lt;p>Easy to use ready to go CSV File Reading utility. Read One or Multiple files into a RecordManager, quick access to the file with segmentation into Fields and Records. Merge Multiple CSV files in one. Listener to CSV Files.&lt;/p>
&lt;p>&lt;a href="https://sourceforge.net/project/platformdownload.php?group_id=172152">Download Here&lt;/a>&lt;/p>
&lt;p>Organization:
A CSV file is broken up as follows
A CSVField has a group of characters
A CSVRecord has a group of CSVFields
A CSVFile has a group of record&lt;/p></description></item><item><title>HowTo create a JDBC provider with wsadmin scripting - Jython</title><link>https://shaaf.dev/post/2008-07-01-howto-create-a-jdbc-provider-with-wsadmin-scripting-jython/</link><pubDate>Tue, 01 Jul 2008 14:21:48 +0200</pubDate><guid>https://shaaf.dev/post/2008-07-01-howto-create-a-jdbc-provider-with-wsadmin-scripting-jython/</guid><description>&lt;p>Last week I wrote a post about creating MQQueues with jacl. However today I am moving to Jython. This is the new scripting languauge supported by the wsadmin. The following write-up helps you create a JDBC provider using Jython in 6 easy steps on the wsadmin console.&lt;/p>
&lt;p>*Pre requirements:
*Following should be known to start using this tutorial.&lt;/p>
&lt;ol>
&lt;li>How to launch the wsadmin with Jython enabled.&lt;/li>
&lt;/ol>
&lt;p>*Where will I find the wsadmin?
*It is typically placed in the bin directory of your server.
In my case its lying in my RAD installation directory as
../Rational/SDP/6.0/runtimes/base_v6/bin&lt;/p></description></item><item><title>Creating an SVN wrap for your build using Ant</title><link>https://shaaf.dev/post/2008-06-30-creating-an-svn-wrap-for-your-build-using-ant/</link><pubDate>Mon, 30 Jun 2008 14:45:32 +0200</pubDate><guid>https://shaaf.dev/post/2008-06-30-creating-an-svn-wrap-for-your-build-using-ant/</guid><description>&lt;p>Today after along break I would jump right on to one of the interesting topics in my den these days.&lt;/p>
&lt;p>One of my friends was lately troubled with doing some SVN stuff like merging etc. And a lot of people will agree with me on their first experiences. :) I think.&lt;/p>
&lt;p>While Automated builds take a lot of our time I thought I could plug in with some automated merging and a few other tasks. Its hard to go over all of that in one post but I will try putting in some basic stuff to get us started.&lt;/p></description></item><item><title>Creating the MQQueues with wsadmin scripting - JACL Part 2</title><link>https://shaaf.dev/post/2008-06-25-creating-the-mqqueues-with-wsadmin-scripting-jacl-part-2/</link><pubDate>Wed, 25 Jun 2008 14:40:47 +0200</pubDate><guid>https://shaaf.dev/post/2008-06-25-creating-the-mqqueues-with-wsadmin-scripting-jacl-part-2/</guid><description>&lt;p>Yesterday I wrote an article about creating and configuring the MQQueueConnectionFactory with the JACL on the wsadmin console. The other half of the article that was left out was to create the queues also.&lt;/p>
&lt;p>The world looks pretty much the same today and my /etc/profile doesnt seemed to have been sourced again. Good we dont need a restart.&lt;/p>
&lt;p>You would find some of the steps to be similar and that is because we are running on the same configs.&lt;/p></description></item><item><title>Creating the MQQueueConnectionFactory with wsadmin scripting - JACL Part 1.</title><link>https://shaaf.dev/post/2008-06-24-websphere-admin-scripting-jacl-part-1/</link><pubDate>Tue, 24 Jun 2008 15:44:31 +0200</pubDate><guid>https://shaaf.dev/post/2008-06-24-websphere-admin-scripting-jacl-part-1/</guid><description>&lt;p>While working my way in some piece of long java code I came across this huge pile of sand that just shattered me off every bit of patience I was left with. The dilemma all of us face every second day. &lt;em>CONFIGURATIONS!!&lt;/em>&lt;/p>
&lt;p>While my sarcastic mind was just saying Congratulations to me instead. And just how the - would you expect me to start configuring now.&lt;/p>
&lt;p>So what exactly is my problem? I have a list of MQs, Factories, datasource, providers etc.. that I need to configure. And every time I create a new profile on my RAD (Rational Application Developer) I have to manually goto the Admin console and configure them.&lt;/p></description></item><item><title>Quick start Singleton - Walk through</title><link>https://shaaf.dev/post/2008-06-23-quick-start-singleton-walk-through/</link><pubDate>Mon, 23 Jun 2008 03:56:37 +0200</pubDate><guid>https://shaaf.dev/post/2008-06-23-quick-start-singleton-walk-through/</guid><description>&lt;p>This being my first existence on the network and I just want to make sure that I would come back to this blog page again sometime and keep on writing. For now this is a quick 5 min walk through of getting your hands dirty on the Singleton Pattern. As any ones first pattern Singleton always seems to be the easiest to adapt and ironically always the mistress of your pains; when you realize the act wasn&amp;rsquo;t right in the first place.
More details on that later.&lt;/p></description></item></channel></rss>