<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-462145975146047744</id><updated>2011-11-27T15:51:38.316-08:00</updated><category term='spring-test'/><category term='AOP'/><category term='Domain Driven Design'/><category term='Environmental Awareness'/><category term='Spring AOP'/><category term='Osgi'/><category term='Springframework'/><category term='SpEL'/><category term='unitils'/><category term='Spring Batch'/><category term='aspectJ'/><category term='S2AP'/><category term='testing tools'/><title type='text'>Java Chimaera</title><subtitle type='html'>"Imagination is more important than knowledge."  A. Einstein</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://java-chimaera.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://java-chimaera.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Slim Tebourbi</name><uri>http://www.blogger.com/profile/15470047192543139696</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-462145975146047744.post-6549677033648110347</id><published>2011-01-15T13:47:00.000-08:00</published><updated>2011-01-15T14:07:35.154-08:00</updated><title type='text'>comment signaler un incident</title><content type='html'>Pour ajouter un point signalant un incident :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;aller sur la map SECURITE TUNSIE : &lt;a title="http://maps.google.com/maps/ms/?hl=en&amp;amp;ie=UTF8&amp;amp;ll=36.879895,10.246811&amp;amp;msa=0&amp;amp;msid=205489421283786071249.000499e8d47a35b7ce5fb&amp;amp;spn=0.1093,0.308647&amp;amp;t=h&amp;amp;z=12" url="http://maps.google.com/maps/ms/?hl=en&amp;amp;ie=UTF8&amp;amp;ll=36.879895,10.246811&amp;amp;msa=0&amp;amp;msid=205489421283786071249.000499e8d47a35b7ce5fb&amp;amp;spn=0.1093,0.308647&amp;amp;t=h&amp;amp;z=12" href="http://bit.ly/gox6Qm" target="_blank" rel="nofollow" class="twitter-timeline-link"&gt;http://bit.ly/gox6Qm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;chercher votre point en tappant l'adresse dans le moteur de recherche&lt;/li&gt;&lt;li&gt;un lien va apparaitre a gauche avec votre adresse appuyer sur "save to ..."&lt;/li&gt;&lt;li&gt;ajouter le point dans SECURITE TUNSIE et faites save&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Courage, on confiance en vous.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/462145975146047744-6549677033648110347?l=java-chimaera.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-chimaera.blogspot.com/feeds/6549677033648110347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://java-chimaera.blogspot.com/2011/01/comment-signaler-un-incident.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/6549677033648110347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/6549677033648110347'/><link rel='alternate' type='text/html' href='http://java-chimaera.blogspot.com/2011/01/comment-signaler-un-incident.html' title='comment signaler un incident'/><author><name>Slim Tebourbi</name><uri>http://www.blogger.com/profile/15470047192543139696</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-462145975146047744.post-8906863208163826911</id><published>2009-11-03T13:56:00.000-08:00</published><updated>2009-11-04T12:51:41.389-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Springframework'/><category scheme='http://www.blogger.com/atom/ns#' term='SpEL'/><category scheme='http://www.blogger.com/atom/ns#' term='Environmental Awareness'/><title type='text'>Spring Expression Langage, a simple use case.</title><content type='html'>&lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="" lang="EN-GB"&gt;Waiting for the release of Spring3, I have taken a look at the source code. There was an eternity that I didn’t that. My first insights where focused on the Expression Language (SpEL). When I discovered the @Value(“systemProperties[‘myProperty’]”) feature, I didn’t understand why it wasn’t more generally implemented to cover all spring managed properties those for which we used the PropertyPlaceHolderConfigurer. So I decided to make it. &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="" lang="EN-GB"&gt;It is a BeanFactoryPostProcessor that extends the PropertiesLoaderSupport the same base class as the PropertyPlaceHolderConfigurer utility. This post processor registers a bean that merges the declared properties and was exposed to the context of the SpEL which is simply the running container.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="" lang="EN-GB"&gt;Given that properties can be accessed simply like this:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span  lang="EN-GB" style="font-size:8pt;"&gt;&lt;o:p&gt; &lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;span  lang="EN-GB" style="font-size:8pt;"&gt;&lt;span style=""&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);font-size:8pt;" &gt;@Value&lt;/span&gt;&lt;span style=";font-size:8pt;color:black;"  &gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);font-size:8pt;" &gt;"#{properties['property']}"&lt;/span&gt;&lt;span style=";font-size:8pt;color:black;"  &gt;)&lt;/span&gt;&lt;/span&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span  lang="EN-GB" style="font-size:8pt;"&gt;&lt;o:p&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;span style=";font-size:8pt;color:black;"  &gt;&lt;span class="Apple-style-span" style=";font-family:Georgia,serif;font-size:16px;"  &gt;&lt;span style=";font-size:8pt;color:black;"  &gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:8pt;" &gt;private&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-size:8pt;color:black;"  &gt; String &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);font-size:8pt;" &gt;property&lt;/span&gt;&lt;span style=";font-size:8pt;color:black;"  &gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;where “properties” is simply the name of the registred bean and “property” is the name of the desired property. Note that the setter can be omitted in order to make the property immutable.&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="" lang="EN-GB"&gt;Besides, this gives me the possibility to use the EL feature to declare the locations of the properties files, to have another solution to resolve the “Complexity at the structural and dynamic level” (see this post : &lt;span lang="EN-GB"&gt;&lt;a href="http://blog.springsource.com/2007/06/25/code-samples-from-springone-beyond-the-obvious-talk/"&gt;http://blog.springsource.com/2007/06/25/code-samples-from-springone-beyond-the-obvious-talk/&lt;/a&gt;).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-indent: 35.4pt;"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="" lang="EN-GB"&gt;For example I can define my files locations like this :&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style=";font-size:10pt;color:black;"  &gt;&lt;span style=""&gt;&lt;span class="Apple-style-span" style=";font-family:Georgia,serif;font-size:16px;"  &gt;&lt;span style=";font-size:9pt;color:teal;"   lang="EN-GB"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(63, 127, 127);font-size:9pt;"  lang="EN-GB"&gt;bean&lt;/span&gt;&lt;span  lang="EN-GB" style="font-size:9pt;"&gt; &lt;span style="color: rgb(127, 0, 127);"&gt;id&lt;/span&gt;&lt;span style="color:black;"&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"spelPropertiesExposer"&lt;/span&gt;&lt;/i&gt; &lt;span style="color: rgb(127, 0, 127);"&gt;class&lt;/span&gt;&lt;span style="color:black;"&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"example.spring3.spel.PropertiesSpelExposer"&lt;/span&gt;&lt;/i&gt;&lt;span style="color:teal;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-size:9pt;color:black;"   lang="EN-GB"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-size:9pt;color:teal;"   lang="EN-GB"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(63, 127, 127);font-size:9pt;"  lang="EN-GB"&gt;property&lt;/span&gt;&lt;span  lang="EN-GB" style="font-size:9pt;"&gt; &lt;span style="color: rgb(127, 0, 127);"&gt;name&lt;/span&gt;&lt;span style="color:black;"&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"locationPatterns"&lt;/span&gt;&lt;/i&gt; &lt;span style="color: rgb(127, 0, 127);"&gt;value&lt;/span&gt;&lt;span style="color:black;"&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"configuration/%{#environment ?:'dev'}/env.properties"&lt;/span&gt;&lt;/i&gt;&lt;span style="color:teal;"&gt;/&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-size:9pt;color:teal;"   lang="EN-GB"&gt;&lt;/span&gt;&lt;span style="color: rgb(63, 127, 127);font-size:9pt;"  lang="EN-GB"&gt;bean&lt;/span&gt;&lt;span style=";font-size:9pt;color:teal;"   lang="EN-GB"&gt;&gt;&lt;/span&gt;&lt;span  lang="EN-GB" style="font-size:9pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="" lang="EN-GB"&gt;Where “environment” is a system property wich represents the application’s environment such as dev, staging or prod. In the example if the property is undefined the default value ‘dev’ is used.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;You can find the entire source code &lt;a href="http://github.com/stebourbi/spel-properties-resolver"&gt;here on gitHub&lt;/a&gt;. And if you want to simply see the BeanPostProcessor &lt;a href="http://github.com/stebourbi/spel-properties-resolver/blob/master/src/main/java/example/spring3/spel/PropertiesSpelExposer.java"&gt;go directly here&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/462145975146047744-8906863208163826911?l=java-chimaera.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-chimaera.blogspot.com/feeds/8906863208163826911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://java-chimaera.blogspot.com/2009/11/spring-expression-language.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/8906863208163826911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/8906863208163826911'/><link rel='alternate' type='text/html' href='http://java-chimaera.blogspot.com/2009/11/spring-expression-language.html' title='Spring Expression Langage, a simple use case.'/><author><name>Slim Tebourbi</name><uri>http://www.blogger.com/profile/15470047192543139696</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-462145975146047744.post-6562411223276463995</id><published>2008-12-29T08:38:00.000-08:00</published><updated>2008-12-29T08:48:46.055-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing tools'/><category scheme='http://www.blogger.com/atom/ns#' term='spring-test'/><category scheme='http://www.blogger.com/atom/ns#' term='unitils'/><title type='text'>Unitils 2: unitils is dead, long live to spring-test</title><content type='html'>&lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 11"&gt;&lt;meta name="Originator" content="Microsoft Word 11"&gt;&lt;link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CSLIMTE%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:hyphenationzone&gt;21&lt;/w:HyphenationZone&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman";} a:link, span.MsoHyperlink 	{color:blue; 	text-decoration:underline; 	text-underline:single;} a:visited, span.MsoHyperlinkFollowed 	{color:purple; 	text-decoration:underline; 	text-underline:single;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 70.85pt 70.85pt 70.85pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Tableau Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman"; 	mso-ansi-language:#0400; 	mso-fareast-language:#0400; 	mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="" lang="EN-GB"&gt;     I appreciate the &lt;a href="http://unitils.org/summary.html"&gt;unitils framework&lt;/a&gt; and I used it in practically all the situations where I need an advanced tool for tests and especially integration ones. When I recently discover that a major version was released, I was enthusiastic to see what’s new in this version, especially since they suddenly &lt;/span&gt;&lt;span style="" lang="EN-GB"&gt;pass &lt;/span&gt;&lt;span style="" lang="EN-GB"&gt;from 1.1 to 2.0. But when I take a look at the official site of the framework, I found that the only significant change, of this major version, was a new mock module or framework!&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="" lang="EN-GB"&gt;     Personally, and as a user of this tool, I hoped that the next version will be simpler to use, and especially more flexibly configured; because I dislike the fact that I was obliged to configure unitils modules similarly, for all the tests of my project. For example it isn’t possible to deactivate, activate or configure modules per test (more precisely test-class); so it wasn’t simple to use two test-database configurations (a real and a memory one); the database module leaks, also, a facility more flexible than the DbMaintainer. Because if you’re not using Hibernate and its hbm2ddl application, you must manage by yourself your database test schema, and it’s really boring especially for memory database based tests. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="" lang="EN-GB"&gt;     Instead of these enhancements, we have only a new mock framework, which I don’t think that I will use instead of frameworks like easymock or jmock, a more stable and reliable solutions. That’s why I believe that it’s time to move to the other option in this field which is Spring-test. In fact, Spring-test has not yet the same capability as unitils, but it’s really simple to extend; and this can be simply done by reusing unitils listeners (from the modules) as spring-test ones. Or to re-implement these features from scratch like it was done in the &lt;a href="http://code.google.com/p/springdbunit/"&gt;springdbunit &lt;/a&gt;project. Besides being a part of the popular Spring framework it will be surely enhanced and promoted to rich the status of the defacto choice of this category (unitils itself was promoted and made popular by an article on it’s spring-hibernate friendliness).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/462145975146047744-6562411223276463995?l=java-chimaera.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-chimaera.blogspot.com/feeds/6562411223276463995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://java-chimaera.blogspot.com/2008/12/unitils-2-unitils-is-dead-long-live-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/6562411223276463995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/6562411223276463995'/><link rel='alternate' type='text/html' href='http://java-chimaera.blogspot.com/2008/12/unitils-2-unitils-is-dead-long-live-to.html' title='Unitils 2: unitils is dead, long live to spring-test'/><author><name>Slim Tebourbi</name><uri>http://www.blogger.com/profile/15470047192543139696</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-462145975146047744.post-3497197539410468457</id><published>2008-11-02T10:21:00.000-08:00</published><updated>2008-11-04T15:08:56.457-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Springframework'/><category scheme='http://www.blogger.com/atom/ns#' term='Domain Driven Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Batch'/><title type='text'>Spring-Batch: Domain Driven Design in Action</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:arial;"&gt;          Not long ago, Spring was the main promoter of AOP technology and gave it its real place in the enterprise landscape. Recently and with the release of Spring-Batch, which is in his own as a framework the first one in this category for the java environment (I don’t know if there is any other equivalent in other platforms), Spring tends to promote one of the most powerful concepts in application development : Domain Driven Design.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;DDD emergence difficulties&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;          In fact, although DDD is not a ‘new’ concept (the famous Eric Evans’ Book was published in 2004, and Martin Fowler speaks about it in 2003), its adoption is not equivalent to its importance and added value. This is ‘classically’ due to the absence of real promoters which could put it into action and demonstrate its powerful approach for a wide public.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;Indeed, DDD is rarely invoked publicly, and even when it is the case, it is promoted by some evangelists who preaches, in my eyes, by elitism which means that the concept is ignored and neglected by the masses. Besides, there have been no good and interesting examples of its&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;application, for those who manifest their interest but have nothing concrete that can really demonstrate DDD. But the most principal obstacle (imho) is the harmful effect of the EJB design model and its related ‘patterns’, which is the actual main stream even for lightweight container based applications like Spring itself, and which promotes the anaemic domain model and the  'super’ service layer anti-patterns.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Spring-Batch: the savior?&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;By applying DDD in Spring Batch, we now have a realistic and elaborate example of concepts like ‘repository’, ‘factory’ or again the ‘ubiquitous language’. What’s also interesting in this implementation is that, by being a technical domain, developers can easily comprehend the concepts and identify them more easily. Talking about easiness, I noticed that a large number of people who have tried Spring-Batch find it a bit complex to use and they especially encounter some difficulties in finding the entry point to it. I think that this is due to the fact that they were accustomed to a traditional view of batch applications and haven’t taken the time to understand the way Spring-batch makes abstraction of all the common and traditional facets of a batch application. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;I will not go into detail about what was done in this direction, because I think that it is very well treated on the official site or in the reference documentation or even in some online presentations, but I will say that by understanding the whys of this unusual way, we can realise all the powerful things that Spring-batch can offer.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;In fact, to be simple and concise, Spring-Batch makes a very fine abstraction of a batch application and its execution flow and by doing so it permits not only the developer (or the user) to focalise on the specific &lt;span style="font-style: italic; font-weight: bold;"&gt;steps&lt;/span&gt; of his &lt;span style="font-style: italic; font-weight: bold;"&gt;job&lt;/span&gt; and their particular logic but also gives him a very powerful control facilities on what is done in these steps; for example, like the &lt;span style="font-style: italic; font-weight: bold;"&gt;execution context&lt;/span&gt; which can hold information such as the number of processed &lt;span style="font-style: italic; font-weight: bold;"&gt;items&lt;/span&gt; in any particular instant of the execution like a resource unavailability failure. Also note here, that it treats the steps in an &lt;span style="font-style: italic;"&gt;item-oriented&lt;/span&gt; way which is one of the core reasons of these features and that’s why we must prefer it on the &lt;span style="font-style: italic;"&gt;Tasklet&lt;/span&gt; solution which can be considered for refactoring legacy batches which cannot be easily adapted in the &lt;span style="font-style: italic;"&gt;item-oriented&lt;/span&gt; way.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;The Springframework new argument&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Finally, and returning to the Springframework and the SpringSource, I just want to say that it seems to be that DDD will be the next Rod Johnson’s ‘War’ on EJB after the IoC one. And we can see that through the new features introduced into the 2.5 version, which takes benefits essentially from AspectJ power (and team!) to give technical solution to DDD patterns realisation; and also some presentations made by the Spring Team and essentially those of &lt;a style="font-weight: bold;" href="http://www.infoq.com/presentations/rod-johnson-are-we-there-yet"&gt;Rod Johnson&lt;/a&gt; &lt;/span&gt;&lt;span style="font-family:arial;"&gt;and &lt;/span&gt;&lt;a style="font-family: arial; font-weight: bold;" href="http://www.parleys.com/display/PARLEYS/Home#title=Domain%20Driven%20Design%20%20with%20AOP%20and%20DI;talk=6295;slide=1"&gt;Ramnivas Laddad&lt;/a&gt;&lt;span style="font-family:arial;"&gt;. After all, even EJB ‘prone’ now the lightweight model promoted by Spring and the IoC pattern (without being able of course ☺ ), and Mr. Rod was obliged to find another area where EJB really sucks. &lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/462145975146047744-3497197539410468457?l=java-chimaera.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-chimaera.blogspot.com/feeds/3497197539410468457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://java-chimaera.blogspot.com/2008/11/spring-batch-domain-driven-design-in.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/3497197539410468457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/3497197539410468457'/><link rel='alternate' type='text/html' href='http://java-chimaera.blogspot.com/2008/11/spring-batch-domain-driven-design-in.html' title='Spring-Batch: Domain Driven Design in Action'/><author><name>Slim Tebourbi</name><uri>http://www.blogger.com/profile/15470047192543139696</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-462145975146047744.post-3470408200212586710</id><published>2008-10-12T12:32:00.001-07:00</published><updated>2008-10-13T12:13:04.006-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Springframework'/><title type='text'>Scanning classpath annotated classes with Spring 2.5</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;One of the common problems of using annotations as class markers, substituting configuration files for frameworks metadata is the processing phase of these annotations.&lt;br /&gt;&lt;br /&gt;Even if this is not a big difficulty, problems, and potential bugs related to this task like those related to classpath scanning, and resources manipulation are significant and impose the use of low level frameworks like ASM or Javassist (to avoid class loading related problems) which are not very trivial to use nor well documented.&lt;br /&gt;&lt;br /&gt;Fortunately Spring 2.5, provides a very nice framework which resolves ‘all’ these problems in a very clean way, using ASM under the woods. This is, more precisely, located in the core module which contains also the i/o and utilities frameworks and can be used without being in the context of using the whole spring container.&lt;br /&gt;&lt;br /&gt;In fact, suppose that we have a custom annotation called Marker that have the attribute type. Now suppose that we want to scan the classpath and find all classes annotated by this annotation and having a particular value for the type attribute; In the following snippet of code I show how to satisfy this need.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 11"&gt;&lt;meta name="Originator" content="Microsoft Word 11"&gt;&lt;link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CSLIMTE%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:hyphenationzone&gt;21&lt;/w:HyphenationZone&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman";} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 70.85pt 70.85pt 70.85pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Tableau Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman"; 	mso-ansi-language:#0400; 	mso-fareast-language:#0400; 	mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;package&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; example.annotation.scan;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; java.io.IOException;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; java.util.HashSet;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; java.util.Map;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; java.util.Set;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; java.util.Map.Entry;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; org.springframework.core.io.Resource;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; org.springframework.core.io.support.PathMatchingResourcePatternResolver;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; org.springframework.core.io.support.ResourcePatternResolver;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; org.springframework.core.type.AnnotationMetadata;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; org.springframework.core.type.classreading.MetadataReader;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; org.springframework.core.type.classreading.MetadataReaderFactory;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; org.springframework.core.type.classreading.SimpleMetadataReaderFactory;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; org.springframework.core.type.filter.AnnotationTypeFilter;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; org.springframework.core.type.filter.TypeFilter;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;import&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; org.springframework.util.ClassUtils;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;/**&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;*&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;Acts&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;as&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;classpath&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;scanner&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;that&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;finds&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;classes&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;annotated&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;with&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;*&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;the&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 63, 191);" lang="EN-GB"&gt;{@link Marker}&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;annotation.&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;It&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;garantees&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;that&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;no&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;scanned&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;class&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;*&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;is&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;loaded&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;by&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;the&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 63, 191);" lang="EN-GB"&gt;{@link ClassLoader}&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;.&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;*&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;*&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 159, 191);" lang="EN-GB"&gt;@author&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;slim&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;tebourbi&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;*&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 95, 191);" lang="EN-GB"&gt;*/&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;public&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;class&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; MarkedClassFinder {&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;private&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;final&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;static&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; String &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;FOLDERS_SEPARATOR_AS_STRING&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; = System&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;.&lt;span style=""&gt;getProperty&lt;/span&gt;(&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(42, 0, 255);" lang="EN-GB"&gt;"file.separator"&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;);&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;/*&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;* the base package wich represents the root of the scanned resources/classes folder.&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;*/&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;public&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;final&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;static&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; String &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;BASE_SCANNING_PACKAGE&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; = &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(42, 0, 255);" lang="EN-GB"&gt;"base\\scanned\\classes\\"&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;private&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;final&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; Class&lt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(100, 100, 100);" lang="EN-GB"&gt;Marker&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;MARKER_ANNOTATION&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; = &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(100, 100, 100);" lang="EN-GB"&gt;Marker&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;.&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;class&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;private&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;final&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; String &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;TYPE_MARKER_ATTRIBUTE&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; = &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(42, 0, 255);" lang="EN-GB"&gt;"type"&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;private&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;final&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; MetadataReaderFactory &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;metadataReaderFactory&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;private&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;final&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; TypeFilter &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;annotationFilter&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;private&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;final&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; ResourcePatternResolver &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;resourceResolver&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;public&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; MarkedClassFinder() {&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;this&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;.&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;metadataReaderFactory&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; = &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;new&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; SimpleMetadataReaderFactory();&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;this&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;.&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;annotationFilter&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; = &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;new&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; AnnotationTypeFilter(&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;MARKER_ANNOTATION&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;);&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;this&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;.&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;resourceResolver&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; = &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;new&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; PathMatchingResourcePatternResolver(&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                           &lt;/span&gt;Thread.&lt;span style=""&gt;currentThread&lt;/span&gt;().getContextClassLoader());&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;}&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;public&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; Set&lt;class&lt;?&gt;&gt; findMarkedClassOfType(String type) {&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;Set&lt;class&lt;?&gt;&gt; markedClasses = &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;new&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; HashSet&lt;class&lt;?&gt;&gt;();&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;/*&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;* First of all we load all resources that are under a specific package by using a ResourcePatternResolver.&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;* By doing so we will use class files as simple resources without passing &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;* by the ClassLoader which can for example cause the execution of a static initialization block.&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;* It resolves also transparently resources in jars.&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;*/&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;String candidateClassesLocationPattern = &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(42, 0, 255);" lang="EN-GB"&gt;"classpath*:"&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; + &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;BASE_SCANNING_PACKAGE&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; + &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(42, 0, 255);" lang="EN-GB"&gt;"**"&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; + &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;FOLDERS_SEPARATOR_AS_STRING&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; + &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(42, 0, 255);" lang="EN-GB"&gt;"*.class"&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;Resource[] resources = &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;null&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;try&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; {&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                    &lt;/span&gt;resources = &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;resourceResolver&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;.getResources(candidateClassesLocationPattern);&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;} &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;catch&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; (IOException e) {&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;throw&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;new&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; RuntimeException(&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                  &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(42, 0, 255);" lang="EN-GB"&gt;"An I/O problem occurs when trying to resolve ressources matching the pattern : "&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                               &lt;/span&gt;+ candidateClassesLocationPattern, e);&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;}&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;/*&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;* then we proceed resource by resource, using a MetadataReaderFactory to create&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;* MetadataReader wich hides the ASM related interface and complexity.&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;* &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;*/&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;for&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; (Resource resource : resources) {&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                    &lt;/span&gt;MetadataReader metadataReader = &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;null&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;try&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; {&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                           &lt;/span&gt;metadataReader = &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;this&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;.&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;metadataReaderFactory&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;.getMetadataReader(resource);&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                           &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;/*&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;                           &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;* the filter will pass only annotated classes&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;                           &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;*/&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                           &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;if&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; (&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;this&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;.&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;annotationFilter&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;.match(metadataReader, &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;metadataReaderFactory&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;)) {&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                  &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;/*&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;                                  &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;* the AnnotationMetadata is a simple abstaction of the informations&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;                                  &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;* that holds the annotation&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(63, 127, 95);" lang="EN-GB"&gt;&lt;span style=""&gt;                    &lt;/span&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;*/&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                  &lt;/span&gt;AnnotationMetadata metadata = metadataReader.getAnnotationMetadata();&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                  &lt;/span&gt;Map&lt;string,&gt; attrts = metadata.getAnnotationAttributes(&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;MARKER_ANNOTATION&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;.getName());&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                  &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;for&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; (Entry&lt;string,&gt; attrt : attrts.entrySet()) {&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                        &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;if&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; ((&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;TYPE_MARKER_ATTRIBUTE&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;.equals(attrt.getKey())) &amp;amp;&amp;amp; (type.equals(attrt.getValue())))&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                        &lt;/span&gt;{&lt;span style=""&gt;                                              &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                               &lt;/span&gt;String className = &lt;span style=""&gt;convertResourceToClassName&lt;/span&gt;(resource,&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;BASE_SCANNING_PACKAGE&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;);&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                               &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;try&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; {&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                                      &lt;/span&gt;markedClasses.add(ClassUtils.&lt;span style=""&gt;forName&lt;/span&gt;(className));&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                               &lt;/span&gt;} &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;catch&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; (Exception e) {&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                                      &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;throw&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;new&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; RuntimeException(&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(42, 0, 255);" lang="EN-GB"&gt;"problems occurs when trying to load the annotated class : "&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; + className,e);&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                                               &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;} &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;                                        &lt;/span&gt;}&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;                                  &lt;/span&gt;}&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;                           &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                    &lt;/span&gt;} &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;catch&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; (IOException e) {&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                           &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;throw&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;new&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; RuntimeException(&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(42, 0, 255);" lang="EN-GB"&gt;"An I/O problem occurs when trying to process resource : "&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; + resource,e); &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;                    &lt;/span&gt;}&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;}&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;return&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; markedClasses;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;}&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;static&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; String convertResourceToClassName(Resource resource,String basePackage) &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);" lang="EN-GB"&gt;throws&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt; IOException {&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;String path = resource.getFile().getPath();&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;String pathWithoutSuffix = path.substring(0, path.length()- ClassUtils.&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);" lang="EN-GB"&gt;CLASS_FILE_SUFFIX&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;.length());&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;String relativePathWithoutSuffix = pathWithoutSuffix.substring(pathWithoutSuffix.indexOf(basePackage));&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;String className = relativePathWithoutSuffix.replace(&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(42, 0, 255);" lang="EN-GB"&gt;'\\'&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;, &lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(42, 0, 255);" lang="EN-GB"&gt;'.'&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;);&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;" lang="EN-GB"&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;return&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; className;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;       &lt;/span&gt;}&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;i style=""&gt;&lt;span style="font-size: 8pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt; &lt;br /&gt;&lt;/div&gt;&lt;marker&gt;&lt;class&gt;&lt;class&gt;&lt;class&gt;&lt;string,&gt;&lt;string,&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/class&gt;&lt;/class&gt;&lt;/class&gt;&lt;/marker&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/462145975146047744-3470408200212586710?l=java-chimaera.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-chimaera.blogspot.com/feeds/3470408200212586710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://java-chimaera.blogspot.com/2008/10/scanning-classpath-annotated-classes.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/3470408200212586710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/3470408200212586710'/><link rel='alternate' type='text/html' href='http://java-chimaera.blogspot.com/2008/10/scanning-classpath-annotated-classes.html' title='Scanning classpath annotated classes with Spring 2.5'/><author><name>Slim Tebourbi</name><uri>http://www.blogger.com/profile/15470047192543139696</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-462145975146047744.post-7906574448334873184</id><published>2008-08-17T12:44:00.000-07:00</published><updated>2008-10-05T13:23:49.421-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring AOP'/><category scheme='http://www.blogger.com/atom/ns#' term='aspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>AspectJ or Spring AOP?</title><content type='html'>&lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="" lang="EN-GB"&gt;Although &lt;span style="font-style: italic;"&gt;Aspect Oriented Programming&lt;/span&gt; is a mature technology nowadays, it is not so widely used in enterprise applications, and this is, sometimes, due to the ignorance of the benefits of using it and the strength of its implementations or let’s say tools. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="" lang="EN-GB"&gt;After being convinced to apply AOP, we must make a choice for the tool to use and the &lt;a style="font-style: italic; font-weight: bold;" href="http://java-source.net/open-source/aspect-oriented-frameworks"&gt;list&lt;/a&gt; of java frameworks as for almost all the areas is long. Fortunately this choice in our case is relatively easy (imho) because there are two predominant actors which are the most used and active ones and are AspectJ and Spring AOP. But even if I start by speaking about choices which traditionally means that I’ll compare the two solutions and make an exclusive choice (like for persistence, IoC…), I think that Spring AOP and AspectJ are two ‘opposite’/complimentary solutions that can coexist and interact without any problems. That's why in this particular case the real solution when applying AOP is to take in consideration the two tools and to make the choice based on the particular problem that we try to solve and its imposed context.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="" lang="EN-GB"&gt;In fact the principal source of this opposition / complementarity resides in the nature of the two solutions; while aspectJ is a full AOP solution, based on class-weaving and is considered as a language on his own; Spring AOP is a relatively limited solution based on proxies and aiming to provide the Springframework the capacity to resolve with simplicity and transparency most commons enterprise application problems that are resolvable with AOP. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;span style=""&gt; &lt;/span&gt;Being faced on a situation that we decide to resolve a particular problem or need with AOP, we must principally take in consideration three factors to determine which of the two tools, Spring AOP or AspectJ, to use:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style="margin-left: 71.4pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;!--[if !supportLists]--&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="" lang="EN-GB"&gt;The targets to be aspectized.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span  lang="EN-GB" style="font-family:Symbol;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="" lang="EN-GB"&gt;The type of pointcut needed by the aspect.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;!--[if !supportLists]--&gt;&lt;span  lang="EN-GB" style="font-family:Symbol;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="" lang="EN-GB"&gt;The invasiness of the solution.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;      &lt;p class="MsoNormal" style="text-indent: 35.4pt;"&gt;&lt;span style="" lang="EN-GB"&gt;So, firstly we must take on consideration the targets of our aspect, and this is due to two important facts that are the limitation of Spring AOP to act only on Spring beans and its incapacity to aspectise another aspect. Based on this it’s obvious that AspectJ is the solution in these cases.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="" lang="EN-GB"&gt;The second consideration is to see what kind of pointcut our aspect needs; because Spring AOP can only be applied on method execution, whereas AspectJ can be applied on practically all types of possible pointcut (call, get, set, preinitialization, staticinitialization, initialization, handler, adviceexecution, withincode,…). This can be seen as a big limitation for Spring AOP but in reality method execution based pointcuts are the most used ones in common enterprise application problematics; and this is simply because the major part of code fragments having meaningful (or important) business or technical logics are put into methods so it’s obvious that aspects are tied to these methods and are simply an externalisation and factorisation of what was put in these methods before using AOP.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="" lang="EN-GB"&gt;The third consideration is our tolerance to the invasiveness of the adopted solution. Spring AOP being a pure java implementation presenting an xml based declarative solution (schema-based support) and offering a valuable @Aspect support, is perfectly transparent. On the other side, being a class weaving based tool, AspectJ is relatively invasive. In fact if we choose the compile-time solution we must use the AspectJ specific compiler to weave the target application; even if this compiler has made many evolutions to be able of weaving source code as well as already compiled classes (or aspects - for aspect libraries) (this is also said post-compile weaving or binary weaving) even in a packaged form (for third party libraries or legacy applications) and its performance was &lt;/span&gt;remarkably&lt;span style="" lang="EN-GB"&gt; optimized. Personally, and based on my own experience I think that even if transparency is an important consideration, its not so prohibitive to use compile time weaving, because after all, this consecutive ‘pollution’ is localized in the build relative part and not propagated in our code; and tools like maven or Ant offers a big support for these needs; then I think that independently of what tool or support to use, the most important here, and more generally for all problems of this type, is the good modularisation of our application. AspectJ presents also an alternative to compile-time weaving, which is the Load-Time weaving; this feature is more transparent than the traditional one and can be enabled in &lt;a style="font-weight: bold; font-style: italic;" href="http://www.eclipse.org/aspectj/doc/released/devguide/ltw-configuration.html"&gt;different ways&lt;/a&gt;, but it still an exotic solution that must gain more maturity to be used as widely as compile-time weaving. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="" lang="EN-GB"&gt;There are also some miscellaneous considerations that can be important in some situations. As for other factors of discrimination these particularities are imposed principally by the natures of the two tools. In fact due to its proxy based implementation Spring AOP can presents some unexpected behaviour when faced to the use of the ‘&lt;span style="font-style: italic;"&gt;this’&lt;/span&gt; java keyword in the target method which can be a serious limitation when consider&lt;span style="color:red;"&gt; &lt;/span&gt;to use the developed aspects on legacy code or on third party libraries. Always for the same reasons, Spring AOP aspects can be instantiated only as singletons with the schema based support; and also as with the ‘perthis’ and ‘pertarget’ AspectJ’s instantiation model when using the @Aspect way; &lt;span style=""&gt; &lt;/span&gt;while the ‘percflow’ and ‘percflowbelow’ &lt;a style="font-weight: bold; font-style: italic;" href="http://www.eclipse.org/aspectj/doc/released/progguide/semantics-aspects.html#aspect-instantiation"&gt;instantiation models&lt;/a&gt; are not yet supported. Then, there are performance issues; personally I never find a case where this issue was prohibitive for the use of AOP, and I’ll limit myself to mention the &lt;a style="font-weight: bold; font-style: italic;" href="http://today.java.net/pub/n/AWbench"&gt;AWBench&lt;/a&gt; for those who want to make more investigations on performance.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;span style="" lang="EN-GB"&gt;Finally, and as a conclusion of what was mentioned above, I think that the best approach to take when we are faced to the problem consisting in to choosing what AOP tool to use between these two solutions, is to see firstly if we are in the applicability scope of Spring AOP (a spring bean as a target and a method execution as a pointcut); based on this we obviously must choose AspectJ in the case where we are out of this scope, else, I recommend using Spring AOP with the @Aspect support, which gives us the possibility of changing our initial choice and to use AspectJ if our needs evolutes and can’t be satisfied by Spring AOP. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/462145975146047744-7906574448334873184?l=java-chimaera.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-chimaera.blogspot.com/feeds/7906574448334873184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://java-chimaera.blogspot.com/2008/08/aspectj-or-spring-aop.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/7906574448334873184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/7906574448334873184'/><link rel='alternate' type='text/html' href='http://java-chimaera.blogspot.com/2008/08/aspectj-or-spring-aop.html' title='AspectJ or Spring AOP?'/><author><name>Slim Tebourbi</name><uri>http://www.blogger.com/profile/15470047192543139696</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-462145975146047744.post-5915897186281466412</id><published>2008-05-01T12:00:00.000-07:00</published><updated>2008-08-17T13:08:08.748-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Osgi'/><category scheme='http://www.blogger.com/atom/ns#' term='S2AP'/><title type='text'>The  SPRINGSOURCE NEW PRODUCT</title><content type='html'>&lt;p class="MsoNormal" style="text-align: left;"&gt;&lt;span style="" lang="EN-GB"&gt;SpringSource announced yesterday a new product the &lt;b&gt;&lt;a href="http://www.springsource.com/web/guest/products/suite/applicationplatform"&gt;SpringSource Application Platform&lt;/a&gt; &lt;/b&gt;which is simply said a J2EE server à &lt;st1:personname productid="la Spring" st="on"&gt;la Spring&lt;/st1:personname&gt; and OSGI.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="" lang="EN-GB"&gt;From a technical point of view I am very pleased about this new product, because I believe in OSGI and its benefits. I'm working on IBM Websphere 6.1 which is also based on OSGI but without giving the opportunity to access the target runtime from the application level, a feature that could simplify considerably the management (versioning, deployment, patching ...) and the non-web modules of the application like batches. This is not only the case of Websphere but all actual implementations of J2EE application servers choose this approach.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="" lang="EN-GB"&gt;But, from another point of view, I want to reply to a question that asked an &lt;a href="http://java.dzone.com/news/interview-rod-johnson-springso"&gt;interviewer to Rod Johnson&lt;/a&gt; about the unusual discretion about the announcement of this new SpringSource product.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="" lang="EN-GB"&gt;I think that the days when Spring was an implementation of some great ideas of Rod that he published in his two famous books &lt;i&gt;Expert One-on-One J2EE Design and Development and J2EE without EJB&lt;/i&gt; and evolved only by the needs and the critics of its community and those when the framework is becoming a platform with a company like the SpringSource behind it with important economic issues there is a big gap. And like any other company SpringSource will not be driven by the simple needs and ideas of his customers but principally by a commercial model. And so all the romantics and the effervescence of the Spring community must give way to commercial and economic models. I hope that I am wrong but I think that we are in the same scenario of Hibernate/Gavin King/JBoss.&lt;i&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/462145975146047744-5915897186281466412?l=java-chimaera.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-chimaera.blogspot.com/feeds/5915897186281466412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://java-chimaera.blogspot.com/2008/05/springsource-new-product.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/5915897186281466412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/462145975146047744/posts/default/5915897186281466412'/><link rel='alternate' type='text/html' href='http://java-chimaera.blogspot.com/2008/05/springsource-new-product.html' title='The  SPRINGSOURCE NEW PRODUCT'/><author><name>Slim Tebourbi</name><uri>http://www.blogger.com/profile/15470047192543139696</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
