<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>Learn Share Learn &amp;amp; Repeat</title><description></description><managingEditor>noreply@blogger.com ({ Neeraj : Sidhaye })</managingEditor><pubDate>Mon, 2 Sep 2024 13:37:39 +0530</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">143</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><link>http://extremeportal.blogspot.com/</link><language>en-us</language><itunes:explicit>no</itunes:explicit><itunes:subtitle/><itunes:owner><itunes:email>noreply@blogger.com</itunes:email></itunes:owner><item><title>Server Sent Events - Concept</title><link>http://extremeportal.blogspot.com/2019/02/server-sent-events-concept.html</link><author>noreply@blogger.com ({ Neeraj : Sidhaye })</author><pubDate>Mon, 11 Feb 2019 00:36:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-8899551342711671957</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This post describes basics of&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;SSE concepts,&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;SSE use cases,&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;How does SSE work,&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Message Formats,&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;SSE code on Client side and Server side&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;SseEmitter connection keep alive time,&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Auto Re-connect mechanism&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;If you already know basics concepts, please refer to my post on&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;a href="https://extremeportal.blogspot.com/2019/02/server-sent-events-development-test.html" target="_blank"&gt;&lt;b&gt;Server Sent Event - Development and Test Automation&lt;/b&gt;&lt;/a&gt;, which completely focused on E2E SSE development and addressing the challenges of testing SSE, preciously on how to automate SSE automation tests.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;As always, you could refer to code here from my git hub account at&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;a href="https://github.com/BeTheCodeWithYou" target="_blank"&gt;BeTheCodeWithYou&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&amp;nbsp;and refer to repository&amp;nbsp;&lt;b&gt;Spring-Boot-SSE&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Please give star to the repo if you liked it :-)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Alright, so, with this post let's continue to talk on SSE basics&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;SSE Concept:-&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Server Sent Events are the events ( data ) sent from server to the client over HTTP connection.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This connection is one directional&amp;nbsp;connection from server to client. Meaning that, once the client connects to server, then there after server will send&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;any real-time notifications generated on the server side, to the client.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Client can be mobile app or browser based app, or any client that support HTTP Connection.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;SSE use cases:-&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;you would have seen SSE use cases around you in day to day life&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;1)&lt;/b&gt; Continuous update about train time notifications on the display panel&amp;nbsp;on the platform.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;2)&lt;/b&gt; Continuous Rolling of Stock updates&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;3)&lt;/b&gt; Real time counter increment of your social media 'likes' icon.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;and could be more...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;How does SSE work:-&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Client initiates a connection to server over http, this can be done by "client calling a rest end point on the server,&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;in return, the response should have content-type header values as "text/event-stream".&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This tells the client, that a connection&amp;nbsp;is established and stream is opened for sending events from the server to the client.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;In the browser you have a special object called,&amp;nbsp; &lt;b&gt;"EventSource"&lt;/b&gt;, that handles the connection and converts the responses into events.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;Message-Formats:-&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;SSE only supports text data. Meaning, server can only send text data to the client.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Binary&amp;nbsp;streaming, while possible, is inefficient with SSE. In that case, WebSocket would be good choice for binary data transfer.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;SSE code on Client side and server side:-&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Client Side Code&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;EventSource object is the core object supported by browser.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;To open a connection to the server, client will need to instantiate EventSource object.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;const eventSource = new EventSource('http://localhost:8080/subscribe/');&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Browser sends this GET request with accept header text/event-stream.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;The response to this request, must contain header content-type with&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;value text/event-stream and response must be encoded with UTF-8.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;To process these events in the browser an application needs to register a listener for the message event.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;The property data of the event object contains the message&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;eventSource.onmessage = event =&amp;gt; {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; const msg = JSON.parse(event.data);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; // access your attributes from the msg.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;};&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Client api supports certain events like open and error.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;u&gt;Open event&lt;/u&gt; occurs as soon as 200 response is received by client for /subscribe GET call.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;u&gt;error event&lt;/u&gt; is received by client, when there is any network error or server terminates the connection.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Server Side Code&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Http Response to the above GET request on /subscribe end point must contain the Content-Type header with the value text/event-stream.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Spring Boot supports SSE by providing SseEmitter object. It was introduced in spring version 4.2 ( spring boot 1.3 ).&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Create a spring boot application from start.spring.io and select web as dependency.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;You can have a controller with rest end point &lt;/span&gt;&lt;b style="font-family: Verdana, sans-serif;"&gt;GET with /subscribe&lt;/b&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt; allows client to establish connection.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;A&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;nother rest end point &lt;/span&gt;&lt;b style="font-family: Verdana, sans-serif;"&gt;POST with /event &lt;/b&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;allows us to submit new events on the server.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;T&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;his POST with /events or similar&amp;nbsp;end point, can be called from any other server side component to send real time notification.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This /event end point, will then send event to connected&amp;nbsp;clients.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Each client connection is represented with it's own instance of SseEmitter.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;One limitation with spring SSE is , it does not give you tools to manage&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;these SseEmitter instances. So, for this example, I have used a list that stores&amp;nbsp;SseEmitter objects and release objects&amp;nbsp;on errors, completion or timeout scenarios.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;SseEmitter object is created as below&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;SseEmitter emitter = new SseEmitter();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;SseEmitter connection keep alive time:-&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;By default, &lt;b&gt;Spring Boot with the embedded Tomcat &lt;/b&gt;server keeps the SSE HTTP connection open for 30 seconds.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;we can override this 30 seconds via configurations.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;spring.mvc.async.request-timeout=50000&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;this entry will keep the HTTP connection open for 50 seconds.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Alternatively, you can directly use SseEmitter constructor to pass this timeout value as below&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;SseEmitter emitter = new SseEmitter(150_000L);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;//keep connection open for 150 seconds&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;Auto Re-connect mechanism&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;The nice thing about Server-Sent Events is that they have a built in re-connection&amp;nbsp;feature. Meaning that, &lt;u&gt;if the connection&amp;nbsp;&lt;/u&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;u&gt;is dropped due to server error then client will automatically tries to re-connect after 3 seconds.&amp;nbsp;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;The browser tries to send reconnect requests forever until he gets a 200 HTTP response back.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;It's a browser feature to wait for 3 seconds and then automatically reconnect.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This 3 seconds of time can be changed by the server by sending a new time value in the &lt;b&gt;retry&lt;/b&gt; header attribute&amp;nbsp;together with the message.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;A client can be told to stop reconnecting using the HTTP 204 No Content response code.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Hope you liked this basic concept walk through&amp;nbsp;of SSE.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Please follow reading on the next post on&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;a href="https://extremeportal.blogspot.com/2019/02/server-sent-events-development-test.html" target="_blank"&gt;&lt;b&gt;Server Sent Event - Development and Test Automation&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Server Sent Events - Development &amp; Test Automation</title><link>http://extremeportal.blogspot.com/2019/02/server-sent-events-development-test.html</link><author>noreply@blogger.com ({ Neeraj : Sidhaye })</author><pubDate>Mon, 11 Feb 2019 00:35:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-8446094830266614224</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This post is a next part of the my earlier post&amp;nbsp;&lt;b&gt;&lt;a href="https://extremeportal.blogspot.com/2019/02/server-sent-events-concept.html" target="_blank"&gt;SSE basics&lt;/a&gt;.&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;In this post, I will get into SSE code and how we can automate it's testing.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Please refer to my github account at &lt;b&gt;&lt;a href="https://github.com/BeTheCodeWithYou" target="_blank"&gt;BeTheCodeWithYou&lt;/a&gt;&lt;/b&gt; and clone the repository &lt;b&gt;Spring-Boot-SSE &lt;/b&gt;to directly run the application.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;please give repo a star if it did help you&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #f6f8fa; color: #24292e; font-family: &amp;quot;apple color emoji&amp;quot; , &amp;quot;segoe ui&amp;quot; , &amp;quot;segoe ui emoji&amp;quot; , &amp;quot;segoe ui symbol&amp;quot;; font-size: 19.2px;"&gt;✌️&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;The need of creating this repository was apparent due to SSE Test challenges and I couldn't find anything fitted together!!&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;So, think about if you have a client connected to server over SSE but how do you make sure that your client or clients are getting events which are generated on the server and essentially how do you automate this test??&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #f6f8fa; color: #24292e; font-family: &amp;quot;apple color emoji&amp;quot; , &amp;quot;segoe ui&amp;quot; , &amp;quot;segoe ui emoji&amp;quot; , &amp;quot;segoe ui symbol&amp;quot;; font-size: 19.2px;"&gt;&#128552;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Important point to understand is that, here we are testing our server side components to make sure that it is able to send events to all the connected clients and able to release sse emitter objects when clients have initiated connection close. We have simulated the client ( UI )&amp;nbsp; with java library so that we can automate this approach.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: #24292e; font-family: &amp;quot;apple color emoji&amp;quot; , &amp;quot;segoe ui&amp;quot; , &amp;quot;segoe ui emoji&amp;quot; , &amp;quot;segoe ui symbol&amp;quot;; font-size: 19.2px;"&gt;&#128074;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;In your application code, you will have client code which will make use of browser supported EventSource object to establish SSE connection with server.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;To test it, you will normally open browser, making a connection to SSE channel and then wait for the push notification to receive on the browser when an event is triggered on the server.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;To test with multiple clients, you might open multiple browsers and do the same tests.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Challenges with this manual tests of SSE are:-&lt;/span&gt;&lt;/div&gt;
&lt;ul style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px; margin-top: 0px; padding-left: 2em;"&gt;
&lt;li style="box-sizing: border-box;"&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;can you automate this test behaviour?&amp;nbsp;&lt;img align="absmiddle" alt=":confounded:" class="emoji" data-canonical-src="https://github.githubassets.com/images/icons/emoji/unicode/1f616.png" height="20" src="https://camo.githubusercontent.com/a0ba254dee8874bb9827e71f6c37f995e2a61ed3/68747470733a2f2f6769746875622e6769746875626173736574732e636f6d2f696d616765732f69636f6e732f656d6f6a692f756e69636f64652f31663631362e706e67" style="background-color: transparent; border-style: none; box-sizing: content-box; max-width: none; vertical-align: text-top;" title=":confounded:" width="20" /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-top: 0.25em;"&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;can you assert that message received by the client is correct?&amp;nbsp;&lt;img align="absmiddle" alt=":flushed:" class="emoji" data-canonical-src="https://github.githubassets.com/images/icons/emoji/unicode/1f633.png" height="20" src="https://camo.githubusercontent.com/037d467223fcb203000b34c3b1ce7d497795d140/68747470733a2f2f6769746875622e6769746875626173736574732e636f6d2f696d616765732f69636f6e732f656d6f6a692f756e69636f64652f31663633332e706e67" style="background-color: transparent; border-style: none; box-sizing: content-box; max-width: none; vertical-align: text-top;" title=":flushed:" width="20" /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-top: 0.25em;"&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;can you run this test steps with any build tools? &#127939;&lt;/span&gt;&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-top: 0.25em;"&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;could be more ....&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;To solve this challenge, I thought that it would be nice I find a java equivalent&amp;nbsp;of EventSource object, so that I can write a client ( java based and not the browser ) that establish SSE connection. But then the next issue was, how do I assert because without&amp;nbsp;which test is not complete!!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;So, I found an open source library which support java equivalent of EventSource Object.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;For Test automation&amp;nbsp;and Assertions, I used ZeroCode TDD framework, which allows easiest way of calling a REST end point and importantly directly calling a java method and asserting what you expected.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Let's see in SSE in Action&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: #24292e; font-family: &amp;quot;apple color emoji&amp;quot; , &amp;quot;segoe ui&amp;quot; , &amp;quot;segoe ui emoji&amp;quot; , &amp;quot;segoe ui symbol&amp;quot;; font-size: 19.2px;"&gt;☀️ running the tests&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #24292e; font-family: &amp;quot;apple color emoji&amp;quot; , &amp;quot;segoe ui&amp;quot; , &amp;quot;segoe ui emoji&amp;quot; , &amp;quot;segoe ui symbol&amp;quot;; font-size: 19.2px;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNGfFUmMPesWrMNMiFGShnExe6AXEfy3wBMcgXuj-zUPyFwXHHTb5TMKemJxFVgCv6tt98ClME-9GZee7CD6icg7MvnDz4c2I2YqQ-p_qjiarEaNuK-VR5LCBCVI3vO-V-vjbqYA/s1600/running+demo.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="722" data-original-width="1321" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNGfFUmMPesWrMNMiFGShnExe6AXEfy3wBMcgXuj-zUPyFwXHHTb5TMKemJxFVgCv6tt98ClME-9GZee7CD6icg7MvnDz4c2I2YqQ-p_qjiarEaNuK-VR5LCBCVI3vO-V-vjbqYA/s400/running+demo.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="background-color: white; color: #24292e; font-family: &amp;quot;apple color emoji&amp;quot; , &amp;quot;segoe ui&amp;quot; , &amp;quot;segoe ui emoji&amp;quot; , &amp;quot;segoe ui symbol&amp;quot;; font-size: 19.2px;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: white; color: #24292e; font-family: &amp;quot;apple color emoji&amp;quot; , &amp;quot;segoe ui&amp;quot; , &amp;quot;segoe ui emoji&amp;quot; , &amp;quot;segoe ui symbol&amp;quot;; font-size: 19.2px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;I approached this by creating gradle multi module project with Spring Boot.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Project code consists&amp;nbsp;of below framework and libraries,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;gradle&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Spring Boot&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Sprint REST API&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;a href="https://github.com/authorjapps" target="_blank"&gt;ZeroCode Framework&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;a href="https://github.com/launchdarkly/okhttp-eventsource#okhttp-eventsource" target="_blank"&gt;okhttp-eventsournce&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;In the multi module gradle project, I have got 3 projects&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b style="color: black; font-family: Verdana, sans-serif;"&gt;see-client&lt;/b&gt;&lt;br style="color: black; font-family: &amp;quot;Times New Roman&amp;quot;;" /&gt;&lt;b style="color: black; font-family: Verdana, sans-serif;"&gt;sse-server&lt;/b&gt;&lt;br style="color: black; font-family: &amp;quot;Times New Roman&amp;quot;;" /&gt;&lt;b style="color: black; font-family: Verdana, sans-serif;"&gt;see-test-automation&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b style="color: black; font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="color: black; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Project structure setup&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi30HxV5bqhmZsmVRCUVHDnJRx1rE4ckR1RS3K_1njnpLn7bzLMI_9qtxfW5y4o78E_352PnEIIg6sJ26kujCJzQk5lsPE0E2zYorY-vQxEtfCIRlbBLbT1ZYs5G-FVyP0_l0gDSQ/s1600/project+structure+demo+1.gif" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" data-original-height="722" data-original-width="1321" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi30HxV5bqhmZsmVRCUVHDnJRx1rE4ckR1RS3K_1njnpLn7bzLMI_9qtxfW5y4o78E_352PnEIIg6sJ26kujCJzQk5lsPE0E2zYorY-vQxEtfCIRlbBLbT1ZYs5G-FVyP0_l0gDSQ/s400/project+structure+demo+1.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;b style="font-family: verdana, sans-serif;"&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;

&lt;b style="font-family: verdana, sans-serif;"&gt;&lt;span style="color: blue;"&gt;Sse-client&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b style="font-family: verdana, sans-serif;"&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;span style="color: #24292e; font-family: , &amp;quot;blinkmacsystemfont&amp;quot; , &amp;quot;segoe ui&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif , &amp;quot;apple color emoji&amp;quot; , &amp;quot;segoe ui emoji&amp;quot; , &amp;quot;segoe ui symbol&amp;quot;;"&gt;&lt;span style="background-color: white;"&gt;Project setup&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWxkxZEfEViQn2q85MbaSAdEwgeqT7aT4u83WLNUqDT0tGATwqN0fIZubFxSb205RI02wE3BItAC55AgDQbOrZUAPuwymceg1mf87tH4PIMh3iW99q84IVFLaMFv_n6UnwH1bwyw/s1600/sse-client+demo.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="722" data-original-width="1321" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWxkxZEfEViQn2q85MbaSAdEwgeqT7aT4u83WLNUqDT0tGATwqN0fIZubFxSb205RI02wE3BItAC55AgDQbOrZUAPuwymceg1mf87tH4PIMh3iW99q84IVFLaMFv_n6UnwH1bwyw/s400/sse-client+demo.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&amp;nbsp;&lt;span style="background-color: white; color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 16px;"&gt;Establish a SSE connection to REST endpoint exposed by sse-server project. This is achieved with&amp;nbsp;&lt;/span&gt;&lt;code style="background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; color: #24292e; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em;"&gt;EventSource&lt;/code&gt;&lt;span style="background-color: white; color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 16px;"&gt;&amp;nbsp;java object&amp;nbsp;.&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="background-color: white; font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="background-color: white; font-size: 16px;"&gt;This project has&amp;nbsp;&lt;/span&gt;&lt;code style="background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em;"&gt;ClientEventHandler&lt;/code&gt;&lt;span style="background-color: white; font-size: 16px;"&gt;&amp;nbsp;which overrides a&amp;nbsp;&lt;/span&gt;&lt;code style="background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em;"&gt;onMessage&lt;/code&gt;&lt;span style="background-color: white; font-size: 16px;"&gt;&amp;nbsp;method. When server push an event, onMessage method gets invoked and you can retrieve message here.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="background-color: white; font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 16px;"&gt;For simplicity, I have just added sse-client project code into sse-test-automation project, but you can always define dependencies of sse-client into sse-test-automation project as well.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;sse-server - in action&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: x-small;"&gt;click to open on gif, it doesn't run&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEyNu6X2N4BYwDMQYKYeAeJpTGXvxdB0Vk4DJvjVmUP3JEiIGUp38hg54JX8R2tJAZKNdkjrhENJdllUpp50m4Lvk-SJH0LTFAdSj8EjZpRR2jiExAXO9S9AGVuQx_fpwJI9C8vA/s1600/sse-server+demo-new.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="722" data-original-width="1321" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEyNu6X2N4BYwDMQYKYeAeJpTGXvxdB0Vk4DJvjVmUP3JEiIGUp38hg54JX8R2tJAZKNdkjrhENJdllUpp50m4Lvk-SJH0LTFAdSj8EjZpRR2jiExAXO9S9AGVuQx_fpwJI9C8vA/s400/sse-server+demo-new.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;span style="color: blue; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This project exposes two rest end points.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;code style="background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em;"&gt;/subscribe&lt;/code&gt;&amp;nbsp;for allowing client to establish SSE connection.&lt;/span&gt;&lt;/div&gt;
&lt;div class="highlight highlight-source-java" style="background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; line-height: 1.45; overflow-wrap: normal; overflow: auto; padding: 16px; word-break: normal;"&gt;    &lt;span class="pl-k" style="box-sizing: border-box; color: #d73a49;"&gt;@GetMapping&lt;/span&gt;(&lt;span class="pl-s" style="box-sizing: border-box; color: #032f62;"&gt;&lt;span class="pl-pds" style="box-sizing: border-box;"&gt;"&lt;/span&gt;/subscribe&lt;span class="pl-pds" style="box-sizing: border-box;"&gt;"&lt;/span&gt;&lt;/span&gt;)
    &lt;span class="pl-k" style="box-sizing: border-box; color: #d73a49;"&gt;public&lt;/span&gt; &lt;span class="pl-smi" style="box-sizing: border-box;"&gt;SseEmitter&lt;/span&gt; subscribeForEvents() {
     &lt;span class="pl-c1" style="box-sizing: border-box; color: #005cc5;"&gt;...&lt;/span&gt;
    }
&lt;/pre&gt;
&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;code style="background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em;"&gt;/events&lt;/code&gt;&amp;nbsp;for triggering events on the server, which in turn publish events to subscribed clients.&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="highlight highlight-source-java" style="background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; line-height: 1.45; overflow-wrap: normal; overflow: auto; padding: 16px; word-break: normal;"&gt;&lt;span class="pl-k" style="box-sizing: border-box; color: #d73a49;"&gt;@PostMapping&lt;/span&gt;(&lt;span class="pl-s" style="box-sizing: border-box; color: #032f62;"&gt;&lt;span class="pl-pds" style="box-sizing: border-box;"&gt;"&lt;/span&gt;/events&lt;span class="pl-pds" style="box-sizing: border-box;"&gt;"&lt;/span&gt;&lt;/span&gt;)
    &lt;span class="pl-k" style="box-sizing: border-box; color: #d73a49;"&gt;public&lt;/span&gt; &lt;span class="pl-k" style="box-sizing: border-box; color: #d73a49;"&gt;void&lt;/span&gt; pushNewEventsToClients(&lt;span class="pl-k" style="box-sizing: border-box; color: #d73a49;"&gt;@RequestBody&lt;/span&gt; &lt;span class="pl-smi" style="box-sizing: border-box;"&gt;String&lt;/span&gt; eventData) throws &lt;span class="pl-smi" style="box-sizing: border-box;"&gt;IOException&lt;/span&gt; {
     &lt;span class="pl-c1" style="box-sizing: border-box; color: #005cc5;"&gt;...&lt;/span&gt;
    }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;sse-test-automation&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="background-color: white; color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 16px;"&gt;project Setup&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYCUVKVAPKGXffGFTmZlX7_Jqn3DjroQKSO-f6LsrnhUeP9tWsUhHYKF3bU8n5Sz2eBPM0JuhW256L6uClihQdCa-XHRJ_fCRBSetkew4s65ri8G9i096H2htzNZb5byRiu3dNWQ/s1600/sse-test-automation+demo.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="722" data-original-width="1321" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYCUVKVAPKGXffGFTmZlX7_Jqn3DjroQKSO-f6LsrnhUeP9tWsUhHYKF3bU8n5Sz2eBPM0JuhW256L6uClihQdCa-XHRJ_fCRBSetkew4s65ri8G9i096H2htzNZb5byRiu3dNWQ/s400/sse-test-automation+demo.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This module automates three activities together&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;a)&lt;/b&gt; client subscription for SSE connection,&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;b)&lt;/b&gt; triggering message on the server, and&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;b style="font-family: Verdana, sans-serif;"&gt;c)&lt;/b&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt; asserting if the client has received the published events.&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;sse-test-automation project is the key of part of this repository, because that's the whole purpose of creating this repository to talk about SSE automation testing.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;Assertions&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;As soon as client receives a message, in ClientEventHandler class, onMessage method gets called and there I am adding the message data received in the HashMap.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;and then i have written a public method which returns&amp;nbsp;size of the map.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;See this code of file &lt;a href="https://github.com/BeTheCodeWithYou/Spring-Boot-SSE/blob/master/sse-test-automation/src/test/resources/event_publish.json"&gt;event_publish.json&lt;/a&gt;, how assertions is achieved.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;b style="color: blue; font-family: Verdana, sans-serif;"&gt;Creating multiple Clients for SEE connection&lt;/b&gt;&lt;span style="color: blue; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; color: #24292e; font-size: 16px; margin-bottom: 16px;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This is achieve with the help of ZeroCode framework, which allows to create parallel threads. Refer to file&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: , &amp;quot;blinkmacsystemfont&amp;quot; , &amp;quot;segoe ui&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif , &amp;quot;apple color emoji&amp;quot; , &amp;quot;segoe ui emoji&amp;quot; , &amp;quot;segoe ui symbol&amp;quot;; font-weight: 600;"&gt;&lt;a href="https://github.com/BeTheCodeWithYou/Spring-Boot-SSE/blob/master/sse-test-automation/src/test/resources/parallel_load.properties"&gt;parallel_load.properties&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; margin-bottom: 16px;"&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;number.of.threads=3&amp;nbsp; ( to launch 2 clients and 1 server thread )&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; margin-bottom: 16px;"&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;ramp.up.period.in.seconds=5&amp;nbsp; ( launch these 3 thread in gap of 5 seconds )&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; margin-bottom: 16px;"&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;l&lt;/span&gt;&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;oop.count=1 ( do it once, so you will have total 3 threads )&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; margin-bottom: 16px;"&gt;
&lt;b style="color: blue; font-family: Verdana, sans-serif;"&gt;How to RUN&lt;/b&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; margin-bottom: 16px;"&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;I have created a TestSuite class, which does everything for us!!&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; margin-bottom: 16px;"&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;It reads the paralle_load.properties and then create client 1 which&amp;nbsp;&lt;/span&gt;&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;connects to the server over SSE.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; margin-bottom: 16px;"&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;It then creates another client, client 2 which connects to server over SSE.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; margin-bottom: 16px;"&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;It then push message on the server side by calling REST end point.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; margin-bottom: 16px;"&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Refer code here&amp;nbsp; for&amp;nbsp;&lt;/span&gt;&lt;a href="https://github.com/BeTheCodeWithYou/Spring-Boot-SSE/blob/master/sse-test-automation/src/test/java/com/xp/ssetest/TestSuite.java" style="font-family: Verdana, sans-serif;"&gt;TestSuite.java&lt;/a&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; margin-bottom: 16px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="background-color: white; box-sizing: border-box; margin-bottom: 16px;"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Yi-8Kl30I1YNFSe8xp8NXy6ilTi3FcCFkAg5qZuhZZpDd7K_L9ZvQnxqfDnVOqMFgSzSexlFtYDOteL9dm_7BxSf1Cf9pgJk8u8qjeBvi915rtReROAY3fcSKEPvm73bTgXF-g/s1600/running+demo.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="722" data-original-width="1321" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Yi-8Kl30I1YNFSe8xp8NXy6ilTi3FcCFkAg5qZuhZZpDd7K_L9ZvQnxqfDnVOqMFgSzSexlFtYDOteL9dm_7BxSf1Cf9pgJk8u8qjeBvi915rtReROAY3fcSKEPvm73bTgXF-g/s400/running+demo.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="color: #24292e; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNGfFUmMPesWrMNMiFGShnExe6AXEfy3wBMcgXuj-zUPyFwXHHTb5TMKemJxFVgCv6tt98ClME-9GZee7CD6icg7MvnDz4c2I2YqQ-p_qjiarEaNuK-VR5LCBCVI3vO-V-vjbqYA/s72-c/running+demo.gif" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Kotlin dev - Spring Boot REST API with Kotlin</title><link>http://extremeportal.blogspot.com/2018/11/kotlin-dev-spring-boot-rest-api-with.html</link><author>noreply@blogger.com ({ Neeraj : Sidhaye })</author><pubDate>Sun, 11 Nov 2018 01:05:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-1032797721671182222</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Let's talk about Kotlin in this article. I have been reading on Kotlin since last few weeks, so wanted to code in Kotlin to actually feel the difference in compared to java code.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Finally, developed a very simple REST API in Kotlin with Spring Boot + Spring Data + H2 in memory DB.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Kotlin and Spring Boot play well together.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;You will also notice in the Code Walk through section that, there is NO controller, NO service class in the project!! That's magic of spring's &lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;@&lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;RepositoryRestResource. I explained below in details.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;I will try to write down my notes, on what I have learnt so far in Kotlin as on day 0.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;I have no experience&amp;nbsp;on Kotlin but what I read and looked into the Kotlin code on github projects, this is definitely to practice on.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;An obvious question, you would ask is, Why Kotlin?&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;In short,&lt;/span&gt;&lt;br /&gt;
&lt;b style="font-family: Verdana, sans-serif;"&gt;&lt;span style="color: blue;"&gt;Why Kotlin &lt;/span&gt;-&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Kotlin compiles to bytecode, so it can perform just as well as Java.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;More succinct than Java.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Kotlin's Data classes are clearly more concise than Java's value classes.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Classes are final by default which corresponds&amp;nbsp;to Effective Java Item 17. You would need to explicitly put &lt;b&gt;open &lt;/b&gt;if you want to make class&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;inheritable.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Abstract classes are open by default.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;One of Kotlin’s key features is null-safety - which cleanly deals with null values at compile time rather than bumping into the famous NullPointerException at runtime.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Primary constructor vs. secondary constructors. If you need more than one constructor then only you would go for secondary otherwise most of the Kotlin class would have primary constructor.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Kotlin can also be used as a scripting language.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Kotlin and Java are inter-operable, so it's easy to do a trial of Kotlin on just a small part of your codebase.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Kotlin uses aggressive type inference to determine the types of values and expressions for which type has been left unstated. This reduces language verbosity relative to Java.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Kotlin is fully supported by Google for use with their Android operating system.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Two points below, reference from Wiki:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;According to Jetbrains blog, Kotlin is used by Amazon Web Services, Pinterest, Coursera, Netflix, Uber, and others. Corda, a distributed ledger developed by a consortium of well-known banks (such as Goldman Sachs, Wells Fargo, J.P. Morgan, Deutsche Bank, UBS, HSBC, BNP Paribas, Société Générale), has over 90% Kotlin in its codebase.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;According to Google, Kotlin has already been adopted by several major developers — Expedia, Flipboard, Pinterest, Square, and others — for their Android production apps.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;b style="font-family: Verdana, sans-serif; font-size: x-large;"&gt;&lt;span style="color: blue;"&gt;Code walk through&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Project code is on my&lt;b&gt; &lt;a href="https://github.com/BeTheCodeWithYou/SpringBoot-Kotlin" target="_blank"&gt;Kotlin Github Repo&lt;/a&gt;&lt;/b&gt;&amp;nbsp;, which is a simple REST API using Kotlin and Spring Boot&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Clone &lt;/b&gt;-&amp;nbsp;https://github.com/BeTheCodeWithYou/SpringBoot-Kotlin.git&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Kotlin&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Spring Boot&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Spring Data&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;H2 in-memory DB&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Gradle&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif; font-size: large;"&gt;&lt;b&gt;&lt;u&gt;Understanding build.gradle&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif; font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif; font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcpaNCmuLMe07EdKkEBdFArLdUCIOPcFb_DG3C2wX7Jkos1EeGKvFLqdM2MA7a_iR3eCjQ4iwbHPvQ2KbqnAtAxvizQGD3-wueLxhmBuexjdSl47oSPPAkxWIJTLdC9aTR_wp5xQ/s1600/gradle+build-+1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="327" data-original-width="703" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcpaNCmuLMe07EdKkEBdFArLdUCIOPcFb_DG3C2wX7Jkos1EeGKvFLqdM2MA7a_iR3eCjQ4iwbHPvQ2KbqnAtAxvizQGD3-wueLxhmBuexjdSl47oSPPAkxWIJTLdC9aTR_wp5xQ/s400/gradle+build-+1.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: Verdana, sans-serif; font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 14px;"&gt;&lt;b&gt;org.jetbrains.kotlin:kotlin-gradle-plugin&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="background-color: #efefef; color: #333333; font-size: 14px;"&gt;&amp;nbsp;-&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="background-color: white; color: #333333; font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="background-color: white; color: #333333; font-size: 14px;"&gt;compiles Kotlin sources and modules.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="background-color: white; color: #333333; font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;org.jetbrains.kotlin:kotlin-allopen&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;This is interesting part here. In Kotlin, by default&amp;nbsp;all classes are&lt;span style="background-color: white;"&gt; &lt;b&gt;final&lt;/b&gt;&lt;/span&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Now, in order to make a class inheritable, you have to annotate with open keyword.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;And the problem is, lot of other libraries like Spring, test libraries ( Mockito etc ) requires classes and methods to be non-final. In Spring, such classes mainly to include @Configuration classes and @Bean methods.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Rule is simple, you need to annotate @Configuration&amp;nbsp;and @Bean methods to mark them open but this approach is tedious and error-prone, hence Kotlin has come up with compiler plugin to automate this process through this dependency.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;b style="font-family: Verdana, sans-serif;"&gt;org.jetbrains.kotlin:kotlin-noarg&amp;nbsp; &lt;/b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;and&lt;/span&gt;&lt;b style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;b style="font-family: Verdana, sans-serif;"&gt;apply plugin: 'kotlin-jpa'&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;In order to be able to use Kotlin immutable classes, we need to enable Kotlin JPA plugin. It will generate no-arg constructors for any class annotated with @Entity&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;apply plugin: 'kotlin'&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;To target the JVM, kotlin plugin needs to be applied.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;apply plugin: 'kotlin-spring'&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Required for Spring Kotlin integration&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;b style="font-family: Verdana, sans-serif;"&gt;Compiler options&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="background-color: white; color: #24292e; font-family: Verdana, sans-serif;"&gt;Spring nullability annotations provide null-safety for the whole Spring Framework API to Kotlin developers, with the advantage of dealing with null related issues at compile time and t&lt;/span&gt;&lt;span style="background-color: white; color: #24292e; font-family: Verdana, sans-serif;"&gt;his feature can be enabled by adding the -Xjsr305 compiler flag with the strict options.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #24292e; font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;and also, configures&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: #24292e; font-size: 16px;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Kotlin compiler to generate Java 8 bytecode.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #666666; font-family: Verdana, sans-serif;"&gt;compileKotlin {&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #666666; font-family: Verdana, sans-serif;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;kotlinOptions {&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #666666; font-family: Verdana, sans-serif;"&gt;&lt;span style="white-space: pre;"&gt;  &lt;/span&gt;freeCompilerArgs = ["-Xjsr305=strict"]&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #666666; font-family: Verdana, sans-serif;"&gt;&lt;span style="white-space: pre;"&gt;  &lt;/span&gt;jvmTarget = "1.8"&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #666666; font-family: Verdana, sans-serif;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #666666; font-family: Verdana, sans-serif;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;b style="color: #24292e; font-family: Verdana, sans-serif;"&gt;compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")&lt;/b&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #24292e; font-size: 16px;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Is the Java 8 variant of Kotlin standard library&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: white;"&gt;&lt;span style="color: #24292e; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;b&gt;compile('com.fasterxml.jackson.module:jackson-module-kotlin')&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white;"&gt;&lt;span style="color: #24292e; font-family: Verdana, sans-serif;"&gt;Adds support for serialization/deserialization of Kotlin classes and data classes.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white;"&gt;&lt;span style="color: #24292e; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="background-color: white;"&gt;&lt;span style="color: #24292e; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;b&gt;compile("org.jetbrains.kotlin:kotlin-reflect")&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #24292e; font-size: 16px;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Is Kotlin reflection library&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #24292e; font-size: 16px;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="background-color: white; color: #24292e; font-size: 16px;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Spring Boot Gradle plugin automatically uses the Kotlin version declared on the Kotlin Gradle plugin, hence the version is not defined explicitly on the dependencies section.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #24292e; font-size: 16px;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="background-color: white; color: #24292e; font-size: 16px;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;All remaining entries are self explanatory.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h4 id="user-content-dependencies" style="background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; line-height: 1.25; margin-bottom: 16px; margin-top: 24px;"&gt;
&lt;b style="background-color: transparent; font-family: Verdana, sans-serif; font-size: x-large;"&gt;&lt;u&gt;Kotlin Coding&lt;/u&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Spring Boot Application&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;/src/main/kotlin/&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; com.xp.springboot.kotlin.SpringBootKotlinRestApiApplication.kt&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Notice that, missing&amp;nbsp;semicolon.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;You need open and close braces of class only if you have @Bean otherwise just a class with name is required.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;runapplication is a top level function.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMjUYrpe71wbR8d7QDCwvnO9Tsdbky2XyXMbVWGgFRN3-Mq6oiVnJ1cP-Fgk0BN2VvnSzAKxsuAw1JPouzRS5daIvc2K2MUZojTBYLKVQJN7iI1dRMzQ6pq7qY8KNtp52xWx6zOA/s1600/spring+boot+main+application.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="465" data-original-width="831" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMjUYrpe71wbR8d7QDCwvnO9Tsdbky2XyXMbVWGgFRN3-Mq6oiVnJ1cP-Fgk0BN2VvnSzAKxsuAw1JPouzRS5daIvc2K2MUZojTBYLKVQJN7iI1dRMzQ6pq7qY8KNtp52xWx6zOA/s400/spring+boot+main+application.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Creating Data Class&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Then we create our model by using Kotlin data classes which are designed to hold data and automatically provide equals(), hashCode(), toString(), componentN() functions and copy().&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Also, you could define multiple entities in the same data class.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;var&lt;/b&gt; is like general variable and its known as a mutable variable in kotlin and can be assigned multiple times.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;There is another type&amp;nbsp;&lt;b&gt;val,&amp;nbsp;&lt;/b&gt;is like constant variable and its known as immutable in kotlin and can be initialized only single time and moreover, val is read-only and you are not allowed to explicitly&amp;nbsp;write to val.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXtYuwYRX14CBgs3kx_sXu16lk3pl6Bt1tx9GrvxVykswYh8R3m7VFcjxMnwhxnawjaEMXZYCixTm5X-tJXEjszY6wZok-wTGnuwv5iM2pQTZjkaIdIgyPbhlKrZMUc2DuqK09NA/s1600/data+class.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="536" data-original-width="539" height="397" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXtYuwYRX14CBgs3kx_sXu16lk3pl6Bt1tx9GrvxVykswYh8R3m7VFcjxMnwhxnawjaEMXZYCixTm5X-tJXEjszY6wZok-wTGnuwv5iM2pQTZjkaIdIgyPbhlKrZMUc2DuqK09NA/s400/data+class.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Creating a Repository&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Yes, just the one liner to define repository interface with spring data curd repository.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;The interesting spring annotation here is RepositoryRestResource.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;This comes by adding&amp;nbsp;&lt;b&gt;spring-boot-starter-data-rest &lt;/b&gt;dependency.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-iIoVDz0FVsVWzKWDW-lmY2o4wkYfv5hIutZMDeEKUguoQGtbNXq2v3pEsq6titBQA73uZPye7PYFwxA77b-CRCZ_ZVkuhI-JBYDoNq7Vo9BMtKxIAAcNo0kxZBUirQEcNQPiCg/s1600/repository.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="144" data-original-width="712" height="80" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-iIoVDz0FVsVWzKWDW-lmY2o4wkYfv5hIutZMDeEKUguoQGtbNXq2v3pEsq6titBQA73uZPye7PYFwxA77b-CRCZ_ZVkuhI-JBYDoNq7Vo9BMtKxIAAcNo0kxZBUirQEcNQPiCg/s400/repository.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;If you would have noticed, &lt;b&gt;there is NO Controller , NO Service&lt;/b&gt; and this project is exposing below REST endpoints with HATEOAS enabled.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;GET - http://localhost:8080/parkrun/runners&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;POST - http://localhost:8080/parkrun/runners&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;GET - http://localhost:8080/parkrun/runners/2&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;DELETE - http://localhost:8080/parkrun/runners/1&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;It's the magic of @&lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;RepositoryRestResource.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Apply&amp;nbsp;&lt;b&gt;collectionResourceRel &lt;/b&gt;to define custom resource label else annotation will use default as per the model class name ( /parkRunners ).&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;At runtime, Spring Data REST &lt;/b&gt;will create an implementation of this interface automatically. Then it will use the @RepositoryRestResource annotation to direct Spring MVC to create RESTful endpoints at /parkRunners.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif; font-size: large;"&gt;&lt;b&gt;Running the Application&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Once you have the jar ready after gradle clean bulid. Just run the app using&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;java -jar&amp;nbsp;SpringBootKotlinRestAPI-0.0.1-SNAPSHOT.jar&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;and hit the below url&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="background-color: #fafafa; white-space: pre-wrap;"&gt;http://localhost:8080/parkrun&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="background-color: #fafafa; font-size: 12px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 12px; white-space: pre-wrap;"&gt;&lt;b&gt;Response:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 12px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 12px; white-space: pre-wrap;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 12px; white-space: pre-wrap;"&gt;&amp;nbsp; &amp;nbsp; "_links": {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 12px; white-space: pre-wrap;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "runners": {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 12px; white-space: pre-wrap;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "href": "http://localhost:8080/parkrun/runners"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 12px; white-space: pre-wrap;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 12px; white-space: pre-wrap;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "profile": {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 12px; white-space: pre-wrap;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "href": "http://localhost:8080/parkrun/profile"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 12px; white-space: pre-wrap;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 12px; white-space: pre-wrap;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="background-color: #fafafa; font-size: 12px; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 12px; white-space: pre-wrap;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Hit the url&amp;nbsp;&lt;/span&gt;&lt;span style="color: #505050; font-family: Verdana, sans-serif; white-space: pre-wrap;"&gt;http://localhost:8080/parkrun/runners&lt;/span&gt;&lt;span style="color: #505050; font-family: Verdana, sans-serif; font-size: 12px; white-space: pre-wrap;"&gt; on GET&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif; font-size: 12px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif; font-size: 12px; white-space: pre-wrap;"&gt;&lt;b&gt;Response:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif; font-size: 12px; white-space: pre-wrap;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif; font-size: 12px; white-space: pre-wrap;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: 12px; white-space: pre-wrap;"&gt;&lt;b&gt;{
    "_embedded": {
        "runners": [
            {
                "firstName": "NEERAJ",
                "lastName": "SIDHAYE",
                "gender": "M",
                "runningClub": "RUNWAY",
                "totalRuns": "170",
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/parkrun/runners/1"
                    },
                    "parkRunner": {
                        "href": "http://localhost:8080/parkrun/runners/1"
                    }
                }
            }
        ]
    },
    "_links": {
        "self": {
            "href": "http://localhost:8080/parkrun/runners"
        },
        "profile": {
            "href": "http://localhost:8080/parkrun/profile/runners"
        }
    }
}&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Hit the profile url and see what you get&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: #fafafa; color: #505050; white-space: pre-wrap;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;http://localhost:8080/parkrun/profile/runners&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #fafafa; color: #505050; white-space: pre-wrap;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="background-color: #fafafa; white-space: pre-wrap;"&gt;&lt;span style="color: #505050; font-family: Verdana, sans-serif;"&gt;{
    "alps": {
        "version": "1.0",
        "descriptors": [
            {
                "id": "parkRunner-representation",
                "href": "http://localhost:8080/parkrun/profile/runners",
                "descriptors": [
                    {
                        "name": "firstName",
                        "type": "SEMANTIC"
                    },
                    {
                        "name": "lastName",
                        "type": "SEMANTIC"
                    },
                    {
                        "name": "gender",
                        "type": "SEMANTIC"
                    },
                    {
                        "name": "runningClub",
                        "type": "SEMANTIC"
                    },
                    {
                        "name": "totalRuns",
                        "type": "SEMANTIC"
                    }
                ]
            },
            {
                "id": "get-runners",
                "name": "runners",
                "type": "SAFE",
                "rt": "#parkRunner-representation"
            },
            {
                "id": "create-runners",
                "name": "runners",
                "type": "UNSAFE",
                "rt": "#parkRunner-representation"
            },
            {
                "id": "patch-parkRunner",
                "name": "parkRunner",
                "type": "UNSAFE",
                "rt": "#parkRunner-representation"
            },
            {
                "id": "get-parkRunner",
                "name": "parkRunner",
                "type": "SAFE",
                "rt": "#parkRunner-representation"
            },
            {
                "id": "delete-parkRunner",
                "name": "parkRunner",
                "type": "IDEMPOTENT",
                "rt": "#parkRunner-representation"
            },
            {
                "id": "update-parkRunner",
                "name": "parkRunner",
                "type": "IDEMPOTENT",
                "rt": "#parkRunner-representation"
            }
        ]
    }
}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcpaNCmuLMe07EdKkEBdFArLdUCIOPcFb_DG3C2wX7Jkos1EeGKvFLqdM2MA7a_iR3eCjQ4iwbHPvQ2KbqnAtAxvizQGD3-wueLxhmBuexjdSl47oSPPAkxWIJTLdC9aTR_wp5xQ/s72-c/gradle+build-+1.PNG" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>SonarCloud Integration with SpringBoot-Maven</title><link>http://extremeportal.blogspot.com/2018/11/sonarcloud-integration-with-springboot.html</link><author>noreply@blogger.com ({ Neeraj : Sidhaye })</author><pubDate>Sun, 4 Nov 2018 04:38:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-898680266778703270</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;In this article, I am writing up detailed steps on how you scan your code&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;with SonarCloud by running maven sonar locally.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;It's a very important phase, where we should configure sonar quality gates at very early stage of the development, so as to eliminate last time surprises!&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;More importantly, the point is, if you do sonar configuration at later stage then&amp;nbsp; fixing sonar issues becomes more complex due to high code density and then you will have to perform more regression and integration tests to make sure that sonar fixes are not breaking existing functionalities. Hence, get sonar configured at early stage and FAIL FAST!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Let's get started,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: large;"&gt;1) SonarCloud Configuration&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;This involves below steps,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Creating an organization,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Adding project to your organization,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Generating security token&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Before you being, go to&amp;nbsp;https://sonarcloud.io and&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;create your account.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Once you logged in, follow below steps&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Creating an organization&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;b style="font-family: Verdana, sans-serif;"&gt;A)&amp;nbsp;&lt;/b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; On the top right, click on the + icon and select "Create New Organization"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;B)&lt;/b&gt;&amp;nbsp; You will see screen as below, fill up the details and click "continue"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqUp-nEJF2iLuP_ruGR2lt9W9xtEvdJ4jIW28jGXmwsgEDXHEbfgRl7xKwWdYdCnk9ai8PzmUCu5kZY0WY6nN-6Az2btChz9aptW0tmPiwnb7sjKu0gMdcerXxnKpqObjHVMx5aQ/s1600/sonarQube-CreateOrg-Step1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="690" data-original-width="751" height="294" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqUp-nEJF2iLuP_ruGR2lt9W9xtEvdJ4jIW28jGXmwsgEDXHEbfgRl7xKwWdYdCnk9ai8PzmUCu5kZY0WY6nN-6Az2btChz9aptW0tmPiwnb7sjKu0gMdcerXxnKpqObjHVMx5aQ/s320/sonarQube-CreateOrg-Step1.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;C)&amp;nbsp; &lt;/b&gt;On the next screen, select a free plan and click on "create organization"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;D) &lt;/b&gt;You will see screen as below,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDXAGdXJbrTcChyphenhyphenoWv6W881Q2AxWf1aZrTD682Kl8t6mT9UddDO4bQ85rT8lTL_R_sviadXRcW9EorE7wZNC2AojK7HdBpcFXqH77sExW4USSVghCt8zzACdUsYWYvRmenWTKwxw/s1600/sonarQube-CreateOrg-step3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="547" data-original-width="1337" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDXAGdXJbrTcChyphenhyphenoWv6W881Q2AxWf1aZrTD682Kl8t6mT9UddDO4bQ85rT8lTL_R_sviadXRcW9EorE7wZNC2AojK7HdBpcFXqH77sExW4USSVghCt8zzACdUsYWYvRmenWTKwxw/s320/sonarQube-CreateOrg-step3.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Adding project to your organization,&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;E) &lt;/b&gt;Click on "Create New Project" and on the next screen, you will have two tabs "select repositories" and "create manually"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;you can select your github repository or create project manually.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;If you don't have your github project, that's fine, go ahead with selecting option, "Create Manually" and enter below details and click "Create"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Organization &lt;/b&gt;-&amp;nbsp; &amp;lt;Write org name, which we just created on step 1.B above &amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Project Name&lt;/b&gt; - &amp;lt; any name you like&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Project Key&lt;/b&gt;-&amp;nbsp; &amp;nbsp; &amp;lt; this will be value of groupId.artifactId from your pom.xml &amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;F) &lt;/b&gt;Once you create project into your organization, you will see screen as below.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMeCu5c90Byryi0PoUGbnyYU2Jx4_37BSmuuW4CR1VYDSVHk7Om7gDBHWYEjNMkltBq9MwnTMMazvArPqkp_jdeUDmJG2vdcREZnrTteqL9w97C-X9TmDxQI4J2edp8UkqnyWqgg/s1600/sonarQube-CreateOrg-project-dashboard.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="608" data-original-width="1343" height="144" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMeCu5c90Byryi0PoUGbnyYU2Jx4_37BSmuuW4CR1VYDSVHk7Om7gDBHWYEjNMkltBq9MwnTMMazvArPqkp_jdeUDmJG2vdcREZnrTteqL9w97C-X9TmDxQI4J2edp8UkqnyWqgg/s320/sonarQube-CreateOrg-project-dashboard.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Generating security token&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&amp;nbsp;G)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Click on "Configure Analysis" from above screen, and you will see below&amp;nbsp; screen&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn9l6D1_2rSlmhqO8-j_un-ejV5YME5eXVEPH9tuigKTezrl1vOpfvYG769O2j2bsC3CGQ3C6LjlgbFnRtf82P656r-2F0Mt6HjQrFcwfuo7hkpBWQXwy5Jlv5OsHJPT5PCtrqZQ/s1600/token+generate.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="546" data-original-width="726" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn9l6D1_2rSlmhqO8-j_un-ejV5YME5eXVEPH9tuigKTezrl1vOpfvYG769O2j2bsC3CGQ3C6LjlgbFnRtf82P656r-2F0Mt6HjQrFcwfuo7hkpBWQXwy5Jlv5OsHJPT5PCtrqZQ/s320/token+generate.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&amp;nbsp; H) &lt;/b&gt;Generate&amp;nbsp;the token and then copy your token. On the next screen, you will see option to choose your project language and build technology.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Once you select maven or gradle, it will show your the command to run sonar with maven or gradle, which I have explained in below in "Using the Code" section.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;This ends all your SonarCloud configuration, Let's move next and see how we can generate sonar report on the SonarCloud by running maven on local project.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;2) Using the Code&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Step 1:- Add sonar dependency&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Go to your pom.xml and add the below plugin to enable SonarQube on your project.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;org.sonarsource.scanner.maven&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;sonar-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;3.3.0.603&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;lt;executions&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;execution&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;phase&amp;gt;verify&amp;lt;/phase&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;goals&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;goal&amp;gt;sonar&amp;lt;/goal&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/goals&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/execution&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/executions&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Step 2:- Run below command to scan your code against the SonarCloud Server&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;mvn clean verify -P sonar \&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;-Dsonar.host.url=https://sonarcloud.io \&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;-Dsonar.organization=&amp;lt;organization-name created on step 1.B above&amp;gt; \&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;-&lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Dsonar.login=&amp;lt;token generated on step 1.G above&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Step 3: - Analyze maven output&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;You will see code is compiling and all your test cases running&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3Y60o5LqQY8b2RnTWAbv-4G1xY-04E1o3T6m4ze6SforYI1pSU5VtABuKqMzRNfkby24J5S1NJkK2We3xcdsQ-WsXkQCfElZvzSbzHe9H_gjyNszOiDzzU04Gs_ajFMwUsJ03-A/s1600/mvn-command-output-1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="646" data-original-width="1275" height="162" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3Y60o5LqQY8b2RnTWAbv-4G1xY-04E1o3T6m4ze6SforYI1pSU5VtABuKqMzRNfkby24J5S1NJkK2We3xcdsQ-WsXkQCfElZvzSbzHe9H_gjyNszOiDzzU04Gs_ajFMwUsJ03-A/s320/mvn-command-output-1.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Spring Application starting and running all the integration test cases written using ZeroCode framework.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggm25QosJGulrhPgwU9cKoUR6t0RaM3hufedkmuDahMbgYOtaBMTRFWIO9tWmDD_hw9zrXSc1GOjX8_ayZkpGpQKZO-2g7NQxDodI8SHc6m2ZYQRs9RiDFyzPAN-9x2IDjbLKMAA/s1600/mvn-command-output-2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="579" data-original-width="1471" height="125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggm25QosJGulrhPgwU9cKoUR6t0RaM3hufedkmuDahMbgYOtaBMTRFWIO9tWmDD_hw9zrXSc1GOjX8_ayZkpGpQKZO-2g7NQxDodI8SHc6m2ZYQRs9RiDFyzPAN-9x2IDjbLKMAA/s320/mvn-command-output-2.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;u&gt;All your test cases passed &lt;/u&gt;and now maven sonar plugin doing the magic and scanning your code against sonar rules.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrp6wmz5TKnneUNbn2klkuhld513mfa-kiqq8KdGZv5yiDy0Sv4T0rx6sjkgOqly3tnwu3Orf8SClwx_pDpLzTXRcdRzRvK_2c_7MF5CKiR-8hsja0gxQptc4URBVuQegiv4VQEQ/s1600/mvn-command-output-3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="611" data-original-width="1070" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrp6wmz5TKnneUNbn2klkuhld513mfa-kiqq8KdGZv5yiDy0Sv4T0rx6sjkgOqly3tnwu3Orf8SClwx_pDpLzTXRcdRzRvK_2c_7MF5CKiR-8hsja0gxQptc4URBVuQegiv4VQEQ/s320/mvn-command-output-3.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;You can see in highlighted text that, sonar sensors are running on the code, like &lt;b&gt;JoCoCoSensor&lt;/b&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;checking &lt;b&gt;Vulnerabilities&lt;/b&gt;, Java &lt;b&gt;securitySenor &lt;/b&gt;etc etc.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTRylTe5SrnKcwi3pmLCrA5N19nT4egBbVtPORjP7v4no-1srnKj81YZ8yuBiU4Hcj_nEZ61xHKtcQwgckmNZnYP8G98mqvDXsKsEv6TzZvxok5NXHJK8hXPihdVoDElQVfWY5DA/s1600/mvn-command-output-4.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="794" data-original-width="943" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTRylTe5SrnKcwi3pmLCrA5N19nT4egBbVtPORjP7v4no-1srnKj81YZ8yuBiU4Hcj_nEZ61xHKtcQwgckmNZnYP8G98mqvDXsKsEv6TzZvxok5NXHJK8hXPihdVoDElQVfWY5DA/s320/mvn-command-output-4.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Finally&lt;/b&gt;, you see build is success and you can see the report on the SonarCloud.&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgllEGREPqnncF9OuedpML7Uo0z-b5ufn99FAkSDV4EEeFFC6mJfX6gsrioBFH71ty5HBYK5jvfpVhjnMfIIjX3_JxTkxi1_uBX3mEvjcdEq_9JJCQ3Ve9M2j5xhZO0CJKNwR_OiA/s1600/mvn-command-output-5.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="260" data-original-width="972" height="85" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgllEGREPqnncF9OuedpML7Uo0z-b5ufn99FAkSDV4EEeFFC6mJfX6gsrioBFH71ty5HBYK5jvfpVhjnMfIIjX3_JxTkxi1_uBX3mEvjcdEq_9JJCQ3Ve9M2j5xhZO0CJKNwR_OiA/s320/mvn-command-output-5.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Notice now that, on the SonarCloud, you can see your project is now showing up the code quality metrics.&amp;nbsp; Just refresh your project on SonarCloud and see below metrics.&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheRwZWuTIwmKnFWA9N16M0qCQ96k9udKmiW5ma_uVXan96PApNPhNtvdaXqciqbLf3jH6CtV6sXR3HZyJNQ_i5h_xXEgM_rfheBt3oVvIFLLNnRhK5F0fkBtnKCC3T2p_B_wrO8A/s1600/sonarQube-Report-page1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="546" data-original-width="1345" height="129" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheRwZWuTIwmKnFWA9N16M0qCQ96k9udKmiW5ma_uVXan96PApNPhNtvdaXqciqbLf3jH6CtV6sXR3HZyJNQ_i5h_xXEgM_rfheBt3oVvIFLLNnRhK5F0fkBtnKCC3T2p_B_wrO8A/s320/sonarQube-Report-page1.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Click on the project and look into the details of the reported issues,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Fix issues&lt;/b&gt;, &lt;b&gt;run mvn sonar again on the local &lt;/b&gt;and when you see code is clean, &lt;b&gt;then &lt;/b&gt;you are all good for commit-&amp;gt;push.&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Hope this helps. Leave your thoughts on the comments section.&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqUp-nEJF2iLuP_ruGR2lt9W9xtEvdJ4jIW28jGXmwsgEDXHEbfgRl7xKwWdYdCnk9ai8PzmUCu5kZY0WY6nN-6Az2btChz9aptW0tmPiwnb7sjKu0gMdcerXxnKpqObjHVMx5aQ/s72-c/sonarQube-CreateOrg-Step1.PNG" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Develop ZeroDefect API's with ZeroCode!</title><link>http://extremeportal.blogspot.com/2018/10/develop-zerodefect-apis-with-zerocode.html</link><category>Automate Integration Test</category><category>Spring Boot Rest API</category><category>ZeroCode Integration Test</category><author>noreply@blogger.com ({ Neeraj : Sidhaye })</author><pubDate>Sat, 20 Oct 2018 05:32:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-4930835597371685242</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="background-color: white; color: #111111; font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 14px;"&gt;This post details about how you can configure your mindset and achieve possibility of developing and delivering zero defects API with TDD,&amp;nbsp;Writing and automating Integration Test Cases along with Build pipeline strategy.&lt;/span&gt;&lt;br /&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;In projects, we always talk about code quality, and hence we scan our code against various tools like FindBug, SonarQube, we write unit test cases ( min 80% coverage&amp;nbsp;), we write Integration test cases, we apply profiling and etc etc.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="color: #111111;"&gt;&lt;span style="font-size: 14px;"&gt;We do all this setup, with a GOAL for achieving less number of defects with quality deliverable&amp;nbsp;as much as we could. yeah?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Now, even after having these code quality gates in place, we still find defects, some basics defect which shouldn't be there at all,&amp;nbsp; contract related issues, integration issues, some of due to load/performance, some of due to memory issues and etc etc and It&amp;nbsp;DOES happen!!&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;but WHY? In my experience so far, it may be due to following factors:-&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3 style="background-color: white; color: #ff9900; font-family: &amp;quot;Segoe UI&amp;quot;, Arial, sans-serif; font-size: 19px; font-weight: normal; line-height: 1.4;"&gt;
Problem Statement&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;1)&lt;/strong&gt;&amp;nbsp;Involvement of QA at later stage. Normally they gets on boarded when you see your code integrated and working at least locally&amp;nbsp;and ready to deploy on CIT or SIT,&amp;nbsp;whatever.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;2)&amp;nbsp;&lt;/strong&gt;Less focus on writing Integration Test cases in the BEGINNING.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;3)&lt;/strong&gt;&amp;nbsp;Automation of Integration Test cases.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;4)&amp;nbsp;&lt;/strong&gt;Takes&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;&amp;nbsp;&lt;/strong&gt;time to correct/update integration test cases when defects comes because we introduced integration test cases at later stage!&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;5)&amp;nbsp;&lt;/strong&gt;Load and performance Testing kicks-In at very later stage.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;6)&lt;/strong&gt;&amp;nbsp;Application Profiling kicks-In at later phase when testers reports issues.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;You might have more points to add and in-fact you would have addressed few of them at right time but in general this is what we see happening!&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;In order to find solution of those 6 points listed above, please have a read on the below approach and the framework I have used in sample project code to make it possible. I am sure, you would easily map solutions to above points when you read on below.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3 style="background-color: white; color: #ff9900; font-family: &amp;quot;Segoe UI&amp;quot;, Arial, sans-serif; font-size: 19px; font-weight: normal; line-height: 1.4;"&gt;
Solution Approach - Code &amp;amp; Automate Integration Test Cases&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Once your API’s contract are ready (probably draft is also perfect, because design gets evolve as you move on, so don't wait! )&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="09e2" name="09e2" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;1)&amp;nbsp;&lt;u&gt;Involve QA in the BEGINNING&lt;/u&gt;&lt;/strong&gt;&amp;nbsp;and make them comfortable with API contracts with the same comfort as of Developers.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div id="09e2" name="09e2" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="c2fb" name="c2fb" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;2)&lt;/strong&gt;&amp;nbsp;&lt;u&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;Create Two projects&lt;/strong&gt;&amp;nbsp;&lt;/u&gt;of each API’s.&lt;/span&gt;&lt;/div&gt;
&lt;div id="9997" name="9997" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;&amp;nbsp; &amp;nbsp; a)  "API Build" -&amp;nbsp;&lt;/strong&gt;Project with implementation of API’s contracts practicing TDD with unit tests. Developers own this.&lt;br /&gt;&lt;br /&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;&amp;nbsp; &amp;nbsp; b) "API Integration Test" -&amp;nbsp;&lt;/strong&gt;Project with Integration Test Cases.&lt;/span&gt;&lt;/div&gt;
&lt;div name="9997" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;u&gt;Writing JSON part of this project will be owned by QA&lt;/u&gt;&amp;nbsp;and&amp;nbsp;&lt;u&gt;JAVA part will be owned by developers&lt;/u&gt;,.&lt;/span&gt;&lt;/div&gt;
&lt;div name="9997" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp;You will see below, how QA can contribute in writing up integration test cases from day 1!&lt;/span&gt;&lt;/div&gt;
&lt;div name="9997" style="background-color: white; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="color: #111111;"&gt;&lt;span style="font-size: 14px;"&gt;&amp;nbsp; &amp;nbsp; Java developer will focus on mocking up external API calls and boundaries of the system&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div name="9997" style="background-color: white; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="color: #111111;"&gt;&lt;span style="font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div name="9997" style="background-color: white; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="color: #111111;"&gt;&lt;span style="font-size: 14px;"&gt;( when external api’s or boundary&amp;nbsp;systems are not ready to integrate ).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div name="9997" style="background-color: white; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="color: #111111;"&gt;&lt;span style="font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div name="9997" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp;Later, you will just switch same test cases to run against actual test env of boundary systems/api’s.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div name="9997" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="9db0" name="9db0" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;3)&amp;nbsp;&lt;u&gt;Setup two Jenkins build jobs&lt;/u&gt;&lt;/strong&gt;&amp;nbsp;for each API ( “API Build” and “API integration Test”) because I don’t want my API Build project failure because of API Integration Test project failure hence the separation. Make sense?&lt;/span&gt;&lt;/div&gt;
&lt;div id="9db0" name="9db0" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="cf88" name="cf88" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;4)&lt;/strong&gt;&amp;nbsp;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;&lt;u&gt;Develop both of these projects in parallel&lt;/u&gt;&lt;/strong&gt;&amp;nbsp;- It would be obvious that API Integration Test project will finish sooner with basic integration test cases in place and hence eventually you will end up building TDD on your Jenkins build.&lt;/span&gt;&lt;/div&gt;
&lt;div id="cf88" name="cf88" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="7444" name="7444" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;5)&amp;nbsp;&lt;u&gt;FAIL FAST approach&lt;/u&gt;&amp;nbsp; -&amp;nbsp;&amp;nbsp;&lt;/strong&gt;Schedule ( daily and then later hourly ) Jenkin Builds for API Integration Test project. Initially&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;,&amp;nbsp;&lt;/strong&gt;you will see more failures on API Integration Test projects because “API Build” is still in development mode. Which is what the intention towards FAIL FAST approach!&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div id="7444" name="7444" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="9593" name="9593" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;6)&amp;nbsp;&lt;u&gt;Feel Good&lt;/u&gt;&amp;nbsp;-&amp;nbsp;&lt;/strong&gt;As the “API Build” project development progresses, you will see more tests passing on the “API Integration Tests” project. Feel good about it!&amp;nbsp; YES PLEASE.&lt;/span&gt;&lt;/div&gt;
&lt;div id="9593" name="9593" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="4814" name="4814" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;7)&amp;nbsp;&lt;u&gt;Write Performance Test cases&lt;/u&gt;&amp;nbsp;-&amp;nbsp;&lt;u&gt;&amp;nbsp;&lt;/u&gt;&lt;/strong&gt;The moment you see some comfort on the “API Integration Test” build,&amp;nbsp;Immediately GET&amp;nbsp;your QA involved in writing&amp;nbsp;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;Performance Testing test case scenarios.&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="4814" name="4814" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="c903" name="c903" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;With the framework, I have used in my sample gitgub code, it is very easy to write performance test cases with it's simplest ever form using JSON and yes QA can do it very well and very quickly. They would just need NFR !&lt;/span&gt;&lt;/div&gt;
&lt;div id="c903" name="c903" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="9318" name="9318" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;8) Introduce Integration Test Suites -&amp;nbsp;&lt;/strong&gt;Now, its time to write various Test Suites for testing logically related functionality together and independently.&lt;/span&gt;&lt;/div&gt;
&lt;div name="9318" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Think of creating various test suites, for example -&lt;/span&gt;&lt;/div&gt;
&lt;div name="9318" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div name="9318" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;A) Functionality Based Test Suites -&amp;nbsp;&lt;/strong&gt;something like&amp;nbsp;&lt;u&gt;Verify-ALLGET-Operations-TestSuite&lt;/u&gt;,&amp;nbsp;&lt;u&gt;Verify-ALLPOST-Operations-TestSuites&lt;/u&gt;, OR&amp;nbsp;&lt;u&gt;Verify-AccountCreationJounery-TestSuite&lt;/u&gt;&amp;nbsp;wihch could involve account creation, fetch newly created account details, test 400, 404, 500 cases with account creation journey etc.&lt;/span&gt;&lt;/div&gt;
&lt;div name="9318" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div name="9318" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;B)&amp;nbsp;Performance based Test Suites&lt;/strong&gt;&amp;nbsp;- something like,&amp;nbsp;&lt;u&gt;Verify-GradualLoad-ALLGET-Operations-TestSuite&lt;/u&gt;&amp;nbsp;( increase load gradually with 5 sec gap, 2 sec gap, 0.2 sec gap etc ),&lt;/span&gt;&lt;/div&gt;
&lt;div name="9318" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;u&gt;Verify-ParallelLoad-ALLGET-Operations-TestSuite&lt;/u&gt;&amp;nbsp;( increase load parallel&amp;nbsp;- 100 requests in 100secs i.e. each request in 1 sec gap, looping twice, meaning 200 parallel requests)&lt;/span&gt;&lt;/div&gt;
&lt;div name="9318" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div name="9318" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;9) FAIL-FAST again on Performance Test now! -&amp;nbsp;&amp;nbsp;&lt;/strong&gt;See more failures on API Integration Test project for Load Test Suites.&amp;nbsp; Fix issues on API Build project and reduce failures.&lt;/span&gt;&lt;/div&gt;
&lt;div name="9318" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="9d63" name="9d63" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;10) Feel Good again on Performance Test -&amp;nbsp;&lt;/strong&gt;As you fix issues, you will definitely see more confidence on your application on the performance side.&lt;/span&gt;&lt;/div&gt;
&lt;div id="9d63" name="9d63" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="61ee" name="61ee" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;11)&amp;nbsp;&lt;/strong&gt;Add more and more tests to API Integration Tests project, Fail again, Feel good again, and keep it RUNNING!&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-family: &amp;quot;Segoe UI&amp;quot;, Arial, sans-serif; font-size: 14px; line-height: 1.4;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2 style="background-color: white; color: #ff9900; font-family: &amp;quot;segoe ui&amp;quot;, arial, sans-serif; font-weight: 200; line-height: 1.4; margin: 20px 0px 11px; padding: 0px 0px 10px;"&gt;
&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;&lt;span style="font-size: large;"&gt;Using the code&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;I have explored effective and efficient way of writing integration and performance test cases with an open source framework.&amp;nbsp; Please follow details.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;I have developed a very simple REST API using&amp;nbsp;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;Spring Boot, Spring Data, H2 In-memory DB with Maven.&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Clone&amp;nbsp;sample project from my GitHub account&amp;nbsp;&lt;a href="https://github.com/BeTheCodeWithYou/SpringBoot-ZeroCode-Integration" rel="noopener" style="border: 0px; color: purple; margin: 0px; padding: 0px; text-decoration-line: none;" target="_blank"&gt;https://github.com/BeTheCodeWithYou/SpringBoot-ZeroCode-Integration&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="138a" name="138a" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;clone -&amp;gt;&amp;nbsp;&lt;a href="https://github.com/BeTheCodeWithYou/SpringBoot-ZeroCode-Integration.git" rel="noopener" style="border: 0px; color: purple; margin: 0px; padding: 0px; text-decoration-line: none;" target="_blank"&gt;https://github.com/BeTheCodeWithYou/SpringBoot-ZeroCode-Integration.git&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="441a" name="441a" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="441a" name="441a" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Once you clone, go to your local repo and run below&lt;/span&gt;&lt;/div&gt;
&lt;div id="2c39" name="2c39" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;mvn clean install&lt;/span&gt;&lt;/div&gt;
&lt;div id="2c39" name="2c39" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="0405" name="0405" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;check the test results in /target folder&lt;/span&gt;&lt;/div&gt;
&lt;div id="96cb" name="96cb" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id="96cb" name="96cb" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;u&gt;running the application&lt;/u&gt;&lt;br /&gt;Java -jar SpringbootRestInMemoryDB-1.0.0-SNAPSHOT.jar.jar&lt;/span&gt;&lt;/div&gt;
&lt;h3 name="96cb" style="background-color: white; color: #ff9900; font-size: 19px; font-weight: normal; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Code walk-through&lt;/span&gt;&lt;/h3&gt;
&lt;div name="96cb" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Once you import the project into IDE, it will look like as below. Highlighted once are the integration tests related code. That’s all and easy!&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvZ-r0TTLY1Ki4eiRjGs01nhAcqOyt947j2-b1fxlRHFIKZ29WErZ1RkLoc34GuZUaRkBiHKNjUK4IT2GP0Wm5p8cffVwSvgfzsM9RQAjdIcygkjoldxaTPFF-U7IKP6xGkxyQoA/s1600/project_structure-New.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="703" data-original-width="443" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvZ-r0TTLY1Ki4eiRjGs01nhAcqOyt947j2-b1fxlRHFIKZ29WErZ1RkLoc34GuZUaRkBiHKNjUK4IT2GP0Wm5p8cffVwSvgfzsM9RQAjdIcygkjoldxaTPFF-U7IKP6xGkxyQoA/s320/project_structure-New.JPG" width="201" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;1)&lt;/b&gt; add dependency&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;org.jsmart&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;zerocode-rest-bdd&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;1.2.6&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;refer list of available&amp;nbsp;versions here &lt;a href="https://mvnrepository.com/artifact/org.jsmart/zerocode-rest-bdd" target="_blank"&gt;ZeroCode Maven Central&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div name="1df8" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;2) src/test/java&amp;nbsp; -&amp;nbsp;&lt;/b&gt;Organize integration test cases in faster ever possible way!&lt;/span&gt;&lt;/div&gt;
&lt;div name="1df8" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div name="1df8" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;2.a) /integrationtests -&amp;nbsp;&lt;/b&gt;TestGetOperations.java&lt;/span&gt;&lt;/div&gt;
&lt;div name="1df8" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div name="1df8" style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;As you see below, you just need to provide JSON file location, where the actual test case preset with asserts and this is the JSON, which will be created by QA as I mentioned in point 2.b in the solution approach section above. You will see all the details about @TargetEnv and @RunWith on the github with README.md&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyf7zMZvUEiKG4gWSTtAYg82LkHAXhp5wHbhfMFgQ8HeNQZGiH6LEV68JJUvr56MCk8uW-YqI3IKl2LE1EJrkx7_U8Y_c9Mf7GTPlSU1qU9nElMZKDlZSowydE1Y0puiuBCn-Htw/s1600/integrationtest-GET.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="472" data-original-width="633" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyf7zMZvUEiKG4gWSTtAYg82LkHAXhp5wHbhfMFgQ8HeNQZGiH6LEV68JJUvr56MCk8uW-YqI3IKl2LE1EJrkx7_U8Y_c9Mf7GTPlSU1qU9nElMZKDlZSowydE1Y0puiuBCn-Htw/s320/integrationtest-GET.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="background-color: white; border: 0px; color: #111111; font-size: 14px; margin: 0px; padding: 0px;"&gt;&amp;nbsp;2.b) /testconfig -&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;span style="background-color: white; color: #111111; font-size: 14px;"&gt;Custom class which runs spring app. you will just need to write start method in you spring main class.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="background-color: white; color: #111111; font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="background-color: white; color: #111111; font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYffY5JY82sc3njAqI-1f-3Bj8cMMEnRfkzB6cIL6_B1S56Io2Q-tiaXstbUujyxryM2L-tJ-6WFw8qsTQ9gQzRR7aXv-UoDZnJEuOjeFC5gu2Zx26kvxWIQ-aLwX5ZprHaXWUBg/s1600/E2ERunner.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="427" data-original-width="695" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYffY5JY82sc3njAqI-1f-3Bj8cMMEnRfkzB6cIL6_B1S56Io2Q-tiaXstbUujyxryM2L-tJ-6WFw8qsTQ9gQzRR7aXv-UoDZnJEuOjeFC5gu2Zx26kvxWIQ-aLwX5ZprHaXWUBg/s320/E2ERunner.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="background-color: white; color: #111111; font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="background-color: white; color: #111111; font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 14px;"&gt;Spring main class with start method, being called by E2eJunitRunner above&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="background-color: white; color: #111111; font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6bcPRhsN05DIwlNhjHzFdAlgcEO5fEGn9il2S2jje7PV_i2lxJGJd9pZN1YApyF4u2BKTvoqw8STH5sAkYhYf3Aw0w9nISP2xx71raVYCmO7rvCiwiEOOlVKyxyki1QnftEr4xQ/s1600/spring+main+class.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="559" data-original-width="712" height="251" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6bcPRhsN05DIwlNhjHzFdAlgcEO5fEGn9il2S2jje7PV_i2lxJGJd9pZN1YApyF4u2BKTvoqw8STH5sAkYhYf3Aw0w9nISP2xx71raVYCmO7rvCiwiEOOlVKyxyki1QnftEr4xQ/s320/spring+main+class.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="background-color: white; color: #111111; font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;b&gt;&lt;span style="font-family: &amp;quot;segoe ui&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;2.c) /&amp;nbsp;testsuite -&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This runs the entire test suite i.e. picking all tests under "resources/integration_tests" folder and sub-folders.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp;As you see below, @EnvProperty is very interesting here. It allows you to run your test suite against multiple environments without any code change. All details are on the github with REAME.md file.&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcWVZEVgJ4nK3woX9-06flEbxzaOC9n4P0y8NB762bBRyhfwmMHFS8vHr8UCrnGFYi5RRVb5ryfIPNIWOBGC2Rz-kh4MJMujvBotJG_iYv_fMAB1f2TnwDHJ4rnn7xpqO68VMWSA/s1600/integrationtest+suite.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="545" data-original-width="830" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcWVZEVgJ4nK3woX9-06flEbxzaOC9n4P0y8NB762bBRyhfwmMHFS8vHr8UCrnGFYi5RRVb5ryfIPNIWOBGC2Rz-kh4MJMujvBotJG_iYv_fMAB1f2TnwDHJ4rnn7xpqO68VMWSA/s320/integrationtest+suite.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b style="background-color: white; color: #111111; font-family: Verdana, sans-serif; font-size: 14px;"&gt;3) src/test/resources -&amp;nbsp;&lt;/b&gt;&lt;span style="background-color: white; color: #111111; font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 14px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: #111111; font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 14px;"&gt;Write Test cases in JSON formats for your API end points with assertions.&lt;/span&gt;&lt;span style="background-color: white; color: #111111; font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 14px;"&gt;&amp;nbsp;Plenty of variations available for assertions of the response body, headers, custom response headers etc&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;One sample ( /reintegration_tests/get/get_new_parkrunner_by_parkrunid_test.json ) here from the project looks like this. You can see that request and response body can be re-used very easily.&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKaQPJwJck9bs4u9fEREiNMvWBajY0ue81epTnDjVCWep5XlV-yTWwoARt91htEyszfdY6gpc_pL8gyBsyfzouFEdM9Alx3InPT6WNWo0sM2VqFenvvqkGWSVRbNoVYqwWtfBoJw/s1600/JSON+test+case.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="538" data-original-width="784" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKaQPJwJck9bs4u9fEREiNMvWBajY0ue81epTnDjVCWep5XlV-yTWwoARt91htEyszfdY6gpc_pL8gyBsyfzouFEdM9Alx3InPT6WNWo0sM2VqFenvvqkGWSVRbNoVYqwWtfBoJw/s320/JSON+test+case.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;strong style="background-color: white; border: 0px; color: #111111; font-size: 14px; margin: 0px; padding: 0px;"&gt;4) Reports -&amp;nbsp;&lt;/strong&gt;&lt;span style="background-color: white; color: #111111; font-size: 14px;"&gt;See your test reports from the /target folder. Very interactive reports.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiD0VVq0qG63L-P9OppGYZISzr6HlfMpG-xotQ8xI3PKU6xckSuMwKwDJvj53ZTYup_O85uduvbnMgSSIQoHSFJtOE00pbokMshEu7vp1T9GarnG2bnBLuLmJP40TFQPNg6yMGM0w/s1600/Report+1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="665" data-original-width="1495" height="142" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiD0VVq0qG63L-P9OppGYZISzr6HlfMpG-xotQ8xI3PKU6xckSuMwKwDJvj53ZTYup_O85uduvbnMgSSIQoHSFJtOE00pbokMshEu7vp1T9GarnG2bnBLuLmJP40TFQPNg6yMGM0w/s320/Report+1.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVw5S7NUx7FEMVIW9Bcb7ewpjpjNWsVhfweXPZYapMmR9iD6RuH4O-l6Mw1l0Ojz-VUXhoFEMqKONAJndPiJu9As6h1MatY7q-AdUmCdWbOUXIhYHVDQOk6MM8PQfo5kdDEkN26Q/s1600/report+2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="767" data-original-width="1525" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVw5S7NUx7FEMVIW9Bcb7ewpjpjNWsVhfweXPZYapMmR9iD6RuH4O-l6Mw1l0Ojz-VUXhoFEMqKONAJndPiJu9As6h1MatY7q-AdUmCdWbOUXIhYHVDQOk6MM8PQfo5kdDEkN26Q/s320/report+2.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Thanks for your time and hope you finds this article useful as best practice for developing your API's.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; color: #111111; font-size: 14px; line-height: 1.4;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Feel free to provide comments and suggestions on improving this best practice&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvZ-r0TTLY1Ki4eiRjGs01nhAcqOyt947j2-b1fxlRHFIKZ29WErZ1RkLoc34GuZUaRkBiHKNjUK4IT2GP0Wm5p8cffVwSvgfzsM9RQAjdIcygkjoldxaTPFF-U7IKP6xGkxyQoA/s72-c/project_structure-New.JPG" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></item><item><title>JAVA 8 | Stream Basics</title><link>http://extremeportal.blogspot.com/2018/09/java-8-streams-basics.html</link><author>noreply@blogger.com ({ Neeraj : Sidhaye })</author><pubDate>Sat, 15 Sep 2018 20:20:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-618884631106788592</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Java 8 stream have always been the most exciting concept to understand and apply. I have got a chance to apply streams api's in my project and thoroughly&amp;nbsp;enjoyed it.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This post is about, covering basic streams concepts to the best of my experience. I will try to keep it as simple as possible for easy understanding.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Before we begin on streams, it would be good if we take a look at concept of&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Map , Filter &amp;amp; Reduce &lt;/b&gt;algorithm.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This concept is a generic and not related to java but will help us to understand stream in a much better and quicker way.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Let's understand this algorithm with an example. Again, I always prefer example with my passion&amp;nbsp;being Running! :-)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;So, let's say, we need to find out &lt;u&gt;Average age of Runners older than 40&lt;/u&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;If we solve this scenario with Map, Filter and Reduce algorithm, it will comprises below steps,&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Step 1 -&amp;gt; Mapping&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Creates a List of Runner and Returns a List of Integer.&amp;nbsp; Here, size of the returned list will be same but it will have integer holding Runners Age.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Takes &lt;b&gt;List&amp;lt;Runner&amp;gt;&lt;/b&gt;&amp;nbsp; and returns &lt;b&gt;List&amp;lt;Integer&amp;gt;&amp;nbsp; =&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Resulting List type differs but Size is same.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Step 2 -&amp;gt; Filtering&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Now, you are telling that, filter out List&amp;lt;Integer&amp;gt; which returns only Runner with age greater than 40.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Takes &lt;b&gt;List&amp;lt;Integer&amp;gt;&lt;/b&gt; and returns&amp;nbsp;&lt;b&gt;List&amp;lt;Integer&amp;gt;&lt;/b&gt; =&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Resulting List type same, but size differs after filter is applied.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Step 3 -&amp;gt; Reduce&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;At this step, you will just apply aggregation&amp;nbsp;function ( here Avg ) on the filtered list from step 2.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Takes &lt;b&gt;List&amp;lt;Integer&amp;gt;&amp;nbsp; and returns Average Age &lt;/b&gt;of Runner older than 40.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This is how Streams works internally!&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Let's understand some basics of Streams&lt;/span&gt;&lt;b style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b style="font-family: Verdana, sans-serif;"&gt;What is Stream all about&lt;/b&gt;&lt;br /&gt;
&lt;b style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b style="font-family: Verdana, sans-serif;"&gt;# An Object on which we define operations,&lt;/b&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt; like Map, Filter and Reduce are operations.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;# An Object which does NOT hold any data&lt;/b&gt; and that's the biggest difference between Collection and Stream.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;# An Object that should not change data that it processes.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;when I say, should not, meaning it a rule, one should follow while working with streams. Compiler will never report anything here!&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;# An object which is capable of processing data in &lt;u&gt;one pass&lt;/u&gt;.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Suppose you have stream of Account collection, now while processing this stream, there should not be any intermediary&amp;nbsp;collection created as part of this processing.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;# Is a typed Interface&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;public&amp;nbsp;interface Stream&amp;lt;T&amp;gt; extends BaseStream&amp;lt;T, Stream&amp;lt;T&amp;gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Stream interface can take any of type of data for streaming, it could be stream of String, Integer, Customer etc etc.&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b style="font-family: Verdana, sans-serif;"&gt;# Efficient data Processing - Large or small amount of data&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Efficiently&amp;nbsp;process data - in Parallel and in Pipelined ( avoiding intermediary&amp;nbsp;computations ).&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class="line number1 index0 alt2" style="background: none white !important; border-radius: 0px !important; border: 0px !important; bottom: auto !important; box-sizing: content-box !important; color: #cccccc; float: none !important; font-family: Consolas, &amp;quot;Bitstream Vera Sans Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 14.85px; height: auto !important; left: auto !important; line-height: 1.1em !important; margin: 0px !important; min-height: auto !important; outline: 0px !important; overflow: visible !important; padding: 0px 1em !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; white-space: pre !important; width: auto !important;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;public class StreamBasic {&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; public static void main(String ... args) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp;//Creating Stream of Strings&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; Stream&amp;lt;String&amp;gt; stream = Stream.of("Sprint", "TempoRun", "NegativeSplit", "LongRun", "Intervals"); // MAP&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; //Prints all elements of Streams&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; /*stream.forEach( s -&amp;gt; System.out.println(s));*/&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; // Applied Predicate with only string lenght &amp;gt; 10&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; Predicate&amp;lt;String&amp;gt; p = s&amp;nbsp; -&amp;gt; s.length() &amp;gt; 10;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; //filter strings greater than of lenght 10*/&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; /*stream&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.filter(p)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.forEach(System.out::println);&amp;nbsp; */&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; List&amp;lt;String&amp;gt; runTypes = new ArrayList&amp;lt;&amp;gt;();&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; Predicate&amp;lt;String&amp;gt; p1 = Predicate.isEqual("LongRun");&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; Predicate&amp;lt;String&amp;gt; p2 = Predicate.isEqual("TempoRun");&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; //Prints only elements from stream when p1 or p2 is present&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;/*&amp;nbsp; stream&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .filter(p1.or(p2))&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .forEach(s -&amp;gt; System.out.println(s)); */&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; /*prints stream elements using Peek method and then applying filter with only p1 or p2 predicates and finally adding result to the list*/&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; stream&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.peek(System.out::println)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.filter(p1.or(p2))&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.forEach(runTypes::add);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; System.out.println("List size=&amp;gt;"+runTypes.size());&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: blue; font-family: verdana, sans-serif;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;You would have noticed that there is only one stream can operate at a time, so if you have two streams in operation ( say, two streams.filter statement ) then you will get a runtime error as below&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Exception in thread "main" java.lang.IllegalStateException:&lt;/b&gt; &lt;span style="color: red;"&gt;stream has already been operated upon or closed&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Java 8 - Auto closure of resource stream</title><link>http://extremeportal.blogspot.com/2018/09/java-8-auto-closure-of-resource-stream.html</link><author>noreply@blogger.com ({ Neeraj : Sidhaye })</author><pubDate>Sun, 9 Sep 2018 20:11:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-879637192555112477</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Java 8 at it's best! Yes and handles memory&amp;nbsp;leaks scenarios very effectively.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Memory leaks&amp;nbsp;scenarios should be handled by programmer very carefully and here java 8 comes to rescue for taking care some of scenario out of the box.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Before I begin, let me quickly put short note on what is referred to as memory leak in a java application.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Memory leak is scenario in which garbage collector is not able to release objects. You would think what are these objects would be, yeah?!&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;so, such object are those objects which are created by the application and not in use by the application but are being referenced from the code!&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Yes, such objects eats up memory and hence leads to out of memory error because&amp;nbsp;GC won't be able to release them because&amp;nbsp;of their reference.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;I will try to cover Memory Leak in detail on my other post, so for now, let's proceed&amp;nbsp;with how java 8 handles few of the memory leak scenario&amp;nbsp;out of the box.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Consider a scenario when you are reading large text file by opening a connection to URL and reading contents over inputstream.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Below code sample, leads to memory leak because buffered reader is never closed.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs8HoRk0P3SAqivje6NRGPM8WMFSCSfAt7sXgI8hIQRWp9k5wPxpfAs8hZqolrBtSAtBBV0rV9gTY_czklDlkpne8OL_CAYiJ1VExPLuKpcr_o3LbyO5lYBaz1-OuUrNfnxAyN1Q/s1600/uclosedStreams.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="521" data-original-width="1108" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs8HoRk0P3SAqivje6NRGPM8WMFSCSfAt7sXgI8hIQRWp9k5wPxpfAs8hZqolrBtSAtBBV0rV9gTY_czklDlkpne8OL_CAYiJ1VExPLuKpcr_o3LbyO5lYBaz1-OuUrNfnxAyN1Q/s400/uclosedStreams.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Java 8, comes to rescue and provides capability to auto closure&amp;nbsp;of steams.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;see the modified version of above code with java 8.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ8H-7rjkujLM0cy3O9orbOhD53QLakrPMn7kHGfSpz4F7IQqLOyweniFvoHJ0IVpap1SXQrKGO637sCRQyMOIAejrJkhdbTinMqyDZSc7zhTkBkdY5Fg3PMjmcggcxS1f36SvMQ/s1600/java8-autoclosurestream.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="684" data-original-width="1108" height="246" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ8H-7rjkujLM0cy3O9orbOhD53QLakrPMn7kHGfSpz4F7IQqLOyweniFvoHJ0IVpap1SXQrKGO637sCRQyMOIAejrJkhdbTinMqyDZSc7zhTkBkdY5Fg3PMjmcggcxS1f36SvMQ/s400/java8-autoclosurestream.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs8HoRk0P3SAqivje6NRGPM8WMFSCSfAt7sXgI8hIQRWp9k5wPxpfAs8hZqolrBtSAtBBV0rV9gTY_czklDlkpne8OL_CAYiJ1VExPLuKpcr_o3LbyO5lYBaz1-OuUrNfnxAyN1Q/s72-c/uclosedStreams.JPG" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Functional Interface</title><link>http://extremeportal.blogspot.com/2018/09/functional-interface.html</link><author>noreply@blogger.com ({ Neeraj : Sidhaye })</author><pubDate>Sun, 9 Sep 2018 17:02:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-5468984179854621322</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Functional interface as concept is not new to java 8! It was there with earlier java version as well.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Any interface with only single abstract method is called Functional Interface. Yes!&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;We already have such functional interface available like Runnable, Comparator , Callable and few others. All these interfaces have exactly one abstract method, hence they all are functional interface.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Now, in JAVA 8&lt;/b&gt;, functional interface is enhanced and made it more powerful along with Lambda expression.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;In short, Lambda expression is&amp;nbsp; &amp;nbsp;&lt;b&gt;(param list ) - &amp;gt; method body&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;There are new functional interfaces have been introduced in java 8.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;java.util.function&amp;nbsp; a new package introduced in java 8.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This package has multiple&amp;nbsp;functional interfaces for various scenario usage.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;functional interface can provide target type in multiple context, such as assignment context, method invocation and cast context.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;stream.filter(e -&amp;gt; e.getSize(0) &amp;gt; 10 );&amp;nbsp; // method invocation&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Predicate&amp;lt;String&amp;gt; pre = String::isEmpty; // assignment context&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;stream.map((ToIntFunction) e -&amp;gt; e.getSize())&amp;nbsp; &amp;nbsp;// cast context&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>MDB vs JMS listener</title><link>http://extremeportal.blogspot.com/2017/04/mdb-vs-jms-listener.html</link><category>JMS Listener</category><category>MDB</category><author>noreply@blogger.com ({ Neeraj : Sidhaye })</author><pubDate>Thu, 20 Apr 2017 21:32:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-256039523304160163</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Notes around MDB ( Message Driven Bean) vs Standard JMS listener, and their advantages and limitations around concurrency, scalability etc.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: orange; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;u&gt;Concurrency&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;JMS Listener&lt;/b&gt; -&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 12pt; line-height: 115%; text-indent: -0.25in;"&gt;JMS has NO built-in mechanism to handle
more than one incoming request at a time. Meaning that, if you have JMS listener which is listening a queue, where loads of messages coming in, then your JMS listener will consume one message at a time, which results in picking up messages one by one, which might cause message piling up on queue!&lt;/span&gt;&lt;br /&gt;
&lt;div class="MsoListParagraph" style="mso-list: l0 level1 lfo1; text-indent: -.25in;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , &amp;quot;sans-serif&amp;quot;; font-size: 12.0pt; line-height: 115%;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;MDB &lt;/b&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 12pt; line-height: 115%; text-indent: -0.25in;"&gt;The main advantage that MDBs have over
simple JMS message consumers is that the EJB container can instantiate multiple
MDB instances to handle multiple messages simultaneously.&lt;/span&gt;&lt;br /&gt;
&lt;div class="MsoListParagraph" style="mso-list: l0 level1 lfo1; text-indent: -.25in;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , &amp;quot;sans-serif&amp;quot;; font-size: 12.0pt; line-height: 115%;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Now, in order to &lt;b&gt;handle concurrently in JMS listener&lt;/b&gt; you have two options:-&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;a)&lt;/b&gt; Dynamic scaling of JMS listener by spawning multiple threads for JMS listener via configuration.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This can be done by adding property&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;concurrency="15-40"&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;to &lt;b&gt;&amp;lt;jms:listener&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;-container&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This sets concurrentConsumer to 15 and maxConcurrentConsumer to 40 in the properties of DefalutMessagingListenerContainer ( DMLC ) of Spring.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 12pt;"&gt;Above configuration instructs DMLC to always start up a minimum of 15 consumers. When a new message
has been received, if the maxConcurrentConsumers has not been reached and the
value of the idleConsumerLimit property has not been reached, then a new
consumer is created to process the message.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 12pt;"&gt;This behavior from the DMLC
continues up to the limit set by the maxConcurrentConsumers property. When no
messages are being received and the consumers become idle, the number of
consumers is automatically decreased&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;b)&lt;/b&gt; Deploy JMS listener on multiple JVM instances.This allows multiple consumers listening to queue.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;span style="color: red;"&gt;IMP Note-&amp;gt;&lt;/span&gt;&amp;nbsp;One should NOT increase number of concurrent consumers for a JMS topic. This leads to concurrent consumption of same message, which is NOT desirable.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;MDB Limitation&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="MsoListParagraph"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 12pt; line-height: 115%;"&gt;MDB
can be linked to listen from only one queue or topic whereas standard JMS
listener can be linked to listen to multiple queues or topic.&lt;b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoListParagraph"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 12pt; line-height: 115%;"&gt;In order to allow a MDB to listen to multiple queues or topic, you will have to deploy multiple MDB classes.&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoListParagraph"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 12pt; line-height: 115%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoListParagraph"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: 12pt; line-height: 115%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>XA, Non-XA transaction and 2PC Protocol</title><link>http://extremeportal.blogspot.com/2017/03/xa-non-xa-transaction-and-2pc-protocol.html</link><author>noreply@blogger.com ({ Neeraj : Sidhaye })</author><pubDate>Thu, 9 Mar 2017 11:43:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-7665457815474752976</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div class="MsoNormal" style="text-align: left;"&gt;
&lt;div class="MsoNormal"&gt;
&lt;span style="font-size: 12.0pt; line-height: 115%;"&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Wisely
choose transaction type while designing your application. Transaction,
a key aspect of any application should be taken care well in advance. Here are
few tips while choosing between XA and Non-XA transaction.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span style="font-size: 12.0pt; line-height: 115%;"&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span style="font-size: 12.0pt; line-height: 115%;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;b&gt;&lt;span style="font-size: 12.0pt; line-height: 115%;"&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;XA transactions&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: .25in;"&gt;
&lt;/div&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;XA transaction is like global transaction.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;When you have multiple resources involved for a single transaction,
you should be using XA transaction.&lt;/span&gt;Multiple
resource means, 2 or more databases or JMS listener and a database etc.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Transaction manager (TM) is responsible for bringing multiple
resources under a single transaction.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Transaction manger is the capability of the container.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;TM uses 2PC (Two phase commit) pattern for committing the
transaction.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;The resources (JMS, DB etc ) involved in the
transaction should have capability to support 2PC pattern otherwise XA will not
work.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;div class="MsoNormal"&gt;
&lt;span style="font-size: 12.0pt; line-height: 115%;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;b&gt;&lt;span style="font-size: 12.0pt; line-height: 115%;"&gt;&amp;nbsp;NON-XA transaction&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;b&gt;&lt;span style="font-size: 12.0pt; line-height: 115%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: .25in;"&gt;
&lt;/div&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Non-XA transaction is like a local transaction.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Use this approach when a single resource is doing all it’s transaction&amp;nbsp;work itself.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div class="MsoListParagraph" style="margin-left: 0in; mso-add-space: auto;"&gt;
&lt;b&gt;&lt;span style="font-size: 12.0pt; line-height: 115%;"&gt;What is 2PC ( TWO Phase commit ) Protocol?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: .25in;"&gt;
&lt;/div&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;2PC is used to make sure the transactions are in sync when
you have 2 or more DBs.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Assume I have two databases ( DB-1 and DB-2) using 2PC, both
of these databases are in two different locations.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Now, before DB-1 and DB-2 are ready to commit transactions,
they will notify transaction manager that they are ready to commit ( PHASE 1 ).
So when the transaction manager is acknowledge, it will send a signal to DB-1
and DB-2 telling them go ahead for commit (PHASE – 2 )..&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span style="background: yellow; font-size: 12.0pt; line-height: 115%; mso-highlight: yellow;"&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Important note-&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12.0pt; line-height: 115%;"&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt; Two phase commit does not guarantee that a
distributed transaction can't fail, but it does guarantee that it can't fail
silently without the TM being aware of it.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="MsoListParagraph" style="margin-left: 0in; mso-add-space: auto;"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="MsoNormal"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Microservices/API design principles</title><link>http://extremeportal.blogspot.com/2016/11/microservicesapi-design-principles.html</link><category>API</category><category>Micro Services</category><author>noreply@blogger.com (Unknown)</author><pubDate>Mon, 14 Nov 2016 21:47:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-4010343984785600072</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;My notes on MicroService design principles.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Microservice design principles &lt;/b&gt;- microservies has nothing to do with physical size or lines of code!!! It's about minimizing complexity.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;u&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;"instead of having single complex service for your systems, design bunch of small services based on specific business capabilities. Small service means, it should minimize&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;complexity, should serve a &lt;b&gt;focused purpose&lt;/b&gt; and should minimize&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;inter-service&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp;communication"&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Design&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b style="font-family: verdana, sans-serif;"&gt;principles for MicroServices&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;1) Develop and Deployed independently&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Each service shuould be developed and deployed independently. Deployment of one service should not impact other services and a each service should have it's own code base.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;u&gt;You are doing wrong if&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;you find a need to deploy services together&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;you have one code base for multiple services&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;you need to send notification to before you deploy a service&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;2) Data ownership&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Service should have it's own databased or preferably set of tables that is manged by only a specific service.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;should avoid scenario where multiple services are writing and reading from the same set of tables, any changes to table would&amp;nbsp;require changes in all services.&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;having each service has it's own data ownership introduce loose &lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;coupling &lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;between service and database.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;u&gt;key point is&lt;/u&gt; , services should NOT have knowledge of each others underlying database.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Having own database for a services allows to choose right database technologies based on service functionality.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;3) loosely coupled from all other services,&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp;once you adhere to point 1 and 2, you have already initiated loose coupling &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;but there are more on loose coupling:-&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp;&lt;u&gt;minimal dependency on other services&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp;&lt;u&gt;communication with other services should be over exposed public interfaces( API, events etc )&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp;&lt;u&gt;such interfaces or API should NOT expose internal details &lt;/u&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;4) Follow High cohesion methodology&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp; closely related functionality must stay together in a single service. this minimizes intercommunication between services.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;5) Resilient service&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp;Single point of failure in system should NOT impact multiple services. if you have a service with independent data ownership, loose coupling, independent deployable&amp;nbsp;artifact, it is a&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;step towards resilient system!&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;u&gt;Remember&lt;/u&gt;&lt;/b&gt;- Total resilience in the face of all situations is NOT possible.Implement what is feasible in the short term and work to achieve greater resilience in stages.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;u&gt;6) shared library&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; carefully watch out implications of shared library introduction to your services.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; You are doing something wrong when changes to shared library requires&amp;nbsp; &amp;nbsp; updates to all services simultaneously.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;7) Introduce Asynchronous workers&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &lt;u&gt;&amp;nbsp;very important design principle&lt;/u&gt; - introduce asynchronous workers to minimize impact on primary service API.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;u&gt;example&lt;/u&gt;&lt;/b&gt;-&amp;gt; A batch job can be introduced in a service as an asynchronous worker which is responsible to process high volume request, re-try mechanism for failed request etc.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This asynchronous &amp;nbsp;worker provide following benefits:-&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;speed up the primary request path&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;spread load to asynchronous &amp;nbsp;worker in case of high volume request&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;reduce error scenarios on primary API&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;8) Service Versioning&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp; An API is never going to be completely stable. Change is inevitable!!&lt;b&gt;&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp; it's always a best practice&amp;nbsp;to version your service.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp;Versioning can be added to header or in the service url.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp; &amp;nbsp;Following technique can be used to maintain service version:-&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&amp;nbsp;The URL has a major version number (v1), but the API has date based sub- &amp;nbsp; &amp;nbsp; versions which can be chosen using a custom HTTP request header. In this case, the major version provides structural stability of the API as a whole while the sub-versions accounts for smaller changes (field deprecations, endpoint changes, etc).&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Risk Storming</title><link>http://extremeportal.blogspot.com/2016/10/risk-storming.html</link><category>Risk Stroming</category><category>Technical Risk Assessment</category><author>noreply@blogger.com (Unknown)</author><pubDate>Tue, 4 Oct 2016 00:38:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-3433804799418830858</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Risk Storming - Collaborative and Visual Technique for identifying technical risk&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
My notes&lt;br /&gt;
&lt;br /&gt;
1) Draw you app design on board - high level to show each like component, class, container etc&lt;br /&gt;
2) Identify risk individually - each and every member of team has different view of looking at risk!&lt;br /&gt;
3) Highlight risk at component/flow/integration level&lt;br /&gt;
4) Discuss and Priorities&lt;br /&gt;
&lt;br /&gt;
Excellent write up by Simon here @&amp;nbsp;&lt;a href="http://www.codingthearchitecture.com/2012/07/11/risk_storming.html" target="_blank"&gt;Risk Storming&lt;/a&gt;&lt;b&gt;.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Java EE - the next inception!</title><link>http://extremeportal.blogspot.com/2016/03/java-ee-next-inception.html</link><author>noreply@blogger.com (Unknown)</author><pubDate>Thu, 31 Mar 2016 09:13:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-5655103285363876642</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Read this article on WebSphere and found this interesting about&amp;nbsp;basics of how IBM WebSphere Application Server Liberty profile works, and how its architecture differs significantly from that of older Java EE application servers&lt;br /&gt;
&lt;br /&gt;
Please read here complete article at &lt;a href="https://www.ibm.com/developerworks/websphere/library/techarticles/1602_woolf-trs/1602_woolf1.html" target="_blank"&gt;&lt;b&gt;Java EE, the next inception: A primer to WebSphere Liberty for Java EE developers&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Portlet Preferences Usage - Best Practices</title><link>http://extremeportal.blogspot.com/2013/11/portlet-prefecene-usage-best-practices.html</link><category>Best Practices</category><category>JSR 168</category><category>JSR 286</category><category>Portlet Preference</category><author>noreply@blogger.com (Unknown)</author><pubDate>Tue, 19 Nov 2013 19:13:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-2253344101153804879</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;PortletPreferences should be used very carefully and in&amp;nbsp;situations&amp;nbsp;only when there is a valid use case for it.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;So ideally, one should have good knowledge of portlet preference and most imortantly, where to apply it.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;The PortletPreferences object provides the ability to store information persistently about how a client wants to use a particular portlet.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;For example&lt;/b&gt;, with the stock portlet, a user can provide stock code information to the portlet, and the portlet will store that information persistently using the PortletPreferences object. The next time the user visits the view mode of the portlet, the stock details for that user's choice will be displayed.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Persistently storing this information, is all done behind the scenes for you by the portal framework.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;So when you use portlet preference, did you ever think about where does portlet preference gets stored? In hard drive, some KB's data in DB or as CLOB or something that is not efficient.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;So how to store portlet preference is completely upto portal vendors and hence we as a developer or DB administrator don't have much control over the data which is stored in portlet preference.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Let's talk about&amp;nbsp;application&amp;nbsp;efficiency, where in if you want to store just a&amp;nbsp;Boolean&amp;nbsp;flag and if you choose to store it in portlet preference, you don't know how it will be stored and what size it would use for storage compared to if we chose to use our own DB to store the flag which would just take few tiny bit of space.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Furthermore, mining information from data stored in portlet prefernce is almost very difficult.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;So, If you don't know how the portal stores your PortletPreferences data, and you don't know how the portal ties a particular preference to a particular user, you're going to have a pretty hard time mining your own data.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;The best use&lt;/b&gt; of portlet preference could fall in below situations where a user wants&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;1) To have red&amp;nbsp;background.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;2) configurable pagination numbers&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;3) configurable TimeZone&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;4) configurable portotol ( http or https etc )&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;5) Configurable fonts etc.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Conclusion -&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Use portlet&amp;nbsp;preference&amp;nbsp;for simple configurable&amp;nbsp;parameters&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Don't ever use preference to store information where it would become impossible to do data mining from preference storage because you don't have control over preference storage.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Dynamic Registration of Servlets and Filters at application startup</title><link>http://extremeportal.blogspot.com/2013/10/dynamic-registration-of-servlets-and.html</link><category>Dynamic Servlet Registration</category><category>J2EE</category><category>Servlet</category><author>noreply@blogger.com (Unknown)</author><pubDate>Wed, 23 Oct 2013 17:48:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-2807525933652491436</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Recently I read about one of the nice feature of JAVA EE 6 - &lt;b&gt;Dynamic Registration of Servlets and Filters at application startup.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;I then thought of use cases around this feature.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;I think, this is mostly desinged for framework creators but developers could also get benefits from this.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;You can use this fefature by using new methods introduced in the ServletContext class which are able to programmatically add servlets and servlet filters to a web application during startup.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;The methods are addServlet() method to add a servlet to the web application, and the corresponding addFilter() method to add a servlet filter.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Here's an example, which dynamically registers a Servlet as soon as the ServletContextListener is triggered:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;//Register Servlet&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;public class MyServletContextListener implements ServletContextListener {&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; public void contextInitialized(ServletContextEvent sce) {&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ServletContext sc = sce.getServletContext();&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Register Servlet here&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ServletRegistration sr = sc.addServlet("DynamicServlet",&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "com.sample.DynamicServlet");&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sr.setInitParameter("servletInitParamName", "servletInitParamValue");&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sr.addMapping("/mydynamicServlet");&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;The same steps can be used to register a Filter named MyDynamicFilter bound to the class com.sample.TestFilter:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;// Register Filter&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;FilterRegistration fr = sc.addFilter("DynamicFilter","com.sample.TestFilter");&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;fr.setInitParameter("filterInitName", "filterInitValue");&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;fr.addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST),&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;true, "DynamicServlet");&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;        &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Would be great if readers of this post, could suggest creative use cases which could add useful functionality to an applications.&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>How to programatically refresh data from LDAP</title><link>http://extremeportal.blogspot.com/2013/10/how-to-programatically-refresh-data.html</link><author>noreply@blogger.com (Unknown)</author><pubDate>Thu, 17 Oct 2013 19:04:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-8724132568103054472</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Came across to this article which very well details out, how one can &lt;a href="https://www.ibm.com/developerworks/mydeveloperworks/blogs/PortalL2Thoughts/entry/how_to_programatically_refresh_data_from_ldap64?lang=en" target="_blank"&gt;&lt;b&gt;Programatically refresh date from LDAP.&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;The articles also have a Sample Code to programatically refresh data from the LDAP.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;I am sure, this would be helpful for those who encounter this use case.&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Handling users with multiple roles while Login to portal</title><link>http://extremeportal.blogspot.com/2013/10/handling-users-with-multiple-roles.html</link><category>Authentication Filters</category><category>Login portlet</category><category>Multiple roles login</category><author>noreply@blogger.com (Unknown)</author><pubDate>Wed, 9 Oct 2013 15:50:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-8318511659051509728</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;br /&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Problem Statement-&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;When you have got scenario where in, a user is belonging to multiple roles and you want him/her to select his choice of role while login to portal.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Solution&lt;/b&gt;-&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;This situation can be solved by developing a custom login portlet and make use of Authentication Filters.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Here is how this would work,&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;User login using your custom login portlet with his userid &amp;amp; password.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Once user submit, &amp;nbsp;control goes to authentication filter and there you connect to your user repository to fetch user roles and preset a screen ( next screen of login portlet ) to select his roles.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;When user selects his roles and click Login, &amp;nbsp;control again goes to authentication filter and there you authentication user and redirect user to portal landing page.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;I hope that helps.Feel free to post your queries here.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>How to change the WPS  URL</title><link>http://extremeportal.blogspot.com/2012/08/how-to-change-wps-url.html</link><category>Changng the Portal URI</category><category>WPS</category><author>noreply@blogger.com (Unknown)</author><pubDate>Tue, 21 Aug 2012 21:03:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-4312972210358880790</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;There might be situations when you want to change portal entry url.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;After portal installation you will see portal url as&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;http://hostname:10039/wps/portal &amp;nbsp; &amp;nbsp; ( for Anonymous users) and &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;http://hostname:10039/wps/myportal &amp;nbsp;( for Authenticated users).&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;In the above url,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;wps &lt;/b&gt;is the WPSContextRoot&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;portal &lt;/b&gt;is the WpsDefaultHome&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;myportal &lt;/b&gt;is the WpsPersonalizedHome&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Now, if you want to change the url and want to look like&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;http://hostname:10039/mynewcontextroot/mynewWpsDefaultHome&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;( for Anonymous users)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;http://hostname:10039/mynewcontextroot/mynewWpsPersonalizedHome &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;( for Authenticated users).&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;You would require to make changes in the&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;wkplc.properties&lt;/b&gt; and &lt;b&gt;wkplc_comp.properties&lt;/b&gt; files, located in the wp_profile_root/ConfigEngine/properties&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;For complete details, please go through the following documentation&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;a href="http://publib.boulder.ibm.com/infocenter/wpdoc/v6r1/index.jsp?topic=/com.ibm.wp.ent.doc_v615/config/cfg_intr.html"&gt;http://publib.boulder.ibm.com/infocenter/wpdoc/v6r1/index.jsp?topic=/com.ibm.wp.ent.doc_v615/config/cfg_intr.html&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Above changes are for wps 6.1.5. If you want to make change in some other wps version, please refer to respective WPS version info center.&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>All about XMLAccess</title><link>http://extremeportal.blogspot.com/2012/08/all-about-xmlaccess.html</link><category>What is XML access</category><category>XML Access</category><author>noreply@blogger.com (Unknown)</author><pubDate>Sun, 12 Aug 2012 23:29:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-3569725594956696929</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Recently, I came across to an article which tells everything about XMLAccess.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;I would strongly recommend to go through this &lt;a href="http://www-10.lotus.com/ldd/portalwiki.nsf/dx/XMLAccess_Frequently_Asked_Questions#What+is+XMLAccess%3F" target="_blank"&gt;&lt;b&gt;XMLAccess article&lt;/b&gt;&lt;/a&gt; to understand XML Access concepts in detail.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Many thanks to Fang and Joe for this wonderful article&lt;/span&gt;.&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Web security concepts and considerations for WPS Administrators</title><link>http://extremeportal.blogspot.com/2012/05/web-security-concepts-and.html</link><author>noreply@blogger.com (Unknown)</author><pubDate>Thu, 17 May 2012 23:39:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-3296931597256571080</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;Recently I read an article on Web Security concepts on WPS.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;The article covers various concepts like Authentication, Authorization, SSO, ESM, Sessions, Step Up Authentication and many more.&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;Thought as per article heading, it is specifically for WPS Admin but I would strongly recommend to go through complete article even if you are from portlet development.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;Please read article here at &lt;/span&gt;&lt;b&gt;&lt;a href="http://www-10.lotus.com/ldd/portalwiki.nsf/dx/Web_security_concepts_and_considerations_for_IBM_WebSphere_Portal_administrators#Sessions" target="_blank"&gt;&lt;span style="font-size: small;"&gt;Web Security concepts on WPS&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>InterPortlet Communication - Best Practice Matrix</title><link>http://extremeportal.blogspot.com/2012/01/interportlet-communication-best.html</link><author>noreply@blogger.com (Unknown)</author><pubDate>Fri, 13 Jan 2012 19:34:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-7160277909936908801</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;I published &lt;b&gt;"&lt;a href="http://www-10.lotus.com/ldd/portalwiki.nsf/dx/InterPortlet_Communication-Best_Practices_Matrix" target="_blank"&gt;InterPortlet Communication - Best Practice Matrix&lt;/a&gt;&lt;/b&gt;" on IBM portal wiki.&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;This IPC Matrix helps to choose best practice for various scenarios of IPC.&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Persisting user navigational states in WPS 7</title><link>http://extremeportal.blogspot.com/2011/12/persisting-user-navigational-states-in.html</link><category>Navigational Sate</category><category>WPS 7</category><author>noreply@blogger.com (Unknown)</author><pubDate>Sat, 10 Dec 2011 09:41:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-2411298402200188789</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
You might have come across to situations where you would want WPS to persist user navigational states like&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Portlet states:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Normal&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Minimized&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Maximized&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Portlet modes:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; config&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; edit_defaults&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; edit&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; view&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; help&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Page selection:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; The last page that was active before the user logged out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With the persistent session state feature, portal users can resume and continue a previously interrupted working session at the same state where they left the session. When the user logs out or the session times out, the portal stores the current navigational state into the database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resuming the session state is only possible if either the portal theme login link or WebSphere Application Server TAI based authentication is used to login to the portal.&lt;br /&gt;
&lt;br /&gt;
Please have a look at detail article at &lt;a href="http://www-10.lotus.com/ldd/portalwiki.nsf/dx/Configuring_user_session_persistance_wp7" target="_blank"&gt;&lt;b&gt;Configuring user session persistance&lt;/b&gt; &lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>How to know what all objects are stored in session at any point of time</title><link>http://extremeportal.blogspot.com/2011/11/how-to-know-what-all-objects-are-stored.html</link><author>noreply@blogger.com (Unknown)</author><pubDate>Tue, 22 Nov 2011 20:43:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-5079538603324603325</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;You might want to know at any point of time that how many objects are stored in session along with their size. This would be most useful when you are analyzing&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;application performance or working on performance tuning area.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;This would also be useful in debugging when your application is throwing java.io.NotSerializableException.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;There is a servlet called &lt;b&gt;com.ibm.ws.webcontainer.httpsession.SessionInspectServlet&lt;/b&gt; that ships with WAS located in &lt;b&gt;com.ibm.ws.webcontainer.jar&lt;/b&gt;. This jar is placed under &amp;lt;&lt;b&gt;WPS_ROOT&amp;gt;/AppServer/plugins/&lt;/b&gt;. &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;SessionInspectorServlet &amp;nbsp;can be used to list down what all objects are stored in session along with size of the objects.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;In order to use SessionInspectServlet, you would need to enable “Serving servlets by class name”, you can set this value in the &lt;b&gt;ibm-web-ext.xmi&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;By default this value is true, you can see sample ibm-web-ext.xmi file below and can see that serveServletsByClassnameEnabled value is true.&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;webappext:WebAppExtension xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:webappext="webappext.xmi" xmi:id="WebAppExtension_1320397630802" reloadInterval="3" reloadingEnabled="true" additionalClassPath="" fileServingEnabled="true" directoryBrowsingEnabled="false" serveServletsByClassnameEnabled="true"&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;webApp href="WEB-INF/web.xml#WebApp_ID"/&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;/webappext:WebAppExtension&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;To list down session objects stored in session, you would required to hit below URL&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;http://localhost:10039/wps/&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;context-root&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;/SessionInspector/servlet/com.ibm.ws.webcontainer.httpsession.SessionInspectServlet&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;here, context root would be context root of your application. You can specify this while installing your WAR through portal admin console OR you can also find out this value inside application.xml located under&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;WPS_ROOT&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;/wp_profile/installedApps/&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;NODE&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;/&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;EAR NAME&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;/META-INF/&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;You would see list of your session objects and their size as shown in the screen shot.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3icROzHQOlS4EjFNn5x1Tpj7MTwUVwZeneuPL8nLN1P7ftaAwrUKuEIMd_CyWwPceUwwGCajBaB-Q49hMsfCORRgGnnqNm1rCfekRdJoVcTDNzPVnVnaEfOCy6dtKcG9VW5G_yQ/s1600/Session+Inspector.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3icROzHQOlS4EjFNn5x1Tpj7MTwUVwZeneuPL8nLN1P7ftaAwrUKuEIMd_CyWwPceUwwGCajBaB-Q49hMsfCORRgGnnqNm1rCfekRdJoVcTDNzPVnVnaEfOCy6dtKcG9VW5G_yQ/s320/Session+Inspector.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3icROzHQOlS4EjFNn5x1Tpj7MTwUVwZeneuPL8nLN1P7ftaAwrUKuEIMd_CyWwPceUwwGCajBaB-Q49hMsfCORRgGnnqNm1rCfekRdJoVcTDNzPVnVnaEfOCy6dtKcG9VW5G_yQ/s72-c/Session+Inspector.JPG" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>How to get HttpServletRequest and HttpServletResponse from portlet request</title><link>http://extremeportal.blogspot.com/2011/11/how-to-get-httpservletrequest-and.html</link><category>JSR 286</category><category>PortletRequest and HttpServletRequest</category><author>noreply@blogger.com (Unknown)</author><pubDate>Thu, 17 Nov 2011 20:26:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-413951826222661290</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;There are some scenario when you want to get httpServletRequest or httpServletReponse from portletRequest.&lt;br /&gt;&lt;br /&gt;IBM provides an utility class which gives you what you are looking for.&lt;br /&gt;&lt;br /&gt;Yes, there is a &lt;b&gt;PortletUtil &lt;/b&gt;class available in the &lt;b&gt;com.ibm.ws.portletcontainer.portlet&lt;/b&gt; package, through which you can directly get httpServletRequest, httpServletResponse, ServletContext and many&amp;nbsp; more servlet object you want.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Code to get HttpServletRequest from&amp;nbsp; portletRequest/renderRequest/actionRequest.&lt;br /&gt;&lt;br /&gt;HttpServletRequest httpServletRequest =&amp;nbsp; PortletUtils.getHttpServletRequest(renderRequest);&lt;br /&gt;&lt;br /&gt;There are couple of utility methods available in PortletUtil which&amp;nbsp; gives you ServletContext, ServletConfig, PortletWindow, PortletApplicationDefinition etc.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></item><item><title>How to reset JSF Portlets to initial state</title><link>http://extremeportal.blogspot.com/2011/10/how-to-reset-jsf-portlets-to-initial.html</link><category>JSF Portlet</category><author>noreply@blogger.com (Unknown)</author><pubDate>Sat, 22 Oct 2011 20:26:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-14898252.post-7360459752093370800</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;For a JSF based portlet, if you have a scenario where a user is navigating between screens and that portlet is having 2 or 3 screens, if the user went to 3rd screen and he comes back and clicked on the link it is going to 3rd screen instead of 1st screen.&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;To render 1st jsp from within portlet,we specify init parameter for first jsp in portlet.xml as follows&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;&amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;com.ibm.faces.portlet.page.view&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;/jsp/html/view/HelloView.jsp&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;&amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;Now in case, when you want to reset JSF Portlets to its initial view when user comes back,&lt;/span&gt;&lt;span style="font-size: small;"&gt; set "&lt;b&gt;com.ibm.faces.portlet.page.view&lt;/b&gt;" attributed to session.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Verdana,sans-serif;"&gt;
&lt;span style="font-size: small;"&gt;&lt;b&gt;portletSession.setAttribute("com.ibm.faces.portlet.page.view", &amp;lt;path of jsp to render&amp;gt;);&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item></channel></rss>