<?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-106449775438946661</id><updated>2012-01-19T07:14:10.783-08:00</updated><category term='ruby'/><category term='m2eclipse'/><category term='voicexml'/><category term='quartz'/><category term='introduction'/><category term='emf'/><category term='erlang'/><category term='swing'/><category term='spock'/><category term='weblogic-maven-plugin'/><category term='ecore'/><category term='junit'/><category term='zones'/><category term='maven'/><category term='pidgin'/><category term='selenium'/><category term='page objects'/><category term='automaton'/><category term='xeger'/><category term='rfc2396'/><category term='oda'/><category term='data modelling'/><category term='gmaven'/><category term='gradle'/><category term='osgi'/><category term='find'/><category term='jar signing'/><category term='popup'/><category term='setDomainEnv'/><category term='agile'/><category term='junit4'/><category term='luntbuild'/><category term='jetty'/><category term='spring'/><category term='eclipse testing templates'/><category term='windows'/><category term='uml'/><category term='eclipse marketplace'/><category term='iconv'/><category term='solaris-gtk-x86'/><category term='sustainable pace'/><category term='eclipse'/><category term='axis2'/><category term='closures'/><category term='tycho'/><category term='jax-ws'/><category term='jmock'/><category term='hibernate'/><category term='nexenta'/><category term='ant'/><category term='sauceconnect'/><category term='java'/><category term='xsd'/><category term='refactoring'/><category term='webservices'/><category term='grails 2.0'/><category term='pl/sql'/><category term='synchronized'/><category term='vxml'/><category term='stiq'/><category term='jface'/><category term='hudson'/><category term='webdriver'/><category term='maven2'/><category term='trampoline'/><category term='regular expression'/><category term='concurrency'/><category term='swt'/><category term='jmeter'/><category term='oracle'/><category term='awt'/><category term='regex'/><category term='memoize'/><category term='solipse'/><category term='saucelabs'/><category term='parallels'/><category term='ehcache'/><category term='sql'/><category term='build'/><category term='jpa'/><category term='groovy'/><category term='unix'/><category term='lazy instantiation'/><category term='mac'/><category term='interval math'/><category term='weblogic'/><category term='find and replace'/><category term='regular expressions'/><category term='wldeploy'/><category term='testing'/><category term='blogging'/><category term='pde'/><category term='mercurial'/><category term='uri'/><category term='svn'/><category term='subversion'/><title type='text'>Overcoming Fear</title><subtitle type='html'>An open exploration of what I do not know.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://timezra.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/106449775438946661/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://timezra.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tim Myer</name><uri>http://www.blogger.com/profile/01514263555690798238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_65ARy92WIco/SeOrrQJl-EI/AAAAAAAAAAU/-TUhZO2zOIA/S220/bio-t-myer.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-106449775438946661.post-4219392847356303520</id><published>2012-01-16T22:58:00.000-08:00</published><updated>2012-01-16T22:58:35.682-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='saucelabs'/><category scheme='http://www.blogger.com/atom/ns#' term='gradle'/><category scheme='http://www.blogger.com/atom/ns#' term='page objects'/><category scheme='http://www.blogger.com/atom/ns#' term='grails 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='webdriver'/><category scheme='http://www.blogger.com/atom/ns#' term='spock'/><category scheme='http://www.blogger.com/atom/ns#' term='sauceconnect'/><category scheme='http://www.blogger.com/atom/ns#' term='selenium'/><title type='text'>BDD With Spock and Selenium</title><content type='html'>&lt;!DOCTYPE html&gt;&lt;br /&gt;&lt;html&gt;&lt;br /&gt;&lt;head&gt;&lt;br /&gt;&lt;link href='http://fonts.googleapis.com/css?family=Indie+Flower' rel='stylesheet' type='text/css'&gt;  &lt;br /&gt;&lt;meta charset="UTF-8"&gt;&lt;br /&gt;&lt;title&gt;BDD With Spock and Selenium&lt;/title&gt;&lt;br /&gt;&lt;/head&gt;&lt;br /&gt;&lt;body&gt;&lt;br /&gt; &lt;h4&gt;Goal&lt;/h4&gt; &lt;p&gt; To develop a web site specification-first using Spock and Selenium WebDriver.&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;h4&gt;tl;dr&lt;/h4&gt; &lt;p&gt; The sample code for this project is &lt;a href="https://github.com/timezra/course_registry"&gt;available on github&lt;/a&gt; and will be a helpful resource for following this article. The interesting technologies showcased include &lt;a href="http://code.google.com/p/spock/"&gt;Spock&lt;/a&gt;, &lt;a href="http://seleniumhq.org/projects/webdriver/"&gt;Selenium WebDriver&lt;/a&gt;, &lt;a href="http://code.google.com/p/selenium/wiki/PageObjects"&gt;Selenium PageObjects&lt;/a&gt;, &lt;a href="http://saucelabs.com/ondemand"&gt;Sauce OnDemand&lt;/a&gt;, &lt;a href="http://gradle.org/"&gt;Gradle&lt;/a&gt; and &lt;a href="http://grails.org/"&gt;Grails 2.0&lt;/a&gt;.&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;h4&gt;The Project&lt;/h4&gt; &lt;p&gt; Suppose our product owner would like to publish a website for teachers to schedule their classes and for students to register for those courses. At the first backlog grooming, the product owner has prioritized the stories that would constitute a &lt;a href="http://en.wikipedia.org/wiki/Minimum_viable_product"&gt;minimum viable product&lt;/a&gt;. &lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;h4&gt;&lt;a id="user_stories"&gt;User Stories&lt;/a&gt;&lt;/h4&gt; &lt;p&gt; During the team's first sprint planning meeting, we sized the stories, accepted four into the sprint, and have added tasks for each. Our story board for the first sprint contains &lt;a href="http://net.tutsplus.com/articles/news/create-a-sticky-note-effect-in-5-easy-steps-with-css3-and-html5/"&gt;sticky notes&lt;/a&gt; for our user stories, the acceptance criteria and the individual tasks for each story.&lt;br /&gt; &lt;/p&gt;&lt;br /&gt;    &lt;div style="           overflow-x: auto;           overflow-y: hidden;           padding: 1em;           background-color: white;            border-style: groove;           border-width: medium;"&gt;  &lt;div style="         float: left;             text-decoration: none;             color: #000;            font-family: 'Indie Flower', cursive;            width: 96em;"&gt;         &lt;!-- User Story 1 --&gt;&lt;br /&gt;   &lt;div style="         float: left;         padding: 1em;"&gt;    &lt;div     style="                   -webkit-backface-visibility: hidden;       box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);        -ms-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);        -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);        -moz-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);        -o-transform: rotate(-3deg);        -ms-transform: rotate(-3deg);        -webkit-transform: rotate(-3deg);        -moz-transform: rotate(-3deg);        -o-transition: -o-transform .15s linear;        -ms-transition: -ms-transform .15s linear;        -webkit-transition: -webkit-transform .15s linear;        -moz-transition: -moz-transform .15s linear;       position: relative;       z-index: 0;        background: #ffc;        height: 10em;        width: 10em;        padding: 1em;"     onmouseover="      this.style.boxShadow='10px 10px 7px rgba(0,0,0,.7)';        this.style.msBoxShadow='10px 10px 7px rgba(0,0,0,.7)';        this.style.WebkitBoxShadow='10px 10px 7px rgba(0,0,0,.7)';        this.style.MozBoxShadow='10px 10px 7px rgba(0,0,0,.7)';      this.style.OTransform='scale(1.25)';        this.style.MsTransform='scale(1.25)';        this.style.WebkitTransform='scale(1.25)';        this.style.MozTransform='scale(1.25)';        this.style.zIndex='1';"     onmouseout="      this.style.boxShadow='5px 5px 7px rgba(33,33,33,.7)';      this.style.msBoxShadow='5px 5px 7px rgba(33,33,33,.7)';      this.style.WebkitBoxShadow='5px 5px 7px rgba(33,33,33,.7)';      this.style.MozBoxShadow='5px 5px 7px rgba(33,33,33,.7)';      this.style.OTransform='rotate(-3deg)';      this.style.MsTransform='rotate(-3deg)';      this.style.WebkitTransform='rotate(-3deg)';      this.style.MozTransform='rotate(-3deg)';        this.style.zIndex='0';"&gt;     &lt;p&gt;      As a teacher  &lt;br /&gt;      I want to sign up  &lt;br /&gt;      So I can add courses &lt;br /&gt;     &lt;/p&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;div                 style="                   -webkit-backface-visibility: hidden;                   box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -ms-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -moz-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -o-transform: rotate(1deg);                    -ms-transform: rotate(1deg);                    -webkit-transform: rotate(1deg);                    -moz-transform: rotate(1deg);                    -o-transition: -o-transform .15s linear;                    -ms-transition: -ms-transform .15s linear;                    -webkit-transition: -webkit-transform .15s linear;                    -moz-transition: -moz-transform .15s linear;                   position: relative;                    z-index: 0;                    background: #ccf;                    height: 10em;                    width: 20em;                   padding: 1em;"                 onmouseover="                  this.style.boxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.msBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.WebkitBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.MozBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.OTransform='scale(1.25)';                    this.style.MsTransform='scale(1.25)';                    this.style.WebkitTransform='scale(1.25)';                    this.style.MozTransform='scale(1.25)';                    this.style.zIndex='1';"                 onmouseout="                  this.style.boxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.msBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.WebkitBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.MozBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.OTransform='rotate(1deg)';                  this.style.MsTransform='rotate(1deg)';                  this.style.WebkitTransform='rotate(1deg)';                  this.style.MozTransform='rotate(1deg)';                    this.style.zIndex='0';"&gt;                 Acceptance Criteria:&lt;br /&gt;                 &lt;ul&gt;                     &lt;li&gt;User is greeted with intro screen&lt;/li&gt;                     &lt;li&gt;User is able to register as a teacher or to login&lt;/li&gt;                     &lt;li&gt;After registration or login, a teacher sees account info&lt;/li&gt;                 &lt;/ul&gt;             &lt;/div&gt;   &lt;/div&gt;&lt;!-- User Story 2 --&gt;&lt;div style="               float: left;               padding: 1em;"&gt;             &lt;div                 style="                   -webkit-backface-visibility: hidden;                   box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -ms-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -moz-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                   -o-transform: rotate(4deg);                    -ms-transform: rotate(4deg);                    -webkit-transform: rotate(4deg);                    -moz-transform: rotate(4deg);                    -o-transition: -o-transform .15s linear;                    -ms-transition: -ms-transform .15s linear;                    -webkit-transition: -webkit-transform .15s linear;                    -moz-transition: -moz-transform .15s linear;                   position: relative;                   z-index: 0;                    background: #ffc;                    height: 10em;                    width: 10em;                    padding: 1em;"                 onmouseover="                  this.style.boxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.msBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.WebkitBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.MozBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                  this.style.OTransform='scale(1.25)';                    this.style.MsTransform='scale(1.25)';                    this.style.WebkitTransform='scale(1.25)';                    this.style.MozTransform='scale(1.25)';                    this.style.zIndex='1';"                 onmouseout="                  this.style.boxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.msBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.WebkitBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.MozBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.OTransform='rotate(4deg)';                  this.style.MsTransform='rotate(4deg)';                  this.style.WebkitTransform='rotate(4deg)';                  this.style.MozTransform='rotate(4deg)';                    this.style.zIndex='0';"&gt;     &lt;p&gt;      As a student  &lt;br /&gt;      I want to sign up  &lt;br /&gt;      So I can take courses &lt;br /&gt;     &lt;/p&gt;    &lt;/div&gt;             &lt;br /&gt;             &lt;div                 style="                   -webkit-backface-visibility: hidden;                   box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -ms-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -moz-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                   -o-transform: rotate(-2deg);                    -ms-transform: rotate(-2deg);                    -webkit-transform: rotate(-2deg);                    -moz-transform: rotate(-2deg);                    -o-transition: -o-transform .15s linear;                    -ms-transition: -ms-transform .15s linear;                    -webkit-transition: -webkit-transform .15s linear;                    -moz-transition: -moz-transform .15s linear;                   position: relative;                   z-index: 0;                    background: #ccf;                    height: 10em;                    width: 20em;                   padding: 1em;"                 onmouseover="                  this.style.boxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.msBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.WebkitBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.MozBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                  this.style.OTransform='scale(1.25)';                    this.style.MsTransform='scale(1.25)';                    this.style.WebkitTransform='scale(1.25)';                    this.style.MozTransform='scale(1.25)';                    this.style.zIndex='1';"                 onmouseout="                  this.style.boxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.msBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.WebkitBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.MozBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.OTransform='rotate(-2deg)';                  this.style.MsTransform='rotate(-2deg)';                  this.style.WebkitTransform='rotate(-2deg)';                  this.style.MozTransform='rotate(-2deg)';                    this.style.zIndex='0';"&gt;                 Acceptance Criteria:&lt;br /&gt;                 &lt;ul&gt;                     &lt;li&gt;User is able to register or to login as a student&lt;/li&gt;                     &lt;li&gt;After registration or login, a student sees account info&lt;/li&gt;                 &lt;/ul&gt;             &lt;/div&gt;   &lt;/div&gt;&lt;!-- User Story 3 --&gt;&lt;div style="               float: left;               padding: 1em;"&gt;             &lt;div                 style="                   -webkit-backface-visibility: hidden;                   box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -ms-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -moz-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                   -o-transform: rotate(-2deg);                    -ms-transform: rotate(-2deg);                    -webkit-transform: rotate(-2deg);                    -moz-transform: rotate(-2deg);                    -o-transition: -o-transform .15s linear;                    -ms-transition: -ms-transform .15s linear;                    -webkit-transition: -webkit-transform .15s linear;                    -moz-transition: -moz-transform .15s linear;                   position: relative;                   z-index: 0;                    background: #ffc;                    height: 10em;                    width: 10em;                    padding: 1em;"                 onmouseover="                  this.style.boxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.msBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.WebkitBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.MozBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                   this.style.OTransform='scale(1.25)';                    this.style.MsTransform='scale(1.25)';                    this.style.WebkitTransform='scale(1.25)';                    this.style.MozTransform='scale(1.25)';                    this.style.zIndex='1';"                 onmouseout="                  this.style.boxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.msBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.WebkitBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.MozBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.OTransform='rotate(-2deg)';                  this.style.MsTransform='rotate(-2deg)';                  this.style.WebkitTransform='rotate(-2deg)';                  this.style.MozTransform='rotate(-2deg)';                    this.style.zIndex='0';"&gt;                 &lt;p&gt;                     As a teacher  &lt;br /&gt;                     I want to add courses  &lt;br /&gt;                     So students can register for them &lt;br /&gt;                 &lt;/p&gt;             &lt;/div&gt;             &lt;br /&gt;             &lt;div                 style="                   -webkit-backface-visibility: hidden;                   box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -ms-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -moz-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                   -o-transform: rotate(3deg);                    -ms-transform: rotate(3deg);                    -webkit-transform: rotate(3deg);                    -moz-transform: rotate(3deg);                    -o-transition: -o-transform .15s linear;                    -ms-transition: -ms-transform .15s linear;                    -webkit-transition: -webkit-transform .15s linear;                    -moz-transition: -moz-transform .15s linear;                   position: relative;                   z-index: 0;                    background: #ccf;                    height: 10em;                    width: 20em;                   padding: 1em;"                 onmouseover="                  this.style.boxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.msBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.WebkitBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.MozBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                   this.style.OTransform='scale(1.25)';                    this.style.MsTransform='scale(1.25)';                    this.style.WebkitTransform='scale(1.25)';                    this.style.MozTransform='scale(1.25)';                    this.style.zIndex='1';"                 onmouseout="                  this.style.boxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.msBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.WebkitBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.MozBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.OTransform='rotate(3deg)';                  this.style.MsTransform='rotate(3deg)';                  this.style.WebkitTransform='rotate(3deg)';                  this.style.MozTransform='rotate(3deg)';                    this.style.zIndex='0';"&gt;                 Acceptance Criteria:&lt;br /&gt;                 &lt;ul&gt;                     &lt;li&gt;A teacher can add a course&lt;/li&gt;                     &lt;li&gt;Courses occur in a semester&lt;/li&gt;                     &lt;li&gt;Courses occur in timeslots&lt;/li&gt;                     &lt;li&gt;Courses can have prerequisites&lt;/li&gt;                 &lt;/ul&gt;             &lt;/div&gt;         &lt;/div&gt;&lt;!-- User Story 4 --&gt;&lt;div style="               float: left;               padding: 1em;"&gt;             &lt;div                 style="                   -webkit-backface-visibility: hidden;                   box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -ms-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -moz-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                   -o-transform: rotate(4deg);                    -ms-transform: rotate(4deg);                    -webkit-transform: rotate(4deg);                    -moz-transform: rotate(4deg);                    -o-transition: -o-transform .15s linear;                    -ms-transition: -ms-transform .15s linear;                    -webkit-transition: -webkit-transform .15s linear;                    -moz-transition: -moz-transform .15s linear;                   position: relative;                   z-index: 0;                    background: #ffc;                    height: 10em;                    width: 10em;                    padding: 1em;"                 onmouseover="                  this.style.boxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.msBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.WebkitBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.MozBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                   this.style.OTransform='scale(1.25)';                    this.style.MsTransform='scale(1.25)';                    this.style.WebkitTransform='scale(1.25)';                    this.style.MozTransform='scale(1.25)';                    this.style.zIndex='1';"                 onmouseout="                  this.style.boxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.msBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.WebkitBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.MozBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.OTransform='rotate(4deg)';                  this.style.MsTransform='rotate(4deg)';                  this.style.WebkitTransform='rotate(4deg)';                  this.style.MozTransform='rotate(4deg)';                    this.style.zIndex='0';"&gt;                 &lt;p&gt;                     As a student  &lt;br /&gt;                     I want to register for courses  &lt;br /&gt;                     So I can get credits toward my degree &lt;br /&gt;                 &lt;/p&gt;             &lt;/div&gt;             &lt;br /&gt;             &lt;div                 style="                   -webkit-backface-visibility: hidden;                   box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -ms-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                    -moz-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);                   -o-transform: rotate(-1deg);                    -ms-transform: rotate(-1deg);                    -webkit-transform: rotate(-1deg);                    -moz-transform: rotate(-1deg);                    -o-transition: -o-transform .15s linear;                    -ms-transition: -ms-transform .15s linear;                    -webkit-transition: -webkit-transform .15s linear;                    -moz-transition: -moz-transform .15s linear;                   position: relative;                   z-index: 0;                    background: #ccf;                    height: 10em;                    width: 20em;                   padding: 1em;"                 onmouseover="                  this.style.boxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.msBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.WebkitBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                    this.style.MozBoxShadow='10px 10px 7px rgba(0,0,0,.7)';                   this.style.OTransform='scale(1.25)';                    this.style.MsTransform='scale(1.25)';                    this.style.WebkitTransform='scale(1.25)';                    this.style.MozTransform='scale(1.25)';                    this.style.zIndex='1';"                 onmouseout="                  this.style.boxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.msBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.WebkitBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.MozBoxShadow='5px 5px 7px rgba(33,33,33,.7)';                  this.style.OTransform='rotate(-1deg)';                  this.style.MsTransform='rotate(-1deg)';                  this.style.WebkitTransform='rotate(-1deg)';                  this.style.MozTransform='rotate(-1deg)';                    this.style.zIndex='0';"&gt;                 Acceptance Criteria:&lt;br /&gt;                 &lt;ul&gt;                     &lt;li&gt;A student can register for a course&lt;/li&gt;                     &lt;li&gt;A student must take any pre-reqs before registering for a course&lt;/li&gt;                     &lt;li&gt;A student cannot take 2 courses that occur in the same timeslot&lt;/li&gt;                 &lt;/ul&gt;             &lt;/div&gt;         &lt;/div&gt;  &lt;/div&gt; &lt;/div&gt; &lt;div style="clear: both"&gt;&lt;/div&gt;&lt;br /&gt; &lt;h4&gt;Project Structure&lt;/h4&gt; &lt;p&gt; We will create a top-level project &lt;em&gt;course_registry&lt;/em&gt; and the two sub-projects &lt;em&gt;web&lt;/em&gt; and &lt;em&gt;specifications&lt;/em&gt;.  We will also create a &lt;em&gt;build.gradle&lt;/em&gt; file in the root along with &lt;em&gt;settings.gradle&lt;/em&gt; and a &lt;em&gt;build.gradle&lt;/em&gt; file in the &lt;em&gt;specifications&lt;/em&gt; subproject for running automated acceptance tests (While &lt;a href="http://www.gradle.org/userguide/0.5.2/userguidech17.html#x48-13000017.2.1"&gt;this is not strictly necessary&lt;/a&gt;, it will help to keep our project boundaries clear).&lt;br /&gt;    &lt;/p&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: black;            color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;course_registry&lt;br /&gt;   &amp;nbsp;&amp;nbsp; .&lt;br /&gt;   &amp;nbsp;&amp;nbsp;|____build.gradle&lt;br /&gt;   &amp;nbsp;&amp;nbsp;|____settings.gradle&lt;br /&gt;   &amp;nbsp;&amp;nbsp;| specifications&lt;br /&gt;   &amp;nbsp;&amp;nbsp;| |____build.gradle&lt;br /&gt;   &amp;nbsp;&amp;nbsp;| web&lt;br /&gt;  &lt;/span&gt;&lt;br /&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;em&gt;course_registry/build.gradle&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,0,0);"&gt;allprojects&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;apply&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;plugin:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'eclipse'&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'1.0.0-SNAPSHOT'&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'timezra.course_registry'&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;subprojects&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;sourceCompatibility&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(205,50,0);"&gt;6&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;br /&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;em&gt;course_registry/settings.gradle&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,0,0);"&gt;include&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'web'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'specifications'&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;br /&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;em&gt;course_registry/specifications/build.gradle&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;div style="font-family: courier new; width: 80em; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,0,0);"&gt;apply&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;plugin:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'groovy'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;repositories&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;mavenCentral()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;mavenRepo&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;url:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;http://m2repo.spockframework.org/snapshots&amp;quot;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;dependencies&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;groovy&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.codehaus.groovy'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'groovy'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'1.8.5'&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;testCompile&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.spockframework'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'spock-core'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'0.6-groovy-1.8-SNAPSHOT'&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;testCompile&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.seleniumhq.selenium'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'selenium-java'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'2.16.1'&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;testCompile&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'junit'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'junit'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'4.10'&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;/div&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;p&gt; We will create a &lt;em&gt;src/test/groovy&lt;/em&gt; folder in the &lt;em&gt;specifications&lt;/em&gt; project. At this point we can generate Eclipse .project and .classpath files for all the projects from the project root in order to work within an IDE.&lt;br /&gt;    &lt;/p&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: black;            color: white;            border-style: dashed;            border-width: thin"&gt;        &lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;br /&gt;        &lt;span style="color: green;"&gt;course_registry $&amp;gt;&lt;/span&gt;&amp;nbsp;gradle eclipseProject&lt;br /&gt;        &lt;span style="color: green;"&gt;course_registry $&amp;gt;&lt;/span&gt;&amp;nbsp;gradle eclipseClasspath&lt;br /&gt;        &lt;/span&gt;&lt;br /&gt;    &lt;/div&gt;&lt;br /&gt; &lt;h4&gt;The Teacher Registration Spec&lt;/h4&gt; &lt;p&gt; We are now able to write the first specification for our acceptance criteria.&lt;br /&gt; &lt;/p&gt; &lt;br /&gt; &lt;em&gt;timezra/course_registry/TeacherRegistrationSpec.groovy&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;package&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;timezra.course_registry&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;java.util.concurrent.TimeUnit.SECONDS&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;org.openqa.selenium.WebDriver&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;org.openqa.selenium.firefox.FirefoxDriver&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;spock.lang.Specification&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;TeacherRegistrationSpec&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;extends&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Specification&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebDriver&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;setup()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;FirefoxDriver()&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.manage().timeouts().implicitlyWait&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;SECONDS&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;cleanup()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.quit()&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;a&amp;nbsp;user&amp;nbsp;is&amp;nbsp;greeted&amp;nbsp;with&amp;nbsp;an&amp;nbsp;intro&amp;nbsp;screen&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;when:&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.get&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;http://localhost:8080/course_registry&amp;quot;&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;then:&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.title&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;Course&amp;nbsp;Registry&amp;nbsp;Home&amp;quot;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;br /&gt;    &lt;/div&gt;&lt;br /&gt;    &lt;p&gt;    We can run this spec and watch it fail.&lt;br /&gt;    &lt;/p&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: black;            color: white;            border-style: dashed;            border-width: thin"&gt;        &lt;div style="font-family: courier new; width: 80em; font-size: 11pt;"&gt;         &lt;span style="color: green;"&gt;course_registry $&amp;gt;&lt;/span&gt;&amp;nbsp;gradle test --info&lt;br /&gt;         ....&lt;br /&gt;         Test a user is greeted with an intro screen(timezra.course_registry.TeacherRegistrationSpec) FAILED: org.gradle.messaging.remote.internal.PlaceholderException: org.spockframework.runtime.SpockComparisonFailure: Condition not satisfied:&lt;br /&gt; &lt;br /&gt;         driver.title == "Course Registry Home"&lt;br /&gt;         |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;         |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;false&lt;br /&gt;         |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;17 differences (15% similarity)&lt;br /&gt;         |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(Pr)o(bl-)e(m) (load)i(ng--) (pag)e&lt;br /&gt;         |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(C-)o(urs)e(-) (Reg-)i(stry) (Hom)e&lt;br /&gt;         |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Problem loading page&lt;br /&gt;         org.openqa.selenium.firefox.FirefoxDriver@4532be10&lt;br /&gt; &lt;br /&gt;         Test timezra.course_registry.TeacherRegistrationSpec FAILED&lt;br /&gt;         Gradle Worker 1 finished executing tests.&lt;br /&gt;         1 test completed, 1 failure&lt;br /&gt; &lt;br /&gt;         &lt;span style="color: red;"&gt;FAILURE: Build failed with an exception.&lt;/span&gt;&lt;br /&gt;         ....&lt;br /&gt;        &lt;/div&gt;    &lt;/div&gt;    &lt;br /&gt; &lt;h4&gt;Satisfying the Spec&lt;/h4&gt; &lt;p&gt; Suppose the team decides to use Grails 2.0 to implement the specification. This is not a restriction based on our other technology choices, since gradle is &lt;a href="http://www.gradle.org/userguide/0.5.2/userguidech17.html#x48-12700017.1"&gt;a general purpose build tool&lt;/a&gt; and since our specification defines how a user will interact with our web project entirely through a browser. The decision is based on the convenience of the framework, community support, the plug-in ecosystem and the skills of the developers.&lt;br /&gt; &lt;/p&gt; &lt;p&gt; First, we need to create an empty &lt;em&gt;web/grails-app&lt;/em&gt; directory to indicate to the grails bootstrap that the project will be a grails application.&lt;br /&gt; Then, we will configure our web build for Grails 2.0 in a new &lt;em&gt;web/build.gradle&lt;/em&gt; file.&lt;br /&gt; &lt;/p&gt; &lt;em&gt;web/build.gradle&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;div style="font-family: courier new; width: 80em; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,0,0);"&gt;buildscript&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;repositories&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;mavenCentral()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;mavenRepo&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;url:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'https://repository.jboss.org/nexus/content/groups/public/'&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;mavenRepo&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;url:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'http://repo.grails.org/grails/repo'&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;dependencies&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;classpath&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.grails'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails-gradle-plugin'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'1.1.0'&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;grailsVersion&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'2.0.0'&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;apply&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;plugin:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails'&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;dependencies&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;compile&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.grails'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails-resources'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;grailsVersion&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;compile&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.grails'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails-crud'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;grailsVersion&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;compile&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.grails'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails-hibernate'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;grailsVersion&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;compile&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.grails'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails-plugin-datasource'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;grailsVersion&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;runtime&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.grails'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails-plugin-log4j'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;grailsVersion&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;runtime&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.grails'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails-plugin-url-mappings'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;grailsVersion&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;runtime&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.grails'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails-plugin-gsp'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;grailsVersion&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;runtime&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.grails'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails-plugin-filters'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;grailsVersion&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;runtime&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.grails'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails-plugin-scaffolding'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;grailsVersion&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;runtime&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.grails'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails-plugin-services'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;grailsVersion&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;runtime&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'org.grails'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails-plugin-servlets'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;grailsVersion&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;runtime&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'com.h2database'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'h2'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'1.3.163'&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;runtime&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'net.sf.ehcache'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'ehcache-core'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'2.4.6'&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;repositories&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;mavenCentral()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;mavenRepo&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;url:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'https://repository.jboss.org/nexus/content/groups/public/'&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;mavenRepo&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;url:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'http://repo.grails.org/grails/repo'&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;/div&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;p&gt;    From the project root we will initialize the grails project.&lt;br /&gt;    &lt;/p&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: black;            color: white;            border-style: dashed;            border-width: thin"&gt;        &lt;div style="font-family: courier new; width: 80em; font-size: 11pt;"&gt;         &lt;span style="color: green;"&gt;course_registry $&amp;gt;&lt;/span&gt;&amp;nbsp;gradle grails-init&lt;br /&gt;         :web:grails-init&lt;br /&gt;   The ResolvedArtifact.getResolvedDependency() method is deprecated and will be removed in the next version of Gradle.&lt;br /&gt;   &lt;span style="color:olive;"&gt;|&lt;/span&gt; Configuring classpath&lt;br /&gt;   &lt;span style="color:red;"&gt;| Error&lt;/span&gt; log4j:WARN No appenders could be found for logger (org.springframework.core.io.support.PathMatchingResourcePatternResolver).&lt;br /&gt;   &lt;span style="color:red;"&gt;| Error&lt;/span&gt; log4j:WARN Please initialize the log4j system properly.&lt;br /&gt;   &lt;span style="color:red;"&gt;| Error&lt;/span&gt; log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.&lt;br /&gt;   &lt;span style="color:olive;"&gt;|&lt;/span&gt; Environment set to development.....&lt;br /&gt;   &lt;br /&gt;   BUILD SUCCESSFUL&lt;br /&gt;   &lt;br /&gt;   Total time: 1 mins 36.328 secs&lt;br /&gt;        &lt;/div&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;p&gt;    We can satisfy the spec simply by modifying &lt;em&gt;application.properties&lt;/em&gt; with the expected web application deployment path and project version, the homepage to include the expected title, and &lt;em&gt;messages.properties&lt;/em&gt; to contain the expected messages.&lt;br /&gt;    &lt;/p&gt;    &lt;br /&gt;    &lt;em&gt;web/application.properties&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;        &lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,0,0);"&gt;app.grails.version&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;2.0.0&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0,0,0);"&gt;app.name&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;course_registry&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0,0,0);"&gt;app.servlet.version&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;2.5&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0,0,0);"&gt;app.version&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;1.0.0-SNAPSHOT&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;em&gt;web/grails-app/views/index.gsp&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;html&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;head&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;title&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;g:message&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;code&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;home.title&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;title&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;meta&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;layout&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;content&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;main&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;style&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;type&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;media&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;screen&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-style: italic; color: rgb(63,127,127);"&gt;#pageBody&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;margin-left&lt;/span&gt;:&amp;nbsp;&lt;span style="font-style: italic; color: rgb(42,0,225);"&gt;280px&lt;/span&gt;;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;margin-right&lt;/span&gt;:&amp;nbsp;&lt;span style="font-style: italic; color: rgb(42,0,225);"&gt;20px&lt;/span&gt;;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;style&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;head&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;body&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;pageBody&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;class&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;dialog&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;p&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;g:message&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;code&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;home.welcome.message&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;p&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;div&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;body&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;html&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;em&gt;web/grails-app/i18n/messages.properties&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;span style="font-family: courier new; font-size: 11pt;"&gt;....&lt;br /&gt;  &lt;span style="color: rgb(0,0,0);"&gt;home.title&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;Course&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(42,0,255);"&gt;Registry&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(42,0,255);"&gt;Home&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0,0,0);"&gt;home.welcome.message&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;Welcome&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(42,0,255);"&gt;to&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(42,0,255);"&gt;the&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(42,0,255);"&gt;course&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(42,0,255);"&gt;registry.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;p&gt;    We can now add hooks to the specifications project to stop and start the web application before and after running the specifications, respectively.&lt;br /&gt;    &lt;/p&gt;    &lt;em&gt;specifications/build.gradle&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;test.dependsOn&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;':web:webStart'&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;gradle.taskGraph.afterTask&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Task&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;task,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;TaskState&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;state&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;':specifications:test'&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;task.path)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;project(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;':web'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;).tasks.getByPath(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;'webStop'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;).execute()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;br /&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;p&gt;    These hooks depend on a specific interface in the &lt;em&gt;web&lt;/em&gt; project, i.e., the existence of the tasks &lt;em&gt;webStart&lt;/em&gt; and &lt;em&gt;webStop&lt;/em&gt;. We can deploy the Grails 2.0 artifact to an &lt;a href="http://gradle.org/docs/current/userguide/jetty_plugin.html"&gt;embedded Jetty server&lt;/a&gt; through gradle to satisfy this interface.&lt;br /&gt;    &lt;/p&gt;    &lt;br /&gt;    &lt;em&gt;web/build.gradle&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;div style="font-family: courier new; width: 80em; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0,0,0);"&gt;apply&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;plugin:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'jetty'&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;stopPort&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;8001&lt;/span&gt;&lt;br /&gt;    &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;safeWord&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'banana'&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: rgb(0,0,0);"&gt;task&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;webStart(dependsOn:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'grails-war'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;jettyRunWar&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;tasks.getByPath(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;'jettyRunWar'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;jettyRunWar.webApp&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;File(projectDir,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;target/course_registry-${version}.war&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;jettyRunWar.contextPath&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'course_registry'&lt;/span&gt;&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;jettyRunWar.daemon&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;true&lt;/span&gt;&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;jettyRunWar.stopPort&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;stopPort&lt;/span&gt;&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;jettyRunWar.stopKey&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;safeWord&lt;/span&gt;&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;jettyRunWar.execute()&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: rgb(0,0,0);"&gt;task&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;webStop&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;jettyStop&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;tasks.getByPath(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;'jettyStop'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;jettyStop.stopPort&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;stopPort&lt;/span&gt;&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;jettyStop.stopKey&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;safeWord&lt;/span&gt;&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;jettyStop.execute()&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;  &lt;/div&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;p&gt;    The first specification should now be satisfied.&lt;br /&gt;    &lt;/p&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: black;            color: white;            border-style: dashed;            border-width: thin"&gt;        &lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;br /&gt;            &lt;span style="color: green;"&gt;course_registry $&amp;gt;&lt;/span&gt;&amp;nbsp;gradle test --info&lt;br /&gt;            ....&lt;br /&gt;            Started Jetty Server&lt;br /&gt;   Gradle Worker 1 executing tests.&lt;br /&gt;   Test a user is greeted with an intro screen(timezra.course_registry.TeacherRegistrationSpec) PASSED&lt;br /&gt;   Gradle Worker 1 finished executing tests.&lt;br /&gt;   ....&lt;br /&gt;        &lt;/span&gt;&lt;br /&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;strong&gt;NB:&lt;/strong&gt; The Jetty plugin must be applied before the grails plugin, or else you will see an error similar to the following:&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: black;            color: white;            border-style: dashed;            border-width: thin"&gt;        &lt;div style="font-family: courier new; width: 80em; font-size: 11pt;"&gt;   &lt;span style="color:red;"&gt;FAILURE: Build failed with an exception.&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   * Where:&lt;br /&gt;   Build file '/path/to/course_registry/web/build.gradle' line: 38&lt;br /&gt;   &lt;br /&gt;   * What went wrong:&lt;br /&gt;   A problem occurred evaluating project ':web'.&lt;br /&gt;   Cause: Cannot add task ':web:clean' as a task with that name already exists.&lt;br /&gt;   &lt;br /&gt;   * Try:&lt;br /&gt;   Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color:red;"&gt;BUILD FAILED&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   Total time: 7.624 secs&lt;br /&gt;        &lt;/div&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;p&gt;    Adding another test for our second acceptance criterion should be straightforward now that our infrastructure is in place. &lt;br /&gt;    &lt;/p&gt;    &lt;em&gt;timezra/course_registry/TeacherRegistrationSpec.groovy&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;div style="font-family: courier new; width: 80em; font-size: 11pt;"&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;a&amp;nbsp;user&amp;nbsp;can&amp;nbsp;register&amp;nbsp;as&amp;nbsp;a&amp;nbsp;teacher&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;when:&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.get&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;http://localhost:8080/course_registry&amp;quot;&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebElement&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;teacherLink&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.findElement(By.id(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;'teacher_link'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;))&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;teacherLink.click()&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebElement&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.findElement(By.id(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;'name'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;))&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;type&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'John&amp;nbsp;Doe'&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebElement&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;email&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.findElement(By.id(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;'email'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;))&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;type&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;email,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;"${UUID.&lt;/span&gt;&lt;span style="color: rgb(0,0,0); font-style: italic;"&gt;randomUUID&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;()}@rutgers.edu"&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebElement&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;password&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.findElement(By.id(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;'password'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;))&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;type&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;password,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'1234567'&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebElement&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;create&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.findElement(By.id(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;'create'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;))&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;create.click()&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;then:&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.title&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'Show&amp;nbsp;Teacher'&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.findElement(By.className(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;'message'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)).text&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==~&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;/Teacher&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;\d+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;created/&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;type(field,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;text)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;field.clear()&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;field.sendKeys&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;text&lt;/span&gt;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;/div&gt;    &lt;/div&gt;    &lt;br /&gt;    &lt;p&gt;    We can satisfy this specification by generating a Grails &lt;em&gt;Teacher&lt;/em&gt; domain object with fields for the name, email and password, along with a Grails controller that uses dynamic scaffolding to generate the view and actions available, and by adding a link to the scaffolded &lt;em&gt;Create Teacher&lt;/em&gt; page on our &lt;em&gt;web/grails-app/views/index.gsp&lt;/em&gt;. Since the point of this tutorial is not to cover basic Grails development, we do not need to go into those specifics here, but sample code can be found on the &lt;a href="https://github.com/timezra/course_registry"&gt;project site&lt;/a&gt; or in any &lt;a href="http://grails.org/Tutorials"&gt;Grails tutorial&lt;/a&gt; for further reference.&lt;br /&gt;    &lt;/p&gt;    &lt;br /&gt; &lt;h4&gt;Page Objects&lt;/h4&gt; &lt;p&gt; Before we get too far with automating our acceptance criteria, we should begin to look towards a more abstract representation of the testable components of our application. From the second acceptance test above, we can already see patterns emerging. For example, when we navigate to a particular page, it would be convenient to identify that we are on the correct page, perhaps by its title. It would also be convenient to represent each view in the application as its own object, and each view could encapsulate its specific &lt;em&gt;WebElement&lt;/em&gt;s. Finally, there is a small set of actions available for any &lt;em&gt;WebElement&lt;/em&gt; on a page, and it would be helpful to build these actions into a testing DSL. Fortunately, by combining the &lt;a href="http://code.google.com/p/selenium/wiki/PageObjects"&gt;Page Object&lt;/a&gt; pattern and Groovy's dynamic language features, we can achieve all these goals with a minimal amount of code. &lt;br /&gt; &lt;/p&gt; &lt;p&gt; As we are satisfying the specifications for all the &lt;a href="#user_stories"&gt;acceptance criteria&lt;/a&gt;, a base &lt;a href="http://code.google.com/p/selenium/wiki/PageObjects"&gt;Page Object&lt;/a&gt; emerges.&lt;br /&gt; &lt;/p&gt; &lt;em&gt;specifications/src/test/groovy/timezra/course_registry/pages/CourseRegistryPage.groovy&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;div style="font-family: courier new; width: 80em; font-size: 11pt;"&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;package&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;timezra.course_registry.pages&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;org.apache.commons.lang.StringUtils.splitByCharacterTypeCamelCase&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;org.openqa.selenium.WebDriver&lt;/span&gt;&lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;org.openqa.selenium.WebElement&lt;/span&gt;&lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;org.openqa.selenium.support.FindBy&lt;/span&gt;&lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;org.openqa.selenium.support.PageFactory&lt;/span&gt;&lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;org.openqa.selenium.support.ui.Select&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;abstract&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;CourseRegistryPage&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebDriver&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(70,70,70);"&gt;@FindBy&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(className&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebElement&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;message&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;&amp;lt;T&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;extends&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;CourseRegistryPage&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;T&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;goTo(String&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;address,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebDriver&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Class&amp;lt;T&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;page)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.get&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;address&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;PageFactory.initElements&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;page&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;CourseRegistryPage(WebDriver&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;.driver&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;String&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;title&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;splitByCharacterTypeCamelCase(getClass().simpleName).&lt;/span&gt;&lt;span style="color: rgb(102,204,255);"&gt;join&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'&amp;nbsp;'&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(!title.equals(driver.title))&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;IllegalStateException(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;Should&amp;nbsp;be&amp;nbsp;on&amp;nbsp;page&amp;nbsp;'${title}'&amp;nbsp;but&amp;nbsp;was&amp;nbsp;on&amp;nbsp;page&amp;nbsp;'${driver.title}'&amp;nbsp;instead&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;methodMissing(String&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;args)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;m&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;((m&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=~&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;/click_(\w+)/))&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;webElement&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;${m[0][1]}&amp;quot;&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;webElement.click()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;PageFactory.initElements&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;args[&lt;/span&gt;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;]&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;((m&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=~&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;/type_(\w+)/))&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;webElement&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;${m[0][1]}&amp;quot;&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;webElement.clear()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;webElement.sendKeys&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;args[&lt;/span&gt;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;]&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;((m&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=~&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;/choose_(\w+)/))&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;webElement&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;${m[0][1]}&amp;quot;&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;select&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Select(webElement)&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;select.selectByVisibleText&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;args[&lt;/span&gt;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;]&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;MissingMethodException(name,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;getClass(),&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;args)&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;/div&gt;    &lt;/div&gt;    &lt;p&gt;NB: The constructor verifies that the page is correct by comparing the class name to the page title; in addition, the static &lt;em&gt;goTo&lt;/em&gt; method demonstrates how to use the &lt;em&gt;PageFactory&lt;/em&gt; for initializing a &lt;a href="http://code.google.com/p/selenium/wiki/PageObjects"&gt;Page Object&lt;/a&gt;; the &lt;em&gt;methodMissing&lt;/em&gt; declaration also showcases Groovy's ability to call dynamic methods based on the combination of the &lt;em&gt;click&lt;/em&gt;, &lt;em&gt;type&lt;/em&gt; and &lt;em&gt;choose&lt;/em&gt; actions with individual &lt;em&gt;WebElement&lt;/em&gt; names. Such phrases become first-class elements of the testing DSL.&lt;/p&gt; &lt;br /&gt; &lt;p&gt; We can see the use of &lt;em&gt;WebElement&lt;/em&gt; injection and dynamic methods in action with a &lt;em&gt;CreateUser&lt;/em&gt; page that serves as the base for the &lt;em&gt;CreateTeacher&lt;/em&gt; and &lt;em&gt;CreateStudent&lt;/em&gt; pages.&lt;br /&gt; &lt;/p&gt; &lt;br /&gt; &lt;em&gt;specifications/src/test/groovy/timezra/course_registry/pages/CreateUser.groovy&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;package&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;timezra.course_registry.pages&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;groovy.transform.InheritConstructors&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;org.openqa.selenium.WebDriver&lt;/span&gt;&lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;org.openqa.selenium.WebElement&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color: rgb(70,70,70);"&gt;@InheritConstructors&lt;/span&gt;&lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;abstract&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;CreateUser&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;extends&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;CourseRegistryPage&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebElement&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebElement&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;email&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebElement&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;password&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebElement&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;create&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;CreateUser(WebDriver&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;super&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(driver)&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;T&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;register(name,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;email,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;password,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Class&amp;lt;T&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;nextPage)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;type_name&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;type_email&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;email&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;type_password&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;password&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;click_create&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;nextPage&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;br /&gt;    &lt;/div&gt;&lt;br /&gt; &lt;h4&gt;Other Browsers&lt;/h4&gt; So far, we have done all our testing with a single &lt;em&gt;WebDriver&lt;/em&gt;, i.e., the &lt;em&gt;FirefoxDriver&lt;/em&gt;. For simple testing, a single driver works fine, but if we wish to ensure that our website works in multiple browsers, we will need to configure our tests to use multiple &lt;em&gt;WebDriver&lt;/em&gt;s. Fortunately, since we are using Gradle to manage our dependencies, the &lt;em&gt;InternetExplorerDriver&lt;/em&gt; and &lt;a href="http://code.google.com/p/selenium/wiki/ChromeDriver"&gt;&lt;em&gt;ChromeDriver&lt;/em&gt;&lt;/a&gt; should be available to us automatically, along with the &lt;em&gt;AndroidDriver&lt;/em&gt; and &lt;em&gt;IPhoneDriver&lt;/em&gt; for testing our application on mobile devices. In addition, an &lt;a href="http://code.google.com/p/selenium/wiki/OperaDriver"&gt;&lt;em&gt;OperaDriver&lt;/em&gt;&lt;/a&gt; is also available.&lt;br /&gt; &lt;p&gt; &lt;strong&gt;NB:&lt;/strong&gt; Some of these drivers require that additional platform-specific software be installed, so please read the project pages for documentation on additional requirements.&lt;br /&gt; &lt;/p&gt; &lt;br /&gt; &lt;p&gt; Configuring our specifications to use multiple &lt;em&gt;WebDriver&lt;/em&gt;s should just be a matter of &lt;a href="http://code.google.com/p/spock/wiki/Parameterizations"&gt;parameterizing each Spock feature&lt;/a&gt;.&lt;br /&gt; &lt;/p&gt; &lt;p&gt; &lt;strong&gt;NB:&lt;/strong&gt; Unlike JUnit tests which are parameterized by fixture, Spock specifications are parameterized per feature.&lt;br /&gt; &lt;/p&gt;    &lt;br /&gt;    &lt;p&gt;    We will modify our &lt;em&gt;TeacherRegistrationSpec&lt;/em&gt; to use the Spock &lt;em&gt;where:&lt;/em&gt; block for parameterization, we will configure multiple &lt;em&gt;WebDriver&lt;/em&gt;s, and we will &lt;em&gt;share&lt;/em&gt; the instance &lt;em&gt;driver&lt;/em&gt; field among the parameterized features. &lt;br /&gt;    &lt;/p&gt;    &lt;em&gt;timezra/course_registry/TeacherRegistrationSpec.groovy&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;div style="font-family: courier new; width: 80em; font-size: 11pt;"&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;TeacherRegistrationSpec&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;extends&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Specification&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(70,70,70);"&gt;@Shared&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebDriver&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;setup()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.manage().timeouts().implicitlyWait&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;SECONDS&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;cleanup()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.quit()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;a&amp;nbsp;user&amp;nbsp;is&amp;nbsp;greeted&amp;nbsp;with&amp;nbsp;an&amp;nbsp;intro&amp;nbsp;screen&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;when:&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;then:&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;where:&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;browser&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;browsers()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;a&amp;nbsp;user&amp;nbsp;can&amp;nbsp;register&amp;nbsp;as&amp;nbsp;a&amp;nbsp;teacher&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;when:&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;then:&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;where:&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;browser&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;browsers()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;browsers()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;System.setProperty(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;webdriver.chrome.driver&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;/path/to/chromedriver&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;drivers&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;[&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;HtmlUnitDriver(),&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;FirefoxDriver(),&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;ChromeDriver()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;]&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Browsers(spec:&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;delegate:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;drivers.iterator())&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Browsers&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(70,70,70);"&gt;@Delegate&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Iterator&amp;lt;WebDriver&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;delegate&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;TeacherRegistrationSpec&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;spec&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(70,70,70);"&gt;@Override&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;WebDriver&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;next&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;spec.driver&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;delegate.&lt;/span&gt;&lt;span style="color: rgb(102,204,255);"&gt;next&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;/div&gt;    &lt;/div&gt;&lt;br /&gt; &lt;h4&gt;Testing In The Cloud&lt;/h4&gt; &lt;p&gt; Now that our specifications are running through multiple browsers on a single machine, we can move a step further towards testing multiple browser versions on multiple OSes with cloud-based services such as &lt;a href="http://saucelabs.com/"&gt;Sauce Labs&lt;/a&gt;. For such a powerful service, the configuration changes to our existing application are surprisingly simple. We will modify our &lt;em&gt;TeacherRegistrationSpec&lt;/em&gt; to use a &lt;em&gt;RemoteWebDriver&lt;/em&gt; for the specific browser and OS combination we would like to test along with our Sauce Labs username and API key as described in the &lt;a href="http://saucelabs.com/docs/ondemand/getting-started/env/java/se2/mac"&gt;Sauce OnDemand documentation&lt;/a&gt;. We will also need to add a Gradle plugin to start &lt;em&gt;SauceConnect&lt;/em&gt; from the build, just as we start our web application before running acceptance tests. Finally, we should ensure that all references to &lt;em&gt;localhost&lt;/em&gt; in our application are changed to the IP address of the machine where we will be running our tests; otherwise, we might see the &lt;em&gt;SauceConnect&lt;/em&gt; proxy freeze (you might have a different experience, and this freezing might just be attributable to the Gremlins in my machine).   &lt;br /&gt; &lt;/p&gt; &lt;br /&gt; &lt;em&gt;timezra/course_registry/TeacherRegistrationSpec.groovy&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;div style="font-family: courier new; width: 80em; font-size: 11pt;"&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;TeacherRegistrationSpec&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;extends&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Specification&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;a&amp;nbsp;user&amp;nbsp;is&amp;nbsp;greeted&amp;nbsp;with&amp;nbsp;an&amp;nbsp;intro&amp;nbsp;screen&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;when:&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.get&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;http://&amp;lt;your.ip.address&amp;gt;:8080/course_registry&amp;quot;&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;a&amp;nbsp;user&amp;nbsp;can&amp;nbsp;register&amp;nbsp;as&amp;nbsp;a&amp;nbsp;teacher&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;when:&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;driver.get&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;http://&amp;lt;your.ip.address&amp;gt;:8080/course_registry/&amp;quot;&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;browsers()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;capabilities&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;DesiredCapabilities.internetExplorer()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;capabilities.setCapability(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;7&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;capabilities.setCapability(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;platform&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Platform.XP)&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;capabilities.setCapability(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;Testing&amp;nbsp;Teacher&amp;nbsp;Registration&amp;nbsp;in&amp;nbsp;Sauce&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;sauceDriver&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;RemoteWebDriver(&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;URL(&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;http://&amp;lt;username&amp;gt;:&amp;lt;apiKey&amp;gt;@ondemand.saucelabs.com:80/wd/hub&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;),&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;capabilities)&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;drivers&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;[sauceDriver]&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Browsers(spec:&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;delegate:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;drivers.iterator())&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;/div&gt;    &lt;/div&gt; &lt;br /&gt; &lt;em&gt;course_registry/specifications/build.gradle&lt;/em&gt;&lt;br /&gt;    &lt;div style="            overflow: auto;            padding: 1em;            background-color: white;            border-style: dashed;            border-width: thin"&gt;  &lt;div style="font-family: courier new; width: 80em; font-size: 11pt;"&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;java.util.concurrent.Executors&lt;/span&gt;&lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;java.util.concurrent.ExecutorService&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;repositories&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;mavenRepo&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;url:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;https://repository-saucelabs.forge.cloudbees.com/release&amp;quot;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;dependencies&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;runtime&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;group:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'com.saucelabs'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;name:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'sauce-connect'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;version:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'3.0.18'&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;apply&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;plugin:&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;SauceConnect&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;sauceConfig&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;username&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'&amp;lt;username&amp;gt;'&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;apiKey&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'&amp;lt;apiKey&amp;gt;'&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;test.dependsOn&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;':web:webStart'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'sauceConnect'&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;gradle.taskGraph.afterTask&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Task&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;task,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;TaskState&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;state&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;':specifications:test'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;.equals(task.path))&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;tasks.getByPath(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;'sauceDisconnect'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;).execute()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;project(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;':web'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;).tasks.getByPath(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;'webStop'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;).execute()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;SauceConnect&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;implements&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Plugin&amp;lt;Project&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;ExecutorService&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;executor&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Executors.newFixedThreadPool(&lt;/span&gt;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;void&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;apply(Project&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;project)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;project.extensions.sauceConfig&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;SauceConnectExtension()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;project.task(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;'sauceConnect'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;output&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;PipedOutputStream()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;input&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;PipedInputStream(output)&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;reader&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;BufferedReader(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;InputStreamReader(input))&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;executor.execute&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;println&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;Connecting&amp;nbsp;to&amp;nbsp;Sauce&amp;nbsp;Labs&amp;nbsp;as&amp;nbsp;${project.sauceConfig.username}&amp;nbsp;with&amp;nbsp;key&amp;nbsp;${project.sauceConfig.apiKey}....&amp;quot;&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;try&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;project.javaexec&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;main&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;'com.saucelabs.sauceconnect.SauceConnect'&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;classpath&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;project.sourceSets.main.runtimeClasspath&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;args&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;[project.sauceConfig.username,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;project.sauceConfig.apiKey]&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;standardOutput&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;output&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&amp;nbsp;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;catch&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(Exception&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;ignored)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(63,127,95);"&gt;//&amp;nbsp;Executor&amp;nbsp;has&amp;nbsp;been&amp;nbsp;shutdown&lt;br /&gt;   &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;boolean&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;okToStart&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;false&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;executor.execute&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;nextLine&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;try&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;while&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;((nextLine&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;reader.readLine())&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;null&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;println&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;nextLine&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(!okToStart)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(nextLine&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=~&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;/Please&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;wait&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;for&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;You&amp;nbsp;may&amp;nbsp;start&amp;nbsp;your&amp;nbsp;tests&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;to&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;start&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;your&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;tests/)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;continue&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(nextLine&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=~&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;/You&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;may&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;start&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;your&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;tests/)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;okToStart&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;true&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;catch&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(Exception&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;ignored)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(63,127,95);"&gt;//&amp;nbsp;Executor&amp;nbsp;has&amp;nbsp;been&amp;nbsp;shutdown&lt;br /&gt;   &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;while&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(!okToStart)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;Thread.sleep&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;250&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;project.task(&lt;/span&gt;&lt;span style="color: rgb(255,0,204);"&gt;'sauceDisconnect'&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;println&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(255,0,204);"&gt;&amp;quot;Disconnecting&amp;nbsp;from&amp;nbsp;Sauce&amp;nbsp;Labs....&amp;quot;&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;executor.shutdownNow()&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;SauceConnectExtension&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;String&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;username&lt;/span&gt;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;String&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;apiKey&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;/div&gt;    &lt;/div&gt; &lt;br /&gt; &lt;h4&gt;Conclusion&lt;/h4&gt; &lt;p&gt; This post took us through the definition of user stories for a small website, the setup of a Gradle project for automating the website build and the run of its corresponding acceptance tests, the creation of our first &lt;em&gt;WebDriver&lt;/em&gt;-based Spock specification for our acceptance criteria and the fulfillment of that spec with a Grails 2.0 application, the use of Selenium PageObjects to create abstract representations of our web pages before those web pages are even written, all the way to the creation of a Gradle plugin for running our acceptance tests on various browser/OS combinations in Sauce Labs. Each of those items in itself is worthy of a tutorial series. The combination of all these elements demonstrates with a remarkably small amount of configuration and code the type of robust and scalable ATDD infrastructure that is possible and should be at the core of any enterprise web application.&lt;br /&gt; &lt;/p&gt;&lt;/body&gt;&lt;br /&gt;&lt;/html&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/106449775438946661-4219392847356303520?l=timezra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timezra.blogspot.com/feeds/4219392847356303520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=106449775438946661&amp;postID=4219392847356303520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/106449775438946661/posts/default/4219392847356303520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/106449775438946661/posts/default/4219392847356303520'/><link rel='alternate' type='text/html' href='http://timezra.blogspot.com/2012/01/bdd-with-spock-and-selenium.html' title='BDD With Spock and Selenium'/><author><name>Tim Myer</name><uri>http://www.blogger.com/profile/01514263555690798238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_65ARy92WIco/SeOrrQJl-EI/AAAAAAAAAAU/-TUhZO2zOIA/S220/bio-t-myer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-106449775438946661.post-8033555829900301367</id><published>2011-11-10T22:59:00.000-08:00</published><updated>2011-11-11T06:51:41.811-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='closures'/><category scheme='http://www.blogger.com/atom/ns#' term='trampoline'/><category scheme='http://www.blogger.com/atom/ns#' term='memoize'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Trampoline and Memoize</title><content type='html'>Trampoline and Memoize&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Goal&lt;/h4&gt;&lt;br /&gt;Groovy 1.8 introduces two new closure functions. Memoization is the automatic caching of closure results. Trampolining permits a form of declarative tail-call optimization. This article introduces the two concepts and demonstrates how to combine them in order to create cached, tail-recursive closures.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;tl;dr&lt;/h4&gt;&lt;br /&gt;The example code from this article is &lt;a href="https://github.com/timezra/groovy-trampoline-memoize-specs"&gt;available on github&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Simple Memoization&lt;/h4&gt;&lt;br /&gt;Creating a closure that caches the result of some calculation is as easy as appending &lt;em&gt;.memoize()&lt;/em&gt; or one of the alternate &lt;em&gt;memoize...(...)&lt;/em&gt; methods that allows more fine-grained control over cache sizes to a closure declaration. One benefit of memoization includes the caching of results of long-running calculations that have no side effects. Memory leaks are a potential pitfall, which is why a maximum cache size should generally be prefered.&lt;br /&gt;The specification below contains a closure with a side-effect. This side effect happens just once, despite the closure being invoked twice.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;SimpleMemoizationSpec.groovy&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;package&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;timezra.groovy.trampoline_memoize&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;SimpleMemoizationSpec&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;extends&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;spock.lang.Specification&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;identity&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;++&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;it&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}.memoize()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;each&amp;nbsp;call&amp;nbsp;should&amp;nbsp;be&amp;nbsp;cached&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;when:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;first&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;identity&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;second&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;identity&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;then:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;first&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;second&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;second&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Recursive Memoization&lt;/h4&gt;&lt;br /&gt;Suppose we want to memoize the results of a recursive closure call. For example, we can unroll the call tree of this naive implementation of the fibonacci function. &lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib(n-&lt;/span&gt;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib(n-&lt;/span&gt;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The call trace for the fourth fibonacci number looks like this.&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:silver;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;___________fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;___________&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;/&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;\&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;/&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;\&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;NB:&lt;/strong&gt; The closure here is entered nine times but we can see that it only needs to be entered 5 times because 4 calls are repeated. If we cache the results of the fibonacci calls, the complexity of even a naive implementation such as this will increase linearly, rather than exponentially.&lt;br /&gt;&lt;br /&gt;Unfortunately, because, in Groovy 1.8, a closure cannot invoke another closure directly, memoizing this closure is not entirely straightforward. The example directly below does not work.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;RecursiveMemoizationSpec.groovy&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;package&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;timezra.groovy.trampoline_memoize&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;RecursiveMemoizationSpec&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;extends&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;spock.lang.Specification&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;++&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib(n-&lt;/span&gt;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib(n-&lt;/span&gt;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}.memoize()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;calls&amp;nbsp;should&amp;nbsp;be&amp;nbsp;cached&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;when:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;actual&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;10&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;then:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;actual&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;55&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;11&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;The stack trace when a closure calls itself.&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="font-weight: bold; color: rgb(255,0,0);"&gt;groovy.lang.MissingMethodException:&lt;/span&gt; No signature of method: org.codehaus.groovy.runtime.memoize.Memoize$MemoizeFunction.doCall() is applicable for argument types: (java.lang.Integer) values: [9]&lt;br /&gt;Possible solutions: call(), call([Ljava.lang.Object;), call(java.lang.Object), call([Ljava.lang.Object;), findAll(), equals(java.lang.Object)&lt;br /&gt;&amp;nbsp;&amp;nbsp;at timezra.groovy.trampoline_memoize.RecursiveMemoizationSpec.$spock_initializeFields_closure1(RecursiveMemoizationSpec.groovy:11)&lt;br /&gt;&amp;nbsp;&amp;nbsp;at groovy.lang.Closure.call(Closure.java:410)&lt;br /&gt;&amp;nbsp;&amp;nbsp;at groovy.lang.Closure.call(Closure.java:423)&lt;br /&gt;&amp;nbsp;&amp;nbsp;at timezra.groovy.trampoline_memoize.RecursiveMemoizationSpec.calls should be cached(RecursiveMemoizationSpec.groovy:16)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Since methods can invoke memoized closures, the solution is to invoke the call method on the closure.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;RecursiveMemoizationSpec.groovy&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;RecursiveMemoizationSpec&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;extends&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;spock.lang.Specification&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;++&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib.&lt;/span&gt;&lt;span style="color: rgb(102,204,255);"&gt;call&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(n-&lt;/span&gt;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib.&lt;/span&gt;&lt;span style="color: rgb(102,204,255);"&gt;call&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(n-&lt;/span&gt;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}.memoize()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;....&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;NB:&lt;/strong&gt; The un-memoized version enters the closure 177 times, but the memoized version enters just 11.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Trampoline&lt;/h4&gt;&lt;br /&gt;Declarative tail-call optimization is as simple as adding &lt;em&gt;.trampoline()&lt;/em&gt; to a closure declaration and ensuring that recursive calls to the closure invoke the trampoline method on the closure instead of the closure itself. Some problems are more clearly solved with recursive solutions, but &lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug%5Fid=4726340"&gt;without automatic tail-call optimization in the JVM&lt;/a&gt;, recursion can quickly lead to an explosion in the size of the call stack. Trampolining is one work-around for this design tradeoff &lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_idx_684"&gt;(or defect)&lt;/a&gt;.&lt;br /&gt;A tail-recursive fibonacci closure:&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;n,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;By tracing the call stack, we can see its linear growth without memoization.&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:silver;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;4&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;|&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;3&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;|&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;|&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;3&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;|&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;3&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In order to avoid a &lt;span style="font-weight: bold; color: rgb(255,0,0);"&gt;java.lang.StackOverflowError&lt;/span&gt; for sufficiently large inputs, the tail-recursive closure must be explicitly &lt;em&gt;trampolined&lt;/em&gt;.&lt;br /&gt;&lt;em&gt;TrampolineSpec.groovy&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;package&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;timezra.groovy.trampoline_memoize&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;TrampolineSpec&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;extends&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;spock.lang.Specification&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;n,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;++&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib.trampoline&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}.trampoline()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;tail&amp;nbsp;calls&amp;nbsp;chould&amp;nbsp;be&amp;nbsp;optimized&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;when:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;actual&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1000&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;then:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;actual&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1556111435&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1001&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In this example, the trampolined closure is called 1001 times. If a method in Java were to call itself 1001 times, the stack would be overwhelmed. By trampolining, Groovy turns this recursion into iteration.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Memoizing a Trampolined Closure&lt;/h4&gt;&lt;br /&gt;Suppose we want to cache the results of a computationally expensive tail-recursive closure with no side effects. A trampolined closure that calls itself can easily be memoized in a separate closure declaration.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;OneTimeTrampolineMemoizationSpec.groovy&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;package&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;timezra.groovy.trampoline_memoize&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;OneTimeTrampolineMemoizationSpec&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;extends&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;spock.lang.Specification&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib_aux&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;n,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;++&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib_aux.trampoline&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}.trampoline()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib_aux.memoize()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;top-level&amp;nbsp;trampolined&amp;nbsp;calls&amp;nbsp;should&amp;nbsp;be&amp;nbsp;cached&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;when:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;first&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1000&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;second&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1000&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;then:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1001&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;first&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;second&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;second&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1556111435&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;NB:&lt;/strong&gt; This solution caches the top-level trampolined closure, not the results of the intermediate calls.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Trampolining a Memoized Closure&lt;/h4&gt;&lt;br /&gt;Suppose we want to cache the intermediate results of a trampolined function call. For example, in our trace above, suppose we want to cache the results of &lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;4&lt;/span&gt; and &lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;3&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt; and &lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt; and &lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;3&lt;/span&gt; and &lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;3&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;5&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;Again, this situation is not straightforward because no closure can call a memoized closure directly, so in this case, the trampolined closure cannot call a memoized version of itself directly. Again, we can use the call function on the memoized closure.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;FullTrampolineMemoizationSpec.groovy&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;package&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;timezra.groovy.trampoline_memoize&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;FullTrampolineMemoizationSpec&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;extends&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;spock.lang.Specification&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib_aux&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;n,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;++&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib.trampoline&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;n&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}.memoize()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;n,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib_aux.&lt;/span&gt;&lt;span style="color: rgb(102,204,255);"&gt;call&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;n,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;a,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;b&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}.trampoline()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;all&amp;nbsp;trampolined&amp;nbsp;calls&amp;nbsp;should&amp;nbsp;be&amp;nbsp;cached&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;when:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;first&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1000&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold; color: rgb(151,44,120);"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;second&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;fib&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;500&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;315178285&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(205,50,0);"&gt;1898383934&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;then:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(102,204,255);"&gt;count&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1001&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;first&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;second&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;second&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(205,50,0);"&gt;1556111435&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Conclusion&lt;/h4&gt;&lt;br /&gt;Trampolining and memoization are two powerful new features in Groovy 1.8, but the combination of the two is not always straightforward. This tutorial has presented strategies for combining the two and for working around some of the limitations of their combination.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/106449775438946661-8033555829900301367?l=timezra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timezra.blogspot.com/feeds/8033555829900301367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=106449775438946661&amp;postID=8033555829900301367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/106449775438946661/posts/default/8033555829900301367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/106449775438946661/posts/default/8033555829900301367'/><link rel='alternate' type='text/html' href='http://timezra.blogspot.com/2011/11/trampoline-and-memoize.html' title='Trampoline and Memoize'/><author><name>Tim Myer</name><uri>http://www.blogger.com/profile/01514263555690798238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_65ARy92WIco/SeOrrQJl-EI/AAAAAAAAAAU/-TUhZO2zOIA/S220/bio-t-myer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-106449775438946661.post-3865815093957068329</id><published>2011-10-19T18:35:00.000-07:00</published><updated>2011-11-16T00:35:17.162-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='tycho'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Tycho Archetype</title><content type='html'>&lt;h4&gt;Goal&lt;/h4&gt;&lt;br /&gt;The purpose of this blog post is to demonstrate how to generalize &lt;a href="http://timezra.blogspot.com/2011/10/eclipse-plug-ins-program-to-publish.html"&gt;a Maven project that suits a specific need&lt;/a&gt; into a re-usable archetype, how to publish this archetype to a Maven repository and how to use it as the starting point for similar projects.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;tl;dr&lt;/h4&gt;&lt;br /&gt;The &lt;a href="https://github.com/timezra/tycho_new_plugin_project"&gt;artifact that is the end result of this tutorial&lt;/a&gt; can be used for creating a boilerplate Tycho plug-in project hierarchy with minimal configuration. This generated project will contain a simple Eclipse UI plug-in, an integration-test fragment, a feature that contains the binary plug-in, a feature that contains the source of the plug-in and its test fragment, and an update site for publishing both features.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Generate Archetype From Project&lt;/h4&gt;&lt;br /&gt;Since we are moving from the specific to the general, we begin by cloning the save-actions-extensions project from github.&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;color:white;background-color:black;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;git clone git://github.com/timezra/save-actions-extensions.git&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Since we need only a few of the components from the save-actions-extensions project, we can prune out the extra. We must also rename the &lt;em&gt;features&lt;/em&gt;, &lt;em&gt;plugins&lt;/em&gt; and &lt;em&gt;update-site&lt;/em&gt; directories to match the artifactIds in their respective poms along with the module declarations in the root pom. This directory structure follows the Eclipse convention, but archetype generation will be easier if we make sure that the artifactIds and directory names match. We will also rename the individual plugins and features along with their artifactIds so that there is a consistent name prefix for all projects. Again, this convention will help when generating the archetype.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;The pruned project&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;color:white;background-color:black;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&amp;nbsp;&amp;nbsp;save-actions-extensions&lt;br /&gt;&amp;nbsp;&amp;nbsp;.&lt;br /&gt;&amp;nbsp;&amp;nbsp;|____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;|____README&lt;br /&gt;&amp;nbsp;&amp;nbsp;| timezra.eclipse.save_actions_extensions.features&lt;br /&gt;&amp;nbsp;&amp;nbsp;| |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | timezra.eclipse.save_actions_extensions.feature&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____build.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____feature.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____feature.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____license.html&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | timezra.eclipse.save_actions_extensions.source.feature&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____build.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____feature.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____feature.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____license.html&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| timezra.eclipse.save_actions_extensions.plugins&lt;br /&gt;&amp;nbsp;&amp;nbsp;| |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | timezra.eclipse.save_actions_extensions.plugin&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____build.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____plugin.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | META-INF&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | |____MANIFEST.MF&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | src&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | main&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | java&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | timezra&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | eclipse&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | save_actions_extensions&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | | plugin&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | | |____Activator.java&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | timezra.eclipse.save_actions_extensions.plugin.tests&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____build.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____plugin.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | META-INF&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | |____MANIFEST.MF&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | src&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | test&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | java&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | timezra&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | eclipse&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | save_actions_extensions&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | | plugin&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | | |____ActivatorTest.java&lt;br /&gt;&amp;nbsp;&amp;nbsp;| timezra.eclipse.save_actions_extensions.update-site&lt;br /&gt;&amp;nbsp;&amp;nbsp;| |____index.html&lt;br /&gt;&amp;nbsp;&amp;nbsp;| |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| |____site.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | web&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____site.css&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____site.xsl&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;We are now ready to &lt;a href="http://maven.apache.org/archetype/maven-archetype-plugin/examples/create-multi-module-project.html"&gt;generate, install and test the archetype from maven&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;NB:&lt;/strong&gt; even when specifying filtered extensions, not all files (here &lt;em&gt;README&lt;/em&gt;, &lt;em&gt;MANIFEST.MF&lt;/em&gt; and &lt;em&gt;site.xsl&lt;/em&gt;) are turned into velocity templates, and the hard-coded artifactId references in some files are not all replaced with parameters.&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;color:white;background-color:black;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&amp;nbsp;&amp;nbsp;mvn archetype:create-from-project -Darchetype.filteredExtensions=java,html,xsl,properties,xml,MF&lt;br /&gt;&amp;nbsp;&amp;nbsp;cd target/generated-sources/archetype/&lt;br /&gt;&amp;nbsp;&amp;nbsp;find ./src -type f \( -name "*.MF" -o -name "*.xsl" \) -print0 |xargs -0 perl -pi -e 's/\$/\${symbol_dollar}/g'&lt;br /&gt;&amp;nbsp;&amp;nbsp;find ./src -type f \( -name "*.MF" -o -name "*.xsl" \) -exec perl -pi -e "print qq(#set( \\\$symbol_pound = '#' )\n#set( \\\$symbol_dollar = '\\$' )\n#set( \\\$symbol_escape = '\\\' )\n) if $. == 1" {} \;&lt;br /&gt;&amp;nbsp;&amp;nbsp;find ./src -type f -print0 |xargs -0 perl -pi -e 's/timezra\.eclipse\.save_actions_extensions/\$\{rootArtifactId}/g'&lt;br /&gt;&amp;nbsp;&amp;nbsp;find ./src -type f -print0 |xargs -0 perl -pi -e 's/\$\{groupId}\.save_actions_extensions/\$\{rootArtifactId}/g'&lt;br /&gt;&amp;nbsp;&amp;nbsp;find ./src -name archetype-metadata.xml -exec perl -pi -e 'undef $/; $_=&lt;&gt;; s/\s*\n\s*//g; s~&lt;fileSet encoding="UTF-8"&gt;&lt;directory&gt;&lt;/directory&gt;&lt;includes&gt;&lt;include&gt;README~&lt;fileSet filtered="true" encoding="UTF-8"&gt;&lt;directory&gt;&lt;/directory&gt;&lt;includes&gt;&lt;include&gt;README~g;s~&lt;fileSet encoding="UTF-8"&gt;&lt;directory&gt;META-INF~&lt;fileSet filtered="true" encoding="UTF-8"&gt;&lt;directory&gt;META-INF~g;s~&lt;fileSet encoding="UTF-8"&gt;&lt;directory&gt;web&lt;/directory&gt;&lt;includes&gt;&lt;include&gt;\*\*/\*\.xsl&lt;/include&gt;~&lt;fileSet filtered="true" encoding="UTF-8"&gt;&lt;directory&gt;web&lt;/directory&gt;&lt;includes&gt;&lt;include&gt;**/*.xsl&lt;/include&gt;&lt;/includes&gt;&lt;/fileSet&gt;&lt;fileSet encoding="UTF-8"&gt;&lt;directory&gt;web&lt;/directory&gt;&lt;includes&gt;~g' {} \;&lt;br /&gt;&amp;nbsp;&amp;nbsp;mvn clean install&lt;br /&gt;&amp;nbsp;&amp;nbsp;cd /path/to/tmp/archetype&lt;br /&gt;&amp;nbsp;&amp;nbsp;mvn archetype:generate -DarchetypeCatalog=local&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Choose the new archetype (here local -&gt; timezra.eclipse:timezra.eclipse.save_actions_extensions-archetype)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Define a groupId (e.g., &lt;em&gt;my.company&lt;/em&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Define an artifactId (e.g., &lt;em&gt;my.company.do_something&lt;/em&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Define a version (e.g., &lt;em&gt;1.0.0-SNAPSHOT&lt;/em&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Define a package (e.g., &lt;em&gt;my.company.do_something.plugin&lt;/em&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;cd my.company.do_something&lt;br /&gt;&amp;nbsp;&amp;nbsp;mvn verify&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After running this sequence of commands, we should see the eclipse workbench open and successfully run the canary integration test for our test project.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;The generated project structure&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;height:250px;padding:5px;color:white;background-color:black;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&amp;nbsp;&amp;nbsp;my.company.do_something&lt;br /&gt;&amp;nbsp;&amp;nbsp;.&lt;br /&gt;&amp;nbsp;&amp;nbsp;|____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;|____README&lt;br /&gt;&amp;nbsp;&amp;nbsp;| my.company.do_something.features&lt;br /&gt;&amp;nbsp;&amp;nbsp;| |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | my.company.do_something.feature&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____build.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____feature.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____feature.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____license.html&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | my.company.do_something.source.feature&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____build.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____feature.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____feature.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____license.html&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| my.company.do_something.plugins&lt;br /&gt;&amp;nbsp;&amp;nbsp;| |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | my.company.do_something.plugin&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____build.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____plugin.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | META-INF&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | |____MANIFEST.MF&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | src&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | main&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | java&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | my&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | company&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | do_something&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | | plugin&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | | |____Activator.java&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | my.company.do_something.plugin.tests&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____build.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____plugin.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | META-INF&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | |____MANIFEST.MF&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | src&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | test&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | java&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | my&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | company&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | do_something&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | | plugin&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | | |____ActivatorTest.java&lt;br /&gt;&amp;nbsp;&amp;nbsp;| my.company.do_something.update-site&lt;br /&gt;&amp;nbsp;&amp;nbsp;| |____index.html&lt;br /&gt;&amp;nbsp;&amp;nbsp;| |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| |____site.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | web&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____site.css&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____site.xsl&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Dynamic Directories&lt;/h4&gt;&lt;br /&gt;On closer comparison of the directory tree from the original project and the generated project, you might wonder how Maven knows to name folders based on the artifactIds.&lt;br /&gt;If we look at the generated archetype, we will see a parameterized directory structure.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Parameterized directories are in red&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;color:white;background-color:black;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&amp;nbsp;&amp;nbsp;archetype&lt;br /&gt;&amp;nbsp;&amp;nbsp;.&lt;br /&gt;&amp;nbsp;&amp;nbsp;|____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| src&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | main&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | resources&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | archetype-resources&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | |____README&lt;br /&gt;&lt;span style="color: red; font-weight: bold"&gt;&amp;nbsp;&amp;nbsp;| | | | | __rootArtifactId__.features&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____pom.xml&lt;br /&gt;&lt;span style="color: red; font-weight: bold"&gt;&amp;nbsp;&amp;nbsp;| | | | | | __rootArtifactId__.feature&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____build.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____feature.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____feature.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____license.html&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____pom.xml&lt;br /&gt;&lt;span style="color: red; font-weight: bold"&gt;&amp;nbsp;&amp;nbsp;| | | | | | __rootArtifactId__.source.feature&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____build.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____feature.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____feature.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____license.html&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____pom.xml&lt;br /&gt;&lt;span style="color: red; font-weight: bold"&gt;&amp;nbsp;&amp;nbsp;| | | | | __rootArtifactId__.plugins&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____pom.xml&lt;br /&gt;&lt;span style="color: red; font-weight: bold"&gt;&amp;nbsp;&amp;nbsp;| | | | | | __rootArtifactId__.plugin&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____build.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____plugin.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | META-INF&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | |____MANIFEST.MF&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | src&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | main&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | | java&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | | |____Activator.java&lt;br /&gt;&lt;span style="color: red; font-weight: bold"&gt;&amp;nbsp;&amp;nbsp;| | | | | | __rootArtifactId__.plugin.tests&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____build.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____plugin.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | META-INF&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | |____MANIFEST.MF&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | src&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | test&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | | java&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | | | | |____ActivatorTest.java&lt;br /&gt;&lt;span style="color: red; font-weight: bold"&gt;&amp;nbsp;&amp;nbsp;| | | | | __rootArtifactId__.update-site&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____index.html&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____pom.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____site.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | web&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____site.css&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | | |____site.xsl&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | META-INF&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | maven&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____archetype-metadata.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | test&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | resources&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | projects&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | basic&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____archetype.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____goal.txt&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You might also notice that the &lt;em&gt;Activator.java&lt;/em&gt; and &lt;em&gt;ActivatorTest.java&lt;/em&gt; are contained in the root of their &lt;em&gt;src/main/java&lt;/em&gt; and &lt;em&gt;src/test/java&lt;/em&gt; folders, respectively, in the archetype resources; however, in the generated project, the files are in the proper subdirectories with corresponding package declarations. In the generated &lt;em&gt;archetype-metadata.xml&lt;/em&gt;, the contents of these source directories are &lt;em&gt;filtered&lt;/em&gt; and &lt;em&gt;packaged&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;src/main/resources/META-INF/maven/archetype-metadata.xml&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;archetype-descriptor&lt;/span&gt;&amp;nbsp;....&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;modules&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;module&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;${rootArtifactId}.plugins&amp;quot;&lt;/span&gt;&amp;nbsp;....&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;modules&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;module&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;${rootArtifactId}.plugin&amp;quot;&lt;/span&gt;&amp;nbsp;....&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;fileSets&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;fileSet&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127); font-weight: bold; font-size: 15pt;"&gt;filtered&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127); font-weight: bold; font-size: 15pt;"&gt;packaged&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;encoding&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;directory&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;src/main/java&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;directory&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;includes&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;include&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;**/*.java&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;include&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;includes&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;fileSet&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;fileSets&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;module&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;module&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;${rootArtifactId}.plugin.tests&amp;quot;&lt;/span&gt;&amp;nbsp;....&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;fileSets&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;fileSet&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127); font-weight: bold; font-size: 15pt;"&gt;filtered&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127); font-weight: bold; font-size: 15pt;"&gt;packaged&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;encoding&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;directory&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;src/test/java&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;directory&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;includes&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;include&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;**/*.java&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;include&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;includes&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;fileSet&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;fileSets&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;module&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;modules&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;module&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;modules&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;archetype-descriptor&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Testing&lt;/h4&gt;&lt;br /&gt;After customizing our resources and adding any additional required properties, we can integration-test the archetype using a golden template project contained in the &lt;em&gt;src/test/projects/basic/reference&lt;/em&gt; directory. For this example, if the generated &lt;em&gt;my.company.do_something&lt;/em&gt; project above exactly meets our needs, then we can simply copy the entire contents of this directory to the &lt;em&gt;src/test/projects/basic/reference&lt;/em&gt; folder and update the &lt;em&gt;archetype.properties&lt;/em&gt; to match the properties we used for project generation.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;src/test/resources/projects/basic/archetype.properties&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,0,0);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;my.company&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;my.company.do_something&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;1.0.0-SNAPSHOT&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0);"&gt;package&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;my.company.do_something.plugin&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;During the integration-test phase, Maven will generate a sample project from the archetype with these properties and will compare the results with the golden template.&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;color:white;background-color:black;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;mvn verify&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;NB:&lt;/strong&gt; use of this type of golden template can be very brittle, and any changes made to files in the &lt;em&gt;src/main/resources/archetype-resources&lt;/em&gt; directory must be reflected by equivalent changes in the &lt;em&gt;src/test/resources/projects/basic/reference&lt;/em&gt; directory.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Publish to a Maven Repository&lt;/h4&gt;&lt;br /&gt;Now that our Maven archetype is tested and ready for publication, we can publish it, either to &lt;a href="http://archiva.apache.org/docs/1.0.1/userguide/deploy.html"&gt;an&lt;/a&gt; &lt;a href="http://www.sonatype.com/books/nexus-book/reference/staging-sect-update-pom.html"&gt;internal&lt;/a&gt; &lt;a href="http://wiki.jfrog.org/confluence/display/RTF/Configuring+Deployment"&gt;repository&lt;/a&gt;, to &lt;a href="https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide"&gt;the sonatype repository&lt;/a&gt;, which will synch our artifact with Maven central, or to a private repository, which in our case can simply be &lt;a href="http://cemerick.com/2010/08/24/hosting-maven-repos-on-github/"&gt;github pages&lt;/a&gt;.&lt;br /&gt;We want to partition our repository into &lt;em&gt;snapshots&lt;/em&gt; and &lt;em&gt;releases&lt;/em&gt;, and we will need archetype catalogs in a subfolder of each.&lt;br /&gt;We can deploy our archetype to a folder that contains the gh-pages branch of a github project called &lt;em&gt;maven&lt;/em&gt;, which will contain all our published maven artifacts.&lt;br /&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;color:white;background-color:black;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;mvn -DaltDeploymentRepository=snapshot-repo::default::file:/path/to/git_maven_repository/snapshots clean deploy&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Since we have installed the archetype, we already have a &lt;em&gt;~/.m2/archetype-catalog.xml&lt;/em&gt; file.&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;xml&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;version&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;encoding&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;archetype-catalog&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0&amp;nbsp;http://maven.apache.org/xsd/archetype-catalog-1.0.0.xsd&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns:xsi&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;archetypes&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;archetype&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;timezra.eclipse&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;timezra.eclipse.save_actions_extensions-archetype&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;1.0.0-SNAPSHOT&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;description&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;Parent&amp;nbsp;project&amp;nbsp;for&amp;nbsp;the&amp;nbsp;timezra.eclipse.save_actions_extensions&amp;nbsp;project&amp;nbsp;set&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;description&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;archetype&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;archetypes&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;archetype-catalog&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;The Maven repository&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;height:250px;padding:5px;color:white;background-color:black;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&amp;nbsp;&amp;nbsp;github_maven_repository&lt;br /&gt;&amp;nbsp;&amp;nbsp;.&lt;br /&gt;&amp;nbsp;&amp;nbsp;| releases&lt;br /&gt;&amp;nbsp;&amp;nbsp;| snapshots&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | archetypes&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | |____archetype-catalog.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | timezra&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | eclipse&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | timezra.eclipse.save_actions_extensions-archetype&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | |____maven-metadata.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | |____maven-metadata.xml.md5&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | |____maven-metadata.xml.sha1&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | 1.0.0-SNAPSHOT&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____maven-metadata.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____maven-metadata.xml.md5&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____maven-metadata.xml.sha1&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____timezra.eclipse.save_actions_extensions-archetype-1.0.0-20111020.005931-1.jar&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____timezra.eclipse.save_actions_extensions-archetype-1.0.0-20111020.005931-1.jar.md5&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____timezra.eclipse.save_actions_extensions-archetype-1.0.0-20111020.005931-1.jar.sha1&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____timezra.eclipse.save_actions_extensions-archetype-1.0.0-20111020.005931-1.pom&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____timezra.eclipse.save_actions_extensions-archetype-1.0.0-20111020.005931-1.pom.md5&lt;br /&gt;&amp;nbsp;&amp;nbsp;| | | | | |____timezra.eclipse.save_actions_extensions-archetype-1.0.0-20111020.005931-1.pom.sha1&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Use the Archetype From the Repository&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;After our artifacts have been deployed to a Maven repository, we can generate a project from the deployed archetype in a way similar to how we generated the project from the archetype installed locally above.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Generating from an artifact in a gh-pages repository&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;color:white;background-color:black;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;mvn archetype:generate -DarchetypeCatalog=http://your_github_username.github.com/maven/snapshots/archetypes&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Conclusion&lt;/h4&gt;&lt;br /&gt;This tutorial is a continuation of a &lt;a href="http://timezra.blogspot.com/2011/10/eclipse-plug-ins-program-to-publish.html"&gt;previous post&lt;/a&gt;, in which we created a set of Tycho-enabled Eclipse projects. The archetype we created from this set of projects abstracts the boilerplate and conventions into a re-usable component that will make setting up similar projects even faster in the future.&lt;br /&gt;The end result of this effort is the &lt;a href="https://github.com/timezra/tycho_new_plugin_project"&gt;tycho_new_plugin_project&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/106449775438946661-3865815093957068329?l=timezra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timezra.blogspot.com/feeds/3865815093957068329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=106449775438946661&amp;postID=3865815093957068329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/106449775438946661/posts/default/3865815093957068329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/106449775438946661/posts/default/3865815093957068329'/><link rel='alternate' type='text/html' href='http://timezra.blogspot.com/2011/10/tycho-archetype.html' title='Tycho Archetype'/><author><name>Tim Myer</name><uri>http://www.blogger.com/profile/01514263555690798238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_65ARy92WIco/SeOrrQJl-EI/AAAAAAAAAAU/-TUhZO2zOIA/S220/bio-t-myer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-106449775438946661.post-2815377677008658556</id><published>2011-10-12T00:18:00.000-07:00</published><updated>2011-10-17T16:55:35.731-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='tycho'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse marketplace'/><category scheme='http://www.blogger.com/atom/ns#' term='jar signing'/><title type='text'>Eclipse Plug-ins: Program to Publish</title><content type='html'>&lt;h4&gt;Goal&lt;/h4&gt;&lt;br /&gt;The purpose of this blog entry is to demonstrate one workflow for taking an idea for an Eclipse plug-in from concept to product downloadable from the Eclipse marketplace.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;tl;dr&lt;/h4&gt;&lt;br /&gt;If you want to look right away at working code for a simple Eclipse plug-in, feature, update site and their &lt;a href="http://www.eclipse.org/tycho/"&gt;Tycho&lt;/a&gt; configurations, a &lt;a href="https://github.com/timezra/save-actions-extensions"&gt;sample project&lt;/a&gt; based on this tutorial is available. The plug-in can also be installed in Eclipse through the &lt;a href="http://marketplace.eclipse.org"&gt;Marketplace&lt;/a&gt; (search for "save actions") or directly from an &lt;a href="http://timezra.github.com/save-actions-extensions/"&gt;update site&lt;/a&gt;. In addition, the conventions for project setup contained in this tutorial have been extracted into &lt;a href="https://github.com/timezra/tycho_new_plugin_project"&gt;a Maven archetype&lt;/a&gt;. Since this blog entry does not provide an in-depth introduction to the nuances of configuring and writing Eclipse plug-ins, having the project source as a reference, either locally or in a web browser, will be helpful for following the examples.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;The Idea&lt;/h4&gt;&lt;br /&gt;Suppose we are starting a new project on an existing codebase and, as part of our Working Agreement, the team has decided to automate certain coding standards with Eclipse Java editor save actions. It would be convenient to bring all the existing code up to our standards before development even begins. Currently, formatting and import organization can be performed in bulk from the source submenu in the workbench. Eclipse users can also apply clean-up conventions from this submenu. Unfortunately, even though the clean-up and save participants have similar configurations, there is a disconnect between the two.&lt;br /&gt;Exposing save actions for the bulk processing of Java/Groovy files through this source submenu is a simple enough feature to add to Eclipse and should provide the opportunity to experience one full cycle of Eclipse plug-in development, from the creation of a simple plug-in and its integration tests, to the addition of a feature to contain the plug-in, to the packaging of an update site, to the distribution of the product through the &lt;a href="http://marketplace.eclipse.org"&gt;Eclipse Marketplace&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;The Plug-in&lt;/h4&gt;&lt;br /&gt;We will begin by creating a new plug-in project named &lt;em&gt;timezra.eclipse.apply_save_actions&lt;/em&gt; in our Eclipse workspace. Since we will eventually generate a Tycho configuration in order to automate the compilation, testing and packaging of our product, we will modify a few of the default settings for the plug-in. Our plug-in and fragment projects will be contained in a &lt;em&gt;plugins&lt;/em&gt; subdirectory, here &lt;em&gt;/path/to/workspace/plugins/timezra.eclipse.apply_save_actions&lt;/em&gt;. Our source folder will be &lt;em&gt;src/main/java&lt;/em&gt; and output folder will be &lt;em&gt;target/classes&lt;/em&gt; to follow the Maven convention.&lt;br /&gt;&lt;br /&gt;&lt;img alt="The New Plug-in Project wizard with Maven-inspired configurations" src="http://farm7.static.flickr.com/6110/6236573817_b280ed1379_z.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;We can either use the New Plug-in Project Wizard &lt;em&gt;Hello, World Command Template&lt;/em&gt; or we can contribute a command to a menu with manual configuration. There are already quite a &lt;a href="http://my.safaribooksonline.com/book/software-engineering-and-development/ide/9780321574435/commands-and-actions/ch06lev1sec1"&gt;few&lt;/a&gt; &lt;a href="http://help.eclipse.org/indigo/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/workbench_cmd_handlers.htm"&gt;resources&lt;/a&gt; &lt;a href="http://www.eclipse-tips.com/tutorials/1-actions-vs-commands"&gt;for&lt;/a&gt; &lt;a href="http://wiki.eclipse.org/Platform_Command_Framework"&gt;contributing&lt;/a&gt; &lt;a href="http://www.vogella.de/articles/EclipseCommands/article.html"&gt;commands&lt;/a&gt; through an extension point, so you can get more insight into specific configuration settings there.&lt;br /&gt;For this example, the configuration is boilerplate. The internals of the ApplySaveActions command handler are somewhat interesting. There may be a more direct way to invoke the save participant, but this method works on both un-opened files and source buffers modified in memory for Java and Groovy, so in the interest of &lt;a href="http://www.xprogramming.com/Practices/PracSimplest.html"&gt;DTSTTCPW&lt;/a&gt;, we can use this simple implementation until it is no longer sufficient.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;plugins/timezra.eclipse.apply_save_actions/src/main/java/timezra/eclipse/apply_save_actions/handlers/ApplySaveActions.java&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;package&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.eclipse.apply_save_actions.handlers;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.Arrays.asList;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.lang.reflect.InvocationTargetException;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.ArrayList;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.Collection;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.commands.AbstractHandler;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.commands.ExecutionEvent;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.commands.ExecutionException;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.resources.IFile;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.resources.IWorkspace;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.resources.ResourcesPlugin;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.runtime.CoreException;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.runtime.IAdapterManager;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.runtime.IProgressMonitor;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.runtime.OperationCanceledException;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.runtime.Platform;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jdt.core.ICompilationUnit;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jdt.core.IJavaElement;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jdt.core.IJavaProject;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jdt.core.IPackageFragment;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jdt.core.IPackageFragmentRoot;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jdt.core.JavaModelException;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jface.operation.IRunnableWithProgress;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jface.viewers.ISelection;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jface.viewers.IStructuredSelection;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.ui.IWorkbench;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.ui.PlatformUI;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.ui.actions.WorkspaceModifyOperation;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.ui.handlers.HandlerUtil;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.ui.part.FileEditorInput;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.ui.texteditor.IDocumentProvider;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ApplySaveActions&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;extends&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;AbstractHandler&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IAdapterManager&amp;nbsp;adapterManager;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IWorkspace&amp;nbsp;workspace;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IWorkbench&amp;nbsp;workbench;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ApplySaveActions()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;(Platform.getAdapterManager(),&amp;nbsp;ResourcesPlugin.getWorkspace(),&amp;nbsp;PlatformUI.getWorkbench());&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;ApplySaveActions(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IAdapterManager&amp;nbsp;adapterManager,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IWorkspace&amp;nbsp;workspace,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IWorkbench&amp;nbsp;workbench)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;.adapterManager&amp;nbsp;=&amp;nbsp;adapterManager;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;.workspace&amp;nbsp;=&amp;nbsp;workspace;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;.workbench&amp;nbsp;=&amp;nbsp;workbench;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Object&amp;nbsp;execute(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionEvent&amp;nbsp;event)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ISelection&amp;nbsp;currentSelection&amp;nbsp;=&amp;nbsp;HandlerUtil.getCurrentSelectionChecked(event);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(currentSelection&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;instanceof&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IStructuredSelection)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IStructuredSelection&amp;nbsp;selections&amp;nbsp;=&amp;nbsp;(IStructuredSelection)&amp;nbsp;currentSelection;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;try&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;applyTo(selections);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;catch&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;JavaModelException&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throw&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionException(Messages.APPLY_SAVE_ACTIONS_UNEXPECTED_ERROR,&amp;nbsp;e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;catch&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;InvocationTargetException&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throw&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionException(Messages.APPLY_SAVE_ACTIONS_UNEXPECTED_ERROR,&amp;nbsp;e.getTargetException());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;null&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;applyTo(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IStructuredSelection&amp;nbsp;selections)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;JavaModelException,&amp;nbsp;InvocationTargetException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;for&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Object&amp;nbsp;o&amp;nbsp;:&amp;nbsp;selections.toList())&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IJavaProject&amp;nbsp;javaProject&amp;nbsp;=&amp;nbsp;getAdapter(o,&amp;nbsp;IJavaProject.&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(javaProject&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;null&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;applyTo(javaProject.getPackageFragments());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;continue&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IPackageFragmentRoot&amp;nbsp;packageFragmentRoot&amp;nbsp;=&amp;nbsp;getAdapter(o,&amp;nbsp;IPackageFragmentRoot.&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(packageFragmentRoot&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;null&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;applyTo(packageFragmentRoot);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;continue&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IPackageFragment&amp;nbsp;packageFragment&amp;nbsp;=&amp;nbsp;getAdapter(o,&amp;nbsp;IPackageFragment.&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(packageFragment&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;null&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;applyTo(packageFragment);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;continue&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ICompilationUnit&amp;nbsp;compilationUnit&amp;nbsp;=&amp;nbsp;getAdapter(o,&amp;nbsp;ICompilationUnit.&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(compilationUnit&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;null&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;applyTo(compilationUnit);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;continue&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;applyTo(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IPackageFragmentRoot&amp;nbsp;packageFragmentRoot)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;JavaModelException,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InvocationTargetException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IJavaElement[]&amp;nbsp;children&amp;nbsp;=&amp;nbsp;packageFragmentRoot.getChildren();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IPackageFragment[]&amp;nbsp;fragments&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IPackageFragment[children.length];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.arraycopy(children,&amp;nbsp;0,&amp;nbsp;fragments,&amp;nbsp;0,&amp;nbsp;children.length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;applyTo(fragments);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;applyTo(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IPackageFragment...&amp;nbsp;packageFragments)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;JavaModelException,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InvocationTargetException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Collection&amp;lt;ICompilationUnit&amp;gt;&amp;nbsp;compilationUnits&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ArrayList&amp;lt;ICompilationUnit&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;for&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IPackageFragment&amp;nbsp;f&amp;nbsp;:&amp;nbsp;packageFragments)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compilationUnits.addAll(asList(f.getCompilationUnits()));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;applyTo(compilationUnits.toArray(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ICompilationUnit[compilationUnits.size()]));&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;applyTo(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ICompilationUnit...&amp;nbsp;compilationUnits)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;InvocationTargetException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IRunnableWithProgress&amp;nbsp;delegate&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ApplySaveActionsOperation(compilationUnits);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;try&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;workbench.getProgressService().run(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;false&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;true&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&amp;nbsp;delegate);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;catch&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;InterruptedException&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&amp;nbsp;cancellation&amp;nbsp;is&amp;nbsp;fine&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@SuppressWarnings(&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;restriction&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IDocumentProvider&amp;nbsp;createDocumentProvider()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitDocumentProvider();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@SuppressWarnings(&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;unchecked&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;lt;T&amp;gt;&amp;nbsp;T&amp;nbsp;getAdapter(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Object&amp;nbsp;o,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Class&amp;lt;T&amp;gt;&amp;nbsp;c)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(T)&amp;nbsp;adapterManager.getAdapter(o,&amp;nbsp;c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ApplySaveActionsOperation&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;extends&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;WorkspaceModifyOperation&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ICompilationUnit[]&amp;nbsp;compilationUnits;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ApplySaveActionsOperation(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ICompilationUnit...&amp;nbsp;compilationUnits)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;.compilationUnits&amp;nbsp;=&amp;nbsp;compilationUnits;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;execute(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IProgressMonitor&amp;nbsp;pm)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;CoreException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pm.beginTask(Messages.APPLY_SAVE_ACTIONS_BEGIN_TASK,&amp;nbsp;compilationUnits.length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;try&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;for&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ICompilationUnit&amp;nbsp;unit&amp;nbsp;:&amp;nbsp;compilationUnits)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;applyTo(workspace.getRoot().getFile(unit.getPath()),&amp;nbsp;pm);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;finally&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pm.done();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;applyTo(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFile&amp;nbsp;f,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IProgressMonitor&amp;nbsp;pm)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;CoreException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;report(f.getName(),&amp;nbsp;pm);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IDocumentProvider&amp;nbsp;provider&amp;nbsp;=&amp;nbsp;createDocumentProvider();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;FileEditorInput&amp;nbsp;editorInput&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;FileEditorInput(f);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;try&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;provider.connect(editorInput);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;provider.aboutToChange(editorInput);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;provider.saveDocument(pm,&amp;nbsp;editorInput,&amp;nbsp;provider.getDocument(editorInput),&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;true&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;finally&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;provider.changed(editorInput);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;provider.disconnect(editorInput);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;report(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;task,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IProgressMonitor&amp;nbsp;pm)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(pm.isCanceled())&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throw&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;OperationCanceledException();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pm.setTaskName(task);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pm.worked(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;The Test Fragment&lt;/h4&gt;&lt;br /&gt;We will similarly create a new integration test fragment alongside this plug-in, overriding the default configuration to store the fragment into the &lt;em&gt;plugins&lt;/em&gt; subdirectory and to use Maven conventions for the source and output directories.&lt;br /&gt;&lt;br /&gt;&lt;img alt="The New Fragment Project wizard with Maven-inspired configurations" src="http://farm7.static.flickr.com/6211/6236573901_762ff9c69f_z.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;There are &lt;a href="http://www.modumind.com/2007/06/20/unit-testing-plug-ins-with-fragments/"&gt;various approaches&lt;/a&gt; for testing Eclipse plug-ins, but the fragment approach has been &lt;a href="http://wiki.eclipse.org/Tycho/Packaging_Types#eclipse-test-plugin"&gt;embraced by the Tycho community&lt;/a&gt;, so we will use it here.&lt;br /&gt;Again, the project configuration can be boilerplate for now. Of particular interest is the handler test case.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;plugins/timezra.eclipse.apply_save_actions.tests/src/test/java/timezra/eclipse/apply_save_actions/handlers/ApplySaveActions.java&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;height:1200x;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;package&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.eclipse.apply_save_actions.handlers;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.Assert.assertEquals;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.Assert.assertNull;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.io.ByteArrayInputStream;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.io.IOException;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.ArrayList;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.Collections;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.HashMap;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.List;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.Map;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.Scanner;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.commands.ExecutionEvent;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.commands.ExecutionException;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.expressions.EvaluationContext;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.resources.IContainer;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.resources.IFile;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.resources.IFolder;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.resources.IProject;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.resources.IResource;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.resources.IWorkspaceRoot;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.resources.ResourcesPlugin;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.runtime.CoreException;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.runtime.IProgressMonitor;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.runtime.NullProgressMonitor;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.runtime.Path;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.runtime.SubProgressMonitor;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.core.runtime.preferences.InstanceScope;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jdt.core.IClasspathEntry;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jdt.core.IJavaProject;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jdt.core.JavaCore;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jdt.launching.JavaRuntime;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jdt.ui.JavaUI;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jdt.ui.cleanup.CleanUpOptions;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jface.text.TextSelection;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.jface.viewers.StructuredSelection;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.eclipse.ui.ISources;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.After;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.Before;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.Rule;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.Test;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.rules.MethodRule;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.eclipse.apply_save_actions.Constants;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.eclipse.apply_save_actions.tests.ModifiesSaveActionsPreferences;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.eclipse.apply_save_actions.tests.ModifiesSaveActionsPreferencesRule;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ApplySaveActionsPluginTest&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;SOURCE_FOLDER&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;src/test/java&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;EOL&amp;nbsp;=&amp;nbsp;System.getProperty(&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;line.separator&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IProgressMonitor&amp;nbsp;NULL_PROGRESS_MONITOR&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;NullProgressMonitor();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;TEST_CLASS&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;TestClass&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;TEST_PACKAGE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;timezra.eclipse.apply_save_actions&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;TEST_CLASS_BEFORE_SAVE_ACTIONS&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;package&amp;nbsp;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;TEST_PACKAGE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;;import&amp;nbsp;java.util.*;class&amp;nbsp;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;TEST_CLASS&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;{private&amp;nbsp;List&amp;lt;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;TEST_CLASS&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;&amp;gt;&amp;nbsp;l;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;TEST_CLASS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;(List&amp;lt;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;TEST_CLASS&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;&amp;gt;&amp;nbsp;l){this.l=l;}}&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;TEST_CLASS_AFTER_SAVE_ACTIONS&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;package&amp;nbsp;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;TEST_PACKAGE&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;EOL&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EOL&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;import&amp;nbsp;java.util.List;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;EOL&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EOL&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;class&amp;nbsp;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;TEST_CLASS&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;&amp;nbsp;{&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;EOL&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;&amp;nbsp;&amp;nbsp;private&amp;nbsp;final&amp;nbsp;List&amp;lt;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;TEST_CLASS&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;&amp;gt;&amp;nbsp;l;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;EOL&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EOL&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;&amp;nbsp;&amp;nbsp;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;TEST_CLASS&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;(List&amp;lt;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;TEST_CLASS&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;&amp;gt;&amp;nbsp;l)&amp;nbsp;{&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;EOL&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.l&amp;nbsp;=&amp;nbsp;l;&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;EOL&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;&amp;nbsp;&amp;nbsp;}&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;+&amp;nbsp;EOL&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Rule&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;MethodRule&amp;nbsp;rule&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ModifiesSaveActionsPreferencesRule();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IProject&amp;nbsp;aJavaProject;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFolder&amp;nbsp;aJavaPackage;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFile&amp;nbsp;aJavaFile;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFolder&amp;nbsp;aJavaSourceFolder;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Before&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;setUp()&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;CoreException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aJavaProject&amp;nbsp;=&amp;nbsp;createAJavaProject(&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;a_java_project&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aJavaSourceFolder&amp;nbsp;=&amp;nbsp;createASourceFolder(SOURCE_FOLDER);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aJavaPackage&amp;nbsp;=&amp;nbsp;createAPackage(aJavaSourceFolder,&amp;nbsp;TEST_PACKAGE.replaceAll(&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;\\.&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aJavaFile&amp;nbsp;=&amp;nbsp;createAJavaFile(aJavaPackage,&amp;nbsp;TEST_CLASS&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;.java&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@After&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;tearDown()&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;CoreException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aJavaProject.delete(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;true&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&amp;nbsp;NULL_PROGRESS_MONITOR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;theCurrentSelectionMustBeStructured()&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ApplySaveActions&amp;nbsp;command&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ApplySaveActions();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;EvaluationContext&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;EvaluationContext(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;null&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Object());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.addVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;TextSelection(0,&amp;nbsp;100));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionEvent&amp;nbsp;event&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionEvent(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;null&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&amp;nbsp;Collections.emptyMap(),&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;null&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&amp;nbsp;context);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assertNull(command.execute(event));&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;@ModifiesSaveActionsPreferences&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;aJavaFileCanBeReformatted()&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionException,&amp;nbsp;CoreException,&amp;nbsp;IOException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enableJavaSaveActions();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;applySaveActions(JavaCore.create(aJavaFile));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;verifyThatSaveActionsHaveBeenApplied(aJavaFile);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;@ModifiesSaveActionsPreferences&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;aJavaPackageCanBeReformatted()&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionException,&amp;nbsp;CoreException,&amp;nbsp;IOException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enableJavaSaveActions();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;applySaveActions(JavaCore.create(aJavaPackage));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;verifyThatSaveActionsHaveBeenApplied(aJavaFile);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;@ModifiesSaveActionsPreferences&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;aJavaSourceFolderCanBeReformatted()&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionException,&amp;nbsp;CoreException,&amp;nbsp;IOException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enableJavaSaveActions();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;applySaveActions(JavaCore.create(aJavaSourceFolder));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;verifyThatSaveActionsHaveBeenApplied(aJavaFile);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;@ModifiesSaveActionsPreferences&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;aJavaProjectCanBeReformatted()&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionException,&amp;nbsp;CoreException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enableJavaSaveActions();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;applySaveActions(JavaCore.create(aJavaProject));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;verifyThatSaveActionsHaveBeenApplied(aJavaFile);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;applySaveActions(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Object&amp;nbsp;selection)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ApplySaveActions&amp;nbsp;command&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ApplySaveActions();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;EvaluationContext&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;EvaluationContext(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;null&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Object());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.addVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;StructuredSelection(selection));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionEvent&amp;nbsp;event&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ExecutionEvent(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;null&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&amp;nbsp;Collections.emptyMap(),&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;null&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&amp;nbsp;context);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;command.execute(event);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&amp;nbsp;contains&amp;nbsp;a&amp;nbsp;beaut&amp;nbsp;that&amp;nbsp;turns&amp;nbsp;a&amp;nbsp;stream&amp;nbsp;into&amp;nbsp;a&amp;nbsp;String&amp;nbsp;without&amp;nbsp;using&amp;nbsp;IoUtils:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&amp;nbsp;http://stackoverflow.com/questions/309424/in-java-how-do-a-read-convert-an-inputstream-in-to-a-string&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;verifyThatSaveActionsHaveBeenApplied(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFile&amp;nbsp;aJavaFile)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;CoreException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;actualContents;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Scanner&amp;nbsp;scanner&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Scanner(aJavaFile.getContents());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;try&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;actualContents&amp;nbsp;=&amp;nbsp;scanner.useDelimiter(&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;\\A&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;).next();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;finally&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scanner.close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assertEquals(TEST_CLASS_AFTER_SAVE_ACTIONS,&amp;nbsp;actualContents);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@SuppressWarnings(&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;restriction&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;enableJavaSaveActions()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InstanceScope.INSTANCE.getNode(JavaUI.ID_PLUGIN).putBoolean(Constants.PERFORM_SAVE_ACTIONS_PREFERENCE,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;true&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Map&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;nbsp;cleanupPreferences&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;HashMap&amp;lt;String,&amp;nbsp;String&amp;gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.eclipse.jdt.internal.ui.JavaPlugin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getDefault()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getCleanUpRegistry()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getDefaultOptions(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.eclipse.jdt.internal.corext.fix.CleanUpConstants.DEFAULT_SAVE_ACTION_OPTIONS)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getMap());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cleanupPreferences.put(org.eclipse.jdt.internal.corext.fix.CleanUpConstants.FORMAT_SOURCE_CODE,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CleanUpOptions.TRUE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cleanupPreferences.put(org.eclipse.jdt.internal.corext.fix.CleanUpConstants.ORGANIZE_IMPORTS,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CleanUpOptions.TRUE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cleanupPreferences.put(org.eclipse.jdt.internal.corext.fix.CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CleanUpOptions.TRUE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.eclipse.jdt.internal.corext.fix.CleanUpPreferenceUtil.saveSaveParticipantOptions(InstanceScope.INSTANCE,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cleanupPreferences);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFolder&amp;nbsp;createASourceFolder(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;name)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;CoreException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFolder&amp;nbsp;aJavaSourceFolder&amp;nbsp;=&amp;nbsp;aJavaProject.getFolder(Path.fromPortableString(name));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;create(aJavaSourceFolder);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;aJavaSourceFolder;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFolder&amp;nbsp;createAPackage(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFolder&amp;nbsp;aJavaSourceFolder,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;name)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;CoreException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFolder&amp;nbsp;aJavaPackage&amp;nbsp;=&amp;nbsp;aJavaSourceFolder.getFolder(Path.fromPortableString(name));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;create(aJavaPackage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;aJavaPackage;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;create(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFolder&amp;nbsp;folder)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;CoreException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IContainer&amp;nbsp;parent&amp;nbsp;=&amp;nbsp;folder.getParent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(parent.getType()&amp;nbsp;==&amp;nbsp;IResource.FOLDER&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;!parent.exists())&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;create((IFolder)&amp;nbsp;parent);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;folder.create(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;true&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;true&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&amp;nbsp;NULL_PROGRESS_MONITOR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFile&amp;nbsp;createAJavaFile(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFolder&amp;nbsp;aJavaPackage,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;name)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;CoreException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IFile&amp;nbsp;aJavaFile&amp;nbsp;=&amp;nbsp;aJavaPackage.getFile(Path.fromPortableString(name));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aJavaFile.create(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ByteArrayInputStream(TEST_CLASS_BEFORE_SAVE_ACTIONS.getBytes()),&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;true&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL_PROGRESS_MONITOR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;aJavaFile;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&amp;nbsp;based&amp;nbsp;on&amp;nbsp;http://www.stateofflow.com/journal/66/creating-java-projects-programmatically&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;@SuppressWarnings(&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;restriction&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IProject&amp;nbsp;createAJavaProject(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;name)&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;CoreException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IWorkspaceRoot&amp;nbsp;root&amp;nbsp;=&amp;nbsp;ResourcesPlugin.getWorkspace().getRoot();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IProject&amp;nbsp;project&amp;nbsp;=&amp;nbsp;root.getProject(name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;project.create(NULL_PROGRESS_MONITOR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;project.open(NULL_PROGRESS_MONITOR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathsBlock.addJavaNature(project,&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;SubProgressMonitor(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL_PROGRESS_MONITOR,&amp;nbsp;1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IJavaProject&amp;nbsp;javaProject&amp;nbsp;=&amp;nbsp;JavaCore.create(project);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;List&amp;lt;IClasspathEntry&amp;gt;&amp;nbsp;entries&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ArrayList&amp;lt;IClasspathEntry&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;for&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IClasspathEntry&amp;nbsp;entry&amp;nbsp;:&amp;nbsp;javaProject.getRawClasspath())&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(entry.getEntryKind()&amp;nbsp;==&amp;nbsp;IClasspathEntry.CPE_SOURCE)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((org.eclipse.jdt.internal.core.ClasspathEntry)&amp;nbsp;entry).path&amp;nbsp;=&amp;nbsp;Path.fromPortableString(SOURCE_FOLDER);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entries.add(entry);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entries.add(JavaRuntime.getDefaultJREContainerEntry());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;javaProject.setRawClasspath(entries.toArray(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;IClasspathEntry[entries.size()]),&amp;nbsp;NULL_PROGRESS_MONITOR);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;project;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;The Feature&lt;/h4&gt;&lt;br /&gt;Now that we have a tested plug-in, we will create an Eclipse feature to contain it for distribution. We can do practically all our configuration through the New Feature Project Wizard, except we want to put the feature project into a &lt;em&gt;features&lt;/em&gt; subdirectory in the same way that we put our plug-in and fragment into the &lt;em&gt;plugins&lt;/em&gt; subdirectory.&lt;br /&gt;&lt;br /&gt;&lt;img alt="The New Feature Project wizard" src="http://farm7.static.flickr.com/6094/6236573969_93fca00579_z.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;The Update Site&lt;/h4&gt;&lt;br /&gt;Now that we have a tested plug-in and a feature to contain it, we will create an Eclipse update site for publishing the feature. In the New Update Site Project Wizard, we will again override the default location so that our update site project is in an &lt;em&gt;update-site&lt;/em&gt; subdirectory, just as we separated our plug-in, fragment and feature into &lt;em&gt;plugins&lt;/em&gt; and &lt;em&gt;features&lt;/em&gt; subdirectories.&lt;br /&gt;&lt;br /&gt;&lt;img alt="The New Update Site Project wizard" src="http://farm7.static.flickr.com/6052/6255218901_1fd2035ca1_z.jpg" /&gt;&lt;br /&gt;&lt;strong&gt;NB:&lt;/strong&gt; Whereas we may have multiple features or plug-ins for our project, we will have a single update site; thus the update-site project is not contained in a subfolder of &lt;em&gt;update-site&lt;/em&gt;, but in this folder directly. &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Tycho&lt;/h4&gt;&lt;br /&gt;Compiling, running integration tests and packaging an application entirely within an IDE does not scale to even a single programmer over time, let alone a team of programmers working on multiple plug-in projects. So far, the amount of ceremony for creating our menu contribution has been high, but the IDE has reduced a significant amount of the boilerplate. Before Tycho, the amount of ceremony and hackery required to get plugins, features and update sites packaged and unit and integration test suites running on a CI server had been prohibitively high. Tycho removes a significant amount of that pain.&lt;br /&gt;Generating meaningful poms for our projects is as trivial as going into each of the &lt;em&gt;features&lt;/em&gt;, &lt;em&gt;plugins&lt;/em&gt; and &lt;em&gt;update-site&lt;/em&gt; directories and running a Tycho goal.&lt;br /&gt;&lt;br /&gt;&lt;div style="overflow:auto;width:80%;padding:5px;color:white;background-color:black;border-style:dashed;border-width:1px"&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&amp;nbsp;&amp;nbsp;mvn org.eclipse.tycho:tycho-pomgenerator-plugin:generate-poms -DgroupId=timezra.eclipse&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;We can combine some of the boilerplate in each of the subproject poms in an über-parent pom at the root of our workspace. We will also add the &lt;a href="http://www.eclipse.org/indigo/"&gt;Indigo&lt;/a&gt; p2 repository and a &lt;a href="http://tycho.sonatype.org/targetplatformmanagement.html"&gt;target platform configuration resolver&lt;/a&gt; since we are developing our Eclipse components Manifest-first.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;pom.xml&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;xml&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;version&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;encoding&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;project&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://maven.apache.org/POM/4.0.0&amp;nbsp;http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://maven.apache.org/POM/4.0.0&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns:xsi&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;modelVersion&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;4.0.0&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;modelVersion&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;timezra.eclipse&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;apply-save-actions-parent&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;1.0.0-SNAPSHOT&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;packaging&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;pom&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;packaging&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;properties&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;tycho-version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;0.13.0&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;tycho-version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;properties&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;modules&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;module&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;plugins&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;module&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;module&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;features&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;module&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;module&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;update-site&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;module&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;modules&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;build&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugins&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugin&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.eclipse.tycho&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;tycho-maven-plugin&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;${tycho-version}&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;extensions&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;extensions&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugin&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugin&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.eclipse.tycho&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;target-platform-configuration&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;${tycho-version}&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;configuration&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;resolver&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;p2&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;resolver&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;configuration&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugin&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugins&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;build&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;repositories&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;repository&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;indigo&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;layout&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;p2&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;layout&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;url&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;http://download.eclipse.org/releases/indigo/&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;url&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;repository&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;repositories&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;project&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;We will also &lt;a href="http://git.eclipse.org/c/tycho/org.eclipse.tycho.git/tree/tycho-demo/itp01/tycho.demo.itp01.tests/pom.xml"&gt;configure Tycho to use the UI test runner&lt;/a&gt; for our integration test suite, as well as add any platform-specific runtime plug-in dependencies or configuration to the test fragment pom.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;plugins/timezra.eclipse.apply_save_actions.tests/pom.xml&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;xml&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;version&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;encoding&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;project&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://maven.apache.org/POM/4.0.0&amp;nbsp;http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://maven.apache.org/POM/4.0.0&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns:xsi&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;modelVersion&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;4.0.0&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;modelVersion&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;parent&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;timezra.eclipse&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;apply-save-actions-plugins-parent&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;1.0.0-SNAPSHOT&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;parent&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;timezra.eclipse&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;timezra.eclipse.apply_save_actions.tests&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;1.0.0-SNAPSHOT&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;packaging&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;eclipse-test-plugin&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;packaging&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(63,95,191);"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: rgb(63,95,191);"&gt;&amp;nbsp;Tell&amp;nbsp;tycho&amp;nbsp;to&amp;nbsp;run&amp;nbsp;PDE&amp;nbsp;tests&amp;nbsp;http://git.eclipse.org/c/tycho/org.eclipse.tycho.git/tree/tycho-demo/itp01/tycho.demo.itp01.tests/pom.xml&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,95,191);"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;build&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;outputDirectory&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;target/test-classes&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;outputDirectory&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugins&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugin&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.eclipse.tycho&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;tycho-surefire-plugin&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;${tycho-version}&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;configuration&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;useUIHarness&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;useUIHarness&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;configuration&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugin&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugins&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;build&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;profiles&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;profile&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;osx&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;activation&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;java.vendor.url&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;http://www.apple.com/&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;activation&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;build&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;pluginManagement&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugins&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugin&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.eclipse.tycho&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;tycho-surefire-plugin&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;${tycho-version}&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;configuration&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;argLine&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;-XstartOnFirstThread&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;argLine&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependencies&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;p2-installable-unit&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.eclipse.jdt.launching.macosx&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependencies&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;configuration&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugin&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugins&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;pluginManagement&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;build&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;profile&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;profiles&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;project&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;NB:&lt;/strong&gt; we would use &lt;a href="http://timezra.blogspot.com/2010/05/tycho-tests-without-osgi.html"&gt;a different configuration&lt;/a&gt; if our fragment contained unit-tests instead of integration tests.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;JAR signing&lt;/h4&gt;&lt;br /&gt;If you do not have access to a certificate from a trusted authority, you can generate a self-signed certificate with 1-year validity by a command such as&lt;br /&gt;&lt;br /&gt;&lt;div style="overflow:auto;width:80%;padding:5px;color:white;background-color:black;border-style:dashed;border-width:1px"&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&amp;nbsp;&amp;nbsp;keytool -genkey -alias _keystore_alias_ -keystore /path/to/keystore -validity 365&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In order to sign the jars deployed to our update-site before release, we will add a new profile with a &lt;a href="http://www.zeroturnaround.com/blog/building-eclipse-plug-ins-with-maven-3-and-tycho/"&gt;plug-in management configuration&lt;/a&gt; to the über-parent pom.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;pom.xml&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;xml&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;version&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;encoding&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;project&lt;/span&gt;&amp;nbsp;....&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;profiles&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;profile&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;sign&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(63,95,191);"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: rgb(63,95,191);"&gt;&amp;nbsp;To&amp;nbsp;sign&amp;nbsp;plug-ins&amp;nbsp;and&amp;nbsp;features,&amp;nbsp;run:&amp;nbsp;mvn&amp;nbsp;-Psign&amp;nbsp;-Djarsigner.keystore=&amp;lt;path&amp;gt;&amp;nbsp;-Djarsigner.storepass=*******&amp;nbsp;-Djarsigner.alias=&amp;lt;keyalias&amp;gt;&amp;nbsp;clean&amp;nbsp;package&amp;nbsp;integration-test&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,95,191);"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;build&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;pluginManagement&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugins&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugin&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;maven-jarsigner-plugin&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;1.2&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;executions&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;execution&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;goals&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;sign&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;goal&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;sign&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;goal&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;goals&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;execution&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;execution&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;goals&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;verify&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;goal&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;verify&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;goal&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;goals&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;execution&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;executions&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugin&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugins&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;pluginManagement&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;build&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;profile&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;profiles&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;project&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Similarly, we will &lt;a href="http://www.zeroturnaround.com/blog/building-eclipse-plug-ins-with-maven-3-and-tycho/"&gt;configure the plug-ins and features parent poms for jar signing&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;plugins/pom.xml&lt;/em&gt; and &lt;em&gt;features/pom.xml&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;xml&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;version&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;encoding&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;project&lt;/span&gt;&amp;nbsp;....&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;profiles&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;profile&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;sign&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;build&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugins&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugin&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;maven-jarsigner-plugin&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugin&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;plugins&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;build&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;profile&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;profiles&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;project&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Publishing&lt;/h4&gt;&lt;br /&gt;We are now ready to build and test our signed plug-ins and features and to package them in an update site for deployment.&lt;br /&gt;&lt;br /&gt;&lt;div style="overflow:auto;width:80%;padding:5px;color:white;background-color:black;border-style:dashed;border-width:1px"&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 11pt;"&gt;&amp;nbsp;&amp;nbsp;mvn -Psign -Djarsigner.keystore=/path/to/keystore -Djarsigner.storepass=_keystore_password_ -Djarsigner.alias=_keystore_alias_ clean package integration-test&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;There will now be a fully deployable update site in &lt;em&gt;update-site/target/site&lt;/em&gt;.&lt;br /&gt;For this particular project, I distribute the contents of this directory to the &lt;a href="http://pages.github.com/"&gt;gh-pages branch&lt;/a&gt; of the &lt;a href="https://github.com/timezra/save-actions-extensions"&gt;project&lt;/a&gt; on github.&lt;br /&gt;Since the &lt;a href="http://timezra.github.com/save-actions-extensions/"&gt;update site for the project&lt;/a&gt; is publicly-available and since I have an &lt;a href="https://bugs.eclipse.org/bugs/"&gt;Eclipse Bugzilla login&lt;/a&gt;, I can simply &lt;a href="http://marketplace.eclipse.org/addcontent"&gt;add a new solution listing&lt;/a&gt; to the &lt;a href="http://marketplace.eclipse.org/"&gt;Eclipse Marketplace&lt;/a&gt; to make the menu contribution even more discoverable by and accessible to Eclipse users.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Conclusion&lt;/h4&gt;&lt;br /&gt;This tutorial has provided the outline for the workflow of taking an idea for a single-featured Eclipse contribution from inception to delivery in a very short amount of time. While Eclipse tooling has for years provided the means to perform the tasks of plug-in, fragment, feature and update site publishing entirely within the IDE, it is the Tycho project that lowers the barrier to entry for scaling out plug-in development by making the build and test process far simpler to automate and to configure than other PDE-based build systems. Along the way, we have explored JAR signing and uploading of content to github and to the Eclipse Marketplace, and we have hopefully developed a menu contribution that others will find useful in their own projects.&lt;br /&gt;&lt;br /&gt;&lt;img alt="The source submenu contribution for applying save actions in batch mode" src="http://farm7.static.flickr.com/6060/6237098352_04757e5682_z.jpg" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/106449775438946661-2815377677008658556?l=timezra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timezra.blogspot.com/feeds/2815377677008658556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=106449775438946661&amp;postID=2815377677008658556' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/106449775438946661/posts/default/2815377677008658556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/106449775438946661/posts/default/2815377677008658556'/><link rel='alternate' type='text/html' href='http://timezra.blogspot.com/2011/10/eclipse-plug-ins-program-to-publish.html' title='Eclipse Plug-ins: Program to Publish'/><author><name>Tim Myer</name><uri>http://www.blogger.com/profile/01514263555690798238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_65ARy92WIco/SeOrrQJl-EI/AAAAAAAAAAU/-TUhZO2zOIA/S220/bio-t-myer.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm7.static.flickr.com/6110/6236573817_b280ed1379_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-106449775438946661.post-1657068226778857310</id><published>2011-10-05T09:54:00.000-07:00</published><updated>2011-10-11T09:43:41.188-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>JPA Callbacks With Hibernate</title><content type='html'>&lt;h4&gt;Goal:&lt;/h4&gt;&lt;br /&gt;The purpose of this blog entry is to provide one solution for using &lt;a href="http://stackoverflow.com/questions/4133287/preupdate-and-prepersist-in-hibernate-jpa-using-session"&gt;JPA Annotations with Hibernate but without using the Hibernate EntityManager&lt;/a&gt;. Thanks to Ben Macfarlane for posing this problem and for doing the groundwork for me to come up with a somewhat simple solution.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;tl;dr&lt;/h4&gt;&lt;br /&gt;If you want to look right away at working code that compares the configuration of JPA callbacks with the EntityManager and the Hibernate SessionFactory, a &lt;a href="https://github.com/timezra/hibernate-jpa-callbacks"&gt;sample project&lt;/a&gt; based on this tutorial is available.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Create a Maven Project:&lt;/h4&gt;&lt;br /&gt;We will start with a boilerplate Maven project that includes dependencies on Spring, Hibernate and JUnit.&lt;br /&gt;&lt;em&gt;pom.xml&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;height:250px;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 10pt;"&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;project&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://maven.apache.org/POM/4.0.0&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns:xsi&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://maven.apache.org/POM/4.0.0&amp;nbsp;http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;modelVersion&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;4.0.0&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;modelVersion&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;timezra.hibernate&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;callbacks&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;0.0.1-SNAPSHOT&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;description&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;Demo&amp;nbsp;for&amp;nbsp;using&amp;nbsp;JPA&amp;nbsp;callbacks&amp;nbsp;with&amp;nbsp;hibernate&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;description&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;properties&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;maven.compiler.source&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;1.6&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;maven.compiler.source&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;maven.compiler.target&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;1.6&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;maven.compiler.target&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;properties&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependencies&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.springframework&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;spring-orm&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;3.0.6.RELEASE&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;cglib&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;cglib-nodep&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;2.2.2&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.hibernate&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;hibernate-core&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;3.6.7.Final&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.hibernate&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;hibernate-annotations&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;3.5.6-Final&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.hibernate&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;hibernate-validator&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;3.1.0.GA&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.javassist&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;javassist&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;3.15.0-GA&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;com.h2database&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;h2&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;1.3.160&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;commons-dbcp&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;commons-dbcp&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;1.4&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;junit&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;junit&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;4.10&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;scope&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;test&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;scope&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.springframework&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;spring-test&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;3.0.6.RELEASE&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;scope&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;test&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;scope&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependencies&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;project&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Create a Domain and Domain Access:&lt;/h4&gt;&lt;br /&gt;Our domain can be as simple as a single POJO that uses javax.persistence annotations such as &lt;em&gt;@PrePersist&lt;/em&gt;, &lt;em&gt;@PreUpdate&lt;/em&gt; and &lt;em&gt;@PostLoad&lt;/em&gt;.&lt;br /&gt;&lt;em&gt;src/main/java/timezra/hibernate/callbacks/domain/Author.java&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;height:1160px;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 10pt;"&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;package&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.hibernate.callbacks.domain;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.Calendar;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.Date;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.Locale;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.persistence.Entity;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.persistence.GeneratedValue;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.persistence.GenerationType;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.persistence.Id;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.persistence.PostLoad;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.persistence.PrePersist;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.persistence.PreUpdate;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.persistence.Table;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.persistence.Transient;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.persistence.UniqueConstraint;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.hibernate.validator.NotNull;&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;@Table(uniqueConstraints&amp;nbsp;=&amp;nbsp;@UniqueConstraint(columnNames&amp;nbsp;=&amp;nbsp;Author.NAME_ATTRIBUTE))&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Author&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;NAME_ATTRIBUTE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Id&lt;br /&gt;&amp;nbsp;&amp;nbsp;@GeneratedValue(strategy&amp;nbsp;=&amp;nbsp;GenerationType.SEQUENCE)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Long&amp;nbsp;id;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@NotNull&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Date&amp;nbsp;dateOfBirth;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Transient&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Integer&amp;nbsp;age;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@NotNull&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Date&amp;nbsp;dateCreated;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@NotNull&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Date&amp;nbsp;lastUpdated;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@PrePersist&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;prePersist()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dateCreated&amp;nbsp;=&amp;nbsp;lastUpdated&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Date();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@PreUpdate&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;preUpdate()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastUpdated&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Date();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@PostLoad&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;postLoad()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(dateOfBirth&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;null&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Calendar&amp;nbsp;now&amp;nbsp;=&amp;nbsp;Calendar.getInstance(Locale.getDefault());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;int&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;thisYear&amp;nbsp;=&amp;nbsp;now.get(Calendar.YEAR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;int&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;thisDay&amp;nbsp;=&amp;nbsp;now.get(Calendar.DAY_OF_YEAR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;now.setTime(dateOfBirth);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;int&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;birthYear&amp;nbsp;=&amp;nbsp;now.get(Calendar.YEAR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;int&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;birthDay&amp;nbsp;=&amp;nbsp;now.get(Calendar.DAY_OF_YEAR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;age&amp;nbsp;=&amp;nbsp;thisYear&amp;nbsp;-&amp;nbsp;birthYear&amp;nbsp;-&amp;nbsp;(birthDay&amp;nbsp;&amp;gt;&amp;nbsp;thisDay&amp;nbsp;?&amp;nbsp;1&amp;nbsp;:&amp;nbsp;0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Long&amp;nbsp;getId()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;id;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Date&amp;nbsp;getDateCreated()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;dateCreated;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Date&amp;nbsp;getLastUpdated()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;lastUpdated;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Integer&amp;nbsp;getAge()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;age;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Date&amp;nbsp;getDateOfBirth()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;dateOfBirth;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;setDateOfBirth(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Date&amp;nbsp;dateOfBirth)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;.dateOfBirth&amp;nbsp;=&amp;nbsp;dateOfBirth;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;getName()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;setName(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;name)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;.name&amp;nbsp;=&amp;nbsp;name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A DAO and Service can provide access into our domain.&lt;br /&gt;&lt;em&gt;src/main/java/timezra/hibernate/callbacks/dao/AuthorDAO.java&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 10pt;"&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;package&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.hibernate.callbacks.dao;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.annotation.Resource;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.hibernate.Session;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.hibernate.SessionFactory;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.hibernate.criterion.Restrictions;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.springframework.stereotype.Repository;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.hibernate.callbacks.domain.Author;&lt;br /&gt;&lt;br /&gt;@Repository&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;AuthorDAO&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Resource&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;SessionFactory&amp;nbsp;sessionFactory;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;create(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Author&amp;nbsp;a)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getSession().save(a);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Author&amp;nbsp;findByName(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;name)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(Author)&amp;nbsp;getSession().createCriteria(Author.&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.add(Restrictions.eq(Author.NAME_ATTRIBUTE,&amp;nbsp;name))&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(63,127,95);"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.uniqueResult();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;update(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Author&amp;nbsp;a)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getSession().update(a);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;delete(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Author&amp;nbsp;a)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getSession().delete(a);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Session&amp;nbsp;getSession()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;sessionFactory.getCurrentSession();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;src/main/java/timezra/hibernate/callbacks/service/AuthorService.java&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 10pt;"&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;package&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.hibernate.callbacks.service;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.annotation.Resource;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.springframework.stereotype.Service;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.springframework.transaction.annotation.Propagation;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.springframework.transaction.annotation.Transactional;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.hibernate.callbacks.dao.AuthorDAO;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.hibernate.callbacks.domain.Author;&lt;br /&gt;&lt;br /&gt;@Service&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;AuthorService&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Resource&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;AuthorDAO&amp;nbsp;authorDAO;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Transactional&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;create(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Author&amp;nbsp;a)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authorDAO.create(a);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Transactional&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;update(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Author&amp;nbsp;a)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authorDAO.update(a);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Transactional&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;delete(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Author&amp;nbsp;a)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authorDAO.delete(a);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Transactional(propagation&amp;nbsp;=&amp;nbsp;Propagation.SUPPORTS)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Author&amp;nbsp;findByName(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;String&amp;nbsp;name)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;authorDAO.findByName(name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Wire It Together With Spring:&lt;/h4&gt;&lt;br /&gt;We will use Spring to glue all our components together and to manage their lifecycles.&lt;br /&gt;&lt;em&gt;src/main/resources/applicationContext.xml&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 10pt;"&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;xml&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;version&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;encoding&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;beans&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns:xsi&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns:context&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns:tx&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://www.springframework.org/schema/beans&amp;nbsp;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://www.springframework.org/schema/context&amp;nbsp;http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://www.springframework.org/schema/tx&amp;nbsp;http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;dataSource&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;class&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;org.apache.commons.dbcp.BasicDataSource&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;destroy-method&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;close&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;driverClassName&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;value&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;org.h2.Driver&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;url&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;value&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;jdbc:h2:test&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;value&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;sa&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;value&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;sessionFactory&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;class&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;dataSource&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;ref&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;dataSource&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;packagesToScan&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;list&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;timezra.hibernate.callbacks.domain&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;list&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;hibernateProperties&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;props&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;prop&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;key&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;hibernate.dialect&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.hibernate.dialect.H2Dialect&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;prop&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;prop&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;key&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;hibernate.hbm2ddl.auto&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;update&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;prop&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;props&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;transactionManager&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;class&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;org.springframework.orm.hibernate3.HibernateTransactionManager&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;sessionFactory&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;ref&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;sessionFactory&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;context:component-scan&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;base-package&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;timezra.hibernate.callbacks&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;context:annotation-config&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;tx:annotation-driven&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;beans&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Test The JPA Callbacks:&lt;/h4&gt;&lt;br /&gt;Finally we can test that the annotated methods are called at the expected times during Hibernate lifecycle events.&lt;br /&gt;&lt;em&gt;src/test/java/timezra/hibernate/callbacks/domain/AuthorTest.java&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 10pt;"&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;package&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.hibernate.callbacks.domain;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.Assert.assertEquals;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.Assert.assertNotNull;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.Assert.assertNull;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;static&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.Assert.assertTrue;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.Calendar;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.Date;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.Locale;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.annotation.Resource;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.After;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.Before;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.Test;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.junit.runner.RunWith;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.springframework.test.context.ContextConfiguration;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.springframework.test.context.junit4.SpringJUnit4ClassRunner;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.hibernate.callbacks.service.AuthorService;&lt;br /&gt;&lt;br /&gt;@RunWith(SpringJUnit4ClassRunner.&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;br /&gt;@ContextConfiguration(&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;/applicationContext.xml&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;AuthorTest&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Resource&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;AuthorService&amp;nbsp;authorService;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Author&amp;nbsp;testAuthor;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Before&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;setup()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;testAuthor&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Author();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;testAuthor.setName(&lt;/span&gt;&lt;span style="color: rgb(42,0,255);"&gt;&amp;quot;timezra&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authorService.create(testAuthor);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@After&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;tearDown()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authorService.delete(testAuthor);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;theCreationDateIsSetAutomatically()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assertNotNull(testAuthor.getDateCreated());&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;theUpdatedDateIsSetAutomaticallyOnCreation()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assertEquals(testAuthor.getDateCreated(),&amp;nbsp;testAuthor.getLastUpdated());&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;theUpdatedDateIsSetAutomaticallyOnUpdate()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;testAuthor.setDateOfBirth(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Date());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authorService.update(testAuthor);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assertTrue(testAuthor.getDateCreated().before(testAuthor.getLastUpdated()));&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;theAgeIsSetAutomaticallyWhenTheAuthorIsLoaded()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Integer&amp;nbsp;expectedAge&amp;nbsp;=&amp;nbsp;42;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Calendar&amp;nbsp;birthDate&amp;nbsp;=&amp;nbsp;Calendar.getInstance(Locale.getDefault());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;birthDate.add(Calendar.YEAR,&amp;nbsp;-expectedAge);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;testAuthor.setDateOfBirth(birthDate.getTime());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authorService.update(testAuthor);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assertNull(testAuthor.getAge());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assertEquals(expectedAge,&amp;nbsp;authorService.findByName(testAuthor.getName()).getAge());&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;We should expect all these tests to fail with a Hibernate validation Exception.&lt;br /&gt;&lt;img alt="JUnit Test Failures for JPA Annotations" src="http://farm7.static.flickr.com/6052/6214874464_d90770c677_z.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Update Project Dependencies:&lt;/h4&gt;&lt;br /&gt;Fortunately, the &lt;em&gt;hibernate-entitymanager&lt;/em&gt; component provides a set of JPA lifecycle listeners that can be used independent of the Hibernate EntityManager, so we will update our project dependencies.&lt;br /&gt;&lt;em&gt;pom.xml&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 10pt;"&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;project&lt;/span&gt;&amp;nbsp;....&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependencies&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;org.hibernate&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;groupId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;hibernate-entitymanager&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;artifactId&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;3.6.7.Final&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependency&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;dependencies&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;project&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;NB:&lt;/strong&gt; for this sample code, the version must be 3.6.x+ in order to access the ReflectionManager from the Hibernate configuration.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Register Hibernate Event Listeners:&lt;/h4&gt;&lt;br /&gt;We must manually tie the JPA lifecycle listeners to Hibernate events, much as the org.hibernate.ejb.EventListenerConfigurator#configure would if the Hibernate EntityManager were used.&lt;br /&gt;&lt;em&gt;src/main/java/timezra/hibernate/callbacks/domain/EntityCallbackHandlerInitializer.java&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 10pt;"&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;package&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;timezra.hibernate.callbacks.dao;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;java.util.Iterator;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.annotation.PostConstruct;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;javax.annotation.Resource;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.hibernate.annotations.common.reflection.ReflectionManager;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.hibernate.cfg.Configuration;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.hibernate.ejb.event.EntityCallbackHandler;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.hibernate.mapping.PersistentClass;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;org.springframework.stereotype.Component;&lt;br /&gt;&lt;br /&gt;@Component&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;EntityCallbackHandlerInitializer&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Resource&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;AnnotationSessionFactoryBean&amp;nbsp;annotationSessionFactory;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Resource&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;EntityCallbackHandler&amp;nbsp;entityCallbackHandler;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@PostConstruct&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;init()&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;throws&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ClassNotFoundException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Configuration&amp;nbsp;configuration&amp;nbsp;=&amp;nbsp;annotationSessionFactory.getConfiguration();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;ReflectionManager&amp;nbsp;reflectionManager&amp;nbsp;=&amp;nbsp;configuration.getReflectionManager();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;final&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;Iterator&amp;lt;PersistentClass&amp;gt;&amp;nbsp;classMappings&amp;nbsp;=&amp;nbsp;configuration.getClassMappings();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;while&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;&amp;nbsp;(classMappings.hasNext())&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entityCallbackHandler.add(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reflectionManager.classForName(classMappings.next().getClassName(),&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(127,0,85);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0,0,0);"&gt;.getClass()),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reflectionManager);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Finally, we will update the Hibernate configuration in the Spring context to use these event listeners. This configuration is based off a similar solution on the &lt;a href="http://forum.springsource.org/showthread.php?54566-Hibernate-3.2-Persistent-Lifecycle-annotations-not-work"&gt;Spring Forum&lt;/a&gt;.&lt;br /&gt;&lt;em&gt;src/main/resources/applicationContext.xml&lt;/em&gt;&lt;br /&gt;&lt;div style="overflow:auto;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;span style="font-family: courier new; font-size: 10pt;"&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;xml&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;version&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;encoding&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;beans&lt;/span&gt;&amp;nbsp;....&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;sessionFactory&amp;quot;&lt;/span&gt;&amp;nbsp;....&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;eventListeners&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;map&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;entry&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;key&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;save&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;value-ref&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;saveEventListener&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;entry&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;key&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;flush-entity&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;value-ref&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;flushEntityEventListener&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;entry&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;key&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;post-load&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;value-ref&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;postLoadEventListener&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;map&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;saveEventListener&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;parent&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;callbackHandlerEventListener&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;class&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;org.hibernate.ejb.event.EJB3SaveEventListener&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;flushEntityEventListener&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;parent&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;callbackHandlerEventListener&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;class&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;org.hibernate.ejb.event.EJB3FlushEntityEventListener&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;postLoadEventListener&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;parent&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;callbackHandlerEventListener&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;class&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;org.hibernate.ejb.event.EJB3PostLoadEventListener&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;entityCallbackHandler&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;class&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;org.hibernate.ejb.event.EntityCallbackHandler&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;callbackHandlerEventListener&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;abstract&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;class&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;org.hibernate.ejb.event.CallbackHandlerConsumer&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;callbackHandler&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;ref&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;entityCallbackHandler&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;bean&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;beans&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;NB:&lt;/strong&gt; This configuration is for a subset of javax.persistence annotations and should be considered a starting point. It is up to the reader to configure Hibernate to use other other listeners in the org.hibernate.ejb.event package if the enablement of more JPA annotations is desired. For the purpose of this tutorial, the three listeners above are sufficient.&lt;br /&gt;&lt;br /&gt;The test cases now succeed.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Conclusion:&lt;/h4&gt;&lt;br /&gt;The purpose of this tutorial has been to demonstrate that, with minimal code and configuration additional to what is necessary for a standard Maven/Spring/Hibernate project, Hibernate can detect JPA annotations and tie them to its persistence lifecycle events. Along the way, we have also developed a simple methodology for testing that JPA annotated methods are called when expected, and this methodology can be used to extend the sample code to cover the remaining javax.persistence annotations not specified in this tutorial.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/timezra/hibernate-jpa-callbacks"&gt;Sample code&lt;/a&gt; based on this tutorial is also available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/106449775438946661-1657068226778857310?l=timezra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timezra.blogspot.com/feeds/1657068226778857310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=106449775438946661&amp;postID=1657068226778857310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/106449775438946661/posts/default/1657068226778857310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/106449775438946661/posts/default/1657068226778857310'/><link rel='alternate' type='text/html' href='http://timezra.blogspot.com/2011/10/jpa-callbacks-with-hibernate.html' title='JPA Callbacks With Hibernate'/><author><name>Tim Myer</name><uri>http://www.blogger.com/profile/01514263555690798238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_65ARy92WIco/SeOrrQJl-EI/AAAAAAAAAAU/-TUhZO2zOIA/S220/bio-t-myer.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm7.static.flickr.com/6052/6214874464_d90770c677_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-106449775438946661.post-8650819075038223270</id><published>2010-05-22T01:13:00.000-07:00</published><updated>2010-05-22T01:29:07.116-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uml'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='tycho'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>Testing Stereotype Attribute RegEx Constraints</title><content type='html'>&lt;h4&gt;Goal:&lt;/h4&gt;&lt;br /&gt;Suppose that we have a &lt;a href="http://timezra.blogspot.com/2010/04/regex-to-validate-uml-stereotype.html"&gt;UML profile that contains a stereotype with an attribute of a custom data type constrained by a regular expression&lt;/a&gt;.  This tutorial steps through one way to automate tests that exercise this restriction.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Create a UML Profile:&lt;/h4&gt;&lt;br /&gt;We can use the instructions from &lt;a href="http://timezra.blogspot.com/2010/04/regex-to-validate-uml-stereotype.html"&gt;a previous tutorial&lt;/a&gt; to create a UML profile with a restricted data type.  In our case, a Contact is an Actor who has a US phone number.  We can call our profile &lt;em&gt;Contact.profile.uml&lt;/em&gt;:&lt;br /&gt;&lt;div style="overflow:auto;width:60%;height:250px;padding:5px;background-color:white;border-style:dashed;border-width:1px"&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 10pt;"&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;xml&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;version&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;encoding&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;xmi:XMI&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:version&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;2.1&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns:xmi&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://schema.omg.org/spec/XMI/2.1&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns:xsi&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns:Ecore&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.eclipse.org/uml2/schemas/Ecore/5&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns:ecore&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.eclipse.org/emf/2002/Ecore&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmlns:uml&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.eclipse.org/uml2/3.0.0/UML&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.eclipse.org/uml2/schemas/Ecore/5&amp;nbsp;pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;uml:Profile&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_-8vWsEz2Ed-q5fB8PwONew&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;ContactProfile&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;metaclassReference&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_Q-rN8Ez-Ed-q5fB8PwONew&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eAnnotations&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjG80GI3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;source&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.eclipse.org/uml2/2.0.0/UML&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;contents&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:type&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;ecore:EPackage&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjJZEGI3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;RegexValidation&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;nsURI&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http:///schemas/RegexValidation/_Til_cGI3Ed-E2et4hPKZEg/0&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;nsPrefix&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;RegexValidation&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eClassifiers&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:type&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;ecore:EClass&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjJZEWI3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;Contact&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eAnnotations&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjJZEmI3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;source&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.eclipse.org/uml2/2.0.0/UML&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;references&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_KxZQgEz3Ed-q5fB8PwONew&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eStructuralFeatures&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:type&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;ecore:EReference&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjJZE2I3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;base_Actor&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;ordered&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;lowerBound&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eType&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:type&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;ecore:EClass&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;href&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.eclipse.org/uml2/3.0.0/UML#//Actor&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eStructuralFeatures&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eStructuralFeatures&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:type&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;ecore:EAttribute&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjJZFWI3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;PhoneNumber&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;ordered&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;lowerBound&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;eType&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjJZF2I3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eClassifiers&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eClassifiers&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:type&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;ecore:EDataType&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjJZF2I3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;USPhoneNumberType&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;instanceClassName&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;java.lang.String&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eAnnotations&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjJZGGI3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;source&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.eclipse.org/uml2/2.0.0/UML&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;references&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_i7slcE0EEd-q5fB8PwONew&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eAnnotations&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjJZGWI3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;source&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http:///org/eclipse/emf/ecore/util/ExtendedMetaData&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;details&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjJZGmI3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;key&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;baseType&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;value&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;http://www.eclipse.org/emf/2003/XMLType#string&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;details&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjJZG2I3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;key&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;pattern&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;value&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;details&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjJZHGI3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;key&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;value&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;USPhoneNumberType&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eAnnotations&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eClassifiers&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(63,127,127);"&gt;eClassifiers&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:type&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;ecore:EDataType&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;xmi:id&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;_TjJZHWI3Ed-E2et4hPKZEg&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;name&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;UMLPrimitiveTypes_String&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(127,0,127);"&gt;instanceClassName&lt;/span&gt;=&lt;span style="font-style: italic; color: rgb(42,0,255);"&gt;&amp;quot;UMLPrimitiveTypes_String&amp;quot;&lt;/span&gt;&lt;span style="color: rgb(0,128,128);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0,128,128);"&
