tag:blogger.com,1999:blog-27132525605671676712024-03-13T12:09:40.152+02:00DeveloperLife<b>Hi and welcome to DeveloperLife, written by Nadav Azaria and Roi Gamliel. In this blog we write about our own experience in software development, trying to share our knowledge following new technologies we adopt or problems we face.</b>Roi Gamliel רועי גמליאלhttp://www.blogger.com/profile/07882658912051279530noreply@blogger.comBlogger22125tag:blogger.com,1999:blog-2713252560567167671.post-17111087646283764452017-09-07T14:04:00.000+03:002017-09-07T14:04:15.852+03:00Is R production ready?<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">It has been a long time since our last post, and many things changed for us
both. New jobs, new adventures, and new challenges. I will not delve into the
details but let's say that our business domain changed, but we are still facing
architectural and programmatic problem that we can all enjoy </span><span style="font-family: "wingdings"; font-size: 13.5pt;">J</span><span style="font-size: 13.5pt;">.</span></div>
<h2 style="margin: 0in 0in 0.0001pt;">
<span style="font-size: 13.5pt;"><br /></span></h2>
<h2 style="margin: 0in 0in 0.0001pt;">
<span style="font-size: 13.5pt;"><br /></span></h2>
<h2 style="margin: 0in 0in 0.0001pt;">
<span style="font-size: 13.5pt;">Intro</span></h2>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">Recently I have been asked to incorporate
Time Series Forecasting into our product. We have been working close with an in
house Data Scientists team. They developed the algorithm and then it was up to
us to decide how to productize it. If you ask me, one of the biggest challenges
facing developers in this Big Data era is the ability to take very complex algorithms
and methods (usually written by non-product-facing people), and understand what
are the correct approaches and tools to make them work in production. An algorithm
can provide great results, but when looking close at the time it takes to run
and the load you will be facing you understand that practically it is useless.</span></div>
<h2 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;"><br /></span></h2>
<h2 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;"><br /></span></h2>
<h2 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">The problem</span></h2>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">So the problem we were facing was creating
a solution for <a href="https://en.wikipedia.org/wiki/Time_series#Prediction_and_forecasting">time
series forecasting</a> running 24/7. We needed to gather utilization values and
from a 3<sup>rd</sup> party system, and create weekly and daily predictions.</span></div>
<h2 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;"><br /></span></h2>
<h2 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;"><br /></span></h2>
<h2 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">Expected load</span></h2>
<h3 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;"><br /></span></h3>
<h3 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">Number of requests</span></h3>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">Our system works in peaks. We can be
requested to compute prediction based on a change in the system, or several
times on a daily basis. I will concentrate on the latter cases, since that will
give us the max load. Several times a day we needed to serve 4000 forecasting requests coming all in a one minute interval.</span></div>
<h3 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;"><br /></span></h3>
<h3 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">Data Points Length</span></h3>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">We needed to forecast for about 3 months
to the future, on a daily and weekly granularity. In numbers this means that we
had 180 data points, and we needed to predict ~90 values to the future.</span></div>
<h2 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;"><br /></span></h2>
<h2 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;"><br /></span></h2>
<h2 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">Possible solutions to run the prediction</span></h2>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">We really cracked our head on the best way
to tackle this. You need to remember the data scientists wrote their code <a href="https://www.r-project.org/">using R</a>. <o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">At first there were suggestions to rewrite
their R code into Java/Python. Since this is not our field of expertise we
quickly decided to drop this approach.</span></div>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;"><br /></span></div>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">We than looked at the possibility to run
the R code using <a href="https://www.rforge.net/Rserve/">Rserve</a>. Rserve is
a TCP/IP server which allows other programs to use R. This solution required us
to create another container that will run the actual Rserve, require maintenance,
and also we would now have a network lag. We could have installed the Rserve on
the same machine as the client but that wasn’t possible due to security
reasons.</span></div>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;"><br /></span></div>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">Lastly we looked at <a href="https://rpy2.bitbucket.io/">rpy2</a>. rpy2 is an interface to R running
embedded in a Python process. This gave us the freedom we needed and expertise
we have in python accompanied with the ability to withstand the load we were
expecting. It’s easy to use and configure (windows needed some <a href="http://developer4life.blogspot.ie/2017/09/installing-and-configuring-rpy2-on.html">hacking</a>
but we were able to overcome it).</span><span style="font-size: 13.5pt;"> </span></div>
<h2 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;"><br /></span></h2>
<h2 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">Chosen Architecture</span></h2>
<div style="text-align: justify;">
<span style="font-size: 13.5pt;">So we decided to stay with the R
code to run the prediction using rpy2. But that was just half of the way. We
still needed a supporting ecosystem that will trigger the R code <i>and</i> sustain our required load. We created a dedicated RedHat VM running 8 cores. We
installed there an apache web server that used <a href="http://flask.pocoo.org/docs/0.12/deploying/mod_wsgi/">flask</a> to receive
requests from consumers. Python was than used with rpy2 to run the R code. We
had a ProcessPoolExecutor </span><span style="background: white; color: #222222; font-size: 13.5pt;">that uses a pool
of processes to execute calls asynchronously</span>.</div>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">The component that actually sent out prediction
requests was another service written in Java we had in the system. We decided
that it will send asynch requests in bulks. It had a retry mechanism and was
sending a callback address to the apache web server.<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<br /></div>
<h2 style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">Results</span></h2>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;"><br /></span></div>
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">Well, I must say I was really surprised.
The system is running for six months now. The web server is stable, holds the
load easily. Moreover the load keeps on growing with no signs of breaking. <o:p></o:p></span></div>
<br />
<div style="margin-bottom: .0001pt; margin: 0in; text-align: justify;">
<span style="font-size: 13.5pt;">As we grow, we expect new challenges. In
other words – watch this space </span><span style="font-family: "wingdings"; font-size: 13.5pt;">J</span><span style="font-size: 13.5pt;"><o:p></o:p></span></div>
Roi Gamliel רועי גמליאלhttp://www.blogger.com/profile/07882658912051279530noreply@blogger.com1tag:blogger.com,1999:blog-2713252560567167671.post-17060044432403092512017-09-07T13:01:00.000+03:002017-09-07T13:07:23.771+03:00Installing and configuring rpy2 on Windows using Intellij<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in;">
<span style="font-family: "Times New Roman", serif; font-size: 12pt;"><br />
This is going to be a quick one. If you need to install rpy2 on Windows there
are a few tips I thought I might share:<o:p></o:p></span></div>
<div class="MsoNormal" style="background: white; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 0in; margin-right: 0in; margin-top: 7.5pt;">
<span style="color: #333333; font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">How do I install all this on my
machine?<o:p></o:p></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in;">
</div>
<ul type="disc">
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Install<o:p></o:p></span></li>
<ul type="circle">
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; mso-list: l0 level2 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">R 3.3<o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; mso-list: l0 level2 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Anaconda2 (with python 2.7)<o:p></o:p></span></li>
</ul>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Add to Path:</span></li>
<ul type="circle">
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; mso-list: l0 level2 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">C:\Program Files\R\R-3.3.3\bin<o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; mso-list: l0 level2 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"><Anaconda2 folder><o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; mso-list: l0 level2 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"><Anaconda2
folder>\Scripts<o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; mso-list: l0 level2 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"><Anaconda2
folder>\Library\bin<o:p></o:p></span></li>
</ul>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">In your <Anaconda2
folder> run as administrator: "conda install -c r
rpy2=2.8.5"<o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; line-height: normal;"><span style="color: #333333; font-family: Times New Roman, serif;"><span style="font-size: 12pt;">Validate python packages
installed in anaconda python: (In I</span>ntellij <span style="font-size: 12pt;">using alt+enter on the
missing import)<o:p></o:p></span></span></li>
<ul style="margin-top: 0in;" type="circle">
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-list: l0 level2 lfo1;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">numpy<o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-list: l0 level2 lfo1;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">pandas<o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-list: l0 level2 lfo1;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">rpy2<o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-list: l0 level2 lfo1;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">etc.</span></li>
</ul>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Validate existing env
variables:<o:p></o:p></span></li>
<ul type="circle">
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; mso-list: l0 level2 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">R_HOME = C:\Program
Files\R\R-3.3.3<o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; mso-list: l0 level2 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">R_User = <Anaconda2
folder>\Lib\site-packages\rpy2<o:p></o:p></span></li>
</ul>
<li class="MsoNormal" style="background: white; line-height: normal;"><span style="color: #333333; font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Navigate to
R_HOME location and run R ("r" in cmd) to install the following
libraries (install.packages("<library>"):</span><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"><o:p></o:p></span></li>
<ul style="margin-top: 0in;" type="circle">
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-list: l0 level2 lfo1;"><span style="color: #003366; font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">>install.packages("zoo")</span><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"><o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-list: l0 level2 lfo1;"><span style="color: #003366; font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">>install.packages("timeDate")</span><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"><o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-list: l0 level2 lfo1;"><span style="color: #003366; font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">>install.packages("forecast")</span><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"><o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #333333; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-list: l0 level2 lfo1;"><span style="color: #003366; font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">>install.packages("xts")</span><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"><o:p></o:p></span></li>
</ul>
<li class="MsoNormal" style="background: white; line-height: normal;"><span style="font-family: "Times New Roman",serif; font-size: 12.0pt; mso-ascii-theme-font: major-bidi; mso-bidi-theme-font: major-bidi; mso-fareast-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Open the code in Intellij and
configure the Intellij python interpreter to <Anaconda2
folder>\python.exe<o:p></o:p></span></li>
</ul>
Roi Gamliel רועי גמליאלhttp://www.blogger.com/profile/07882658912051279530noreply@blogger.com0tag:blogger.com,1999:blog-2713252560567167671.post-6972751909673868812015-06-15T12:57:00.000+03:002015-06-15T12:57:46.910+03:00Agile Estimation - Are We Missing Something?<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">An honorable member in any development group manifest is enhancing people’s knowledge and expertise. However, it often gets positioned in the infamous “Important/Not Urgent” quarter of the <a href="https://en.wikipedia.org/wiki/Time_management">Eisenhower matrix</a>, and gets less attention than it should. Even if an organization does invest effort in this, it will be managed separately from the development process.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">In this post I will suggest an agile approach for measuring and monitoring knowledge transfer among team members in an agile environment. I believe that implementing this technique will also have a positive effect on the team estimation quality.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The agile team routine </span><span style="background-color: white; color: #212121; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">revolves around a </span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">“Task”. We plan, estimate and implement tasks. Most of them are created during user stories break down, but many others exist such as bugs, merges, refactoring, etc.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Time spent on a typical task can roughly be divided in two. Time spent learning and time spent working. Given a task, can you state which portion of it was spent on learning and which on working? Well, you might be able to give a rough estimation but it certainly not trivial. This made me wonder if there is an easy way. Here a mental exercise for you. Imagine you perform a task twice in the exact same way. Each time you start from the exact same point. Only the second time you are armed with the experience and knowledge you got at the first time.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">How much time would it take you to complete the task the second time?</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The second time you don’t need to learn. So it is safe to say that all time spent the second time is “working time”. This gives us the following formal definition:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Given a team member </span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">M</span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> and a task </span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">T</span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> the </span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">learning factor</span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> of a task </span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">T</span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> with regards to team member </span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">M</span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> is defined as the amount of time it will take </span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">M</span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">to perform the task the first time divided by the amount of time it will take him to complete the task the second.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">I apologize for the formality. Let’s have a look at two examples in the form of imaginary tasks belonging to an imaginary team of experienced Java developers. We will then try to estimate the learning factor.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Example 1</span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: Use</span><a href="http://www.javacodegeeks.com/2014/07/converting-json-to-xml-to-java-objects-using-xstream.html" style="text-decoration: none;"><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #1155cc; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Xtream</span></a><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> java library to map about 50 XML’s to java classes.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">What is the learning factor here? Well, if you believe their tutorial (and you should), it takes about 10 minutes to learn how to use XTream. Thus the learning factor here is about ~1. If you start this task again it will roughly take you the same time.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Example 2:</span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Add to a website the option to login with a Google account.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Well, assuming you haven't done this before most of the time here will be spent on learning. The actual implementation is just a few lines of code. So I would roughly go here with ~8.</span></div>
<b id="docs-internal-guid-488d45a7-f69f-26a7-d738-b424d07aadfd" style="font-weight: normal;"><br /></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">OK. So now we have a nice new definition. What can we do with it? First, let’s have a look on the existing method for planning the estimation.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Spoiler alert: The following paragraph might be considered a heresy by some.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Agile methods aim to aspire all members to </span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">agree </span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">on the effort needed for a given task. This is usually achieved by playing Planning Poker. In this game each player will reveal his estimation for a task at the exact same time as the rest of the players. The estimates are then discussed in order to achieve agreement. If you stop for a moment and think about it you can’t help but wonder </span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">why?</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">In practice we know this is not true. The duration on which a person will work on a task is highly dependent on who this person is. So why we should all agree on task estimation? Especially when we still do not know which person will perform the task? It only makes sense that the exact same task will take different amount of time for different people. In most development groups, people have different skills and expertise. The knowledge discrepancy can be at technologies, code, business domain, etc. So even if team members agree on the desired solution it will still take more time to perform by some than others.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">How can we do it better?</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">What if we change the planning poker method just a little? From now on each person will state two numbers. The first is estimation for the working part and the second is estimation for the learning part. The learning part is personal. All team members should only agree on the working part.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Why is it better?</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">It gives us a nice way to measure and monitor learning in our team. We already measure how much time people spend working. What about learning? Using the suggested method, over each sprint we measure the amount of time people spend on learning. We can call it </span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">the Learning Chart.</span><span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> This is exactly like the Burn down Chart only here we measure the number of point’s people spent learning over time. As with Burn down Chart we use the points given at the planning stage.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Here are some examples of learning charts and what they are telling us:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Consider a very horizontal learning chart resulted from most tasks with low learning factor. What does it mean? It means that the team is very efficient and everybody is doing exactly what they are good at. It also means that they are not learning new things and the knowledge is not well spread among team members.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">On the other hand a very steep learning chart might suggest less efficient team and probably low quality work since most of the time people do things they know little about.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">So what is a good learning factor?</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">I actually don’t know the answer for that. I would assume it is at least 2 so on average people spend half of their time learning. This might also correlate to the satisfaction and challenge your team member experience in their daily work.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">What’s next? Try out my new idea and see if it actually makes sense. I will keep you updated…</span></div>
<div>
<span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
11http://www.blogger.com/profile/05224022604837968582noreply@blogger.com2tag:blogger.com,1999:blog-2713252560567167671.post-56609270475272330172013-08-24T23:09:00.000+03:002013-08-27T20:01:11.997+03:00Writing a Java Regular Expression Without Reading the ***** Manual<div>
<br /></div>
<div class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; unicode-bidi: embed;">
<span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Writing and/or maintaining regular expressions is a part of every developer's routine work. Hey, and we usually can't stand it. It's annoying, the syntax is not humanly memorable, and overall it is an experience that one wants to leave behind him as quickly as possible, so he can move on to the <b><u>actual problem</u></b> he is facing. Wonder what will happen if we would Poker Estimate an RE problem. what would be the deviation between the estimation and the real time it took?</span></div>
<span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">You see, when we need to write a new RE we go through the following steps:</span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-list: ignore;"></span> </span><br />
<ol>
<li><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Visit <a href="http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html">Pattern</a> for a quick recap on the syntax.</span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"> </span> </li>
<li><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Describe the RE in English. It goes something like: "start with 4 digits followed by spaces afterwards the string "DUR" then again some spaces and finally one digit"</span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"> </span> </li>
<li><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"></span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Translate the English description to Java syntax: "\d{4}\s+DUR\s</span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; line-height: 115%; mso-ansi-language: en-us; mso-bidi-language: he; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: en-us;">+\d"</span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"> </span> </li>
<li><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"></span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Come up with examples. So here it will be something like: "1234 DUR 9"</span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"> </span> </li>
<li><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"></span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Write a test validating the examples, thinking on edge cases, and making sure the RE is valid.</span></li>
</ol>
<div class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; unicode-bidi: embed;">
<span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">The situation is even worse when one needs to change an existing regular expression. Here we need to translate the RE syntax back to English, apply the changes and translate it back to RE syntax. This is again followed by examples and testing.</span></div>
<div class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; unicode-bidi: embed;">
</div>
<div class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; unicode-bidi: embed;">
<span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">We are not alone facing this problem. Several solutions exist to help ease the process (e.g. <a href="http://txt2re.com/index-csharp.php3">txt2re</a>). The problems with these solutions are:</span></div>
<ul type="disc">
<li class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; margin-left: 36pt; margin-right: 0cm; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-align: justify; unicode-bidi: embed;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">They always require leaving the IDE.</span> </li>
<li class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; margin-left: 36pt; margin-right: 0cm; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-align: justify; unicode-bidi: embed;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">They usually don't help with understanding an existing RE, but rather only help create new ones.</span></li>
</ul>
<div class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; unicode-bidi: embed;">
<span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">So what do we suggest? We present you with the <b><u>Regular Expression Wizard</u></b>, a new approach for writing and maintaining Java Regular Expression. This is a Java based project that aims to help you write RE fluently using the <a href="http://developer4life.blogspot.co.il/2012/01/wizard-design-pattern.html">Wizard Design Pattern</a>.</span></div>
<div class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; unicode-bidi: embed;">
</div>
<div class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; unicode-bidi: embed;">
<span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">How simple can it get? Let's write the RE from our previous example using the new wizard. Just create a wizard object, and than using static methods slowly build your own RE, followed by examples for testing.</span> </div>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;">
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;">
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> 1:</span> RE_Wizard re = <span style="color: blue;">new</span> RE_Wizard();</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum2" style="color: #606060; font-size: 8pt; line-height: 12pt;"> 2:</span><span style="background-color: #f4f4f4; font-size: 8pt; line-height: 12pt;"> String dur = re.start().</span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum3" style="color: #606060; font-size: 8pt; line-height: 12pt;"> 3:</span><span style="font-size: 8pt; line-height: 12pt;"> a_character_described_as(a_digit).exactly(4L).then().</span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum4" style="color: #606060; font-size: 8pt; line-height: 12pt;"> 4:</span><span style="background-color: #f4f4f4; font-size: 8pt; line-height: 12pt;"> a_character_described_as(a_whitespace_character).once_or_more().then().</span></pre>
<!--CRLF--><br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum5" style="color: #606060;"> 5:</span> a_fixed_string(<span style="color: #006080;">"DUR"</span>).then().</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum6" style="color: #606060; font-size: 8pt; line-height: 12pt;"> 6:</span><span style="background-color: #f4f4f4; font-size: 8pt; line-height: 12pt;"> a_character_described_as(a_whitespace_character).then().</span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum7" style="color: #606060; font-size: 8pt; line-height: 12pt;"> 7:</span><span style="font-size: 8pt; line-height: 12pt;"> a_character_described_as(a_digit).</span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum8" style="color: #606060; font-size: 8pt; line-height: 12pt;"> 8:</span><span style="background-color: #f4f4f4; font-size: 8pt; line-height: 12pt;"> for_example(</span><span style="color: #006080; font-size: 8pt; line-height: 12pt;">"1234 DUR 9"</span><span style="background-color: #f4f4f4; font-size: 8pt; line-height: 12pt;">).for_example(</span><span style="color: #006080; font-size: 8pt; line-height: 12pt;">"4423 DUR 1"</span><span style="background-color: #f4f4f4; font-size: 8pt; line-height: 12pt;">).the_end();</span></pre>
<!--CRLF--></div>
</div>
<br />
<div class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; unicode-bidi: embed;">
<span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"></span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Here there is no need for steps A (syntax recap), C (using the syntax) and E (writing a test). Note that if the stated example does not match the regular expression than an </span><span style="color: #e69138; font-family: 'Courier New'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">ExampleDoesNotMatchRegularExpression </span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">exception will be thrown. All you need to do is to describe the RE in English and come up with some examples. The best part comes when later on you need to change it. Again you do not need to deal with weird syntax. You only need to know English.</span><br />
<span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><br /></span></div>
<div class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; unicode-bidi: embed;">
<span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Let us take another example. Mkyong wrote a post on "<a href="http://www.mkyong.com/regular-expressions/10-java-regular-expression-examples-you-should-know/">10 Java Regular Expression Examples You Should Know</a>". We took the one for creating a regular expression for time in a 24-hour format.</span> </div>
<br />
<div class="MsoNormal" dir="ltr" style="background: white; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>1:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"></span><span style="color: green; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>//([01]?[0-9]|2[0-3]):[0-5][0-9]</span></div>
<div class="MsoNormal" dir="ltr" style="background: #f4f4f4; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>2:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>RE_Wizard re = </span><span style="color: blue; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">new</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"> RE_Wizard();</span></div>
<div class="MsoNormal" dir="ltr" style="background: white; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>3:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>String timeRE = re.start().start_group().</span></div>
<div class="MsoNormal" dir="ltr" style="background: #f4f4f4; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>4:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>any_character_in(</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">"01"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">).no_more_then(1L).then().</span></div>
<div class="MsoNormal" dir="ltr" style="background: white; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>5:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>any_character_in_the_range(</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">"0"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">,</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">"9"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">).</span></div>
<div class="MsoNormal" dir="ltr" style="background: #f4f4f4; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>6:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>or().</span></div>
<div class="MsoNormal" dir="ltr" style="background: white; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>7:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>a_fixed_string(</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">"2"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">).then().</span></div>
<div class="MsoNormal" dir="ltr" style="background: #f4f4f4; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>8:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>any_character_in_the_range(</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">"0"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">,</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">"3"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">).then().</span></div>
<div class="MsoNormal" dir="ltr" style="background: white; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>9:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>close_group().</span></div>
<div class="MsoNormal" dir="ltr" style="background: #f4f4f4; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>10:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>then().</span></div>
<div class="MsoNormal" dir="ltr" style="background: white; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>11:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>a_fixed_string(</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">":"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">).then().</span></div>
<div class="MsoNormal" dir="ltr" style="background: #f4f4f4; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>12:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>any_character_in_the_range(</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">"0"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">,</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">"5"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">).then().</span></div>
<div class="MsoNormal" dir="ltr" style="background: white; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>13:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>any_character_in_the_range(</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">"0"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">,</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">"9"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">).then().</span></div>
<div class="MsoNormal" dir="ltr" style="background: #f4f4f4; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>14:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>for_example(</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">"06:58"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">).</span></div>
<div class="MsoNormal" dir="ltr" style="background: white; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>15:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>for_example(</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">"6:45"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">).</span></div>
<div class="MsoNormal" dir="ltr" style="background: #f4f4f4; direction: ltr; line-height: 12pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>16:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>for_example(</span><span style="color: #006080; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">"23:12"</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';">).</span></div>
<div class="MsoNormal" dir="ltr" style="background: white; direction: ltr; line-height: 12pt; margin-bottom: 4.7pt; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; unicode-bidi: embed;">
<span style="color: #606060; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>17:</span><span style="color: black; font-family: 'Courier New'; font-size: 8pt; mso-fareast-font-family: 'Times New Roman';"><span style="mso-spacerun: yes;"> </span>the_end();</span></div>
<div class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; unicode-bidi: embed;">
</div>
<br />
<div class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; unicode-bidi: embed;">
<span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">So where can you get a hold of this? The wizard code can be found on <a href="https://github.com/azarian/wizards" title="https://github.com/azarian/wizards.git">https://github.com/azarian/wizards</a>.Use it, share it, feedback us, and forget about losing time writing RE's.</span> </div>
<br />
<div class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 3; text-align: justify; unicode-bidi: embed;">
<b><span style="font-family: 'Times New Roman','serif'; font-size: 13.5pt; mso-fareast-font-family: 'Times New Roman';">Disclaimers</span></b></div>
<ul type="disc">
<li class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; margin-left: 36pt; margin-right: 0cm; mso-list: l1 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-align: justify; unicode-bidi: embed;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">We did not implement all java regular expression syntax mostly due to time limitation. If anyone wishes to contribute he will be highly appreciated.</span></li>
<li class="MsoNormal" dir="ltr" style="direction: ltr; line-height: normal; margin-left: 36pt; margin-right: 0cm; mso-list: l1 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-align: justify; unicode-bidi: embed;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">We do not include instructions on how to use the builder. We hope it is straight forward. If it is not than we are missing the point, so please inform us.</span></li>
</ul>
11http://www.blogger.com/profile/05224022604837968582noreply@blogger.com1tag:blogger.com,1999:blog-2713252560567167671.post-41587591049191246772013-05-25T19:41:00.000+03:002013-05-25T19:41:08.620+03:00The Dev-QA Delicate Relationship <div style="text-align: justify;">
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>HE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:DontVertAlignCellWithSp/>
<w:DontBreakConstrainedForcedTables/>
<w:DontVertAlignInTxbx/>
<w:Word11KerningPairs/>
<w:CachedColBalance/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]-->
</div>
<div dir="LTR" style="text-align: justify;">
Success to your product is directly
influenced by the ability of your QA and Dev teams to work well together. This
is even more tightly coupled in the agile world when QA and Dev work and
deliver under the same team. Symbiosis between QA and Dev will accelerate delivery
time, create a more robust product, and overall will increase team member
satisfaction. </div>
<div dir="LTR" style="text-align: justify;">
<br /></div>
<div dir="LTR" style="text-align: justify;">
Saying the above is obvious. However,
failing to understand the relationship between QA and Dev will take your
product/team in the opposite direction. There is a delicate relationship
between the two and a certain tension that must be confronted and not
overlooked. Most of you probably felt it in your work place. You hear a QA's
question thrown to the air, followed by a smug reply that is basically telling
him that he will never understand since he didn't write the code. Or the other
way around, when a developer asks a question about the product and the QA looks
at him in a look that says "you really need to get out of your little
world. There is a whole cosmos waiting for you..." </div>
<div dir="LTR" style="text-align: justify;">
<br /></div>
<div dir="LTR" style="text-align: justify;">
There are several symptoms/causes that
can help you identify the level of tension in your workplace:</div>
<div dir="LTR" style="text-align: justify;">
<br /></div>
<h4 dir="LTR" style="text-align: justify;">
Domain knowledge is mostly in the QA
hands</h4>
<div style="text-align: justify;">
In this situation the developer works in
a vacuum. He understands enough to accomplish his tasks, but not enough so that
his code will be reusable. He can not foresee new advances in the field of
interest. He is like an ox plowing in long corridor blind folded.
</div>
<div dir="LTR" style="text-align: justify;">
<br /></div>
<h4 dir="LTR" style="text-align: justify;">
Lack of respect</h4>
<div dir="LTR" style="text-align: justify;">
You all know it is there and from both sides.
"This feature was written with so many bugs, my grandma would have written
it better", or maybe "How dare he open this bug? It just shows me how
little he understands..." Each side is building his own trench while
accusing the other side in every single problem earth has encountered.</div>
<div dir="LTR" style="text-align: justify;">
<br /></div>
<h4 dir="LTR" style="text-align: justify;">
Over Testing</h4>
<div dir="LTR" style="text-align: justify;">
There seems to be a tendency to retest the entire product after each change
(which should be prevented by proper sanity automated tests, and not by manual
checks). Checks are too strict. This leads to slowness in the product
improvement and frustration for developers.</div>
<div dir="LTR" style="text-align: justify;">
<br /></div>
<h4 dir="LTR" style="text-align: justify;">
Under Testing</h4>
<div dir="LTR" style="text-align: justify;">
Features are written under pressure, and
as such are tested under pressure. Not all extremity cases are simulated. This
may cause frustration in QA side, since they are the one that signed off the
feature.<br />
<br />
<h4>
Who's the Boss? </h4>
<div style="direction: ltr; margin-bottom: 0.0001pt;">
<span style="font-family: Arial,sans-serif; font-size: 12pt;">Developers sometimes see QA as their personal assistants.
They might ask the QA to complete tasks that are not directly related to QA but mostly to
save "expensive" developer's time.</span><span style="font-family: Arial,sans-serif; font-size: 12pt;"> </span></div>
<div style="direction: ltr; margin-bottom: 0.0001pt;">
<br /></div>
<h4 style="direction: ltr; margin-bottom: 0.0001pt;">
<span style="font-family: Arial,sans-serif; font-size: 12pt;">Who is to blame? </span></h4>
<div style="direction: ltr; margin-bottom: 0.0001pt;">
<span style="font-family: Arial,sans-serif; font-size: 12pt;">In places where the QA is hold responsible for
product quality every bug which was shipped with the product has the potential
to flame a new fire. Who is to blame?</span></div>
<div style="direction: ltr; margin-bottom: 0.0001pt;">
<br /></div>
<h2 style="direction: ltr; margin-bottom: 0.0001pt;">
<b><span style="font-family: Arial,sans-serif; font-size: 12pt;">What can we do as managers to help reduce this
tension?</span></b><span style="font-family: Arial,sans-serif; font-size: 12pt;"></span>
</h2>
<ul>
<li><span style="font-family: Arial,sans-serif; font-size: 12pt;">Cross Functional teams. Putting them in
the same team and make the entire team responsible for the product.</span><span style="font-family: Arial,sans-serif; font-size: 12pt;"> As we said before this is already happening in the agile era.</span></li>
<li><span style="font-family: Arial,sans-serif; font-size: 12pt;">Let them do each other's job. Let the QA do
some Dev in the form of writing scripts or anything that will make them
understand bugs are inevitable. Let developers do
some QA so they will understand the horror of saying: "I tested it and it
is ready for shipment"</span></li>
<li><span style="font-family: Arial,sans-serif; font-size: 12pt;">The layer of team managers should originate from Dev and QA both, thus giving the management a broader perspective.</span></li>
<li><div class="default_trans" style="display: block;">
Management must have excellent interpersonal relations and be aware of the tension, confronting it when necessary.</div>
</li>
</ul>
<div style="direction: ltr; margin-bottom: 0.0001pt;">
<span style="font-family: Arial,sans-serif; font-size: 12pt;"><br /></span></div>
</div>
Roi Gamliel רועי גמליאלhttp://www.blogger.com/profile/07882658912051279530noreply@blogger.com0tag:blogger.com,1999:blog-2713252560567167671.post-14068365774584949092013-05-12T21:21:00.000+03:002013-05-12T21:21:51.444+03:00Gambling in Software<div style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
I want to tell you about a meeting we had a few days ago. It reminded me of “The Jack Story”
(which was part of an old stage routine of Danny Thomas many years ago).</div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
Here’s how it goes:</div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background-color: #eeeeee; color: blue; font-family: Courier New, Courier, monospace;">Traveling salesman gets stuck one night on a lonely country
road with a flat tire and no jack. He starts walking toward a gas station about
a mile away, and as he walks, he talks to himself. "How much can he charge
me for a jack?" he wonders. "Fifty dollar, sounds reasonable. But
it's the middle of the night, so maybe there's an after-hours fee. Probably
another five dollars. Wait.... He'll probably figure I got no place else to go
for the jack. Fifty dollars more."</span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background-color: #eeeeee; color: blue; font-family: Courier New, Courier, monospace;">He goes on walking and thinking, and the price and the anger
keep rising. Finally, he gets to the gas station and is greeted cheerfully by
the owner: "What can I do for you, sir?" But the salesman will have
none of it. "You got the nerve to talk to me, you robber," he says. "You
can take your stinkin' jack and shove it..."</span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background-color: #eeeeee; color: blue; font-family: Courier New, Courier, monospace;"><br /></span></div>
<div class="MsoNormal" style="text-align: justify;">
The meeting was about a new feature requested by one of our
customers. The feature was quite clear and we started talking about how we should
implement it. At some point one of the participants claimed that if they need
this feature they will surely need another related feature. A third guy immediately followed
with: "if this is the case then we should also implement this feature…". This
routine continued a few rounds until everybody were convinced that this feature was too
big and should be rejected.</div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
It seems that more often than one might think we follow 'The Jack Story" while building software. Fortunately, our story ends well. When we got back to the costumer and
explained to him why we must reject the feature he stated that none of our
guessing were true and he really only needs the original request. This time we
got lucky. No extra work was done and we did not lose any costumers.</div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
<b>But it got me
thinking. Did we do something wrong? </b></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
Now the typical agile practitioner would argue that we
simply should not have added new requests on the original user story. Well...obviously my colleagues and I know this argument. We
also know that the costumer often does not fully understand what he really
needs. Moreover (perhaps not in this case) any company sometimes needs to be a
head of the market instead of following it.</div>
<div class="MsoNormal" style="text-align: justify;">
Actually, <b>many times as software engineers we do more then
we are explicitly requested</b> (over doing). We enhance existing features. We build
our code more generic and powerful than we currently need. We basically gamble
on future needs, and I deliberately use the verb 'gamble' and not the verb 'guess'
because there is a definite rewords for good bets. Naturally, 'Over Doing' also relates to a person character.
Some will choose the 'Over Doing' approach more often than others. But everyone does it at some level.</div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
Usually where ever there is a gamble there are measures
and statistics. This must be done in order to track our gamble and measure the profit. This is
also the case, for example, in software estimation which in essence also involves gambling.
We continuously review our past estimation in order to improve our future ones. <b>But this is not the case with 'Over Doing'.</b> <b>We never mark
which of our work is mandatory for now and which is a gamble on a future need.</b> As a direct result, <u><b>we never come back to check if we were right.</b></u></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
So I answered myself: <u><b>No, we did not do anything wrong.</b></u> We should continue to gamble on future needs. But we also must find a way to document and review our gambling. It will enable us to estimate the profit of our gamble and help us improve future ones, avoid over engineering where it is not needed, and insist on generic code where we see future opportunities. </div>
<h3 style="text-align: justify;">
</h3>
<h3 style="text-align: justify;">
Prolog</h3>
<div class="MsoNormal" style="text-align: justify;">
<br />
A key tool for a manager is matrices. We already know that traditional
matrices in software engineering often provide little help for a project success. You can read about another matrices we suggested in <a href="http://developer4life.blogspot.co.il/2012/01/effective-unit-testing-not-all-code-is.html">Effective Unit Testing - Not All Code is Created Equal</a>. In the agile era we are in a quest for finding new matrices.
New things to measure which might help us navigate our project to safe shore. This post tries to suggest such alternative metric which
might be useful.</div>
<div class="MsoNormal" style="text-align: justify;">
<br />
<br />
<a href="http://developer4life.blogspot.co.il/2012/01/effective-unit-testing-not-all-code-is.html"></a>
</div>
11http://www.blogger.com/profile/05224022604837968582noreply@blogger.com0tag:blogger.com,1999:blog-2713252560567167671.post-37949278282802754342013-03-13T17:03:00.000+02:002013-03-13T17:03:42.275+02:00The Inner Software Model and the End User<br />
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;">When I build software I always do it aligned with a model. The model
evolves with the software and in many
cases defines the boundaries of what can and can't be done (that is without modifying
or breaking it). A good model is one which is simple to understand yet powerful
enough to allow the introduction of new features. <o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;"><br /></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;">A good model makes me happy. If it was developed by me then it will be
the first thing I will show when presenting my work. If it is others it will be
the first things that will make me appreciate their work. Actually I think so
high on the importance of a good model that I have made the mistake of asking my
users to learn it too.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;"><br /></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;">Users obviously view the world through their eyes. In places you might
recognize several use cases as the same one, your users might see them as
completely different cases.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;">It seems I am not the only one taking this approach. Remember the first
days of Android OS. One of the first things they were proud of was: "Everything
is an application". Indeed as a Software Engineer the fact that every functionality
on top of the operating system is modeled as an application is simple yet powerful.
But as a user I always moved uncomfortably in my chair when pressing on the
applications button and find the Phone application there. You see, as a user I
have a phone device with phone related functions and I have the applications
which is an extension to the phone. Finding the phone icon and contacts icon in
the applications section confused me. Especially in the early days of Android
where the phone application shortcuts was permanent. IPhone OS took a different
approach where some of the device functionality was presented to the user as OS
features (e.g. Siri,).<o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;"><br /></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;">Another example is the JavaScript language and Object Oriented Paradigm.
In this example the user is the JavaScript developer trying to use it as an
Object Oriented language. Again you have a powerful simple model (everything is
a function) which enables you to implement any Object Oriented principle. However,
each concept requires a special usage of the model (Hint: want to define a
class? use a function).<o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;">On the other hand Java takes a different approach. One example that comes
to mind are the Enums introduced in Java 5. Although one can easily implement
an Enum (see http://www.javacamp.org/designPattern/enum.html) they still
decided to include it in the language.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;"><br /></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;">What is the correct approach? Taking the first approach, in which the
model is generic and it is also introduced to the user, is cheaper and easier
to develop. Yet it will produce a less friendly software. So I believe the key
consideration here is: Who is your user and will he be able to learn and adapt?<o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;"><br /></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;">Recently I have started to adopt a hybrid approach. I expose both the
general powerful model to the advanced user and a simple domain oriented
interface for the average user.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;"><br /></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="background: white; color: #222222; font-family: "Arial","sans-serif"; font-size: 12.0pt; line-height: 115%;">To sum things up I highly recommend (especially for developers) to pay
attention to the difference in the point of view of users vs. the model. Moreover,
to decide on the correct approach consider both the user nature and your resources.<o:p></o:p></span></div>
11http://www.blogger.com/profile/05224022604837968582noreply@blogger.com0tag:blogger.com,1999:blog-2713252560567167671.post-48410340033402986252013-02-11T17:30:00.001+02:002013-02-11T17:30:26.739+02:00Solr and Lucene Fuzzy Search - A closer look<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>HE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:DontVertAlignCellWithSp/>
<w:DontBreakConstrainedForcedTables/>
<w:DontVertAlignInTxbx/>
<w:Word11KerningPairs/>
<w:CachedColBalance/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]-->
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<b><u><span style="font-family: "Times New Roman","serif"; font-size: 24.0pt; mso-fareast-font-family: "Times New Roman";">What
is Fuzzy Search?</span></u></b><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"></span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">In
a sentence, Fuzzy Search allows one to submit a query against an index, and get
results that are close to the desired query, but not necessarily match the query
exactly. Lucene (and as such Solr) offers a very effective way (from 4.0) for
quickly evaluating such fuzzy queries.</span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<b><u><span style="font-family: "Times New Roman","serif"; font-size: 24.0pt; mso-fareast-font-family: "Times New Roman";">Lucene
Fuzzy Search</span></u></b><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"></span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">From
the <a href="http://lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.html#Fuzzy%20Searches" target="_blank"><span style="color: blue;">Apache Lucene Documentation:</span></a></span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<i><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">Lucene
(and as such Solr) supports fuzzy searches based on the Levenshtein Distance,
or Edit Distance algorithm. To do a fuzzy search use the tilde, "~",
symbol at the end of a Single word Term. For example to search for a term
similar in spelling to "roam" use the fuzzy search: </span></i><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-margin-top-alt: auto; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify;">
<i><span style="font-family: "Courier New"; font-size: 10.0pt; mso-fareast-font-family: "Times New Roman";">roam~
</span></i><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"></span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<i><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">This
search will find terms like foam and roams.</span></i><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"></span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<i><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">Starting
with Lucene 1.9 an additional (optional) parameter can specify the required
similarity. The value is between 0 and 1, with a value closer to 1 only terms
with a higher similarity will be matched. For example:</span></i><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-margin-top-alt: auto; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify;">
<i><span style="font-family: "Courier New"; font-size: 10.0pt; mso-fareast-font-family: "Times New Roman";">roam~0.8</span></i><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"></span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<i><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">The
default that is used if the parameter is not given is 0.5.</span></i><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"></span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<b><u><span style="font-family: "Times New Roman","serif"; font-size: 24.0pt; mso-fareast-font-family: "Times New Roman";">Under
the Hood</span></u></b><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"></span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">The
Levenshtein distance between two words is the minimal number of insertions,
deletions or substitutions that are needed to transform one word into the
other. Than given an unknown query, how does Lucene finds all the terms in the
index that are at distance <= than the specified required similarity?
Well... this depends on the Solr/Lucene version you are using.</span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<br /></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">You
can take a look at the warning that appears at Lucene 3.2.0 <a href="http://lucene.apache.org/core/old_versioned_docs/versions/3_2_0/api/all/org/apache/lucene/search/FuzzyQuery.html" target="_blank"><span style="color: blue;">Javadoc</span></a>: </span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<i><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">Warning:
this query is not very scalable with its default prefix length of 0 - in this
case, *every* term will be enumerated and cause an edit score calculation. </span></i><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"> </span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">Moreover,
prior to 4.0 release Lucene implementation to compute this distance was done
for each query for EACH term in the index. You really don't want to use this.
So my advice to you is to upgrade - the faster the better.</span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<br /></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">The
Lucene 4.0 Fuzzy took a very different approach. The search now works with <a href="http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/FuzzyQuery.html" target="_blank"><span style="color: blue;">FuzzyQuery</span></a>. The underlying
implementation has changed in 4.0 drastically, which lead to significant
complexity improvements. Current implementation uses the <a href="http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/util/automaton/LevenshteinAutomata.html" target="_blank"><span style="color: blue;">Levenshtein Automata</span></a>. This
automaton is based on the work of <a href="http://link.springer.com/search?facet-author=%22Klaus+U.+Schulz%22"><span style="color: blue;">Klaus U. Schulz</span></a> and <a href="http://link.springer.com/search?facet-author=%22Stoyan+Mihov%22"><span style="color: blue;">Stoyan Mihov</span></a> <a href="http://link.springer.com/article/10.1007%2Fs10032-002-0082-8?LI=true" target="_blank"><span style="color: blue;">"Fast string correction with
Levenshtein automata"</span></a>. To make a very long story short this
paper shows how to recognize the set of all words <i>V</i> in an index where
the Levenshtein distance between <i>V</i> and the<i> </i>query does not exceed
a distance d, which is exactly what one wants with Fuzzy Search.</span><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"> For
a deeper look see <a href="http://issues.apache.org/jira/browse/LUCENE-1606" target="_blank"><span style="color: blue;">here </span></a>and <a href="http://issues.apache.org/jira/browse/LUCENE-2089" target="_blank"><span style="color: blue;">here</span></a>.</span> </span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in;">
<b><u><span style="font-family: "Times New Roman","serif"; font-size: 24.0pt; mso-fareast-font-family: "Times New Roman";">Conclusion</span></u></b><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"> </span></div>
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">So
from 4.0 and above one can use Fuzzy Search on very large indexes and fill
comfortable about it. Of course there are other ways we look for similar values
in a query such as:</span></div>
<ul type="disc">
<li class="MsoNormal" style="line-height: normal; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">Solr <a href="http://wiki.apache.org/solr/SpellCheckComponent" target="_blank"><span style="color: blue;">SpellCheckComponent</span></a></span></li>
<li class="MsoNormal" style="line-height: normal; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">Solr <a href="http://wiki.apache.org/solr/Suggester" target="_blank"><span style="color: blue;">Suggester </span></a></span></li>
<li class="MsoNormal" style="line-height: normal; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";">Use phonetic search by elevating <a href="http://lucene.apache.org/solr/api-3_6_1/org/apache/solr/analysis/DoubleMetaphoneFilterFactory.html" target="_blank"><span style="color: blue;">DoubleMetaphoneFilterFactory</span></a>. </span></li>
</ul>
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman";"><br /></span>Roi Gamliel רועי גמליאלhttp://www.blogger.com/profile/07882658912051279530noreply@blogger.com1tag:blogger.com,1999:blog-2713252560567167671.post-17804681858547147612013-01-01T17:27:00.000+02:002013-05-25T17:15:54.056+03:00Executing a Command Line Executable From JavaIn this post we'll deal with a common need for Java developers. Execute and manage an external process from within Java. Since this task is quite common we set out to find a Java library to help us accomplish it. <br />
The requirements from such a library are: <br />
<ol>
<li>Execute the process asynchronously. </li>
<li>Ability to abort the process execution. </li>
<li>Ability to wait for process completion. </li>
<li>On process output notifications. </li>
<li>Ability to kill the process in case it hung. </li>
<li>Get the process exit code.</li>
</ol>
The native JDK does not help much. Fortunately, we have <a href="http://commons.apache.org/exec/">Apache Commons Exe</a>. Indeed it is much easier but still not as straightforward as we hoped. We wrote a small wrapper on top of it. <br />
Here is the method signature we expose:<br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;">
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;">
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><pre style="line-height: normal;"><span style="color: maroon; font-weight: bold;">public</span> <span style="color: maroon; font-weight: bold;">static</span> Future<Long> runProcess(<span style="color: maroon; font-weight: bold;">final</span> CommandLine commandline, <span style="color: maroon; font-weight: bold;">final</span> ProcessExecutorHandler handler, <span style="color: maroon; font-weight: bold;">final</span> long watchdogTimeout) <span style="color: maroon; font-weight: bold;">throws</span> IOException<span style="color: #808030;">;</span></pre>
</pre>
</div>
</div>
<ol>
<li>It returns a Future<Long>. This covers section 1,2,3,6. </li>
<li>Instance of ProcessExecutorHandler is passed to the function. This instance is actually a listener for any process output. This covers section 4 in our requirement.</li>
<li>Last but not least you supply a timeout. If the process execution takes more than said timeout you assume the process hung and you will end it. In that case the error code returned by the process will be -999. </li>
</ol>
That's it! Here is the method implantation. Enjoy.<br />
<br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;">
<br />
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;">
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span style="color: maroon; font-size: 8pt; font-weight: bold; line-height: normal;">import</span><span style="color: #004a43; font-size: 8pt; line-height: normal;"> org</span><span style="color: #808030; font-size: 8pt; line-height: normal;">.</span><span style="color: #004a43; font-size: 8pt; line-height: normal;">apache</span><span style="color: #808030; font-size: 8pt; line-height: normal;">.</span><span style="color: #004a43; font-size: 8pt; line-height: normal;">commons</span><span style="color: #808030; font-size: 8pt; line-height: normal;">.</span><span style="color: #004a43; font-size: 8pt; line-height: normal;">exec</span><span style="color: #808030; font-size: 8pt; line-height: normal;">.</span><span style="color: maroon; font-size: 8pt; font-weight: bold; line-height: normal;">*</span><span style="color: purple; font-size: 8pt; line-height: normal;">;</span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span style="color: maroon; font-size: 8pt; font-weight: bold; line-height: normal;">import</span><span style="color: #004a43; font-size: 8pt; line-height: normal;"> org</span><span style="color: #808030; font-size: 8pt; line-height: normal;">.</span><span style="color: #004a43; font-size: 8pt; line-height: normal;">apache</span><span style="color: #808030; font-size: 8pt; line-height: normal;">.</span><span style="color: #004a43; font-size: 8pt; line-height: normal;">commons</span><span style="color: #808030; font-size: 8pt; line-height: normal;">.</span><span style="color: #004a43; font-size: 8pt; line-height: normal;">exec</span><span style="color: #808030; font-size: 8pt; line-height: normal;">.</span><span style="color: #004a43; font-size: 8pt; line-height: normal;">Executor</span><span style="color: purple; font-size: 8pt; line-height: normal;">;</span></pre>
<pre style="background-color: white; line-height: normal;"><span style="color: maroon; font-weight: bold;">import</span><span style="color: #004a43;"> java</span><span style="color: #808030;">.</span><span style="color: #004a43;">io</span><span style="color: #808030;">.</span><span style="color: #004a43;">IOException</span><span style="color: purple;">;</span></pre>
<pre style="background-color: white; line-height: normal;"><span style="color: maroon; font-weight: bold;">import</span><span style="color: #004a43;"> java</span><span style="color: #808030;">.</span><span style="color: #004a43;">util</span><span style="color: #808030;">.</span><span style="color: #004a43;">concurrent</span><span style="color: #808030;">.</span><span style="color: maroon; font-weight: bold;">*</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">public</span> <span style="color: maroon; font-weight: bold;">class</span> ProcessExecutor <span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">public</span> <span style="color: maroon; font-weight: bold;">static</span> <span style="color: maroon; font-weight: bold;">final</span> <span style="color: #bb7977; font-weight: bold;">Long</span> WATCHDOG_EXIST_VALUE <span style="color: #808030;">=</span> <span style="color: #808030;">-</span><span style="color: #008c00;">999</span><span style="color: #006600;">L</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">public</span> <span style="color: maroon; font-weight: bold;">static</span> Future<span style="color: #808030;"><</span><span style="color: #bb7977; font-weight: bold;">Long</span><span style="color: #808030;">></span> runProcess<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">final</span> CommandLine commandline<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">final</span> ProcessExecutorHandler handler<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">final</span> <span style="color: #bb7977;">long</span> watchdogTimeout<span style="color: #808030;">)</span> <span style="color: maroon; font-weight: bold;">throws</span> <span style="color: #bb7977; font-weight: bold;">IOException</span><span style="color: purple;">{</span>
ExecutorService executor <span style="color: #808030;">=</span> Executors<span style="color: #808030;">.</span>newSingleThreadExecutor<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="font-family: 'Courier New', courier, monospace; font-size: 8pt;">Future</span><span style="color: #808030; font-family: 'Courier New', courier, monospace; font-size: 8pt;"><</span><span style="color: #bb7977; font-family: 'Courier New', courier, monospace; font-size: 8pt; font-weight: bold;">Long</span><span style="color: #808030; font-family: 'Courier New', courier, monospace; font-size: 8pt;">> result = </span><span style="font-family: 'Courier New', courier, monospace; font-size: 8pt;">executor</span><span style="color: #808030; font-family: 'Courier New', courier, monospace; font-size: 8pt;">.</span><span style="font-family: 'Courier New', courier, monospace; font-size: 8pt;">submit</span><span style="color: #808030; font-family: 'Courier New', courier, monospace; font-size: 8pt;">(</span><span style="color: maroon; font-family: 'Courier New', courier, monospace; font-size: 8pt; font-weight: bold;">new</span><span style="font-family: 'Courier New', courier, monospace; font-size: 8pt;"> ProcessCallable</span><span style="color: #808030; font-family: 'Courier New', courier, monospace; font-size: 8pt;">(</span><span style="font-family: 'Courier New', courier, monospace; font-size: 8pt;">watchdogTimeout</span><span style="color: #808030; font-family: 'Courier New', courier, monospace; font-size: 8pt;">,</span><span style="font-family: 'Courier New', courier, monospace; font-size: 8pt;"> handler</span><span style="color: #808030; font-family: 'Courier New', courier, monospace; font-size: 8pt;">,</span><span style="font-family: 'Courier New', courier, monospace; font-size: 8pt;"> commandline</span><span style="color: #808030; font-family: 'Courier New', courier, monospace; font-size: 8pt;">)</span><span style="color: #808030; font-family: 'Courier New', courier, monospace; font-size: 8pt;">)</span><span style="color: purple; font-family: 'Courier New', courier, monospace; font-size: 8pt;">;</span></pre>
<pre style="background-color: white; line-height: normal;"><span style="color: purple; font-family: 'Courier New', courier, monospace; font-size: 8pt;"> </span><span style="font-family: 'Courier New', courier, monospace; font-size: 8pt;">executor.shutdown();</span></pre>
<pre style="background-color: white; line-height: normal;"><span style="color: maroon; font-weight: bold;"> return</span> <span style="color: #808030; font-family: 'Courier New', courier, monospace; font-size: 8pt;">result;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">private</span> <span style="color: maroon; font-weight: bold;">static</span> <span style="color: maroon; font-weight: bold;">class</span> ProcessCallable <span style="color: maroon; font-weight: bold;">implements</span> Callable<span style="color: #808030;"><</span><span style="color: #bb7977; font-weight: bold;">Long</span><span style="color: #808030;">></span><span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">private</span> <span style="color: #bb7977;">long</span> watchdogTimeout<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">private</span> ProcessExecutorHandler handler<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">private</span> CommandLine commandline<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">private</span> ProcessCallable<span style="color: #808030;">(</span><span style="color: #bb7977;">long</span> watchdogTimeout<span style="color: #808030;">,</span> ProcessExecutorHandler handler<span style="color: #808030;">,</span> CommandLine commandline<span style="color: #808030;">)</span> <span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">this</span><span style="color: #808030;">.</span>watchdogTimeout <span style="color: #808030;">=</span> watchdogTimeout<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">this</span><span style="color: #808030;">.</span>handler <span style="color: #808030;">=</span> handler<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">this</span><span style="color: #808030;">.</span>commandline <span style="color: #808030;">=</span> commandline<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: #808030;">@</span>Override
<span style="color: maroon; font-weight: bold;">public</span> <span style="color: #bb7977; font-weight: bold;">Long</span> call<span style="color: #808030;">(</span><span style="color: #808030;">)</span> <span style="color: maroon; font-weight: bold;">throws</span> <span style="color: #bb7977; font-weight: bold;">Exception</span> <span style="color: purple;">{</span>
Executor executor <span style="color: #808030;">=</span> <span style="color: maroon; font-weight: bold;">new</span> DefaultExecutor<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
executor<span style="color: #808030;">.</span>setProcessDestroyer<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">new</span> ShutdownHookProcessDestroyer<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
ExecuteWatchdog watchDog <span style="color: #808030;">=</span> <span style="color: maroon; font-weight: bold;">new</span> ExecuteWatchdog<span style="color: #808030;">(</span>watchdogTimeout<span style="color: #808030;">)</span><span style="color: purple;">;</span>
executor<span style="color: #808030;">.</span>setWatchdog<span style="color: #808030;">(</span>watchDog<span style="color: #808030;">)</span><span style="color: purple;">;</span>
executor<span style="color: #808030;">.</span>setStreamHandler<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">new</span> PumpStreamHandler<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">new</span> MyLogOutputStream<span style="color: #808030;">(</span>handler<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">true</span><span style="color: #808030;">)</span><span style="color: #808030;">,</span><span style="color: maroon; font-weight: bold;">new</span> MyLogOutputStream<span style="color: #808030;">(</span>handler<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">false</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #bb7977; font-weight: bold;">Long</span> exitValue<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">try</span> <span style="color: purple;">{</span>
exitValue <span style="color: #808030;">=</span> <span style="color: maroon; font-weight: bold;">new</span> <span style="color: #bb7977; font-weight: bold;">Long</span><span style="color: #808030;">(</span>executor<span style="color: #808030;">.</span>execute<span style="color: #808030;">(</span>commandline<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span> <span style="color: maroon; font-weight: bold;">catch</span> <span style="color: #808030;">(</span>ExecuteException e<span style="color: #808030;">)</span> <span style="color: purple;">{</span>
exitValue <span style="color: #808030;">=</span> <span style="color: maroon; font-weight: bold;">new</span> <span style="color: #bb7977; font-weight: bold;">Long</span><span style="color: #808030;">(</span>e<span style="color: #808030;">.</span>getExitValue<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>watchDog<span style="color: #808030;">.</span>killedProcess<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
exitValue <span style="color: #808030;">=</span>WATCHDOG_EXIST_VALUE<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">return</span> exitValue<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">private</span> <span style="color: maroon; font-weight: bold;">static</span> <span style="color: maroon; font-weight: bold;">class</span> MyLogOutputStream <span style="color: maroon; font-weight: bold;">extends</span> LogOutputStream<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">private</span> ProcessExecutorHandler handler<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">private</span> <span style="color: #bb7977;">boolean</span> forewordToStandardOutput<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">private</span> MyLogOutputStream<span style="color: #808030;">(</span>ProcessExecutorHandler handler<span style="color: #808030;">,</span> <span style="color: #bb7977;">boolean</span> forewordToStandardOutput<span style="color: #808030;">)</span> <span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">this</span><span style="color: #808030;">.</span>handler <span style="color: #808030;">=</span> handler<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">this</span><span style="color: #808030;">.</span>forewordToStandardOutput <span style="color: #808030;">=</span> forewordToStandardOutput<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: #808030;">@</span>Override
<span style="color: maroon; font-weight: bold;">protected</span> <span style="color: #bb7977;">void</span> processLine<span style="color: #808030;">(</span><span style="color: #bb7977; font-weight: bold;">String</span> line<span style="color: #808030;">,</span> <span style="color: #bb7977;">int</span> level<span style="color: #808030;">)</span> <span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>forewordToStandardOutput<span style="color: #808030;">)</span><span style="color: purple;">{</span>
handler<span style="color: #808030;">.</span>onStandardOutput<span style="color: #808030;">(</span>line<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
handler<span style="color: #808030;">.</span>onStandardError<span style="color: #808030;">(</span>line<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: dimgrey;">// interface.</span>
<span style="color: maroon; font-weight: bold;">public</span> <span style="color: maroon; font-weight: bold;">interface</span> ProcessExecutorHandler <span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">public</span> <span style="color: #bb7977;">void</span> onStandardOutput<span style="color: #808030;">(</span><span style="color: #bb7977; font-weight: bold;">String</span> msg<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">public</span> <span style="color: #bb7977;">void</span> onStandardError<span style="color: #808030;">(</span><span style="color: #bb7977; font-weight: bold;">String</span> msg<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
</div>
</div>
<br />11http://www.blogger.com/profile/05224022604837968582noreply@blogger.com2tag:blogger.com,1999:blog-2713252560567167671.post-89016943535676308122012-10-23T10:41:00.003+02:002012-10-23T14:56:49.696+02:00Developer's wife - Or how do they stand us?<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>HE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:DontVertAlignCellWithSp/>
<w:DontBreakConstrainedForcedTables/>
<w:DontVertAlignInTxbx/>
<w:Word11KerningPairs/>
<w:CachedColBalance/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]-->
<br />
<div dir="LTR" style="text-align: justify;">
<span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">First of all we would like to begin with 2
apologies. The first one is sent to all women developers out there. The points are
valid to your husband as well. The second apology is to all women out there. We
are really not sociological experts or pretend to be. </span><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">This
post is written from the experience and view point of 2 male programmers. </span></div>
<div dir="LTR" style="text-align: justify;">
<br /></div>
<div dir="LTR" style="text-align: justify;">
<span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">So how does your work as a software developer affects
your relationship? Developing requires a different set of skills from other
professions and makes you adopt some unusual behaviors. This influences your relationship in strange ways.</span></div>
<div dir="LTR" style="text-align: justify;">
<br /></div>
<div dir="LTR" style="text-align: justify;">
<b><u><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Working together on the family PC - Or how do I
always get into trouble?</span></u></b><u><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"> </span></u><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"></span></div>
<div dir="LTR" style="text-align: justify;">
<span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Working together on the family PC...Well, you
and your wife operate the PC a bit differently. I don't see my wife opening the
command line to copy files. Surprisingly, I didn't receive any positive
feedback when I brought up my fabulous idea to install a double boot on our
family PC so <b>WE </b>can enjoy the new UNIX based media center. Things can
get hairy, especially when we need to accomplish a very routine assignment. I
remember the nightmare called "Picking up Photos from the Wedding".
Filtering best wedding photos (300 out of 2000, WOW that photographer really
overdid it), while my wife only used the mouse really killed me there. </span></div>
<div dir="LTR" style="text-align: justify;">
<br /></div>
<div dir="LTR" style="text-align: justify;">
<b><u><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">"How was your day honey?" - Or
"You never tell me about what you <i>actually </i>do"</span></u></b><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"></span></div>
<div dir="LTR" style="text-align: justify;">
<span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Communication. That's the key word in
relationship, isn't it? Well, you come back home and your wife ask, "How
was your day?" A laconic answer will get you into trouble. On the
other hand, I don't think she will be interested in the new search engine you
recently integrated. So what's left to talk about? Office gossip. You really
can't have enough of that.</span></div>
<div dir="LTR" style="text-align: justify;">
<br /></div>
<div dir="LTR" style="text-align: justify;">
<b><u><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Delving into the PC after work hours - Or why
did I start with this media center? </span></u></b><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"></span></div>
<div dir="LTR" style="text-align: justify;">
<span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Developers are technical fellows per-se. As
such, they read tech blogs, install open source code on their family PC, adopt
sophisticated media centers, and try to stretch out the limit of technology
when possible. The problems with such assignments is that it takes a long time,
you try them at home and not at work, and you are drawn into them with no
warnings. You don't know what you are getting yourself into. You read a blog
post telling you there is a new streamer for your PS3. You say - I'll give it a
try. You find yourself configuring your router while you have guests sitting in
your living room with your wife. How many times your wife suddenly woke you up
with "Did you hear what I was saying? Can you stop with the computer? I am
talking to you and you are stuck to the screen". Developers are capable of
sitting 10-12 hours a day in front of a computer. A simple "Let me just
check the latest headlines at WIRED", could lead to 3 hours of PC time at
home, trying to hack to the neighbor's Wi-Fi with the new Mozilla plug-in, just
for the fun of it.</span></div>
<div dir="LTR" style="text-align: justify;">
<br /></div>
<div dir="LTR" style="text-align: justify;">
<b><u><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Zombie mode - Or normal people are able to
conduct a conversation at 20:00 o'clock </span></u></b><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"></span></div>
<div dir="LTR" style="text-align: justify;">
<span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Our job requires tremendous brain effort and
almost zero physical effort. After such a long day you go into what we
call the "zombie mode". You come back home. You are in the </span><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">"zombie mode". I</span>t is
hard for you to...well, to communicate. Yes dear wife. This has nothing to
do with us being distance or snobs. We simply processed too
much information for one day and we need some time to reset. I am
sure at some point in the future this phenomena will be more documented but
until then... please be patient. </span></div>
<div dir="LTR" style="text-align: justify;">
<span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;"><br />
<b><u>Tech Support - Or Why can't you be more supportive?</u></b></span></div>
<div dir="LTR" style="text-align: justify;">
<span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">It's true. Most people we know assume the years
we spent at the University, the books we read and the software we developed
must have prepared us to help them use Word. The problem is that when your wife
is on the other side of the line you have to answer. So you find yourself
wondering in the middle of the office trying to teach her to send a fax from
your home computer.</span></div>
<div dir="LTR" style="text-align: justify;">
<br /></div>
<div dir="LTR" style="text-align: justify;">
<b><u><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Buying Gadgets - Or don't say I am not spoiling
you enough...</span></u></b></div>
<div dir="LTR" style="text-align: justify;">
<span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">"You know how much technology can improve
our life. So why did you get upset when I go and buy the new laser directed, Bluetooth
controlled, vacuum cleaner?" Yes. We love technology and sometimes we buy
cool top of the line gadgets that we can live without. But at least you take
comfort in the fact that we never spend money on clothes...</span><br />
<br />
<div dir="LTR" style="text-align: justify;">
<b><u><span style="mso-ascii-font-family: "Times New Roman"; mso-ascii-theme-font: major-bidi; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: major-bidi; mso-hansi-font-family: "Times New Roman"; mso-hansi-theme-font: major-bidi;">Cleaning house - Or why is there a new tool-bar here?</span></u></b></div>
You open up the browser. There are three new shining tool-bars installed. How did they get there? When <b>you </b>install a new software you overcome all those annoying traps to install junk on your PC. However, your wife doesn't. She will tap the next button like crazy, leaving no tool-bar behind. Developers are usually pedant, control freaks when it comes to our machines. Cleaning up after your wife becomes a daily chore.</div>
<div dir="LTR" style="text-align: justify;">
</div>
<div dir="LTR" style="text-align: justify;">
<u><b>Small breaks - Or "I am really working here"</b></u></div>
<div dir="LTR" style="text-align: justify;">
Anyone who ever worked from home knows it. You tell your wife you are really working. She takes a look at the screen and finds you in Reddit (again). "I thought you were working", she says. "I am", you answer (but you still get the long face). Developers need those small 30 seconds breaks. We are working, but we need to lift our head over the water to catch a breath.<br />
<br />
<br />
To sum things up, we would like to dedicate this post to our beloved wives, and wish all you developers out there prosperous relationships.</div>
<div dir="LTR" style="text-align: justify;">
<br /></div>
<!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="267">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin-top:0cm;
mso-para-margin-right:0cm;
mso-para-margin-bottom:10.0pt;
mso-para-margin-left:0cm;
line-height:115%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"Times New Roman";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:Arial;
mso-bidi-theme-font:minor-bidi;}
</style>
<![endif]-->Roi Gamliel רועי גמליאלhttp://www.blogger.com/profile/07882658912051279530noreply@blogger.com2tag:blogger.com,1999:blog-2713252560567167671.post-7989458804826034412012-09-05T14:51:00.001+03:002012-09-05T14:51:19.012+03:00Windows XP and Windows 2003 command-line string limitation<div style="text-align: justify;">
Came across a very weird phenomena that I'd like to share. It took me a while to pin point the problem, so I thought I might shed some light to save others the time. To make a long story short...In our company we use ant scripts in a continuous build process. If the process fails, people get really mad. So, last week I failed the build...a moment before a big delivery...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
So, as I said, we use ant to compile our java projects, and have one project that compiles all the other java projects. Before my commit I checked that everything compiled fine on my machine, and then committed the code to our svn which triggers an automatic build process on our continuous build machines. Guess what? It failed. So, what went wrong? How can it compile on one platform and not on the other. I checked the Java revision, and update them to match. Would it then compile? No. I then checked the ant version and matched them (1.8). Would it then compile? No. However, I knew that the builder and my machine run different OS (2003 vs 7). The biggest problem was that the error message was quite ambiguous, and it failed in different locations at each build process. So, first an foremost, <b>run ant -verbose to make life easier.</b> I then got a stack trace which helped me to understand the error better. I then googled the stack-trace, and got a hint <a href="http://stackoverflow.com/questions/2893970/fail-to-launch-application-createprocess-error-87-cant-use-shorten-classpath" target="_blank">here</a>, which referenced me to <a href="http://support.microsoft.com/kb/830473" target="_blank">this</a> support entry on Microsoft. To summarize:<br />
<blockquote class="tr_bq">
<b>On computers running Microsoft Windows XP or later, the
maximum length of the string that you can use at the command prompt is 8191
characters. On computers running Microsoft Windows 2000 or Windows NT 4.0, the
maximum length of the string that you can use at the command prompt is 2047
characters.</b> See <a href="http://support.microsoft.com/kb/830473" target="_blank">here</a>.</blockquote>
So what was the problem? We compiled the projects by using:<br />
<blockquote class="tr_bq">
<i>...</i><br />
<i><path id="lib.class.path"><br /> <fileset dir="${deploy.dir}" includes="*.jar"/></i><br />
<i></path></i><br />
<i>.</i><i>..</i><br />
<i> <javac...><br /> ...</i><br />
<i> <classpath refid="lib.class.path"/></i><br />
<i> ... </i><br />
<i></javac></i><br />
...</blockquote>
This will create a command line that will eventually include all jar files in the deploy directory concatenated as a string explicitly. <b>As a result we overloaded this command line and passed the string length limitation, which led to compilation errors.</b><br />
<br />
How can this be solved? Simply by removing the <i>fileset </i>property and the using the <i>pathelement </i>property: <br />
<blockquote class="tr_bq">
<i>...</i><br />
<i><path id="lib.class.path"><br /> <pathelement path="${deploy.dir}/*"/></i><br />
<i></path></i><br />
<i>.</i><i>..</i><br />
<i> <javac...><br /> ...</i><br />
<i> <classpath refid="lib.class.path"/></i><br />
<i> ... </i><br />
<i></javac></i><br />
...</blockquote>
This will create a shorter command line with only the class-path variable and all jar files implicitly will be referenced. That's it - hope it will help</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<br /><br />
<br /></div>
Roi Gamliel רועי גמליאלhttp://www.blogger.com/profile/07882658912051279530noreply@blogger.com0tag:blogger.com,1999:blog-2713252560567167671.post-58522147953524495942012-08-01T11:19:00.000+03:002012-08-28T15:03:20.833+03:00Save Time With Eclipse External Tools Configuration<div style="text-align: justify;">
You probably know the feeling. You are sitting next to your colleague in his working station, waiting for your question to be answered. However, he is in charge of the keyboard and you are only an observer. You simply <span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; line-height: 115%; mso-ansi-language: EN-US; mso-bidi-language: HE; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: EN-US;">can't </span>comprehend why instead of creating a shortcut in the folder view, he is again navigating all the way from the Desktop to the ProgramData directory, without using auto-complete. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
This example illustrates how we often see people work inefficiently while performing small technical tasks dozens of times a day. This could be a simple thing, such as navigating to a specific location on the computer. However, if you consider the number of times this is performed a day (and the agony on the face of the person sitting next to you waiting for an answer)...well you get the idea. Performing this weary tasks daily can also lead to frustration and discontentment.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Since developers usually perform what can be considered small technical tasks dozens of times a day, this is especially critical. Since most of us use IDE's as our main tool, I would like you to consider the "<a href="http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.platform.doc.user%2Ftasks%2Ftasks-exttools-running.htm" target="_blank">External Tools Configuration</a>" in Eclipse. This is an unappreciated and not widely used feature which provides a mechanism to run tools that are not part of the IDE. How can this be helpful? For example, let's say that you want to quickly open a file for edit specifically in Notepad++, or jump to the folder of the file you are currently editing, or even open a console directly in a specific directory.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<u><b>Creating a new external tool</b></u> </div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The External Tools Configuration is located right next to the Run\Debug buttons (In red). </div>
<div style="text-align: justify;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="data:image/png;base64,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" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" src="data:image/png;base64,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" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Click on the drop down menu -><b> External Tools Configuration</b>. You can now create a new tool. Right click on the left <b>Program </b>menu, and click <b>new</b>. This will open the configuration screen for your new tool. Let's go over the 3 examples mentioned above:</div>
<ul>
<li style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;">Open a file for edit specifically in Notepad++<img alt="" height="205" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABK0AAAMFCAIAAAA5s5KIAAAgAElEQVR4nOydd3QU593vl3PPvee8Oe97bu6NE8eJ4zeJ4xhSHJdgm7iA7euGwQZJCAM2XaL3poIECIEEkhCi2GAwPdiYLnqVQL2utvfee68q3D+e3dFodnZ2tBKm+Pc5n8PZnd2dnf1p5nme7zyzC8Pi8Mi0FpnWKtNaZRoLphSptkjVFonaHKs09q7GLNGYpRozfj29K+/VQlCqiaeZhhQvpza6ht7PYpKoTRIVphlTrDSJFEaRwihUGIRyg1BuEMj0SL5Uz5fqeVIdXq5Uy5VqOZKIbLEGp5olUrGEvXYgBUomkq9g8hXtPKS8jStv48pbORFbOLIWjqyFLWthy5rZsia2FNnIQkoaOyI2dIgbmOIGpri+j6K6dlFdu6i2TVjbJqxpRQqQd1sFd1v4d5r5d5p5d5p41Y3c6kZuVSPndiPnVgPnVgP7Vh3rJrKefbOOdb2240Yd60Zdx426jpv1rFsN7NsN3KpGXlUTv7pZcKdFeLdVVNMmqmkT1baL65iS+g5pfYe0gSVtZMsaWLIGlqyRrbgPyjEb+trYx/vyjo0sWSNL1siSNnZIG3A2dkijD8lwm6fAW8+S17PkdR2yug5ZLVNa0y652yauaZfcbRPdaRVWtwiqmvm3m3i3Grk3G7k3Gzg36tk36tnX61jX61jXajvIZMYuvF7LwsnuK+tGHTtG1o060uWYnBt1nJv1ZDZgcm82cHF3sSVxvdXIo/B2Ez8qL55VTfyoAtxt+goiNgvpW90iIlMYI+nTHkJjt1xY3ZKoDljp6FndLKxqFiCxt7jTKrrTKooeAmJ0o6Zdgg6NWqYUEx0y6PCJtYGoInnZg+P9afdoyFEmtOnRlPpDEcpO2CXqO2QE65hSvLXtErw1bWK8d1tFmHdahMjqZgFerFW53cjDe6uBiyS0nFjr2re5Zl2vZV2r6SB49S4T75U77aRerm7Di3/o6l0mWhXqAm7Wc241cG838lA/Hu3KxbXtkjqmFJUo5rCiMl556RSWfkn7Vcnkakgqqh7We2LVQwMh9Cmw6mEFxGqIP0KbOMjEO3xzrFyiLVwVUV6vrQT56rYY2wVIDZKJFEbsEGo6RFpMFlKM1LFxciSYeo5Ez5X2ykPKDJh8THlEgdzYR4VRSKJJqDCJlCZhX0V9JSzEXi6QGwRyA1+u58v1gugIny/rHdvz0dheoo0o1nDFGq5EyxFrOGINVxI1spxEh9uX/u5IY3OD6tRx1anjmlPHtaeO604fM5w+Zjp9zHL6mPXMMduZY84zx1xRPf3RdeaY6+wx19ljzrPHbGePWc8es5w5ZjpzzHDmmO7MMe3p45rTx1Wnj6tOHze1NKa/O8rl8aPPzlDorFRqrQqtVa61YMpwtyPqLHKdRaGNvESJ1NuUBpsqVn2y6mwqnU2J1MdqVeqtqr4qI5I+Pyq2Tp1VSfZ5cZplGrNMHcmNUrVZojJKVEaJ0ihWGsSKiCKFQaQwCOX6vuoEcm1EmVYg0/JlWr5Uy4uo4eH2FY5YzRGr2KKoQhUbJUaBsq+KDoGCyZcz+XImT87kydt58jauLCJH1hq1hSNt4Uhb2H1lSZtZYmQTzgamqIEpqmcK6toFde2C2jZ+bRu/ppV3t4V3t5l7p5lb3cStauLcbmBXNXKqGjlV9ayqBnZVI7u6kVPdyLnTxL3TzLvbwq9pFdS2CevaRfVMcUOHBGXUJra0mSNr4cqbOfIWrgLZylM+QrZQy8WriBH3aJw1NHMVzVxFE0feyJY1smUNLGlDh7SeKalnSuraxbVtoppW4d0WwZ1mfnUTr6qRi7zdwLndwLlVz6YjenI8sXX22yYqq5t5SXinhU/h3RZBH5v72iKInuYYsG0i+ta2i38iJihFP4tci3tJbZsIWdcuRjt/fYekvkPSwIqcRSLYxJEj0eGT0L7H6X02YaORyAfQ0PFVj57U7Xbf7ia2cW7myAk2sWUEoydbIzZ0SJB9z7SK0ZlW7GRr9JSroPd8awsf804zD7O6iYsZ6V6j3m5g471Vz8J7s64D741aJqnXa9oJYg+hF6K1oc69uol7p5kX2483sWVYicj6OHKpaxtbUkJhqUtKXcx4lUyuhqQSSodV724LH189rIBYDUlHQW14+bGq4tmOKSCRKVD3UdhrRx9RutN0iDSsvrLFGrZYi8kR9051ILkSHVei40ojRhKUTI/k45XrBShuyQ0CuUGoMAgVBgFOocIoVEYUEVSZMMUE1RElvZoj/6pMErUpOnQ3ERQrjZjYGF6kMIgUepGiz0heKNcJZBH5Ui1fqhVItXxMmZYv1URE43ycTo9vwqg3TPW1suOHlMcPqY4f0hw/pP3+kO77Q8bvD5lOHDSdOGg9cdB24qDjh4POkwddJw+6Th7wxNF18oD75AFvVPfJA+6TB10nDzp/OGj/4aDth4PmHw6afzhoOnFIf+Kw7sRh7XeH1d8dVn13WP7dYXND3YRRb7q9AfTxGWqDPa76iH3CWOS2XaW3qQ02tcGmMdjVBrsGaXRojQ6t0aEzIZ06k1NvHnx1Zkevkfdy6Ek1R9TF09Sr1hTZfq3RrjXaNXgNNrW+j0qdRamNqNCYFRqzHFONaULKVEZMqcooURqi6sVKvVjRq0iO1CGFskh0FOD3MKmGL9HwJRq+WI3kidU8sZorisgRqTgiFUfYK8qTbIESk8VXEOzgydt5snaurI0rbeNKW9mSFpakmSVu6hA3onzYLqxvE9S18mtb+bUtvJoWXm0L704T924z724zr6aFX9sqqG0V1LUJ69tFDUxxY4ekmS1r4chauWhiU9HOU7bzlEy+CtkhUHcI1Cyh5se042FT0CuTr2by1e08VTtP1cZVtnIU6N8WtryZJWtmyZo6pI1MSX2bqL5NVNcqrG0RIGua+ci7TTxqsWdS2dJv0Z8+nnVtwuREnzSeDe1iKpmSQbERTefSs4kl+0lJXY1k6syUNHVIMZtZMrTzt7DlLWx5K0eBDoo2rrKdp0KjJWwARBzrDFj8sTmYDka78SM3m4+0qKPB+hrsLkGsY0Ki3gqzjavAi12kE7lUhx29ToclxdvUIWnqkDQyxXgb2kXI+jYh3rpWAbK2hY+3ppmH924TF++dRk6s1Q1sUqvqWXix5ehVaIW1Lfy6VkF9m7ChXdTIFDd1SJpZ0ha2DH3w2B48oTQLS6ekqJ74kmLFJJQ0YSUpahiveqRir7rbxK1p5sWrXitHTiggYbckyMYUxaqlloMUx5Ur1vVR0isPr1TPk0aueote+xYxGup6p++wXBdJd/I+83UivEqTuK+kF+JJ1URlSPwlh1HlSGzmRmORa6xyjVWhsSo0Vnn0CZHJHnQ7uhCtVh5dv1RlQspUJqnKKFEiDRKlQYwZGa6jgTruhkIvwpYr+ozt3R5/6lsj9DXV0sN75If3yI/sUR7Zoz6yR3t0j/7oHv3RPaaje8xH91iP7rEf3WM/+rXz6NfuqLtXZ6emZyJ3r85xH92ze3UOYYkz8sK91qN7zUf3mo7u1R/dqz+6V3t0r/rIXuWRvfIje+WH90oP79XX3El9a4THF0CBhYFPQQk0OvTRaBdNdw6Dyak3Ow1mp8HiMiKtLpPVbbK6zbZHT7TlJqsLr9HqMlpdBovTYO5Vb3bqTQ6d0Y6pNdjwagw2jR5pVeutap2lV61FrTWrYlRqIio0JoXapFAbMeVqg0xtkKkiSlUGqRKnQi9R6CUKHaZIru1VFqO0V6FU06tEIxCr+SIVV6jiCpUcgZLNV7B4ig6ujMmVtnOkbWxJW4e4lSluYYqa20VN7cKmdlFTu6ihTdDYLmxiipqYouYOcQtL0sqWtnFk7VwZkyfv4ClYfGUHX8kSqNhCNUek4Yg0XLGWK9ZizQ2/b1vzsCu5j/LEOp5YxxVpuSItR6hhC9RsgZolUHXwlUyeop0rb+PIWtnSFpakuUPc3CFGZW9iihrbhY3twoY2AR3Rk+OJrZO+aGPi2dIhSc5WljSBbBmFbRz5YNnOVdCXyVP+RKSuQxJFJlQbvUsHX9XBU7L4KnQ4cIQaJDpG0A2uSIuOHRIlD9iBNgsPvMV79CV0NKR/JtQrYaKuCpMtVONlCVR4O/hKJJOnwNvOlSPbODLMVrYUs4UlwSQ0m4S2HZPQmNe38mOta+GRWtvMxYt/CL0Q6837duVy6h48oYTa4ssbr7D0S5qwngkrSbN68cReGK96TJ4CX0CsCPTHP9h3kcg0UCjElMdVJDf2MRrYxLGi2EYwmuKkKpNUZcaUqQla5GoLFsl6s5nGotAiI7FNobEqtURVWqtKa1NpI5cHYqrx9p2t0ejteAmPIlU6K16l1qLUmvEq0Jg88q8Jm92Rq41ytTEyJo+OxqPzPdhw3SiP6vH6x4/4p67qhuib7eJvtou/2S77Zrt8X4VyX4V6X4V2X4V+X4VhX4V533bLvu22fdsd+7Y79pUjU9Mz70VJTc/cuWI1YYljf7lj/3bb/u2W/dvN+7cb9lcY9lfo9ldo9leo9lco9lfI91VI9lVI9lWI91Xoq2+OHzHc6wuqdVa1zsqIJp+IJ7+98lXBka8KjmxesX3y6FkbFm/J+HwRl8uruVs7afT01RnrP/94+pZVO9FzTh24YrG7LTa3xe6xIh0em8Nrc3jtTqTP7vI5BqY9nk56Uq3BSxBtvM3hiafV4bHaPRa7x2JzI802l9nqMltdJktEo8VltDijOiKaHQZzzFyl0Y7UGW2YWmM0TOptWr0VU6O3YKqRuGyJy5Mmldak1Bj7qO6VEC/laoNcFVGmMsiUBqlSL1HoxHKtSKYRStUCiZovVvFESq5QyREo2Hw5iyfDkiGTI23nSNvZkna2tJ0tZXJkTI6sgytn8eRsnoLDV3IFKp5Iwxdr0b8CiU4o1YtkBrHcKJYbJQoTUqo0P0ISG8FBFWtwRXKDSG4QyvQCqY4v0SJ5Yg1XpMZmdDt48g6enMmVMbmydk40q9MQPTmeaIVJ2MGVU8lT9FcWX0lHtkAVT45QPVhyRRqa8sQ/FelUI4ki46vNE2t5Yi1fokMKpHokGtyI5EbsBlKsMMUqief9PJYH0R+7lVM9slK02zHdDWFnQL0SpkhmwCuU6vEKJDq8fLEWL0+kQXKFarwcgYojULH5SrwsngJJaDBRf8rkyFD3ireNJSHY2iHG28IUkdrcLsRLeBS9to0lQb15B1fO4inYfCVXqKbuwekYr7w0C0taUlRPfEmxYhJKSlrJ5GoYT1S62OpxBCqsgOgzYgXs7yhIFquKoIVaOV41lQq1NaKGqBIzEtJsSpTQ8BJzmj2i3q7uG88iGuxag0ODXV1oQEvsWoMdXaAXvVjPoTU6dHhjZq30Jofe5CRKuK4QNxTHXqUzRt8LP6mjtxKMHXsrNSalxqTETeqokLiZHq8v8OkrL6iuXeRs28Tdtom3bZNw2ybR9kLJ9kLZ9o2K7RtV2zdqKjbqKjbqKjYaKzaaKjaaKwosFQWWioIdS5YRgh/+9o4lyywVBeaKjaaKjfqKjfqKjdqKjertG5XbC+XbC6UVm8QVm0Tlm/nlm3nlm7nlm9XXL336ygu+QFBnsutMdkY0+USsyDu0LfvbouW7Vi3KZXWwvvlq/8qF2aFQyGq1Tk6beuXS1cb6pswvFm1d+fW27G8r8g71xjy33+n2Oz1+l8fv8gRcnoDb+wjqQfrdkQ9CotPtc7p9TpfXgXRGjCZJQnR047Xa3RZkJEa6LDaXxea02Jxmm9Ns7avFabI4TRYH0mgm1W402w1mu8Fk69Vo0/dqJdFg1UXVGix91Js1erNGZ1JpjEq1QaE2yFV6mVInVegkcq1YphFJ1UKpWiBR8cVKvkjJEyl4IiVXqOAJFVyhAt3giZQ8kZIvVgkkaqFUI5brJAo9drJErkZnVszoklp0Dob0PM1P1r6npiwKjVmuNslVJpnSKFUYJHK9WKYTSbVCSWQKF83i8oRKJFegSCj2ZHJFqqTFrlWOVSDRJKFQqk2oSKajVizXD1yJgq59pusfa+lUo59FNkgUBvxticIgVRplKhMmuupegU4kR+09bawjnjAeoOqB+6CbFBCJNa2Eu4QmFy/qrTBxswF9vvER77gQy3V4saty+lyJI9UIJGpMvliFRD0pJjfaySI5AjleNl9GkMWTxtrBlRDEP4peiFbIFSqwTlwk02L9ONaJ43twOlLXlvRLNPjC9m1SqEpKv5jUNSQtIIVY9bhCBTYEEkjUpNWLLeBAdmwNpoFUe0K1xNBFoo4ygMV8J6s3dBkIWno1WpxG7HLCPtcVkuqmf72hBa/dbbF7LHZP9CFPVLfF5kZzOWar22RxmSIDb6fRjHSgfw0me1SHweTQm3DzNwabzmDTGqxag7V3RqfvXZ3R5vMHx7z4V+Xl8x3F69jF67jF6/jF6wVb84Vb86Ul+fLSfGVpvrIsX1uWry3LN5TlG8vyjWX55qgVi5bg4x8WAisWLTGX5RvL8k1l+cayfF1Zvq4sX1WWryrNV5Tmy0ryRSX5wpJ8wZb1vC3rOVvWs7asV12pHPPSXwPBEKoqgxByduQdLlyyY83Mws3rS0KhkMViEYvFHA6Hx+OJxWKXy+VyuebOWrh4cs7mpV/tzDvi9gbd3qDHG/T4gl5fKKI/5MMMhHz+4I+p1zdQPb4AlV6/x+tHWdHt8bvcPryRlOj2RnR5HEgniXaHx04WF7HQ2KvNZbU5kRa81ohmq9NsdWBi6dFkcZjMsdoxjWab0WwzmmxGk81kthtN9kiSNFh1eotWb9HqzBqtWa0xqdRGpdqgUBnkSr1MoZXKtVK5RiLTiKVqiUwjkamFYpVIohZLNWKpRiLTSuU6mUIvVxoUKqNSbVJpzGqtRa2zaPRWrcGmM9qx9gJrHUiag/un+aHT0Fe9yYlaW6yB1uhtap1VpbUoNWaF2iRXGWVKg1Shlyr0ErlOIteJZVqkSKpJKPbkeKJ19le0PaTKlIakleOur4hVoU5s5IzdAIy9lju+lp+YVNVIosiEu+jMq0ZvVeusaLiDjgj8oAQ772uIOZQecgfUbvyYbebjIqG7IQxSCcNZ/Lc/SL4AEmeiIN4hQGiUei/GUerxShWRc694xTINXpFUjVcoUZEqECtj5YsUBNFy7FUiqVos00jkWqlCJ1Pq5SqDQm3EH4n4Tpw4yo9j7M83xKttvLkXfGFJSxpbT1RJimJS1JC0dBRipSOtHmrN0Icird4g7uHY5Wlx0pSLcCUghWa8+KDV9yGL1RPRRq4VE7t+0O7Fa8PrIGrv1ddrnMsAHVGprxN0RK8rxL2Rx+bw4rbQbbG5rb0zNygxOqO5sTc0EmZrCPM36HYgEBr9wlDFxTPtG3M6NuawN+ZwN+bwNmUJNmVJNmXJNmcpNmcpirI0RVmaoix9UZahKMtQlGXCWbFgYWp6pjNKanpmxYKFpuIsU3GWoTjLUJylL87SFGdpirMUxVmKoixZUZZkc5ZgcxZvcza3MJddmNtRmNtemKu4dPaTF4YGQ2E0X8XoDW++kNcX2rR896oFa/fvObRn1z6dTnfo0KF3333/qV8989STf/z00/Hnz53XaDQb8jceOfTvOVMXb121z+cP+QNhZCAQDgTDqWlpjChbt5YEguFgqPN+W1JatrWkFLurUmsYMShV6sgTgnjDsQaC4SFDhjQ1twaC4Vj9gZDfH/L7Qz5/KCUlFa28sbHZ5wv6fEGvL9BHrx9vJEN6/W6vXyJToNcWFRUzGAyJRO52+9x9U6XL7Y3o8rpcXie1Tm9MznTbHW4Gg7FpUxG6jbc3c9pdSKvNabE6rTaXxeo0RzKk3WiyGUy2yCyi3qLVmzU6k1prVGmMKo1BqTYoVHqFyqBQ6WUKnUyhkyv1CpUBXYOq0pjUWrNGZ9HqrTqDDV0EazA5jGanyeKKNB+ojcDaAocPRKKCoPqgM1XRE1ROg8mhN9p1BptWb9XoLGqtWa01qzQmlcbUewGwykBH/DXDsaJ19ku1lkqNzpy0WnRiIo463Cw3qXqDbRCMXstNR3Ti8Kdg4mr0p8gGo91gtGMXNRhM9mhv6sRumCxOs9Vl6XvSF+u/Y4cRlD74gx38MSX0NYTxKGH8ShjvmvCDbFybjG+cYw8KNGMQmTfAf91DZ8FEzTi+Madu0uVKPUHUBROUyrWxSmSaWNFD2Auxrhz141gnTt2DUxsbD+jUlrSpIa0nVtKki0mnehRipSNUT6OzEKqHCvjjj38SfZfKT1MH0kVLJ6Y7QK2LoIdctyeYQG9cPX1FlwH2rtztRzrdfqfLh4m/7s/u8DicXtxEjsdmdyOtNpfV5sINqnvvBoOhN5/4T2bF1gufvHlxzJuXx7x5dcybN8e8Uf3pGzWf/qv+09cbP3u9ddzrHeNGsMeN4I4bIRg3QtjXrWkpqemZxiip6Zlb01KwRwXjRnDHjWCPG9ExbkTruBGNn42o/3REzadvVH/65q0xb14b89aVMW9dGvPWxU/e6qgoeeuX/xkKd6JPyggEO/EunrS2sb7J5/N5vd4lS5Y8+aun/z50+DtvjH3/3bR33hj75+deKS7aEggEvF7v99/9sGzqeix6hUKdoVBXKNyVljbh/PkL4XBXCC0Md4Y7uwgOGTKkta09dnkCw3EtLS0rKSmlvzwc7gpROmTIkJaW9lCoK8bOUDRMDhkyJDU1DUXHSOgNhPwRgxH9veJmLANeX2B8Skpx8da+oZFgb3Ts1eNDukl1e5FFRcVFRcUutyeiK4FOl8fp8jgcbofDZXe4HA633eGy211Wm9NqdVisDrPFHsmERqvBaNUbLDq9Rac3a3Vmjdak1Zm1OpNaY1RrjBqtCS3R6S16g1VvsBqMNqPJbjI7LFaXxeqy2tw2u8dm99gdXofTh1oH/JGf+Ah/bA3gjTRGuGYo0u7Y3VhWN2NZvffvYsbU6kwJxT8/Vr3Bkpxoe+KJ5p+T0k4h2dR3r2aLc1BEuzFNrTb3T0E6pUiizviCY+9ls3sIbQgSHSZYL044mh5uH3jL89OS0NEQhp5O/LDV5XfgphccTp+9z9SE1+7wol0Rk/S4IOzbWKNEaMEMRhsSdZ2YOr1Fp7dodeZYUYeLF3XEmCq1IValSk8qehTryrF+HOvE0fGIDkB8Dx7bj1MYr8IUhe1vSbFKEuqJKhlbzCRqGE9C9VAB41Uvdgj04x8OHrwxMYnMEB29mL7+6cPrD9PXT2Hv4JzEyNWLvr4XFXoDXm/A4/WjfyOXAUZma7zYjegkTXQU7fQ4nB7Su6FQ+F//9z/atxWdf/+1yg9eu/jBa5c/eO36B6/e/ujVOx8Nr/3olfqPX2ke/Ur76Fc6Rr/CHv0Kb/QrfJxbxo9LTc/U9CU1PXNLyjj+J6/wP3mF98krnE9eYX3yCvOTV1o+eaVh9Ct1H79y9+PhVR+/euPDV698+NqlD1+/8OHrlR+8ziwvfuP//kc43OX1Br3eICMU7sS7fv6utWsK7Hb7+fPnf/7zJ958/aOP30v/+L2UD95L++D9CR+8P3Hoc8NbW1uVSuUXk2Ys/WIDylSdnb1OmDChsvIiYSHBIUOGtLW1UzwBST8ilpaVlZSW0l+e0CFDhrS2toXDnfEsLS1NTU0NhcKhUDgYQhOJIWQAMxCREAhRJkxJST177rzPH/T5Az4f0h9rzIyij0qPF4lyILqNhcNEYqHR7XS5XC6304liodNmd9psDqvNbrXaLVab2WIzW6wms9VkshhNFoPRbDCajSazwWjWG0x6g8lgNBtNFqPJYjJbzRabxWq32hw2u9PucDmcbofT7XR5XG6v2+NDR5fXF8Bf2Ut9xP6kxJ84iJ4I8LvdPpfL63R6HA633e6y2Zw2FNctdrPZZjbbTCYrptFooRb/ZBLNtuQ0W+wUWqyO5MSujiYVOwkXz9hZ8SQkvcab2gQz+Y+FdOqQRJ3xBUdv5HL70L8utw9dnO/xBjzegNcXxG54fUEf/usJg6F/UHzQTQqIJPQ1Md8uCRAknJCNPQmLXbyDDQGjA0E30u5w4bXZnUirzYFpsdoxzRYbXpPZiom6V0zUBWOiXhhTpzeSqtUZYsUexXflpP041onjq0T7yzv9qG1sYUlLitUTK2m8YpJWMrkakoqVjk710PgHX70HfmiQGgjgRrYkklw6R98+V+SFkpD8OsEQbXsvBgygf6NDd8K43Rfw9b3KL94eG7v3uj2+cLjzjV/8jLm9qPLDERc+GnHp4xFXPh5x/ePXb49+/e7oV+tGD28YM7xl7HDm2OHsscM5Y4fzxw4XRN2aOj41PVMehXB7a+p4wdjh/LHDOWOHs8cOZ459tWXsqw1jXq0b/erd0a9VjR5x4+MRVz/+1+WP/3Xxo39d+PBfHduL3/jFzzo7u9Afl9HZ2Y13SUZW4botEokkLS3tz8++MGncorTRc8e8P+3j9yd/9N7kj96b9ObrY/Pz1zc2Ns7PWDI1bX5XVzfBCRMmXLx4saurq7u7u7u7u729ncFgaDSarq6uCRMmlJaWDhkyBF0PmZaW1tXVdfHiRezSTfzTGAxGaWlpWVkZ/iVdXV1dXV1lZWXYS9rb29GS0tLSrhgIy9HGILDlpAuxpHrhwkXsIXxGTUubcP58JS4ZRmhpacXWVlJSEgqFQqEQmi3ErpUNBoOpqanY05qamhkMRiAQDASCW7duRQvRFaeBQLCpqYnBYPj9Ab8/gN1GN4qLtzAYDLlcgb/81ev1o+UImUwxfnzKmTNnvV6fTCbHlo8fn+L1+rxe3/jx44uLi6MLx6PoePr0abRk8+Yip9PtdLocDpfD4bTbnTabw2ZzWK12q9VusdgsFpvZbDWbrWazxWSymM1W9C/SYrFZrXabzWG3Ox0Ol9Ppdrk8brcXTWl6vX6fL+D3B9Ehhx2K9I/en4K4FiqEb4+8Xr/H43O7vS6XByV2h8NF+ANhfyMKsdli/WEAACAASURBVGdSiNbZL+12J4Voa5PQ6XRTmHDeG+1+AxSbk6cv4WzO42rCOiRRZ8Jd1Gigf5H4BgTfkjzwIxd8yCX0OMSvhwRCBEkHhZjxjgX8Lk28DCfacGHtG6GdJDSqFK061udimkwWvEajmVSDwYQXW45eRdqPY504oQfHd+LUJldY0pYktpikJaVTyYHXEF86VD2sk7XZHLFDIFQ9whDogR8XSUsxcRKV6rK+gZhwVinBnFPvqjrD4U40wRMKYXssmuMJB4MhNFCP7qsBJNn8jc/r9RHudnZ2vvHL/2J/VXJh/MjL40deGT/yRsrIW6kjq1JH1qSOrE8d2ZQ6siV1JHPCSNaEkZz0t/npbwvS30KmpmeKo6SmZ25Nn0BYIkh/m58+kpM+kjVhVEf6qNa0Uc1poxrSRtWmjapOG3U7bdTN1FFXU0ZdSRl1MWUU5+vSN375X11dXehjMrr7olKqfT6f3W5/8YWX52cu35T3bf6qXdnLy1YtKVy1rHDVso3LFubNnD7X5XJZLJbLl650d3d3d/fgnTAhHRfSmN3dPWVl20pLyy5evJSWloay4pAhQ9rb27u6IikRLcSeMGHCBAaDodFou7q6y8q2RcNe95AhQy5cuIjPnGVl29BL0FvEhlL8cq1Wh60KWxvpQmwLo5tHQjQo9hIOd6rVGgaD0draGg6HQ6Ewg8GorKxENxgMRigUamlpYTAYarU6GAylpqaeP18ZDIaam1sYDEYwGDp//jyDwQgGg1hQDAaDzc0oJQYCgUj8w25s2bIV2xGRDAbj3Llzfr9/y5YtW7Zs8fv9fr8/JSXl7NlzPp+fwWCgGz6fPyUlpbi42OfzpaSkMBgMdF6BwWA0NDTW1zcwGAyvF00tetxut8vldrlcTqfL6XQ6HE6Hw2G3O+x2h81mt9nsVqvNarVZLFa8aKHVarPZ7Ha7w+FwOp0ul8vtdns8Hi/aBr8/EAgE0TGGHXjoOBzgUf04ibWhoVCkPYq2RAHUvkRnfT0ul9vpdDmdLofD6XA48X+jhKInxxOtsF+iLYmny+VOWrfbQyE2JR5P1CIPXNLZ+3gSjtPHWOo6JFFkQsHRu6D9Hx0IhAYEmhGQpljTSriLl7BfYVf9YO0wZrwDgbBLE5oj1Grh2zdCU4lvVLEGmbQNx/pc0h7ZbLaQajKZCWIPYV05Wj+hE0eHJNaJEw69hBIKS6gtvrzxmpfYkuI7AtJ6JqzkAGtIKB1WvdghEHX1HvihcV+lhDiGv69GNwbdjRDTGoTReL7vLhoMBkkP/wjR3qrP3c7Ozree/D+cfTuvTPnk2pRPbkz55NaUT6qmjL47ZXTdlx83TP2wedqHbdM+ZE77kDPjQ86Mj/gzPhJE3TplEva/xm+dMkk4k2SJYOZH3JkfcWd+1DH9o/bpH7VM/6hx2kf1U0fXfPFJ9Ref3P5izM0vxlz/YszVL8Zw9+9668n/09XVjT4jg5Dirl2+IZPJ7Hb766+PWLV0bdmG4xtWfbt25a7s5SVZK0qyV25Zuih/8aLler2+tbW1vGx7d3cPgfT09IsXL/b09HRHH+vu7kYTelqtFqVNlLK6u7u3bdvG6Et3d2RGET1z27ZtZWVlhNv4Gby0tDTC0/Dgl1+6dAk9GX+XdCG2hSipYvEVL3oCbufu7OzsvHDhQmpqGrb3VFZWpqamhsNhFA4jyZvBaGlpDYXCqamplZWVWDgMhVAyPI/2MBT/cDkwGAgEsZnD6I0I2CxiNAcGtmzZiqXElJSUc+fORecSI3tkY2MTg8FAgRAfDs+ePef1ehsaGsePT4lGQS/WqvZtTEnSIGo6sQRI0QLG5kBCr9zZ+WM3Cg+nhFELvtekToOk3V5ySY861CWd96gTXdJhbxDz22ClO8KQ8TF24FmRtMj4BIjFP+wGYQgFzQhIR8IekjAuxrbAScRC0gxDaN8I7STN9rxfkYY64RDO59JMMrE9OM0cTh254xWWtKSxmZC0mPEqmVwNY+tGcxREXb0HfoA8KAdGD31x79jnLj4QRnfUSBpE//YNhL2xEHfII/rc7ezsHPXUr3jHv721YMqtORNvz5l4d97EmvkT6+dPbFiQ3rJgYtuCicxFEzmL0zmL04VL04RL0yRL06RxlMTcRS/hLknnLknvWDyxfeHE1oUTGxdObFjwee2Cz2vmf1419/Pbcz+/vfAL/ncHRj31q+7ubpRcGIQUN+m9ZcP/8oFMJsvPz/909MRNKw8vmrR92rh1U8blTE7JnpSy8p03U/bvP3D37t03Xhj98asziCkwmgPxIZA6B8bmN+ocqNNFZvDwse0+5UBsIYPBIKx/27Zt6JnRPSaSA9PS0qLTg8QciPYk7Ha/cmCccBgIBALnzp3DbqPIh5Lh1q1b8QuxHIjA7qJHsZnDc+fOoV8JOnv2LIPBKC4u9nojs4Jutxv9xyHoJ2sdUex2u91ut5GBHiJtAmNbwXA4jErXe2oI6O7uju5j2G4WDodDIazpCURPOPnQXyo6hdv7l8L/sahxxsE1ANzx8QwAb3x8ifAPEoF+EvwJQKcOSRSZUHD0XugoQNfe4xsQQjMCLQkQD8IeQjpD0dmXcF9CfYl3IBD2aqwtwlotQvuGbyfxzSm+WSa03va+xHbH1vhY+oItp+7H/bgePBJlYg49CgZe2NiS4jsC6mKSVjK5GhKKFls9rHvFqod1Q4FAAMY/g0tsKqGmu29a6Y5pB5LbPwl9lt/v7+zsHD/0j5yzJ+vXrahZPadm9ZyGNZkNazJb1mS2ZWewcjO4azP5azOF+bOF+bOl62ZL18+Wr5+tiKM85q50/Wzputno5fy1mdy1mey1me05ma1Zcxqz5jRmzaldM7d2zdyG9Su5506NH/rH7ng5MG3k0qpbd4LBoFKpfOGvLxbnHlibuW9W2qbpE/KnpK0Z+1HGOyM/1ul0NputrHTHnE83UeRADBTG8IkLS1loZg9LXAjqHIhegj2Tfg5EARJb85AhQy5evEi6sLtvDsS2E79m9EJs5VqttrS0VKvVMhiMCxcuRIrLYFRWVlLnwHA4jOXAkpISdEOtVmOXkqLbLS0twWAQLQz2DYco8gWDQZVKxWAwUJJEC9GOiCU9BoOBv1gU3Y6XA30+X2NjI7pANDZgxEuDWIeBlsQ2f9hIHT+YwxpBQvPX3+P5MQbfQuHTIGqAApRpkNDnUZB0oktIf7NcQgYe8/qT4MhJIiaFfhoMPCsSihxb81AohA4BQgKMN4p60Ecw8PBC2EMIe86gpBfSMSJFLCR0uwmTTLzzfQmDDWm8IZzJpTufFT0AY0dipAxuLCRUMl7MTljMpGtIcR4cXz18DiRUDxquh4SEu2jszok/Ox+7c6K7nZ2dW6ZNPlhUKDl5lLmtoLUoq7VwZUfhSs7mldyilcLilcLiFZLiFdKSFfKS5crS5crSpdr+qCxdqixdLi9ZLi1ZISleISxeISxeyS1aydm8sqNwZWvhytaiLOa2AsnJoweLCrdMm4x9QGIO/OLdvLOnL9hsNrlcfuPGzfFjJs8anzN1bH7KB8vffj39vXfGNDQ0tra2qlSq9fmFU97Nja1genrv9wPRhBuDEXmXIUOGlJWV9fT0oIUTJkzo6enBXxqKHsWuLEWPooX42+jlCGwl2NPwEJYzmUzCe8VbOGTIECaTiX9Ip9PFrh9/RatOp+vue81qaWkpFgjb2toIt9PS0lBibG1tZTAYaH/Cfj8Gy4ShaD7EL8SiI9q98L86g3IgyoQMBkOpVGKThEqlEntaSkoK2kGxR9Hts2fPoviHkMlkpDkw4Yk0bAlpFMQ3grG9CERBUvANE74lCuGiINbzefpO4dKMggOZ3EsiBw4kCg58xq9/mY8ypdDn/kWvhwrqIiRXZELB8W9HejadMKJ60Icv8PBCnQNjh4MUoYX6WMDv1aQ5MN6MFj7AJGzS70cUpOjHg33nA/s1lzXwwsbWM2Ex6YTqQY+CWA9LHaSh4XpIIN1FSUMgPgfG9n34biscDhsMhs9eGLYnL5t7tdJYfdV4s9J4s9Jys9J6s9J6u9JRdc5Zfc5Zfc5dfc5Tfc7bfz3V59zVkZU4qs5Zb1dab1ZablaiNzJWX+VerdyTl/3ZC8NMJlPcHLhg7Ncj/z7lnVfT5s5a4vf71Wr1mdPn8nMLNuRvunjxslqtVigUY96b/P7bKX//4zszPyymWcrHHpqnDeK1aLGtG/43Y5IeUdGcGCE0oNjt2AY03mRgbEOZcFYQG4tjozp8OwhRkJTuvteIUkRBfIf3METBeDnw/s0KJkyD/U0j1CmFJv0NVI8odEqRRJ0DMTkQ3w0TGhBoRgCaEPYQOl18clGQsEuTRhfSnrdf7Tl1hqFIMhRXNsYLM7FJhmJOfnALS6ekhP6iX6F6UHKgLeaqWlQ96hwIDdfDAOkuiu2ThD0TPxKjwOv1ut3uPbMnz/nnsM+ef+az558ZN/T3KcP+kPqXP6b97dkJf3s2/e/PTXzhz5//4/lJLz4/+cWhk18c+gXypaFfvBS98eLQL14cOvnFoVP63p384tBJLz7/+T+en/jCn9P//tyEvz2b9rdnU//yx5Rhfxg39Pfo7eb8c9ie2ZM9Hk8gEMA+FDEHLv70m1nv7UobvmHrpgq3293c3HL+3HmTyaRWq0+dOs3lcvV6fcb0hRNf3TTjnfKl4/fTL+XjTWxbRpoA6UfB1NRUdLUnzfFTf8Me9dCZ9ESam/ZkYLwciHUhsY1g7EgOq+39OcYfSfA7G9YeYftMIJoD40VBOjmQThoc3Bz4AGcF+xtFqFMKfZKNV48MdIqQRIUJpUbvhW9XY6cEoSUB6EDYQ+h08QO8jjEwGFOCCQNMv3JgbBSkDjOeONc39ndWMLa8dApLs6SkURDfN1EUc1ByoC3OVwTjRUEYAj08xO6fdI566l4vFAqR9lODBc3DDfsIXbE5cO6HX2e8+9Wsd3a//fdJ6/I2pY+b8fbL4xQKRXNz87uvT8iYumTR/JUj/pI29c3SjHe/nvfh3gfyt3lood5jEu5A6GpPRGpqKvUwi/74KemIGO/8GZ0QGJsDqRvB2HYQGkFS8PsYlgPD9K4OfYA58D6lwQHmwEGMgrQzYG+Aeey5TzkQX3D0Rvizs1gD0kl2jeiDPnyBhxfqKBg73kouB+J3/nj9L2l08TzQLwpShBmsFQ0m+qpbclGQTmGxZiFhSftVyeRqSBEFse6VZhSEhuthgHRg3xVzmWgozrcEgzFnMOmMGaj71pippT5QRw8CJDlw++qLC0fvXzh6//wP9016vejz1wrH/TN78rgF6Z/NGvmX2TNGlae9umHayK0LRu9bMHp/RfblB/JXeZjpJptEjm3LSKEziiIdIfUr3SWE0AORtpUJTzcmnBIkbQTj9SIP+q/6cEE4o0M4ERXoe3Uo4c/3mOXAgUfB/qYRipRCn37mqUcY6jokUeTYgodiOsVOslOt0JgA1BD2kIRBhfRUb7w+Pd6eH6+nJs2BFBNZ/c0w8WJMvEtDbfG/KEidZAaeA2NH26QtDHVJqXN1vEoObg4knVD1JvrZVWi4Hjix+ye2T/b3kI93N4lxwmDlwM7Y3wsFBkJsi0bRSQxkzDSQpEdnbE1oKAlNJM0QiE+DhP6DEAUpGkE4HxYLfh/DN0Yh3MlRv99PneQHkgOTToP3IwcOMAr2N4pQRBT69DdNPerQb9lo1plQ8BDZb4dirQcMpwA6JMyB/YorNEMLgrQfJ82BdNILzRxIkWRoRkE3jZ88oR8FBysHBsi+eEl/hOOK/59zDDwH2mN+eZU0SMPZ8IcK0l2UzlFP2tPFu5vEUAFy4AOjX41awuxHMVqKbdQGN/5RD8pJEyC+caSTAPHdhj3muojY82FBuEqeHvH2sRDlD8a4H4JZwfsRBRPu/D9OFEzYpveriX+coK5DEkUmVBu9CxYFse4NoiDQLwi7x0DiShI5MIkpQXey1zQmlwNj57XcZL8dGq8HpzlqIi0vnaE2dUkT1jNhJekXkDoNxqtegHJO9QEeF0DsLkrzwCfdP0nvJjdIiBcF+5UGIQcmQ3/bMuocmLAhoyBh2KMIfnRG7f1tFhPmwHhXh2LDu2D87xg86D/7QwRhZ+vE/WBMKBoFsV0iNtg/wBx4P6IgzVMhD1sUpJehHgfoVCOJIgfIoiChC4QoCPSL2D1kIDmQ0OnH2+dJu/V43TfNHBgbBenPaFHkQIowE5tk+psDKaJgfwM26TAp4VgoiUSdRBTEXxtFHQWxIkDD9cChjoLxDnzS4530bnKDBMiBDxLqtixe30A9SKJuwkihTnrUwY96lI+nX6cY40VBfCZ0xr9EPgiXRtCDNAqG4/9gjKf//7P8fcqB1FEwiRxIMwomPKvSz8RHFVHo0K8o9UhDpxpJFJlQ8BDZb4d2kv1aDLQkAAX9jYLJTQ7E6/FJc0ts/x6vH+9XhkkuChK6cjpJZuA5kHooRdqM0I+C1MUc9BwYm6I9tL9m+QCPi584pLsotlvGi4Kkh3y8u8mNEyAHPjDo50CKNgvbFegHvx8zB1KcVuxvDrTHvzo0tguJ7UWgHYwHPgfi97dg/KtDBzEKJp0GBz0H0kmDCXPgoETBBHGnP+37YwZ1NZIoMuEuepdwnC8KQjMC9It+RUGaOZBwIBD26nhjgHj9+6DkQIowQ/3fCcaGGS/u0h7qTjzpHBgvCsZrTEhLGltPOqF60HMgxZQg1pRBDnx4oDj2Y3MgnZ2TsGQgowXIgQ+GAbZlFH0G6UmFwRpsJU0/B8N0R3L4XTx2343XfzzoP/5DROxeR7p33e/do7/0a5fuFwmPJmroN53Aw0kX7ne9qUefD/rYBR5qCDtJf3t8mr0/nv4OAOi0tDS7YzrnyOKdL8O36oRWtF8JMLnyDlZJB1LMwapeiOzrzTD+eXjo186J74zuN9TtDynduPmqPjnw/PnzuQAAAAAAAAAAAMBjx9mzZ7Eo2CcH5ubm3gMAAAAAAAAAAAAefXp67oU7ezz+Lpur02gP5+bmYtOVkAMBAAAAAAAAAAAeH7q7e0LhHrcvEv8wIQcCAAAAAAAAAAA8VvT03AuFe3zBbpe3y+rskwAhBwIAAAAAAAAAADxWdHb1BELd3kA3ugTUZA+bYkIg5EAAAAAAAAAAAIBHnp6ee51dPf5gty/Q7Q10O71dZkfY5AhDDgQAAAAAAAAAAHgMCXdGEqAvOg1odoQhBwIAAAAAAAAAADyGdHX1+EPdvmC3L9jtC3S7vF0WZ6fFGYYcCAAAAAAAAAAA8LjR3X0vgCXAYLcv2O30dlmcYSTkQAAAAAAAAAAAgMcH9Fug/mC3P9g7E2j3dFpdnZADAQAAAAAAAAAAHjfQz4GiEIhyoDfQZXd3Wl2QAwEAAAAAAAAAAB4vunvuBcM9flwI9Ae7vYEum7vT5koyB4bDYciBAAAAAAAAAAAAcWHyqr7+96pVxR8uLnh7ccHbC9a/sazwvYOn1gnlrff7rSPTgMjeENiNQuBAcmA4HO5HDmTguN+f+SfOo1Jk/P7wI2/zo1IiAAAAAAAA4BFFrReWfTs3p+KjnVenHmTPPiTK3C+YsYM7YVP1J6sOjJyX/3rpvgxfwH0/3rrn3r1QuCcQ6ibkQG+g2+7u/PFyICOGAX4wGMRT80jUh7A/3O9tJqz/kSgRAAAAAAAA8Iii1gtXbvl/5ecmnlauuGXZVmPdX2X65opu+wnl2n2SuaWiz/Ka3lpY8tqSgpFqvXBw37q7uycY7kYhEJ8D0Q/DPIAciL87wM8Gg3hqHon6wAQgAAAAAAAA8FhiteuWbX6n4tb4Sn12q/NEm+WM3NUucbQwzVeqtIdPSzfv5y3aykzNbnt1fvnLSwpGDuKsILoWFC/Kgb5At8PTaXf/iDmQYvyNnwvCL8G/hM6SeAsTvilhndRrizdzRb09NJ9Psan93YzYh0hfS1GBhOuJt3n0N5jRl3iP0tnIeJ+LesPiVS/hlsd7MgAAAAAAAAAgSvdl5B9/+5hqZo11r9rDZlkunJSsFNir5C5mq+nCNfXe70Rrd7FnFjR/sLT6bxkF/9h9bPnA37Tn3r1QJzEEBvAh8GHLgYTRNvXC2FfFe2E8Yp+ccIXU7zKQJ/drUwe+ZsKjsS9PblWM+H++eMvjLaHzGak3OOG20f+8NLccAAAAAAAAADCE8taFRf8s5b7xg25xreHfep+k3Xz+omLLEcHSw9zl9bqTtzQHTkkL93DnFrV9trL2pYxTf8zIeXmAV4f29NwLhvtcDtqbA4PdDk/nw5gDSZ8W+yo6eYD67fq1noE8Od4m9XdT6W8GzTVTPC3psgzWmul8ln5t5H16O/p/NQAAAAAAAOAnyO5jy1cde7FEOuKIbNFtzUGxo+mWel+N7pi303FV+dW6mg+/Zi48KSnYw51b3DZudd0/Z1z77ewN/zhxsTTpd+zq7gmGu5Gxk4Eub9cjkAMJxC6n/8J40M8VCd803pMJ2xDvs9DcVDqbEe8dKT57v0pBvZ5BWTOdz9KvVVHUbVDejrTCAAAAAAAAwE+cJQUjs2v+vFH08i72jPPykgbDqR+EG6s0B+/du9fZE1a4WSWNX86//HpJ66RNLaNX1L407cpvpn/9XMHOScm9XWdXbwiMzYEuX5fzweZAwlAb/1DsbcJr6d+mQ8L19OtNEy6kWD7A7aTzjhTr7O9bUKxnUNZM57MM1u0Bvh1FZQAAAAAAAICfOBk5L69p/sMq5nNFrZ8e5C+rlJft6Vh4XfkN9gRfl+usuGLa2b9NOz9s8d2/fHHxySlHfpeR83IS79XZ1YMuByXNgR5/l9P74HLgPbJ5MPxyiudQv5D6OfFIONCnv7X0NzuJTR3gZpCunLC8X2+RcPPivTvNNdP5LPQ3mOK1dP6C9EsdWxkAAAAAAADgp0xGzsvLmb+d1/DU6rp/lrSn7uctKqxPvSTbjT2hsydUoz01s/KFz8/8fk7Vf086/6vPDzzd3xzYc+9euBOFQPIc6A10oxD4IHPgvf5cqkc9Xic8k/7KCe9C8/YAn0yxvF+bSn8zYp8f77Mn8RakayOsgeItqNdM87Mk3GDq51CXjs6Wx3syAAAAAAAAANy7dy8j5+XFDU9n3P115u1nVte9url1zPJbb50Tb793717PvR5LQLutefakM89mXB06r+qPs249lXbyl+n7+50Dw509oXDcHOgPdruiIXDgOVBvDWnNIY05lEwO/JF5eEbqCbfk4dnUhxAoDgAAAAAAAPBosaRg5Lxrz2TUPznr1lMZt59ecvevMy4+f1pUFu4OomnALyv/tPTu3+ZU/fesW09Nu/rrccef+HzbH+l/P7Cn516osycUjpsD/aFul68r+RxoD+utIY05pDIGFYagXN/rI5MDH/gG0IkxD3xTH0LoVw8AAAAAAAAAHip2H1s+59vnM5t/NevWU8gJZ5/ay1xWUJOe8sNvp155OvP2M7Nu/QY9lH76V2OPPvFF/l8OnlpHZ+U9PZGZQIoc6PZ39TcHmp1hoy2ss4TUpqDCQIx/j1IOfOBAjBkIUD0AAAAAAADgEaWurTJj7UtzGn+N5cC0M09O+OG/P/vhF9gS5BcXnxx79ImxO36dkfOyUN6acM2REEiZA72BbpePbg60OMNGe1hnCalMQZUxqDQGlQbIgQAAAAAAAAAAAP2nYOekzN3D0KWhs249lX7+iUkXf0kIgVOv/PqzY0+M3v/ElLxhpfsyCGtorapqrapqq67uqK1l1dez6+tZdfVtd2tbqu82V91pulXVcON2rHKRzI1CIHUOdHWaHJGLP9XmkNoUpJ8DOzs7IQcCAAAAAAAAAAAQUeuFSwpGZn7z/KzbTxHi36xbT828+dSk80+OPfrEJ/ufSM3/05KCkVa7Dv/y8uXLv3jppa0LFnyVk/NVbu6O1atLFy/enJm57ssvsyZMWPrJJ/PefXfmiBFTXnwx7fnnx/zud+8/8cTb//mfI/7n/xzOYLQ3tFHkQIuzE00Aai2Rn36BHAgAAAAAAAAAADA41LVVLikYmVHyt5kXnp5x/dczbjw1/fqvp1399eTKJ8d//8SnR5/4ZPev0rOfX1IwUq0XEl47d9Sot372sw+ffHLsM8+M/9OfUv70p/HPPjvuj3/87A9/GPvMM6N/+9uPfv3r95944t2f/3zkf/3XWz/72b/+1/967X/8j1eHDBnOYFz+/jRpDrQ4wwZbWGcN6awhyIEAAAAAAAAAAAD3BbVemFUyZnb2y9PLn59y4JmJPzyZ9sMvxx98ctyO30wofHb66n8U7JwUGwLv3bv36e9/P5zB+PT3vz9eXt56u2rdtOlzRo4qWbzk7P4Dyz/9LHPkqHVTp984dQbd/ipv3Y1TZ7YuWvLO//75cAZjZ04ePgc6PJ1mZ9hgC+ttYT0KgQPOgaFQKBQKQQ4EAAAAAAAAAAAgp66tsmDnpIycl2dmvTRjzYsz1ryYkfPy7mPL69oqSZ8vYjKHMxgbpk+/h34Ypqsn3BkxhNn3d2ICoW6Pv4vZ0PbO//752P/+PcqBKAGi/wAQciAAAAAAAAAAAMADQChvFcpbSScA8WyYPv3T3//+3r17PT33OnEhMH4O7PYGuj3+Lo+/q+bqreEMxp3LNy3OTvTfwUMOBAAAAAAAAAAAeKjRKxTDGYzj5eWxITBeDvQHIyHQ4+9yers+//s/Zr450uwIQw4EAAAAAAAAAAB4KGg4fvz40qW7U1NJXfvKKzN/8Yvi997blZpK7U5kSsqO8Sk7xqdUjE+pGJeyfVxK9ksvz/zFL8rHjcfcNm78ts8i7p+3+MreI5ADAQAAAAAAAAAAfgx8TufW994rePGFXR/8v+PTp5xdMi+xi+eeWTz3zOI5ZxbNObMo8/TCzNMLM04vyDi9IOPU/Nmn5s8+OX/2yXmzTs6b9cO8mT/MnfnD3Bk/zJlxXglSHQAAIABJREFUYs6ME3Omn8ic/n3mtO8zkFO/mz31yOT0XR+8t+Eff980cpRUak4iB+ZADgQAAAAAAAAAAKDPmbVrN//z5WNTPpd8f9B69woNL1vuXDJXXTDdvmC8XWm4eU5/46zu+hnNtVPqqydVl39QXvpeceE7eeVx2flj0nNHxWeOiE4fEp46KPjhW/6J/bzvvuEe38s+9jXr6Fcdh3cxD+1sP1BRVZx/aGJq4csvHV6RnUwOzIEcCAAAAAAAAAAAQJt1L/x979jRsgN7Tae+i6fx5HHjD8f1J/6tPXFM8/1R9XdHVMcPK48fUvz7gOzYt9Kj+6VH9kkOfyM6tFd48GvBga953+7m7t/F+WYna29Fx57tzK+2te8ua9tV2rJja+O2zTXF66sL197IX30td+WV7GXICysW7hnz8dq//jWpHJgzODmQgeM+lRsAAAAAAAAAAOCBs3bo8xfnzTEf/DZW04FvDQf2677dp93/jXrfXuXePYo9X8m+3i3ZvUu8a6doR4Wgopy/fRu3vIyzrZRVurWjZEv71uK24qLWok3NmwubCgsaNm6oL1hXk597c83KK8sWVy6Yd37+nHgem/J57vN/TjoHBoPBQciBpLcBAAAAAAAAAAAeJ/KGDW1Ys8r61Vd4zbt3G3ft0u/apd2xQ11Rody+XV5eLt22TVJWJiopEWzdyi8u5m7ezNm0iVVYyNy4sX3Dhtb161vy85vWrm3Mza3PyanLyqpeseLq/PmVs2efmzGDjt9NnrR26PNJXxcaDAaDwSDkQAAAAAAAAAAAgATkDRvauGqlfefOiDt21G0qaDh3quHcqfqzJ89vWte2aqV8yxZpcbGkqEi0ebNg0yb+xo3cggL2hg0d69Yx8/La165tzc1tzs5uWrOmYfXqu8uW3Zg799LMmRemTSN4fOKEs3t3Xjiw58KBPee+2fXN2I8jD02ffmH69BOTP38YcyDFwnhXkFJcXEr6Qmwhxctjr1nFvyr2JbFvBNe7AgAAAAAAAACAyBs2tGH1Kuvu3dbdu627dpnLyy8XF/j9/s7OTq/Xe/XotzVzMmSFhZKCAtGGDYL16/n5+dy8PPbataycHGZ2dtuaNa2rVjWvWNG4bFn13LlXp027/OWX8fxu1jS5XNLV1eX3+8ViwdcpY65On3Zt5ozrs2beyJh9+ovJDz4HxgtUhNuxeSzeCknfgubaEi4kXT/pOulsLQAAAAAAAAAAPxHyhg2tz1pt/vpr81dfmSoqjGVll4sK0G+u2O32a0cP1MyaIc3PF+XlCXNz+Tk53Oxszpo1rNWrO1aubF++vHXZssaFC6tnzrw2ZUpCT8ycqlLJOzs7nU4nj8fZmzq2avas6syMO/Pm3F0w79z0Lx98DiTciHc74RWk8aYE+7U2+uEw9h0TrhMAAAAAAAAAgJ8secOGbn7mmfI//7n8uefK//Snbc8+e2jxvFAo5PP5TCbTlcP7N/32qdL//u+SZ57Zivzd77b87ndbnn56y9NPFz/9dNFvflP4q1/RtOi1V1QqeTAYNBgMPB5n42svbf7Nbzb/5jebf/uboqd/W/q3vz4sOfBefzIY9aRc0m+R3DZADgQAAAAAAAAAICF5w4Ye/nzihexszBOF64LBoMvlslgs1/598NCUSfhHC555ZjSD8VYi3//Zf5S8/trRKVPwrz2+erlSKfd6vWq1Wijk7/4iHf/ov6dPe6hzIJ3ZtnivpfkWA98GyIEAAAAAAAAAACQkb9jQuvw8y/ffm48dMx4+bDxw4HJpkd/vt9vtdrv9xvHDdxfOV27bpigrk5WWSktKSv7wh7cYjBQGYzqlpWNH7/rkY+7ly5L9+zkbNnALCngbN97My5HLpU6nU6PRiMXCY7Onisu3SXdUyL7aJd+359qqZQ9RDrxHlr4G5brQ2Ieor/Cksw2xr4IcCAAAAAAAAABAPPKGDa1dtdJQWqovKtIWFGjy8y8VrnO73Tabze123zx++Ob4z0Tz5gnmzGHPnNmUnr75iSfeYjCmMxjLKN09JpID+Rs2tH35ZfvUqczp06/NmS2Visxms16vl8kkRyaO5y9ZIly5QpSzRlqQf33ZorVJ/v+Bg5QDfwQGHsMgyAEAAAAAAAAAMEDyhg2tWblSX1ys3bhRvW6dKifnYmG+zWYzmUwej+fm8cM3Ph0jyMhonzSpYfz4hvHji+jlwCPzMnd+8hH38mXRxo0d06axZ8xgz5x5Y16GSCTQaDQWi0WhkB37PEW0bJlk9Sp5fq6qeOOt1Utzn38OcuB9XwMAAAAAAAAAAD9x8oYNvbt8ubqoSLVxoyI/X5aTc2Fjnk6ntVgsPp/v2tFvL48Z3TBxYm1qKnLzL3+5+/33O65e67hylXn5SvvFS62Vlc3nzjaePlV34vu7/z5adfjAzW/3Xt2zc/M//s69fFlUVNQxezYrM5M9d+6NhXNZLKZGo3E6nTKZ5OjkNPGaNdKcHPmG9erykqrcVQPJgYFA4LHNgaRXkwIAAAAAAAAAACRH3rChVcuXKzZtkm3YIMnLE2Vnn1mQKRLxHQ6H0Wg4nL383Afv35kwAfNUauqOt946Nm3aD/Pnn5g//8S8eSfmzft+7tzv58z5bk7m8cyMf2fMPjZ71r5xn30zZoxNo+FmZ3fMm8desICzaNHVtJSrF04ZDHqbzXbj8rmj/2+UZO1a2bp18sKN6l3b76zLzn3+ObUpoDYGVMaAyhBQGgJKvV+h9yv0frnOL9f5ZTq/TBsRLZHrA1gODAQCD3sOBAAAAAAAAAAAeODkDRt6e9kyceEm0fr1/LVrednZVdOnHZj6+eFVi7+dN/Obt/91LS3t1uefY9YsWOBzu2lqqK5mLlzIWryYvXQpZ/ly5uJFh9M+O7B03oFl8/aPG926aKF0/Xp5YaGyuFi7e+ed/Ozc559TaN0KjUuucck1LpnaJVO7ZCqXVOWSqlwSlUui7FWqckvVHqnGm5OTAzkQAAAAAAAAAACALnnDht5ctpS/sZC7bh07N7djzZr2lSsb5s+/lD7h3LhxVydNujZ5MsHrU6bc/PLLW1On3p4+vWrGjDszZ9bMnl2bkVE/Z07j3LlN8+a1LFjQunBh+6JFzCVLOpYtYy9fzlm5krtqFX/NGu6qVa2LFzUvXMBds0ZWUCAvLFQWFanLyrQ7d1xeOC/3+eekCqtUbpXKrRKkzCqWWcUyq0hqFUktUa0imU0kt4sVDonKBTkQAAAAAAAAAACgH+QNG3p96RJ2wcaO/Py2nJyWNWuaVq68mZFx+csvSb0ydeq16dOvz5x5c9asWxkZtzMzq+fOvTtvXu38+XULF9YvXty4ZEnz0qWty5e3rVjBXLmStWoVe80ablYWPydHkJsrXLtWnJ8vWb++NwSWlGjLy3Xbt1+Ym5H7/HMikUEk0gtFeqFILxDpBUK9QKgXCPR8pFDPFxoEIqNAbBZKLSKZTaxwQA4EAAAAAAAAAACgS0/PvbxhQ68sXdK+oaAlL68pJ6d+9eprc+ZUTptG4vTpF2fMuDxr1pWMjGuZmTfmzr05f/7thQurFy26s3hxzdKldcuW1a9Y0bhyZfOqVS1r1rRlZTFzcjpyc9lr13Lz8/nr1gnXrxdv2CAtKJAVFio2bVIWFam3bNGWlurKy3Xl5RfnZOQ+/xyfq+ZzVTyuisdR8TgqblQOR8XlqrhcNY+n5fN1AqFBKDaLpFbIgQAAAAAAAAAAAP2gu+de3rChl5Ysblq/vmHt2trs7Mvz55+dOTPWczNnnp89+0Jm5qU5c67Mm3d1wYLrixbdXLz41tKlVcuX31mx4u6qVbWrV9dnZTVkZzfl5rasXduWl8dct461fj27oIC7cSO/sFC4ebN482ZJcbFsyxbF1q3qkhJtaal+2zZDebmhvPzinIyc5/7EZkoxWUwpqz0imyljd8g5bCWXo47kQIlZLLdL1W7IgQAAAAAAAAAAALTo6YnkwIuLFtXn59dkZ19fsuTMzJmxnp0163xGxoU5cy7OnXt5/vyrCxdeW7z4xtKlt5Yvv71iRfWqVXfXrKnJyqrLyWnIzW3Ky2tZt651/fr2goKOwkLWpk2coiJecTF/yxbh1q2i0lJpWZmsvFyxfbuqokJTUaHbsQN5YW5GznN/YjYLSGwRstrFbKaUw1LweBq+0CCUWMQKh1TjlesDkAMBAAAAAAAAAAASg0IgyoEXFi6oyV17felS6hB4ad68y/PnX0EhcNmym8uX3165snr16rtZWTXZ2XW5uQ15eU3r1jWvX99SUNBWWMjctIlVVMTZsoVbUsIvLRWWlYnKyyXbt8sqKuQ7dyp27VLu3o23cl5mznN/aq1j9bGB3d7I62gWsNqlHLaCx9MKREaRzCpRuWRav1wfkOuDkAMBAAAAAAAAAAAS09Nzr7unJxgM5w0bem7Bgutrsk9mzv0hYw7Bk5lzT8+df3b+wnMLF1cuXnpx6bLLy1ZcXbnq2qo1N9Zk38rOrcrNu5OXX7Nufd36gvqCjY2Fm5o3F7UUbWnfUsIsKWWVlbPLt3O37+Dv2CXctVu0+2vJ13tke/bKvvlG/s0+gpXz58bmwLZGTkeLkM2UcjgqPl8XvRbUI9cFcP+PPORAAAAAAAAAAAAASnp67nV39/h8AYPOkjds6Pfz5x9cuPTAgiUEDy5cemjRsiNLVhxduvLfy1d/tzLr+1XZJ1bnnMxaeyon/0zuurNr15/PL7iwbuPFDZsuF2y+srHo2qbi65u33iwqubWlrGrrtjul2++WVdRu21FfvrOhYlfjjt1NO7+K56m5feYD2+rZ7Y08VquIw5LzeBrcNKAPTQNCDgQAAAAAAAAAAKBFT8+9np4evy9o0FnEPHn2n54tevWfD4XD/7nmD7+PhMAGDrNFwGZKeRyVQKgXSS0SpVOm9RISIORAAAAAAAAAAACAxPT03Ovq6nY6PFqVUcSTX9l/7PI3Ry6RebGvl/YeufTN0Yh7+3hxcDxyce8RZhOvo0XIYUp5HJVQqBdJzRKlQ6bxKPQBhYGYALEcGA6HIQcCAAAAAAAAAACQ0NNzr6fnXld3TyAQcjo8VrPTZLCZ9FYjTgOmLqIeqbXqtFadxqrVWLUaq0Zj1WgsGrVFo7aokSqLCqdSaVEoLQpFRLnCIpeb5XKzLKpUhjRJZSaJzCSRRhRL/z97d/8lRX0g+r9++P4B927OJmxOztl7zu7m7s1u4h5zk7C4mviQ7OiaxCViUAOS67ohBnUYmQdAZYiIrXEyAxqYqBiMiEQdGAVkAAkTBcVgAFGUh+FBYJinnpme6eenqe8PJW3ZVfWp6p6q7ur+vF/nc+bU1FR9qrpmMP1O9fQMnjgVPHlm9NS58TMXomf64mf6Eqf7EtYduDidTsdisVgspmSzWToQAAAAADQTF38zMHNxpDOfjFRmIpX+ZCTT2WQqm7g44slsPJmNJbKxRDaayEbj2Ug8E45lwrHMeDQzHs2MRTOhyCdjNJwZCadHxtPD4+nhsXRwLB0cSw+FUkOh1GAoNTiaGhhNDYyk+kdS/SOpvuHUheHUhWCyVxtDyfNDyfODyXODybODybMDiY8HEh/3J870JwrowImJiWw2q9UgHQgAAABAcp/8rYisWuUdyP1AAAAAAFBVdUL9JAIL7cAEHQgAAAAAlSh3M7Ba7wd+8j4xud8PzGazdCAAAAAAaWlvD1O9Hah7v9DcLwfSgQAAAABkVnwHJiumAz95XWgmk9G/T8xaAAAAAEDVye9ALQX5/UAAAAAAqFaLFi369PcD0+l07pbg4sWLQwAAAACAqqN1YCKR+LQDtRSkAwEAAACgKuU6MJFIKOl0OndLkA4EAAAAgKq0ePHi/A5Mp9N0IAAAAABUKzoQAAAAAOTymQ5MpVK5XxE0dmC539oUqGD8OwIAAEApFdaBuRQ07UBX0hOQzdrPdmAZzwQAAAAyoAOB8qMDAQAAUErFdGAqlZKqA5ctWxaNRst9FqhmdCAAAABKyWEHJpNJOhDwCh0IAACAUnLSgZlMxpMO3LH6y7bbvL11vtUo6FiTUfoOvKdhWW65cdmTpTw0yoIOBAAAQCk578BkMllMBxr77eRHO05+tGPH6i9PZEdtU3Dv5rpkKqONSQbhuT17/jzr2iOB+/LWHwnc9+dZ157bs8dqR9sOXL9pj3g4PMOcexqWff+WWdoyHSgDf3bghx8d27nrjZc6NjMYDAaDwWAwKnfs3PXGhx8dy3um57ADU6lU8R2YC7lkKpNKZ1Pp7NYVf7d15d9NZEe3rvy7rSv/TnD4N19dEE+mE8lMIpnWN2FufPDqz52k4Lk9e/4883vnpv/wzzO/p0/BI4H73tHW//h7VinopAOPhFSr4aQDf9C668Zfbf7JQ8/fcf8T9zQs04aWgnSgDPzZgWfPDQ4EQyoAAAAq2UAwdOL0hbxnes47MJVKFdOBezbfG0+mcyOdyW589G+zkYPZyMFs+GA2fDAbObjx0b+1OvzuzoZoIr3i+beXrn5d34QXFzLHd913xEEK9qxf+84NV0ebH4guvf+dG64+cPfsnvVrD9w9+50bro5cXNmz3vxaOOzAx554WTzEZ6invx/44//Kv4GJ6uPbDiz3f7UAAADgguI6MJ1Of6YDk8lkOp122IF/eqUxmkjnhnY/8PlffvH5X34x0/fc+l9+cf3SLwoO//rGhePRdDiWHo+l9U1417KO2Q3PxRLpM/taj++674NX5+7ubBA/kiOB+/b9+7fD99ZH7l1w5qe3vvPvV5z56a3hugWR+Qve+fdvG18vmuO8AwV3BQvtwNzy1GtmhUKhXcs+v2vZ553PgMpCBwIAAMA7RXdgMpkssgN3bVw4Hk3rRyKVTaSyzyz8fPrkg88stGmbbS8vDkXTK55/+7G1b+qbMBxLh6PpcOzT8frGhXZPa0Mf3LHg7cunhf/rF+HbfxG+/c7I7b8I337n25f/6wd3LBDsVVAHBuPmo6AONNq17PMT2VFxCv6jmckcFCVDBwIAAMA7Rb8u9JMOTF7k/HWh219eHIqm80Y8lY2nsr9d8LkDB/eKD7/lxQeGx1PD46mR8ZS+CZc9ufu+lV33PvLqnb98+fZFL4Qi6W0v55+Pqbe//o3eb14xPmPO+Iw54zfOufDNK97++jfEuxTUgSMJ81FQB+5o/uvc2H7x40R2dCI7umPpXwt2JAIrFB0IAAAA70ymA5PJZDEduPViyOWNWCITS2RsO3DTC0sHQ0mt/fRNaJxwy4sP2D2tDYVCobf/z7/0/su/jtXMHK+ZOV4zs/df/vXt//Mv4l0K6sCxhPlw3oFbF30uO/5Wdvyt7Pjb2bG3smNvZcffzo6/lR375NMtiz8n2J0IrES2HagoiqIoeWu8PivTDtTOJG9Nqf4LVobDAQAAVIHJvE/MZzrQ+etCO19YOhhKWo3OF5aKD//SumUXRpJ9I8m+kaS+CfPuBw6GkpvspgqFQh/cseCt//XPY9+erh97/9c/ufi60P/vu/cZR0EdGAqFNi343MYFf7Wx/q821f/VpgV/tXHB5zbV/1XmwjOZC89sqhdFoIYIrDhV3IGuZxsdCAAAUKjJvl+o9ufkE4mE8w58ad1DF0aSpqNvJPnSuofEh9/w++Xng5+0n74J9ePiVMvEU31wx4K3/uYftfY7+pVL9k7530e/csnYt6eHvv2fe//mfwtSsKAOjKVceJ8Yoz/c8z8zF575wz3/czKTwLecdGDos+1Xxg5UPxtjdCAAAIDPTbYDExc578D1zz58Ppi0GuuffVh8+Od+9+jHgwlt6Jsw737g+WByw++XC+Y5/fSGvZ/7h0+q73P/8MEdC04/veGDOxboV55+eoPpvgV1YDJlPib5fqHrf/E/1v/ifzifAZVlMh2oXGTcOG+bvAltq7KIDsydTN6neWuMswkmsZrK9AScrAcAAJBN0R2o/emIYjpQH3LG8dzvHhUffu2aX50eSKx4/u1HnvnTZKY6t2fP3s/9w5l//r9aBObWayl4+p+/vvdz/zCZvyO/ftMerQNTGfPB3w+EgMMONF0w3cZq2flsIWEHihecr8xLRNtjiTdzuB4AAEA2k7kfmE6nlXg8Ho/HC+rA3z3dcnogYTpO9Sd+93SL+PBrnvp1T1+8py9+si+ub8IHHt8xP/DKfz+w4XR//FR//FR/Yu2aX4mn0lLQ+PpPLQWtIjDkoAM1WgdmMuZD3IE/aN114682/+Sh5++4/4l7GpZpQ0vBxmVP2h4alc55B4Ys7g2a9p7Vsv7emuCsxB2oGu4NOulA4+1Bq5kL2szqjqLp/UMAAADZTOZ+4KcdGI/HnXfgU0+2aiFnOp56slV8+CefbM0NfRPqP2oLa576tXiqojnvQPFwfkT9/UA6UAaT6UDxzT2rDnRyVl50oO1s4gXbSZysBwAAkE1xHZjNZovvwPb2FeLh5PmoRt+EpsP5VAVx2IEu0v9+IB0og4I6MOT41Z5Wy8YONC1D2w5UrV/Y6VEHmt7fowMBAADEytCBVaD0HQjZTKYDQ4W/LlS8S06hHajqXpBptU3eBlav3jSuzH1K3QEAABTKnQ4s6PcDAdiy7cCyMO1AdxF1AAAAJVB0B2q/IkgHAp4Qd6BizdOzogMBAACqw2Q6MJPJKIlEQsLXhQJe434gAAAAvONCB2opaNWBAIrj/N9kyZSgAwEAAFAC7nSg4HWh5X6AQEXybQcOBEPlvjYAAACYlIFgqOgO1FKQDgQ84c8OHBoaOTcwymAwGAwGg8Go9DE0NJL3TI8OBMrPnx0IAACAakUHAuVHBwIAAKCUnHdgNpulAwFP0IEAAAAoJW878KWOzQwGwzjoQAAAAJSR5x3o4T0UoDLRgQAAACgvOhAotUl24JEjRzz/a4ZmynVcAAAAFOrIkSN0IOAvRXdgrsR6g+ESD+f/Tak+2gMv91nYqIiTLCOpro9UDxYAYMX2mZuTDpyYmKADAdcU14FaBJ4dHC/vkDYIK+KJdUWcZBlJdX2kerAAACuC52wOO1BLQSWZTPqtA3/84x//+Mc/1hZya7w+KDAZRXSgFoGn+kKn+kKqqv7jDYF/nNn2L9qY0zZ1TvvUOe3fmdt+KJRo7jqjH9ouXgzvanDbsi9tW/Yl16edvIp4Yl0RJ1lGUl0fqR4sAMCK1RM25x04MTHhQge6G2mms00mCAvaheBEcQrtQC0Cj58f0UZN+6Ga9kM3tB+aufbonA1H52442tR5tLnrTFv3me/MXXsolMiN5q4zub08Gq6n4LZlX5pIjfqzA0PW/8Xc/VrAapT4DEMWJ/m9+pdqGl++rqnj+4s2/ud9nTc+8OrM5i0/eXDrbQ9tuz2w/b9/tePOltfvav3jPW27S3/CJSZVHUn1YAEAVkyfsBXWgZN/XSgdCBTXgR9+PKyNf7whYHU/8Dtz278zd60WitrI7eXdcPHGoBaBWgf6866goAOTqYxxfPDqz0ufgqYn+ZMn/1K75WzjtnPNO3sD3X1P7B145s9DLx4Mbnl/9I9HQ2/3jB88Hf7gbOSeFfJ24K3zHpl9z6/m1D72/+pa72hom9v0xLz7Vt3T/Nt7l61pfHjt4seeW9K6/sGVG0p8tpNEBwIAQn7owB9/Vt6X9B+NXzVGV95UeflnPFDeJHl72e5itSU1iEIV2oFr1649fGooN1YtvER/008wVi28RL/j4VNDiqLkrRGvF39JPyafgtuWfSnZ+5v08NbcGPtomVUKKjriaZ1sY7qX1ZdM/6O5+7VAIplJJDPxZCaRTCeS6UQqE09mju+674gwBQt6IIJzy1tpPMnv1b9U06C/H/jKJ/cDl2+7/ZEdP/vVzp+37Lqr9Y+mHej8JMVn5R+m38S2tZ1vHep5891j3e98uKGze/sbh7b88d1NO/d1bHvrxS171r/6xrrO7gcft+zA4i5RCZCCAICQxTNM8S5e3Q+06kDjBoL7e8aus9re9KvFTcgvImKSiujAgz0DuaF1YH/CfqxaeIl+x4M9A9rzVCcrixiTTMHOB76YPH5f+sLv9GPsvfrOB75o3Fj/bFvwzLvoJ+WFduDrWx6JJTIrnn/70WfeaP7NzgWPbr6z+aVYIn1mX+vxXfd98Orc17c+ansgh2dbXAd2PTXz779Tazu6nprp8IgVxHj+pt/EW+c9srRl3S9bn1+2Yv3yJ158dNVLj/22o/XpTSt/9+pvfr+1fd22pzdsf/DxP9gewm+Xiw4EAIQm34HJi1x5XajzcrO681bQbMZ7fcYn6OJdrI4IFKSIDtx/rD83ch24oevQhq5Da7sOre3c175hX/uGfW1ruwNruwPt3bkO1O+4/1i/lnxOVhY3JpmCz8776+T+n6ZPLH923l/rl41b+q0Dt29+LBxLR+IXRywTiacjsXQ0ntHW7Hj1MdsDedqBW9pvueS6xq9cMfcrV8xVM+ol1zWaji3ttzg8YgVx2IG/enJj7p/kvvdOmv7j/dWTG53M7yt0IAAgVLkdaPV8uojZBGtsd3GyAWCriA58+8MLudFa5/R+YGvdJfod3/7wgqIouY+ma3KvbcvbQL+l/qvG4TwFTV/zqeWf1n765TxW+aR/YV7eqxn1H/O2NN3XdJuQxX80t3a2jkfTK55/u+X3ex5+unvpqp2LWrfd+8irdz3Y8bP7/zAeTW/tbDW9CKYPRLzS+HiN52k8yU2rZl1589Lv/GfDd/6zQc2oV968VBvzHlgT+E1n4DedbWtea1vz2oe7HhSfpH6N8YoZN7D6NO+cTS+46VEE3zXBLnmbWXXgnr8cf+svx/ccPL7n4PE9uYWDPdrCWwePF9qBTh5p0Y/a9gIKHiwAQDb+6kDV4nf28pb904G8LhSuKKID33z/fG48XHepw/uBD9ddqt/xzffPK4qS+2i1Rr8+b8G40nQ4TEH9O8Hol7WbgcZlPdMn906SycmWVhvnvh1iMg9xAAAgAElEQVTG83mlY8VoOCUYnR0rTS+C+IGIT9VqF9OT3LDytpl3tsz62UNqRp15Z4s2fv3kloZlv//Pe1ZfcdezV9z17E0PdOx5/TdOTtJ4fYwXMO9Uxadt9d2x3cDhPHmPyPSb+PCql3L/JP/0zoem/3gfXmXyulDj/M4f6WQete0DFzxYAIBsyt+BquGXAG1fiqlfb5zKuGyc0HQSq4qz2kXwmlXTeQArRXTg7kNnc6N53jcPhRIh3X2/kGFBW26ed6l+x92HziqKol/I+zS3rDHdxbhsOpykoP5PRAj+XIT49wONpWebHKZbijfO+3YYz+elF38THE8JxksvmvSV1YG86MDft/6/u+9/auEDq9SMevf9T919/1NPrO1q/vWLV9z1bOClg09s/uCJzR8EXjp4xV3PvntsUHCSxZ2h7bV1vjJvAyffcYcd2Ny2/vU97+/c837uo3E0t6037lhoB3qxQaE/sQAA2fiiA/WMvTf5J9mAzxXRgTsPfJwbTRc7MO9+YCiRyBtN876p33HngY8VRdEv5H3qcCFv2WrYpqDWfpFzm7Sbgbllm/+MhUIhx0/3HaadeConz6rXb/jtYCi5ads7X7h01opntg6Gkiue2fqFS2ftO3BSv76IB+JWBz71q/9+sOUFNaM+2PKCNjZu3vuj+1+e1/7mwmf35ca89jd/dP/LgpMs7gy968CCTizH9JvY9Min/xO2c8/7pv94mx4x2ZEOBAD4Hx0IlF8RHdi1/3RuzP/vaVoH2o75/z1Nv2PX/tOKooiXnSzkLQuGOAW3LftS8sxj+j8Uof2tiFeXmNwAzOO3Dnx23dN9owkt/L5w6ay+0YS2sO/ASf36Qh+I6Z0u8WZWJ/nEwz//zZpX1Yz6mzWvamPHH//y1TntMx/dOSOwIzduX7n7q3PaBScpOG3jmVRWB85/8MnOnfs6X3+nc+e+nXve79y5zzjmP/ikcUfvHhQdCABwi4860PZ1nkC1KqIDt+w7mRsFdOBt0/Q7btl3UlEUJ8uavC9ZbS8e4hTsaPqbvL8VkTx+38tNf2P737K8Z7p5ReTkybFxS4fRaPofzdXPPNc7nMz1Xu9wMteB+vWmDyTvTPLOR5B/pptZnWTLg/N+/8J2/Xhjz3t/f/Pj0xo3/e1/PZcb0xo3/f3Nj9ue5GQ6MGS4+FYTOvmOFHdipt/EXyxelfsn+Vr3QdN/vL9YvMq4o9WDcv5IJ/moBVtaPVgAgGx81IGAtIrowM69Pbnx89sud9iBP7/tcv2O5Rpr164V1ODz8z+/fv4X1s//QvrE8uR7c9fXfcHRf8zKx/Q/miueeuFsMJ7rvbPBeK4D9evLeJIPLqnNjZfWLN376mNHup+44q5na5q3Tm3YeOn8ly+d//LUho01zVuvuOvZkp1nuVj9/UAno/RnO0l0IAAgRAcCflBEB778xvHc+OltVx4KJZwc6Ke3Xa7fsbxDfGPw2Xl/nXxvrulbg/qN6X80W9r/cGYwof1O4Ipntp4Z/PR1ofr15T1Jo3ePDX7hBy1z2v54w0Pbfrisa07bH7/wgxbj+8RUHxfTSLHg1vyTRwcCAEJl6UAGg2EchXbght1Hc+OnN1/pfOh3LPsQ3Bi0+vsQPmT6H81HVr18qj9uPRKv7jpY9pM09e6xwW/f/ewXftDyhR+0fPtukzcLrUpSpZFUDxYAYKXUHQjACdsOfH7Xh1Uz1l7k8M/N+43pfzQfenzj8sc3PvT4xuVPbFz+xMaHPvm4afkTG5drX3rC5O+Pl/gkkSPV9ZHqwQIArEy2A1OpFB0IuM62A5/dcaT6RoUGYUU8q66Ikywjqa6PVA8WAGDFhQ7UUpAOBFxk24Frtr1fxWMtAAAAPEYHAr6z1q4Dxf9KAQAAAAE6EPAjOhAAAADecacDU6kUHQi4iA4EAACAd1zrwEwmQwcCbqEDAQAA4J0q6cBAIDB/fmD+/EBpDgd4jQ4EAACAd6qhA7dvf/2qq67q6zt01VVXbd/+egmOCHiNDgQAAIB3qqcDNc47UFEURVGKO6KiY7tl3oLpV4E8dCAAAAC8U9kdeNVVV6mqeujQIe1FofPnB7QO1NaLOexA235z2HJ0IApCBwIAAMA71dCBqqrmOjBvvRXxbTrTLa1W0oHwgrsdqChKQduXd1oAAAB4bbIdmL6oXK8L1V4LGggE+voOBQIB7TWitnuZdqC2rL9PaPX6T9MOFK/M+6rDl5VCWr7tQNoPAACgClR8B6qq2tXVFQgErrrqKq0DnewiyDPBBnlb5oWcww4s4l4iJEQHAgAAwDsV3IH694bR/35gbr3VjlY392zv8pnOUOj9QDoQTpSgA3P/X4ZgpdWn2hr9vsbZctsYVwIAAKC8KrgDc7TbgLmPttsrBrn1+m2MK41ftdqSDsQkFdeBR0736kduvbG+TNtMEGmm29iuNG6g3zLvbBkMBoPBYDAYXgzTZ3cV34Fa++X+jnwgEOjq6hJsL+g6tzrQtC3FmwF5iujAI6d78ybJfWkyHWi8JSjeUbxSrywXFgAAQDamKVjxHXjVVVd1dXXp/468+H1iCu1A1SzYjPcS87a0vQ1oPCKgV2gHahFo9Y+26A4U39CbZAcCAACgBFSzFKzsDtSSz/h35J28ZSjgZ9XagQQhAABAialedGAqlSp7B6qF//1AwOdc78C8l3fqV5puabsm5Ox9YvKW6UAAAIASUz3qwDL+HXmgWrnbgQAAAJCWSgcClcLFDlQMxP/CAQAAUE1UOhCoFNwPBAAAgCtUOhCoFHQgAAAAXKHSgUCloAMBAADgCrVaO/APf+l+oGuNcfzhL90lODrgBToQAAAArlC9+/uB5e3AY4NnE4lz2giNv31hYK02HuhaU4KjA16gAwEAAOAKtfr+jvwjrxye1tTx9TvbpzV1zFn15uZ3z/aNnn7vdHfnO090vvPEvS8+IdhXe+NE4xr9+rxPcysFnzphPBCQhw4EAACAK9Qq68B/ndf+fxe8tPO9Xu3TLX85O62p4+ldxw9/3POz3z7ys98+8tjuPwh2FweePgWNOwo+dcL0QG6hLauDWx344UfHdu5646WOzQwGg8FgMBiM6h47d73x4UfHjE8I1WrqQO1OoLbcPxrTFt4+PphbKWaaeXQg/MOtDjx7bnAgGCr3owEAAIDnBoKhE6cvGJ8QqlXTgWu7jykzVp8aCKuqOq2p47FX3//6ne2/WLNPVdWv39k+dOaPO9u/vLP9y4d2LrKawaMOzLvHaPXKT8FBjV8SvH7VdEtecVodXOzAcj8UAAAAlEiVd+Dda9/+2tx2VVXnrHpzzqo3VVX913mfdqCaiUxEj09Ej+9s/7LVDF50oMP1qsXvBxq3z/tNRfFJCg6HSkQHAgAAoFCydKAyY3VP/7i2sO/E0KmB8NfvbJ+InkifWJ4+sbxj+d+a7i4INkGe2e5uXLa6NWcVdXnb23apbc2ictGBAAAAKFSVd+DiDe/mOlBV1fadx7SFr9/Zvu/EUO+xnS888KUXHvhS9yt3me6uGOTWm24sXuP8NqDpLg5vPNKBsqEDAQAAUKgq78CX3jr19Tvbe0ci7TuPff3O9kdeOfy1ue1fm9u+7eD5R145LN5XEHt0IPyjBB1oe7/auKV/froE/z9O0SdptaPVVTL+d0Owme1RPFLc4fzzjVZ9djIAAPhclXegqqpL/vBu7bPv/PGDPu3dYjRr/nisfeexD08P1z/+p/rH//T6XpMmLKgDBU+UjV8yfcLn5Hm2/vlr3vNa0xlMD23cwPgwUUG87kDbenG+cVk4/P9ZJj+hk/+3paB/jOLTc/3yul7F3u1YsgkBAKhi1d+Bqqq+sPfk4g3vam8VM2fVm4s3vBtPpuPJ9Gg4fm5o/NzQeP3jf/Lu6CXAsx+ZedqBtj9adKBxveB+o20iOr+A/okoOhAAgEokRQfmvHe8vz8U7h8LHz7b/+qBo68ePLr5wNFXDxz9r19uKcHRvcOzH5mVpQOtUsc0Y/IKR3zv2nQvqzvbxrviTh6C1Y07J3fLBTf9TDtQcJevoA40XhzTNcbZBJNYTWV6AoL1Vg/E6kA+fAjG2YybWZ0nAAAVSq4O7Nz10azFG43jsWf3lODo3uFJiczK24FOlp08sRbvZTun6VT6r5pu42TB9oEbK8XhAxQ8cCe72+4rvibik7Fa42RL8aX27UMQnIZgPQAAlat0HZi5KJvNlqsDgepT3teFqmYNYJVDVsu2K/UzO5zTyZq85BCcttXKyYSc7XJBEeX8+hS0mfGaePQtLvtDsDoN2/MEAKBClaADtQPRgYAnyt6BqsUze9NJio4EJ181PQHBGvFpO5nN4UkKzlCwTRHXx8UTM10jWD+Z76ZPHoLVevEhAACoUKXrQD+8LhSoPmV5v1AnMSOewXQv2/s8vupAq1qbfAeqhVwKh+dpu1DpHTiZhyD4SRA0OQAAFU2u3w8Eqk9Z/n5g0R1oOpuqexIv7iKPOtB0fnFCWFWKIOecn4zpjuLJTc/fahfjzKbnVhAn3xrfPgSr8xR8lyd5uQAAKLvq//3A1w53LeiYd03btd9vmfWD9luWbmrpPvKGR8cCSq8EHeiEW0+L/f/0ejJnaLqvFw+5LJfR3YP6/ycBAICKVprXhZatA5duarnuqVsfOvC1jafq2nfftWrH0vnrfza9fXbH/g4vDgeUnk860C0V8ey/uJMs5UOriMsoVgUPAQAAP6vm+4H7e/Z+f/VND2+5e8fR9cmJ0Jojc5Zumblye9PyLXdPb5+9v2ev7QxWL0wC/KMKOpB/aK6rgitZBQ8BAAA/q+YOnPNC7aw1M+vWz9ZeCJpWY2uOzLnjuZp71s2Z99xtdZ1LbGew+kUXwD+qoAMBAABQYtXcgd9tuf6WlTfe2PrDbYe2aWsm1MTGnoZ5z908b91d09tn285AB8L/XOzAgWCo3I8GAAAAnhsIhiq+A3fv3h0IBEy/dOnia6c1XvHNhmkdf/70twH39+y9LnDZTStvv3r1DNvJrd4sTrV77zjj69z0e5m+311uvX4G2zME3OrAoaGRcwOjDAaDwWAwGAwZxtDQiPEJoVopHbhr165/+qd/+vKXv2z61a8uvuaSJd/4yv2X5t4Vpuv97d9Ydvkl902d3j57Mh2YV3fGDcR72c5pOhVgyq0OBAAAgOTUiuhALQJnzpxp1YF1nUv+raXmmrZrOw+8oqrqa4e7vtty/RWt1/zwmZuuXDl96aYW20OYvn2F7bLtStVwS9DJ/IApOhAAAACuUP3fgbkIvPnmm606cH/P3qtXz6hpv77r8Lau97dPC1z+rccuu+GZG/7j6RtDzc1H587RRqi52eootn/sq7gONK6kA1E0OhAAAACuUH3egfoIFHSgqqod+zuuXj1j1rq5t667/ca1P5mx7tbv/fZH+3v2BqZMyQaD2ghMmWK1+yQ70PkrSOlAFI0OBAAAgCtUn3dgIBD4ss7y5csFG+/v2VvXueTKldOve+rWbz12mf5OoH6Y3hW07UBV+D4xqkXpGfeiA1E0OhAAAACuUH3egZPRXTM11BYITJkSagtoQ1vurpnqxeEIOXiNDgQAAIAr1OruwMCUKdpHbeTWeHE4OhBeowMBAJPR1tbW2NhYC1c1Nja2tbVx2UuPK29LfIlULzowq1PeDtw3s0b7qI3cGrcOYfouo4BH6EAAQNEeDgRWrFjR39+fgav6+/tXrFjxcCDAZS8xrrwt8SVSXe1A7cmqX+4Hhpqbu2umGofgXUMBP6MDAQBFq6+vHxwcTKVS43BVKpUaHBysr6/nspcYV96W+BKp3t0PLHsHAlWGDgQAFK22tjaTyZT7eWl1ymQytbW1XPbS48rbElwitYrvBwJVhg4EABSttrY2nU6PwQPpdFpQI1x273DlbQkukerF/cB0Op1Op+lAwF10IACgaNrT4nKfRXWyrZHSno5EuPK2StaBqqpOTEwoyWQymUymUqlMJlMRHfja4a4FHfOuabv2+y2zftB+y9JNLd1H3ij3SQH56EAAQNG0p8Wj8IBtjZT7BKsWV95Wqe8HxuPxeDyeSCTS6bT/O3Dpppbrnrr1oQNf23iqrn33Xat2LJ2//mfT22d37O8o96kBn0EHAgCKVltbm0qlhnX0b3s+XEJ5hxN/6nCS8kqlUoIa8cllNz20ccHhDF6dYoEKuvK2jI/LySMVbGP6pRJfPcElUr3rwHg87v8O3N+z9/urb3p4y907jq5PToTWHJmzdMvMldublm+5e3r77P09e70+Af7gBJyjAwEARTMNkrI8N6UDTZdLoNBiEWzjk2+THzqwoAknP2eh6EBLc16onbVmZt362doLQdNqbM2ROXc8V3PPujnznrutrnOJ1ydAB8I5OhAAUDTtaXFQR1EU0+USyB1OW8j7tKAZ/MC2RvQb++GyF/SlgraZ/C4FKejKO+Hud8d0hhJ/00vdgYlEolI68Lst19+y8sYbW3+47dA2bc2EmtjY0zDvuZvnrbtrevtsr0+ADoRzdCAAoGja0+IhHUVRjMvagv5TjWAX4/b69fpPnRwub1/jUWx3ydtYPKfVgUxP24ptjZg+dvF18PSyW52AeHfBmZiejKJjdZ5Dhu+ad1feCcHldfKjaPsAjYcw/Wks9LQF6EBLly6+dlrjFd9smNbx509/G3B/z97rApfdtPL2q1fPcDJJ7rue+zS3Ur+B6S4KHQjH6EAAQNFqa2tjsdhJHf2zkbyVuWX9ev0a8ad5u+ett53H9NCm52a6mfiBFHpuTsRiMUGN+Oqy5x3ayYJxEtMNxCdjdQjBN9eJgq68E4KfKMGZF7RZEdd8MgSXSJW8A7+6+JpLlnzjK/dfmntXmK73t39j2eWX3Dd1evtsJx1oDDl93eUtG3ehA+EcHQgAKJr2tPiEjqIoxmXTlcYNjB9Nd8k5YVDQPFaTm85pu6zf13QSwWmbsq0R25MszWUXrNEv2D58073E5286s5O9xAq68g4ZL+8J4Y+Nw58uh5fa+WN3qAwdqPF/B9Z1Lvm3lppr2q7tPPCKqqqvHe76bsv1V7Re88Nnbrpy5fSlm1psZ1DMOlC8bLUBIEYHAgCKpj0tPq6jKIpx2XSlcQPjR/FURuJ5nJyb6fziByJYMD20Q7Y1YjV/iS+74ME6/K7l7Wi1l+3jEn/V+begoCvvkOCncTI/Xc4vdRE/gQKl7kDtj0ZURAfu79l79eoZNe3Xdx3e1vX+9mmBy7/12GU3PHPDfzx9Y6i5+ejcOdoINTdbzUAHomToQABA0Wpra6PR6FEdRVGMy6YrjRsYP4qnMmV1LOfnZjyE+IEIFqzOxMle0WhUUCP+uexFPDQnZ17od0E8ofisJnPlHTJeXvFpODxb55e6oB9XW4JLpEregaqqduzvuHr1jFnr5t667vYb1/5kxrpbv/fbH+3v2RuYMiUbDGojMGWK1e6T6UDtX45rjwTVjg4EABTNNEhyjM9B87YxfZ5qXHayu+08VvvaPqs2noyTU7Jd426NlPGyC9aIL4jgS+JP89ZYXVirZXevvHO2P43i74Xx8Ra0vXFLq4fvBB1oY3/P3rrOJVeunH7dU7d+67HL9HcC9cPqrmDuW5j7VP8lq2Xl4tvJePKQUI3oQABA0bSnxR9KQ1GUkh3LtkZKdialV8rrbCTzlXeoDB2opWCldGCe7pqpobZAYMqUUFtAG9pyd83Ucp8apEYHAgCKVltbG4lEPpCDYsa7w0UiEUGNlPKyl/JR547o9SEEyn7lS3adiya4RKrkf0feVHfN1MCUKdpHbeTWlPvUIDU6EABQNO1p8WFpKIpSsmPZ1kjJzqSUtP4p7znIeeULQgcWprtm6r6ZNdpHbeTWlPvUIDU6EABQtNra2nA4/B48EA6HBTXCZfcOV96W4BKpdKBRqLm5u2aqcQjeNRQoAToQAFC0+vr6s2fPBoPBg3BVMBg8e/ZsfX09l73EuPK2xJdI9e7vB1ZuBwL+RAcCAIoWCARaW1vPnz8fhqvOnz/f2toaCAS47CXGlbclvkSqtH9HPpOd2HV4+IltHy97+aSc44ltH+86PJzJTpT7WwGn6EAAwGQsX768vr6+Fq6qr69fvnw5l730uPK2xJdIlbYDt7w7uPVA8PxIejyhyjnOj6S3HghueXew3N8KOEUHAgAAwBWqtB34aOep4Wh2OKYGo+prh7sWdMy7pu3a77fM+kH7LUs3tXQfeSMYVat7DMfU4Wj20c5T5f5WwCk6EAAAAK5Qpe3AZS+fHEuoQxF16aaW65669aEDX9t4qq59912rdiydv/5n09tnd+zvGIqo1T3GEuqyl0+W+1sBp+hAAAAAuEKVuQNDcXV/z97vr77p4S137zi6PjkRWnNkztItM1dub1q+5e7p7bP39+wdCKviof3tlLw1tnu5OCZzuFCcDqwkdCAAAABcocrcgSMxdc4LtbPWzKxbP7v7yBuqqqbV2Jojc+54ruaedXPmPXdbXeeSvnFVPLQOzFsj3t52zoLGZCYcidGBlYQOBAAAgCtUqTswqn635fpbVt54Y+sPtx3apq2fUBMbexrmPXfzvHV3TW+f3TumioeiKLmP+jXi7V0ck5lwJEoHVhI6EAAAAK5QvejAZDJZER04FFEvXXzttMYrvtkwrePPHbkv7e/Ze13gsptW3n716hlnR1XxUBQl91G/Jresyfs0b41xNsEkVlOZnoB4/VCEDqwkhXZgJpMx/vMGAAAAjpzuzWQyeStd6EAtBX3egQNh9auLr7lkyTe+cv+lHfs/6cCu97d/Y9nll9w3dXr77KtXzzg9ooqHoii2C85Xal1n3NLJJII1VusHwnRgJSm0A0MXU5DBYDAYDAaDwdAPYwS61oHJZNLnHdgfVus6l/xbS801bdd2HnhFVdXXDnd9t+X6K1qv+eEzN125cvrSTS0ng6p4KIqSt5xbY/yScWWOYBf9lg43028sWN9PB1aUIjowFAqV+6wBAADgO6bPG2XpwN4xdX/P3qtXz6hpv77r8Lau97dPC1z+rccuu+GZG/7j6RtDzc1H587RRqi5+fiQajoURclbzq0xfslqpWA28YLtJOL1vWN0YCUprgMBAAAAJ1x4n5iK6MDzIfWjAbVjf8fVq2fMWjf31nW337j2JzPW3fq93/5of8/ewJQp2WBQG4EpUz4aUE2Hoih5n+bW6L8kXmm6xriL6YJ4EvH68yE6sJLQgQAAAPCOLB14blQ90q8e6Vf39+yt61xy5crp1z1167ceu0x/J1A/Qs3N2vb6oShK3qf6NbmXYlptk7eB/tWbxl2MMxtPoKBxbpQOrCR0IAAAALwjSwd+PKK+f8FkdNdMDbUFAlOmhNoC2tCWu2ummm7v4lAUxetD6MfHI3RgJaEDAQAA4B13/n6g/zvw9Ij63gWT0V0zNTBlivZRG7k1ptu7OBRF8foQ+nGaDqwodCAAAAC8I8XfD/z15jNH+zPvX1AP9eaP7pqp+2bWaB+1kVtj3NjdoSiK14fIjfcvqEf7M7/efKbc3wo4RQcCAADAO1L8/cBtB4Y69w+fGMwa/85eqLm5u2aqcYSam23/nGAFjROD2c79w1v/MljubwWcogMBAADgHSk6MJnObt4/+GjnqWUvn5RzPNp5avP+wWQ6W+5vBZyiAwEAAOAdKToQqDgudqCiKM4/dTiJ8x2tZstxa04AAAA4J8X7hQIVx/8dOBn62VyZmYAEAAAoiHQd+NrhrgUd865pu/b7LbN+0H7L0k0t3UfeKPdJAfncfV1oLpO0hbxPC5rBFa7fBqQDAQAACiJXBy7d1HLdU7c+dOBrG0/Vte++a9WOpfPX/2x6++yO/R3lPjXgM0rfgcYXauo3Nu5inNNYd6Yv/gxZd6DgPK0mNz2Q4LGYHpqMBAAAsnHh9wNTqVRFdOD+nr3fX33Tw1vu3nF0fXIitObInKVbZq7c3rR8y93T22fv79nrcJ7cU0yPztPr+Z0cWnx006+W5YSrWHEdeOR0r37k1tt2oOkLNfPKyvlmVltarTHd3bY8rSYUn6RtB+ZdQwaDwWAwGIxKHyEzEr1PzJwXametmVm3frb2QtC0GltzZM4dz9Xcs27OvOduq+tc4mQSfe14UT5ezy+e3OER6cASKKIDj5zuzZvEKngEUReybjnbeLNdabXGNiONt/sEEzo/H9PbgGX5dgMAAHjHNAUl6sDvtlx/y8obb2z94bZD27Q1E2piY0/DvOdunrfurunts21nMKaOu/FTypSiA32u0A7UIlDw77aiO1C8exGPxWoeAACA6qOapaA7HVgRrwu9dPG10xqv+GbDtI4/f/rbgPt79l4XuOymlbdfvXqG7QyCDtQWtOfKeRsYb/EZN7Oa37jeeESrj4Iz0d9gsT0B45Z5y6YbmD5q00cHU653YEgYVw7bqYjEMgak4ExK04HGsyIIAQBAFVMl78CvLr7mkiXf+Mr9l+beFabr/e3fWHb5JfdNnd4+e/IdmFdoVgvGlYL5jeutpiriTEwPlBd1ggR1/lVjcMJWiTswZP3eKnnLggXjsrEe845llaOm2Wac3PRwto8lRAcCAACZqJJ3YF3nkn9rqbmm7drOA6+oqvra4a7vtlx/Res1P3zmpitXTl+6qcV2BnEHmq50klWCNeLJxRs4PxOHp+S8A50cC2JedGC5+LCyfHhKAAAAHlG96MBUKlVB7xd69eoZNe3Xdx3e1vX+9mmBy7/12GU3PHPDfzx9Y6i5+ejcOdoINTdbzVBEBwpmKHEHOjmWWx3o5FgQq+IOVCyU8ZQAAACqmCp5B6qq2rG/4+rVM2atm3vruttvXPuTGetu/d5vf7S/Z29gypRsMKiNwJQpghlcrC/bEjPtLn92oPjuHx1YhErvwHIFni0fnhIAAICnVO86MJVKZTIZ/3egqqr7e/bWdS65cuX065669VuPXaa/EwG+6JcAACAASURBVKgf4ruC+uzJW2m1Pvep/kuFzq9apJ3D5bxpTY/i5HxMJxEciw4sQqV3IAAAAHxCpQONumumhtoCgSlTQm0BbWjL3TVTC5qH1IG76EAAAAC4QqUDjbprpgamTNE+aiO3pqB56EC4iw4EAACAK1Q60Ki7Zuq+mTXaR23k1hQ0Dx0Id9GBAAAAcIXqRQem0+mK7sBQc3N3zVTjEPx+IFACdCAAAABcoXrUgVoKVmgHAv7kVgd++NGxnbveeKljM4PBYDAYDAajusfOXW98+NEx4xNC1bsOTKfTdCDgIrc68Oy5wYFgqNyPBgAAAJ4bCIZOnL5gfEKo0oFApXCxA8v9UAAAAFAipevAVCpFBwKuowMBAABQKDoQqGx0IAAAAArF60KBykYHAgAAoFAl7cCK/rsRgD/RgQAAACgUHQhUNjoQAAAAhSr160LpQMBddCAAAAAKxe8HApWNDgQAAEChSteBmUyGDgRcRwcCAACgUHQgUNnoQAAAABSKDgQqGx0IAACAQpW0A3PoQMAtdCAAAAAKVer3iclkMtlslg4E3EIHAgAAoFBleL9QOhBwER0IAACAQpXh9wPpQMBFdCAAAAAKRQcClY0OBAAAQKF4v1CgstGBAAAAKBQdCFQ2FztwIBgq96MBAACA5waCIf5uBFDZ3OrAoaGRcwOjDAaDwWAwGAwZxtDQiPEJoUoHApXCrQ4EAACA5FQ6EKgUdCAAAABcoXrRgdlsVotA3i8UcBEdCAAAAFeodCBQKehAAAAAuEKlA4FKQQcCAADAFapHHZhDBwJuoQMBAADgCpUOBCoFHQgAmIy2trbGxsZauKqxsbGtrY3LXnpceVviS6TSgUCloAMBAEV7OBBYsWJFf39/Bq7q7+9fsWLFw4EAl73EuPK2xJdIpQOBSkEHAgCKVl9fPzg4mEqlxuGqVCo1ODhYX1/PZS8xrrwt8SVS6UCgUtCBAICi1dbWZjKZcj8vrU6ZTKa2tpbLXnpceVuCS6TSgUCloAMBAEWrra1Np9Nj8EA6nRbUCJfdO1x5W4JLpHrRgZlMhg4EXEcHAgCKpj0tLvdZVCfbGint6UiEK2+rDB2YS0E6EHALHQgAKJr2tHgUHrCtkXKfYNXiytsqdQdqBZjh78gDrqIDAQBFq62tTaVSwzqKznAJ5R1O/KnDScorlUoJasQnl9300MYFhzN4dYoFKujK2zI+LiePVLCN6ZdKfPUEl0jl9wOBSkEHAgCKZhokZXluSgeaLpdAocUi2MYn3yY/dGBBE05+zkLRgUA1oAMBAEXTnhYHdRRFMV0ugdzhtIW8TwuawQ9sa0S/sR8ue0FfKmibye9SkIKuvBPufndMZyjxN50OBKoBHQgAKJr2tHhIR1EU47K2oP9UI9jFuL1+vf5TJ4fL29d4FNtd8jYWz2l1INPTtmJbI6aPXXwdPL3sVicg3l1wJqYno+hYneeQ4bvm3ZV3QnB5nfwo2j5A4yFMfxoLPW0BOhCoBnQgAKBotbW1sVjspI7+aXreytyyfr1+jfjTvN3z1tvOY3po03Mz3Uz8QAo9NydisZigRnx12fMO7WTBOInpBuKTsTqE4JvrREFX3gnBT5TgzAvarIhrPhmCS6TSgUCloAMBAEXTnhaf0FEUxbhsutK4gfGj6S45JwwKmsdqctM5bZf1+5pOIjhtU7Y1YnuSpbnsgjX6BduHb7qX+PxNZ3ayl1hBV94h4+U9IfyxcfjT5fBSO3/sDpW6AycmJuhAwHV0IACgaNrT4uM6iqIYl01XGjcwfhRPZSSex8m5mc4vfiCCBdNDO2RbI1bzl/iyCx6sw+9a3o5We9k+LvFXnX8LCrryDgl+Gifz0+X8UhfxEyjA/UCgGtCBAICi1dbWRqPRozqKohiXTVcaNzB+FE9lyupYzs/NeAjxAxEsWJ2Jk72i0aigRvxz2Yt4aE7OvNDvgnhC8VlN5so7ZLy84tNweLbOL3VBP662BJdIpQOBSkEHAgCKZhokOcbnoHnbmD5PNS472d12Hqt9bZ9VG0/GySnZrnG9A8t12QVrxBdE8CXxp3lrrC6s1bK7V945259G8ffC+HgL2t64pdXDd4IOBKoBHQgAKJr2tPhDaSiKUrJj2dZIyc6k9Ep5nY1kvvIO0YFANaADAQBFq62tjUQiH1QFxcB0m5KdTyQSEdRI1Vx2U0VfZ+M30fZ7auTnK1/0g3KX4BKpdCBQKehAAEDRtKfFh6WhKErJjmVbIyU7k1LSwqa85yDnlS8IHQhUAzoQAFC02tracDj8HjwQDocFNcJl9w5X3pbgEql0IFAp6EAAQNHq6+vPnj0bDAYPwlXBYPDs2bP19fVc9hLjytsSXyKVDgQqBR0IAChaIBBobW09f/58GK46f/58a2trIBDgspcYV96W+BKpHv0d+dyfkqcDAbfQgQCAyVi+fHl9fX0tXFVfX798+XIue+lx5W2JL5FKBwKVgg4EAACAK1Q6EKgUdCAAAABcoXrXgVoK0oGAW+hAAAAAuEL1tAMnJiboQMAtdCAAAABcobrXgdlslg4EPEQHAgAAwBUqHQhUCjoQAAAArlDpQKBSFNqBmUzG+M8bAAAAOHK6N5PJ5K0sugO1FKQDAU8U2oGhiynIYDAYDAaDwWDohzECJ9mB2WyWDgQ8UUQHhkKhcp81AAAAfMf0eSMdCPhRcR0IAAAAOEEHAn5EBwIAAMA7dCDgR3QgAAAAvFN0B2YymUwmQwcCnqADAQAA4J3iOjBzER0IeIIOBAAAgHfoQMCP6EAAAAB4p+gOTKfTdCDgFToQAAAA3qEDAT+iAwEAAOCdojswlUql02k6EPCEFx2oKIqiKEXsCAAAgCpTXAem02k6EPCQDB3oq5MBAACQStEdmEwmU6kUHQh4wvUOzEWXf+rLP2cCAAAgm6I7MJFIJJNJOhDwRGk6UFvWfynHamP9Xnk75h3O9EDiY/kwVgEAAKoSHQj4UXEdeOR0r37ov2SVdk6Sz7hSHG+mC4Kvhgzhp/8070ExGAwGg8FgMAoaps8bi+vAVCoVj8cTiQQdCHiiiA48cro3bxLTrAo5KLEi4jBkqL6CItP4aU5Zrj8AAEDVME1BOhDwo0I7UItAq3+0ikFuvX4b43LRHWg8gUI3AwAAgCtUsxQsugNjsVg8HqcDAU+42IGmcZX7hT3jZlav4SxlBxKEAAAAblHd68BkMhmNRmOxGB0IeKL0HRjSxZ7p7xA678DcXk52yU0u+HVBAAAAFE2lA4FK4e7rQgtFhgEAAFQN1dUOjEQi0WiUDgQ84e79QFOCf+R0IAAAQNVQ3evARCIRDocjkQgdCHii9PcDHSYiAAAAKovqageOj4+Hw2E6EPBEeV8XCgAAgKqh0oFApaADAQAA4ArV1Q4cGxsbHx+nAwFP0IEAAABwhepeB8bj8VAoNDY2RgcCnqADAQAA4AqVDgQqBR0IAAAAV6iuduDo6GgoFKIDAU+41YEffnRs5643XurYzGAwGAwGg8Go7rFz1xsnTl8wPiFU6UCgUrjVgWfPDQ4EQ+V+NAAAAPDcQDBUmg4cHR2lAwFPuNiB5X4oAAAAKFgikTh37lxfX9/w8PCoTigU0j7maG/gOTg4qKpqCTpwZGSEDgS8QgcCAADIzJ8dGIvFRkZGRkZG6EDAE3QgAACAzOhAQEYl6EBFUUr4gAAAAFAAOhCQkdcdqFyk/7R0D69whZ6e/x8RAACAgG87cHh4mA4EvOJpB2qBZPzoZ0Wcof8fFAAAgBU/d+Dw8DAdCHiiZB2oX+NndCAAAJCKVQcODw8PDQ0NDw/nnu/RgUD1KGMH5n3V+ALLvDV5LzG1mtl0WuM8VhdEfETb0wAAAKgsph0YDAaHhoYWL16sT0E6EKgepf/9wLwv5a033dK4o3il1SSC+Z1PLtgFAACg4hg7UIvAe++9d8mSJStXrsylIB0IVI+SvV+o6Y01/bLD231qIalm2oGmd/mKmNzqsQAAAFSQvA7UIrC+vv6RRx559tlnX3zxxRdeeEFLQToQqB6l7EDVQdqZ7mu1cXEdaH0xCpvc+ZwAAAC+ldeBQ0NDra2ta9eu3bx5886dO7u7u/fs2bN79+6hoSE6EKgeZXy/UBc7UPDSU6sJrdCBAABAKqb3A424HwhUlfL+fqB4S/EGeZsJfrHQ+HJTJ68LFR/RScQCAAD4H383ApBRyV4XalyuGlX5oAAAgCToQEBGJehAPcGNuLJQPqvoGVw/MQAAgNKgAwEZlbgDAQAA4Ct0ICAjOhAAAEBmdCAgIzoQAABAZnQgICM6EAAAQGZ0ICAjOhAAAEBmdCAgIzoQAABAZnQgICM6EAAAQGZ0ICAjOhAAAEBmdCAgIzoQAABAZnQgICM6EAAAQGb+7MB4PE4HAh6iAwEAAGTm2w4cGRkZGRmhAwFP0IEAAAAyowMBGdGBAAAAMqMDARnRgQAAADKjAwEZ0YEAAAAyowMBGdGBAAAAMqMDARnRgQAAADKjAwEZ0YEAAAAyowMBGdGBAAAAMvNtB46OjtKBgFfoQAAAAJn5uQNHR0fpQMATdCAAAIDM6EBARnQgAACAzOhAQEZ0IAAAgMzoQEBGdCAAAIDM6EBARnQgAACAzPzZgYlEQjsBOhDwBB0IAAAgMzoQkBEdCAAAIDM/d2AoFKIDAU/QgQAAADKjAwEZ0YEAAAAyowMBGdGBAAAAMvNtB46NjYXoQMAjdCAAAIDM6EBARnQgAACAzOhAQEZ0IAAAgMzoQEBGdCAAAIDM/NyBY2NjdCDgCToQAABAZnQgICM6EAAAQGZ0ICAjOhAAAEBmvu3A8fFxOhDwCh0IAAAgMzoQkBEdCAAAIDM6EJARHQgAACAzP3fg+Pg4HQh4gg4EAACQmT87MJlM0oGAh+hAAAAAmdGBgIzoQAAAAJn5tgPD4TAdCHiFDgQAAJCZnzswHA7TgYAn6EAAAACZ0YGAjOhAAAAAmdGBgIzoQAAAAJnRgYCM6EAAAACZ+bYDI5EIHQh4hQ4EAACQmZ87MBKJ0IGAJ+hAAAAAmdGBgIzoQAAAAJn5swNTqRQdCHiIDgQAAJAZHQjIiA4EAACQGR0IyIgOBAAAkJlvOzAajdKBgFfoQAAAAJn5uQOj0SgdCHiCDgQAAJAZHQjIiA4EAACQGR0IyIgOBAAAkJlvOzAWi9GBgFfoQAAAAJn5uQNjsRgdCHiCDgQAAJAZHQjIiA4EAACQGR0IyIgOBAAAkJk/OzCdTsfjcToQ8AodCAAAIDM/d2A8HqcDAU/QgQAAADKjAwEZ0YEAAAAyowMBGdGBAAAAMqMDARnRgQAAADKjAwEZ0YEAAAAy820HJhIJOhDwCh0IAAAgMz93YCKRoAMBT9CBAAAAMqMDARnRgQAAADKjAwEZ0YEAAAAyowMBGdGBAAAAMvNtByaTSToQ8AodCAAAIDM6EJARHQgAACAzP3dgMpmkAwFP0IEAAAAyowMBGdGBAAAAMvNnB2YymVQqRQcCXqEDAQAAZEYHAjKiAwEAAGRGBwIyogMBAABkRgcCMqIDAQAAZObnDkylUnQg4Ak6EAAAQGZ0ICAjOhAAAEBmdCAgIzoQAABAZr7twHQ6TQcCXqEDAQAAZEYHAjKiAwEAAGRGBwIyogMBAABk5ucOTKfTdCDgCToQAABAZnQgICM6EAAAQGZ0ICAjOhAAAEBm/uzAbDZLBwIeogMBAABk5tsO1G4J0oGAJ+hAAAAAmdGBgIzoQAAAAJnRgYCM6EAAAACZ+bkDM5kMHQh4gg4EAACQGR0IyIgOBAAAkBkdCMiIDgQAAJAZHQjIiA4EAACQGR0IyIgOBAAAkBkdCMiIDgQAAJCZbztQQwcCnqADAQAAZEYHAjKiAwEAAGRGBwIyogMBAABkRgcCMqIDAQAAZEYHAjKiAwEAAGRGBwIyogMBAABkRgcCMqIDAQAAZEYHAjKiAwEAAGRGBwIyogMBAABkRgcCMqIDAQAAZEYHAjKiAwEAAGRGBwIyogMBAABkRgcCMqIDAQAAZEYHAjKiAwEAAGRGBwIyogMBAABkRgcCMqIDAQAAZEYHAjKiAwEAAGRGBwIyogMBAABkRgcCMqIDAQAAZEYHAjKiAwEAAGTm2w7MZDJ0IOAVOhAAAEBmfu7ATCZDBwKeoAMBAABk5s8OzFxEBwKeoAMBAABkRgcCMqIDAQAAZObbDkyn03Qg4BU6EAAAQGb+7MB0Op1KpdLpNB0IeIIOBAAAkBkdCMiIDgQAAJCZbzswmUymUik6EPAEHQgAACAz33ZgIpFIJpN0IOAJOhAAAEBmdCAgIzoQAABAZv7swFQqFY/HE4kEHQh4gg4EAACQmW87MBaLxeNxOhDwBB0IAAAgM392YDKZpAMBD9GBAAAAMvNtB0aj0VgsRgcCnqADAQAAZObbDoxEItFolA4EPEEHAgAAyMyfHZhIJMLhcCQSoQMBT9CBAAAAMvNtB46Pj9OBgFfoQAAAAJn5uQPD4TAdCHiCDgQAAJCZbztQOxwdCHiCDgQAAJCZPzswHo+HQiE6EPAKHQgAACAzP3fg2NiYks1O5MaiRXQg4A46EAAAQGY+7MBFixbFYvGRkdHR0ZCS1Vm0aJFxrnJfQKAi0YEAAAAy82sHxkZGRkZGRpTMRXQg4CI6EAAAQGY+7MCFCxfFYrFgMDg8PKykUmltZDKZhQsXGucq9wUEKhIdCAAAIDMfdmDTwoXRaHRwcGhwcEhJJJLaSKfTTU1NxrnKfQGBikQHAgAAyMyPHdjUFIlE+vsH+vsHlEg0ro1kKt3Q0Gicq9wXEKhIdCAAAIDMfNiBDQ2N4+Ph871953v7lNBYRBuJRHJBfYNxrnJfQKAi0YEAAAAy82EHLqhvCI2Nnz5z7szH55Xg8Lg2YrFE3b31xrnKfQGBikQHAgAAyMyHHVh3b/3I6NiJno9P9HysDAyGtBGNJubXLTDOVe4LCFQkOhAAAEBmPuzA+XULhkdCx46fPnb8tNI3MNo3MNo/MBqJxmvn04GAO+hAAAAAmfmwA2vnLwgOj3507NRHx04pff2j2ohE6EDANXQgAACAzHzbgUc+Ovnh0VNK30BIG5Fogg4E3EIHAgAAyMyvHRg6cvTUkaOnlP6hMW1Eoon5dbxPDOAOOhAAAEBmPuzA+XX1wyOhj46d/ujYaWVoOKKNaCxZdy9/NwJwBx0IAAAgMx92YN29DSMjY8dOnD124qwyOhbTRjyRWlDP35EH3EEHAgAAyMyHHbigvnE0NH7y9PmTp88r45G4NhLJdH1Dk3Gucl9AoCLRgQAAADLzYQfWNzSNjYU/Pnvh47MXlGgsoY1UKt3QSAcC7qADAQAAZObDDmxsbAqHI729fb29fUo8nozFE7F4IpVONzbRgYA76EAAAACZ+bADm5oWRiLRC30DF/oGlHg8oXVgmg4E3EMHAgAAyMyHHbhw4aJoNDowMDgwMKjEYvFoNB6JxlOpdGMj7xMDuIMOBAAAkJkPO3DRokXRaGxoKDg4OKSEI9Hx8cjYeCSRTNY38HcjAHfQgQAAADLzZwfGYrFgMBgMBpXQ2PjI6NjIaCieSCyo5+/IA+6gAwEAAGTm2w4cHh4eHh5WgsOjg8HhwaHhaCx+770LjHOV+wICFYkOBAAAkJkPO3Dx4sWfduDAYPDCwNCF/qFINFpXV2ecq9wXEKhIdCAAAIDM/N6BF/oHz18YOH9hIByJ1s6nAwF30IEAAAAy83sHnr8wcLa3/2xv/3gkck/tfONc5b6AQEWiAwEAAGTm9w482ztwprf/TG//eJgOBFxDBwIAAMjM7x14urf/1Pn+0+f7x+hAwD10IAAAgMz83oEnz/f3nOs/ea5/LBy5+x46EHAHHQgAACAzv3dgz7n+nrP9J8/1j43TgYBr6EAAAACZ+b0DT9CBgAfoQAAAAJn5vQO1F4WeOs/rQgE30YEAAAAy83sHnj4/cPp8/8e8XyjgKjoQAABAZn7vwLO9g2d7B871DoTD0Vo6EHAJHQgAACAzf3ZgPB4fGRkZHh5WevuHevsHL/QPRqLR+XV1xrnKfQGBikQHAgAAyMzPHTgyMqIMBkcGh4aHhoZjsdi9995rnKvcFxCoSHQgAACAzPzegaOhsdHR0OhoKJFI1NcvMM5V7gsIVCQ6EAAAQGZ+78DIJ8LJZLKhocE4V7kvIFCR6EAAAACZ+b0DY7FYPBaLx2LpVKqpqdE4V7kvIFCR6EAAAACZ+b0Dk8lEKplMJZOZdHrhwibjXOW+gEBFogMBAABk5vcOTKdS6VQqlUplM5lFCxca5yr3BQQqEh0IAAAgM793YCaTyWTSmUw6m80uWrTIOFe5LyBQkehAAAAAmVVEB2YymQwdCLiIDgQAAJCZ3zswe9HExMTixYuNc5X7AgIViQ4EAACQmd87ULsTqKEDAbfQgQAAADLzbQdqp6HkXhRKBwIuogMBAABk5vcOTKfTuRSkAwG30IEAAAAyq4AO1FKQDgRcRAcCAADIzO8dmEqltBSkAwEX0YEAAAAyowMBGdGBAAAAMvN7ByaTSS0F6UDARXQgAACAzPzZgYlEQjsBJZFIJJPJZDKZyWT4O/KAW+hAAAAAmfmwAxctWqTdDxwZGVFisVg8Hk8kEul0mg4E3EIHAgAAyMy3HTgyMjI8PKxEo1EtBdPp9MKFC41zlfsCAhWJDgQAAJCZDztw4cKFsVhseHh4eHhYCYfD4XA4EomkUqmmpibjXOW+gEBFogMBAABk5sMObGpqikajQ0NDQ0NDinYSY2NjiUSisbHROFe5LyBQkehAAAAAmfmwAxsbG6PR6MDAwMDAgDIyMjIyMjI6OppIJBoaGoxzlfsCAhWJDgQAAJCZDzuwoaEhEon09fX19fUp2m3B4eHhWCxWX19vnKvcFxCoSHQgAACAzHzYgfX19eFwuLe3t7e395MODAaDdCDgIjoQAABAZr7twAsXLvT29iqDg4ODg4NDQ0N0IOAiOhAAAEBmfu/AYDCovXNoLBbj9wMBt9CBAAAAMvNhB2q/H9jf39/X16doETgyMhKPx/m7EYBb6EAAAACZ+bADtfcLHRwcHBgY+MzfjaADAbfQgQAAADLzYQc2NTXFYrFgMBgMBpWxsTHtwIlEYuHChca5yn0BgYpEBwIAAMjMhx24cOHCeDyu/eFARTtqOBxOJpOLFi0yzlXuCwhUJDoQAABAZj7swEWLFiUSCe0ElPHxcToQcB0dCAAAIDPfduDY2FgoFFLC4XA4HI5EIslkcvHixca5yn0BgYpEBwIAAMjMhx24ePHiRCIxPj4+NjZGBwKeoAMBAABk5ucOHB///9u72yc56sPA4/OHKbaTF8RvUyZOVXIFdVUpHJJKmKt4EK7YqE5y5BUQSWvAxIUt5Ls6E3wBtICEBDqMI45LHPNgxLMM2GKJpN3VanbnQbszI8296GNumOnu6Zntnp7Z/nxqSjX09HT/+rfTO/1lZ6XNUvCh0OBzoToQ0qIDAQCKbA46sPf7gToQ0qIDAQCKbDY7cHt7+wsduLm5qQMhRToQAKDIdCAUkQ4EACiygQ5cW1tbDXP16tV8OjDYqw6EdOlAAIAiG+jA1dXVb3/723fffffdd999zz337N+//5FHHvnZz362uro65Q4M/naY0sbGRrDjra0tHQhp0YEAAEUW+vPAw4cPP/jgg8ePHz916tS5c+dy+XmgDoQM6UAAgCIb/v3AIAWPHTt2+vTpX/7yl0EEVqf++4E6EDKkAwEAiizowMuXL6+vr/cu7a5evbq6uvrCCy/0IrCabwdubGzoQEiRDgQAKLKgA1dXV69du7bRZ319fW1tbX19vbck+Gf8dCDsBjoQAKDIgg4Mem8zVhBmOhB2Ax0IAFBkQQdWq9Xh6uu1X7+pdWC9XteBkBUdCABQZEEHDidfkGH1IdPswHq9rgMhEzoQAKDIgg4c7r0oOhB2Ax0IAFBkQQeujKObfQe2Wi0dCBlKsQOvrFXzPhoAADJ3Za2qA2G+pdWB7773wadXrrm5ubm5ubm5uRXhNr0ODP7WGh0I6UqrAwEAKLhuqh3YaDT+fwdubm7qQEiRDgQAIBXdtDuw0WjoQMiEDgQAIBVdHQjzQgcCAJCKrg6EeaEDAQBIRVcHwrzQgQAApKKbagc2m81ms6kDIRM6EAAgoaNHj+7du7dcYHv37j169GjU/HR1IMwLHQgAkMT3FhYWFxcvX77cKbDLly8vLi5+b2EhdIq6OhDmhQ4EAEiiUqmsrKy0Wq3NAmu1WisrK5VKJXSKujoQ5oUOBABIolwudzqdHBtsRnQ6nXK5HDpFXR0I80IHAgAkUS6X2+32RuG12+0pdGC73daBkCEdCACQRNCBeY8if1PrwOvXr1+/fl0HQiZ0IABAEkEHXiu8aXdgrVbTgZA6HQgAkES5XG61WlfHUSqVRi5J8qz4h5JsM0WtVmvaHRikoA6EFOlAAIAkptaBY21w59sclw6E3UAHAgAkEXTg2phKpVLo/cmEbmHnmx2LDoTdQAcCACQRdODqmEql0vD90ucGHur/M3610M0OPxS6ZIfy6cBarba9va0DIS06EAAgiXK53Gw2PxpTqVQKvT+wJKi1yVZLcidFzWZzOh24tbWlAyErOhAAIImgAy+Mr1Qq9f7sXxjoXyf0/sjV+u8MrD+8352bZgdubW3pQMiEDgQASCLowA/HVyqVen/2Lwm9E/9o8o0MDyAtOhB2Ax0IAJBEuVxuNBrvj69UKvX+7F8Seif+0eQbGR7AWE+J0Wg0dCDMPR0IAJDExB0Ymlu9D3AOrzBwf2C1gSVJ1h9ecy46cHt7WwdCVnQgAEASQQe+W3g6EHYDHQgAkES5XK7X62/Pj9IXpbXZer2uA2Hu6UAAgCSCDnyr8KbZgdvb2zoQMqEDAQCSKJfLtVrt14VXq9V0IMw9HQgAkESl2i/SAwAAE/JJREFUUrl48eLa2tobBba2tnbx4sVKpRI6RV0dCPNCBwIAJLGwsHDkyJHl5eVagS0vLx85cmRhYSF0iro6EOaFDgQASOjgwYOVSqVcYJVK5eDBg1Hz002vAzudTqvV0oGQFR0IAEAqujoQ5oUOBAAgFV0dCPNCBwIAkIpu2h3YarV0IGRCBwIAkIquDoR5oQMBAEhFVwfCvNCBAACkoqsDYV7oQAAAUtHVgTAvdCAAAKnoptqB7Xa71WqV6vW6DoTU6UAAAFLRzagDgxTUgZCiFDuwVCqVSqWBJfEn+VhKfcZ9YorDIKH4ad99X5S0jmiC7YQ+ZS5mOBjk8J8AzKlu2h3Ybrf/XwfW63UdCCnKsQOnlnOuLAOpz4OJzcLcdeDOT8yBAvS6AphfXR0I8yLdDqx+8RpOB84UHTgXdKDXFcD86upAmBdT68CBj3QOf8hz4MeJw9eCUUtCfw45sOWoh6J2HXVhHTrICdaPmYTh4x3eS5JDCH1K6FBDxznuBqOeEjVL8Y/GD3h4JKHbj9lm1LyFLqlGfF1Ch7HDI0r4hUiyx/jDHLn3+E31rxa6ZHjjw3uMH0/MowDMrK4OhHmRegfG30m+MPTCMeaKM/6JCYcRv53QdVJZf+TChIc87syELkwyhiQbTD7mhC+YqCXxX4WxHor6Io77ytnJEe38FZL60aV7IscvT/IoADOrm14H3rhxQwdChrLowN79sS4fe6K+I0xw9Ry/x6j7MSMZeCj+4j75+hNcZw+skGRHUSOMWTLWBqPGkLwTxprYJPej5mRghbR2N/ER7XA7I2d4eCrGerWMtXCCKR33UQBmVjfVDgx+JKgDIROz04Hx3w5C10lYO0n2GB9LUeskvLgfuf5kE5XkkONXm+y54wZeFh24w2Ek3HLokpGvnBnswGqsLPYes4sko9KBAHOqqwNhXmTUgdXPfzIw/NAEV8ZJlsxvB4ZO1MjZix/zrunA/nmIGuc0O3B4PKkcUfKv+2Rrhh5mwr3v8ESOWp6wAwUhwHzp6kCYF9PpwN5/xqwzsELohWPMOjH7ih9G1KhCL0ATDiDJ+v27Dh1PksMcd2ChxxU1J8n3Gz+G0OcmH2rUgIdHO/LrOHJJ1Nc9dDxRUzTBEUU9GnNcwyOJ/5LFHFr83sca0vAK8VM6cnnMmAGYQd20O7DT6ehAyESKHcjEXOzGGDk5czd7szzgaY5t3D4EYPZ1dSDMCx04C1z4xtCB0zTlsQ3vbpYnB4CRujoQ5oUOzEvoZ/kIjDU5czGB8/LlnvHhATDjujoQ5oUOBAAgFV0dCPNCBwIAkIquDoR5oQMBAEhFN9UODFKw1Gg0dCCkTgcCAJCKbtodeOPGDR0ImdCBAACkoqsDYV6M24GdTmf49AYAgHc++azT6Qws3GkHNpvNZrOpAyFd43Zg9fMUdHNzc3Nzc3Nzc+u/DUdgah3YbDZ1IKRogg6sVqt5jxoAgJkTet2YWge2Wi0dCGmZrAMBACAJHQizSAcCAJCdyTrw5s2bOhAypAMBAMiODoRZpAMBAMiODoRZpAMBAMjOxB0YpKAOhEzoQAAAsjPx3xMTpKAOhEzoQAAAsrOTvy9UB0JWdCAAANnx+4Ewi3QgAADZ0YEwi3QgAADZ0YEwi3QgAADZ8feFwiwa2YEAALATE3egvycGsnI8tgMBACBdOhDypwMBAJgmHQj504EAAEzTeB14/fp1HQip04EAAEyTDoT86UAAAKZJB0L+dCAAANOkAyF/OhAAgGkauwMDOhBSpAMBAJgmHQj504EAAEzThB3Ybrd1IKRFBwIAME06EPKnAwEAmCYdCPnTgQAATNN4Hbi1tbW1taUDIV06EACAadKBkD8dCADANOlAyJ8OBABgmnQg5E8HAgAwTZN04NbWlg6EFOlAAACmSQdC/nQgAADTpAMhfzoQAIBp0oGQPx0IAMA06UDInw4EAGCadCDkTwcCACM9/+JLTz/3/JPPnCzs7ennnn/+xZdM0U6mqEcHQv50IAAQb+nk6ZfPvbqxudkpsI3NzZfPvbp08rQpihI/Rf10IORPBwIA8Z569tTmZq3dbtcLrN1ub27Wnnr2lCmKEj9F/XQg5E8HAgDxnnzmZKfTybsy8tfpdJ585qQpihEzRf10IORPBwIA8UROQAeOpANhbuhAACCeyAnowJF0IMwNHQgAxBM5AR04kg6EuaEDAYB4WUfOgQMHDhw4MPFz0x1MjOl34IE+qW88CzoQ5oYOBADi6cBALh0Yej/FzaZLB8Lc0IEAQLxMO7DXJJPFiQ7c4WbTpQNhbuhAACDe9DswuD/wc8L4haHbTNfsdGD/JEQde8zsZfdZUx0Ic0MHAgDxcunA4eVRC+u7ugOHmy3JsSecvdTpQJgbOhAAiJddB8b8LGvchflGTtY/DxyO5Jgqjl+nPncduL29rQMhdToQAIiXaQeGflJRBwZGzkPUQzHrhD6aFh0Ic0MHAgDxphA5Awsn6MD6zv7e0SRmtgPrEb8NOHJTqdOBMDd0IAAQL5cODP29uJhflqvv9g6sfzEFQydnYOWoH7GGrp8KHQhzQwcCAPGy/vcDh8Uk4rjPStH0O3DuZNWBgeQdWOrTWzJwZxZMMJiop/QfbJKNhK4cunymZowU6UAAIN7sd2DU7xmmazY7cDrHntAMdWDUte+UgzB+L2l14FjbiSnJyZ7InNKBAEC8eenALEdUr89qB84UHTjGSCYbw85/XjdxSerAXUYHAgDxRE5AB440ux04kH+hHxztf1ZvteGNxD9r+NHQJVEbDN1s6Kaidhr/aNR2YjYy7oxFrRC6hBzpQAAg3lPPntrcrLXb7bwrI0/tdntzs/bUs6dMUZT4Keo3E78fONwwA3eiiiv0/vCaMXuJ2uBYQ43fV5JjHHcjyWcs/riYEToQAIi3dOrMy+derdXqnQKr1eovn3t16dQZUxQlfor65f/zwO5Q1UR1Y9RmY+5HbSd5p022kSl3YMJBxg+eHOlAAGCkEydPP/XsqSefOVnY21PPnjpx8rQp2skU9cxiB47cQsxTdv6jvKinjLWRXH4eOHKQA2tKwdmhAwEAmCYdmGgjoQ/pQNKiAwEAmKaZ6MBu2K+0JYyl+PsDtZZwLwk3EjWwqL4K3VTMmqHLd3gsIwdJLnQgAADTlHkHAiPpQAAApkkHQv50IAAA06QDIX86EACAadKBkD8dCADANOlAyJ8OBABgmnQg5E8HAgAwTToQ8qcDAQCYJh0I+dOBAABMU8odCEzGeQQAwDSl1oEAAADsAl/owFarpQMBAAB2ty90YLvdbrVarVZLBwIAAOxWgx0YpKAOBAAA2K10IAAAQLHoQAAAgGIJ6cB2u93pdHQgAADArqQDAQAAikUHAgAAFIsOBAAAKBYdCAAAUCw6EAAAoFh0IAAAQLHoQAAAgGLRgQAAAMWiAwEAAIpFBwIAABSLDgQAACgWHQgAAFAs2Xbgc2df2ffAY7fesb93++aBfzz2xKmdbxkAAAri+Etvf/3IC3v2LRX29vUjLxx/6e34WTp69OjevXvLBbZ3796jR48mfFFl1YEnz75ye/nQvQ/85H+98np1o9b63FvvffzgsRO33rH/sSdO7mT7AABQBMfOnv/yQ/9yy79vfPX9dmFvt/z7xpcf+pdjZ89HzdL3FhYWFxcvX77cKbDLly8vLi5+b2Ehyesqkw58+PiTd35r8a33Pt7e3m42m41G46PfLn/02+VGo9FoNLa2tv7j8tq9D/zkm/sfmXgXAABQBF87fOaWX2385UfbmwX2lx9t3/Krja8dPhM1S5VKZWVlpdVq5T3SPLVarZWVlUqlkuR1lX4HPnz8yW/u/2F1o9ZsNj+7tPLjx5+vfPfR3u3Hjz//2aWVRqOxvb394LETUhAAAGLs2bf01ffaeSdG/r76XnvPvqWoWSqXy51OJ+8x5q/T6ZTL5SSvq5Q78MTpl+/81mJ1o9ZoNJb/48rdf//o33zn4YHb3X//6G8++TRIwUMP/9N9P/jpBDsCAIAiCDpwo/BGdmC7bZY22u32JB3Y6XR22IG3lw+99d7HwWdBF3/81J9XDv955fCRR//5jfMfvvfhJz/8788GS47+6MmNjc1Go7GxWbv9rvtePz/ilz4BAKCYgg7MexT5S9KB0xzPbJq8A4MUnKwDX/jF/7n3/uNbW1u1Wq1Wq91213233XXfX3/7oQsfX6x9Llj4d4eOfXbpSq1Wazab/7T084cee3LsQwQAgALYs2/pD99tXSu8P3y3NbID8x5j/nbUgYEJOvDQD3569tzr9Xo9+HDq+rVrr/zbW798/Z2V1bVgyTsffPynf3XwT//q4D0Hf3Rx+VKw8LNLq7eXD427LwAAKIKgA69mr9RnCrsb18gObLWynaXhyZnBiWq1WjvqwBs3bkzQgbeXDy1fWolq0397/e3//F/u/5M7v/snd373v/3PM1dWVoPlzWbzzm8t/vzVfx13dwAAsOtNswND78+IfDswdHJmcJby6cBb79jfaDSuhHnmzLmv/8WB4PZfD//k/Q8/7j20sbHxnfuP60AAABi2Z9/SLe9ur2WvVCqF3p8Rt7y7PbIDM9p11GzM4Czl1oG1Wu2zIeff+eC2uw798TcO/PE3Dvz4p8+998GF/kfX19e/c99jOhAAAIbt2bd0yzvbq9krlUrD92MWBh+SnMLAAre8M7oDM9p11GEOTM7whAwsmcKM5fa50N99emnYied/cesd+2+9Y/8Pjp/4zce/HXh0c3PzL+5Z9FeGAgDAsD37lv7g142Pstf/+4H9C4fv96/Tv0Km/uDXjfgObDabGe066hhDJyFqZqYzY81mM4cO3PcPj734i1+trKwMfCj02OMngw589sy54Y+MXly+dOsd+8fdFwAAFMGefUu//2b9QvZKpdLAnaj7UStk6vffrI/swIx2HXWMyWcsuN+TzTAvXLhwIZ8OfO7suYWHHt/c3Bz+AeUnv/v0Nx//9pPffTqwfH19fenM/77vB/9j3H0BAEARBB34YfZKpdLw/eQLs5akAzPaddQxJpmQ0HWyk08HVqvV28uH3jj/4fr6ev9vK755/v3b/ubQN/YeOf/uhcHfZLx67c57Ft98+50J9gUAALvenn1LX3mz9n72SqXS8P3+O8MLB+5n6itv1uI7sNFoZLf3kZMTumbUOtlpNBr5dOATz5792/0/vLpeXe/zk5+dDj4XuvijJ/uXNxqN7x97et8/PDbBjgAAoAhy6cD3wwqwyB34/ufzEHXsoY8OT+nwwnTl1oHVanXfA499/9jTV69Vq9Vq8C8E/vyV1269Y/9/+uuFF3/xy94/J9hsNs+ee82/IA8AADH27Fv6yhu1dwvvK2+M7sC8x5i/PDuwWq1+c/8jf7v/h59dWqnX6xsbG9Vqde3q1d9d/OzyldVqtVqr1davbXz/2NMiEAAA4u3Zt/Tl1zffzlgpTNY7HcuXX9+M78B6vZ73GPNXr9fz7MBqtfrYE8/desf+7x97+sLHy1tbW41Go9FoXL9+/bNLq4+feOm2u+7zcVAAABgp6MC3Ci9JB+Y9xvzl34HVavX1828/9sRzd37r6K137L/3/uP33n/8trvuu7186OHj//z2Bx/ucOMAAFAEe/Ytfem1jV8X3pde24jvwFqtlvcY81er1fLvwMDr59/++av/2rulsk0AACiIrx0+86VzV/7stZU3CuzPXlv50rkrXzt8JmqWKpXKxYsX19bW8h5pntbW1i5evFipVJK8rjLvQAAAYGLHzp7fs/jy771y5fdeqxb39sqVPYsvHzt7PmqWFhYWjhw5sry8XCuw5eXlI0eOLCwsJHld6UAAAJhpj7741h89cHrPvqXC3v7ogdOPvvhW/CwdPHiwUqmUC6xSqRw8eDDhi0oHAgAAFIsOBAAAKJYvdOCNGzd0IAAAwO422IFBCupAAACA3UoHAgAAFIsOBAAAKJaQDgzoQAAAgF1JBwIAABSLDgQAACgWHQgAAFAsOhAAAKBYdCAAAECx6EAAAIBi0YEAAADFEt6BN2/ePHHixN8BAACw6ywtLYV34M2bN29MqjOO9lS0xrGdtq0d6G0kGNvwofVmcuCrcJPdYuIzsXcyJj83p3M+7kTvPB1r5Qn0n3f9hvcSzFvUmThwSjpDZ1+ScyrhKZPie81O3kdiXE/b8PvX8InjbWuk4Zdc71tN/+sq65fHuHZ8uRRpJ9/Mk7xZMPvGeqtlAqWoOU1y+TjZpWTWb4S9d6ZmYo1Go55AbUyb0TbC9B4Nnl6v1xuNRqPRaDabweEEb7fbfW+xAydG3i8nUpPkqjT+InX43Bx4a4y6Nh14Xx/+z9DTrf9aMOoCceKrzN6pOtbK8ad8EgP7Hbj0CeazN6vx17jO0BkXf8YNnzXxr+qRr7ex3mti3kqG300Sfi7oWpj1cfSeEtwJNhu8kQXvX733rP7zxdtWjP7v570XW+8bb/C66r1++l8bY33pQy8/hq9DxjLycijJJdaw5N+iQ038jjMs+SXo+LU7f5LMwwTTO/Cfvd0FZ8HAN5B+vpnsxBx0YMLXXNSLL8cOHDcFh7+l9qdg8Gfv9Ii5+sz7RUUK4q9Kg9Mz6oTtnWvDHdifglE/phh4P4v6z6jv9VvRHTjB28PwiZx8zZFnfZT+825gp8H4t774Q4/+k3H4q9P/Bc33RcVI8SfdwFkT/5KOf73l3oE7r8GBDgxSsL8DG5//T8zrff8HUwfG6/9m3rteCv7c6kvB/tfJLHRgkhrMogOnloJjXYVO1FbzJ34SJpjh4dnu7Wv4rTY0BfM+fefS/wWXsOYmu5S2CgAAAABJRU5ErkJggg==" width="320" /></li>
<li>Open the folder of the file you are currently editing<img alt="" height="206" src="data:image/png;base64,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IhYKhUKhIBEhdhIRAIBYNOJOxGYldknEYrEoEWEYJCIAALFoDCERg0qUiDA6gyZirVbrPPMBAOClt+ZrtVrbzCEmYkAiQrwGTcTMtUo0mUwmk8lkMplap84+jCUR6/V6WCIWi0WJCDHaRiJmMplx7zUAAInT9boxlkRsNBphiVipVCQixGV7iQgAAFFIRJgwEhEAgOHZXiJevXpVIsJ4SEQAAIZHIsKEkYgAAAyPRIQJIxEBABiebSdiayU2JCKMjEQEAGB4tv3ralorsSERYWQkIgAAw7OT32jarMSGRISRkYgAAAzPDj+LGFRiQyLCyEhEAACGRyLChJGIAAAMj0SECSMRAQAYnp3/RlOJCCPVNxEBAGAntp2IfqMpjMGZ0EQEAIB4SURINIkIAMAoSURINIkIAMAoDZSIPf8u4ubm5ubmpkSE2ElEAABGadBE7P7raiQiDIlEBABglCQiJJpEBABglCQiJJpEBABglOJMxIBEhBhJRAAARimGRLx69apEhCGRiAAAjFI8iVgqlZqJWK1WJSLERSICADBKEhESTSICADBKEhESTSICADBKsSViQCJCvCQiAACjJBEh0SQiAACjJBEh0SQiAACjJBEh0SQiAACjFHMilkoliQgxkogAAIySRIREk4gAAIySRIREk4gAAIySRIREk4gAAIySRIREk4gAAIySRIREk4gAQF/f+8GPvv3d7z30ncdSO337u9/73g9+ZIh2MkRNEhESTSICAOHOPvbET849vZHN1lJsI5v9ybmnzz72hCHqJXyIWklESDSJCACEe/jRx7PZXLVazadYtVrNZnMPP/q4IeolfIhaSURINIkIAIR76DuP1Wq1cQfI+NVqtYe+85ghChEyRK0kIiSaRAQAwumfgETsSyLCbiARAYBw+icgEfuSiLAbSEQAIJz+CUjEviQi7AYSEQAIN+z+ufvuu+++++5tf228OxNi9Il4d4vYVz4MEhF2A4kIAISTiIGxJGLX2zGuNl4SEXYDiQgAhBtqIjZzZXvdIhF3uNp4SUTYDSQiABBu9IkY3G57dTF8Ztd1xis5idg6CL0ee8joDe/NqxIRdgOJCACEG0sids7vNTO/qxOxM+eiPPaIoxc7iQi7gUQEAMINLxFDXgEbdOZ4+2fYryJ29nNIMIcvk981iVgul8vlskSE2ElEACDcUBOx61sfJWKg7zj0uitkma73xkUiwm4gEQGAcCPon7aZ20jE/M5+M2oUiU3EfI9PHvZdVewkIuwGEhEACDeWROz6GbyQD+bld3si5t9diV0Hp23hXi/Mdl0+FhIRdgOJCACEG/bfRewUUo+DflWMRp+IE2cMiRiInohTLZpz2m4kwTZ2pteXtD7YKCvpunDX+YkaMWIkEQGAcMlPxF6faYxXMhNxNI89oslIxF6XxSNuxfCtxJWIA60nJDK394VMKIkIAISblEQc5h7l80lNxESRiAMYQSIOupJtR6ZE3GUkIgAQTv8EJGJfE5mIbWXY9Z2orV/VXKxzJeFf1Xlv1zm9Vth1tV1X1Wuj4ff2Wk/ISgYdsV4LdJ3DGElEACDcw48+ns3mqtXquANknKrVajabe/jRxw1RL+FD1Crpn0XszJu2G71irOvtziVDttJrhQPtavi2ojzGQVcSfcTCHxcJIREBgHBnH3/yJ+eezuXytRTL5fI/Off02cefNES9hA9Rq0S/itjoCJ5eSdlrtSG3e60nesJtbyUjTsSIOxm+84yRRAQA+nrksScefvTxh77zWGqnhx99/JHHnjBEOxmipglLxL5rCPmSnb8A2OtLBlrJWF5F7LuTbUuqxOSQiAAAjJJEHGwrESNNIhIXiQgAwCglPREb3T4+F7Gjwm+3hVzErURcSa8d65VeXVcVsmTX+Tt8LH13krGQiAAAjNI4ExHoSyICADBKEhESTSICADBKEhESTSICADBKEhESTSICADBKEhESTSICADBKEhESTSICADBKEhESTSICADBKEhESTSICADBK8SRipVLpm4jA9jiPAAAYpRgSsVqthiciAAAAu0DURGy+kCgRAQAAdquoiRhUYqVSkYgAAAC71QCJGFSiRAQAANitJCIAAABbJCIAAABbBkvEarVaq9UkIgAAwK4kEQEAANgiEQEAANgiEQEAANgiEQEAANgiEQEAANgiEQEAANgiEQEAANgiEQEAANgiEQEAANgiEQEAANgiEQEAANgiEQEAANgytkT87lM/O/rpB2+65VhzuvPu/3P664/vfM0AAJASZ3704h+d/P6Bo2dTO/3Rye+f+dGL4aN0//33z87OTqfY7Ozs/fffH/GgGkMiPvbUz26evufjn/7KD3/2XGYjV7nm+VcuPHD6kZtuOfbg1x/byfoBACANTj/1wgc+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" width="320" /></li>
<li>Open a console directly in a specific directory <span id="goog_1713506631"></span><span id="goog_1713506632"></span><img alt="" height="207" src="data:image/png;base64,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AABAdmlCAACA7NKEAAAA2aUJAQAAsksTAgAAZJcmBAAAyC5NCAAAkF2aEAAAILs0IQAAQHZpQgAAgOzShAAAANk1uyb8zlPPnPnUY/fcd7Z7eehj/+3i17979CUDAEBGXPqXl953/nvHzlzO7OV957936V9eCh+lCxcuLC0t5TNsaWnpwoULEXeqWTThPz31zL35hz/6qa/+n2eeK+2Vm7e98Oq1z1x8/J77zj729X86yvIBACALLj714l2f/be7/2Pvd15rZfZy93/s3fXZf7v41IujRukTy8srKyvr6+vtDFtfX19ZWfnE8nKU/Wp4E7bb7bia8HOXvnX/yZUXXr3WaDRqtVq1Wn3zF2tv/mKtWq1Wq9V6vX5zvfjRT331obNfmHoVAACQBe999Mm7f7L352829jPsz99s3P2Tvfc++uSoUSoUCpubm81mc95bOk/NZnNzc7NQKETZr5Jtws9d+tZDZ79Y2ivXarUbb29+5Wv/XPjrL3UvX/naP994e7NarTYajc9cfFwWAgBAiGNnLv/Oq61558b8/c6rrWNnLo8apXw+3263572N89dut/P5fJT9KsEmfPyJf73/5Eppr1ytVtdubhz/+Jf+8q8+13c5/vEvvfHW9SALH/7c3z/y+b+bYkUAAJAFQRPuZd7YJmy1jNJeq9U6ahN2s3DqJrw3//ALr14LPi+68pX/9SeFR/+k8Oj5L/3D8y++/urrb33xf/xjMOXCl7+1t7dfrVb39sv3PvDIcy+O+YFRAADIpqAJ570V8xelCWe5PekUTxMGWThdE37v6f/30U9eqtfr5XK5XC5/4IFHPvDAI3/xkc9evbZavi2YePrhizfe3iiXy7Va7e8v/+Czj31r4ocLAAAZcOzM5d9+pbmbeb/9SnNsE857G+cvtiYMTNGED3/+75668lylUgk+zLqzu/vMj1748XMvb24Vgykv//zaH37w3B9+8NyJc19eXXs7mHjj7a178w9Pui4AAMiCoAm3k5frMYPVTWpsEzabyY7S4OCkcKCazWZsTXh4eDhFE96bf3jt7c1Rzfqj5176Lx/65Pvv/+v33//X//2bT25sbgXTa7Xa/SdXfvDDf590dQAAcMebZRMOvZ4S823CoYOTwlGafxPec9/ZarW6Mcz/fvLK+/7sY8Hlvz761ddev9a9aW9v768+eUkTAgDAoGNn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" width="320" /></li>
</ul>
<br />
So...if you are seeing this mechanism for the first time, I hope this post will save you time. If you already use it - fill free to add here your created tools and shortcuts.<br />
<br />Roi Gamliel רועי גמליאלhttp://www.blogger.com/profile/07882658912051279530noreply@blogger.com1tag:blogger.com,1999:blog-2713252560567167671.post-90836565007131150872012-07-15T11:21:00.001+03:002012-07-15T11:21:10.113+03:00A necessary condition for hiring a new developper<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>HE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:DontVertAlignCellWithSp/>
<w:DontBreakConstrainedForcedTables/>
<w:DontVertAlignInTxbx/>
<w:Word11KerningPairs/>
<w:CachedColBalance/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="267">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:10.0pt;
mso-para-margin-left:0in;
line-height:115%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"Times New Roman";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:Arial;
mso-bidi-theme-font:minor-bidi;}
</style>
<![endif]-->
<div style="text-align: justify;">
<span style="background: white; font-family: "inherit","serif";">Sof</span><span style="background: white;">tware developers
often take part in the recruiting process. Determine whether a candidate
is suitable for our team/company is a challenge to say the
least. This is especially correct for us - software developers
with no HR training and in most cases used to take decisions
based on well constructed set of rules. However, this is not the case we face
in the recruiting process. This process requires us to use general guidelines,
our experience and intuition.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
At our company the <span style="background: white;">recruiting process begins with a professional interview where the
candidate is asked to code something, design something and show understanding
regarding the running environment. </span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><span style="background: white;">Who passes
the professional interview stage? </span></b></div>
<div style="text-align: justify;">
<span style="background: white;">We do not have
golden rules. After each interview we conduct a short meeting to decide
whether the candidate is suitable or not. We
use similar questions throughout all of our interviews which enable
us to better compare candidates. We interview in pairs and <span style="mso-spacerun: yes;"></span>each interviewer can veto. We believe our
general impression has the most weight on our decision.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><span style="background: white;">How hard it is
to make a decision?</span></b></div>
<div style="text-align: justify;">
<span style="background: white;">Well as Joel
Spolsky once wrote, there are three kind of candidates. The ones that you
easily know you want, the ones you easily know you don't want
and the maybes. Most of the effort is invested in the latter. </span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="background: white;">Lately we started
noticing that the ones we eventually hire from the maybes group have a
certain characteristic.<b> It is the ability of the candidate
to evaluate his own answers.</b> When asked a question, he knows which
information is missing in order to answer it well. He will then state what he
knows and what is missing. If he has been asked to solve a problem he will be
able to state which aspects of the problem his solution works for, and ask for more info in order to provide a complete solution.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="background: white;">A candidate which
does not have said characteristic behaves differently. They write code that doesn't
work and algorithms that does not do as expected. The problem with
this kind of candidates is that <b>we had to tell them</b> that there solution does
not work. They supply shallow, inaccurate, missing answers while they
believe they answered the question fully.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="background: none repeat scroll 0% 0% white;">This ability of
the candidate to evaluate his own answers is extremely important for
software developers. As developers, <b>almost every task requires evaluating
which information is missing in order to complete the task successfully.</b> Developers that do not have the ability to evaluate missing information </span><span style="background: white;"></span><span style="background: white;">will start coding too early and write bad code.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="background: white;">Following this characteristic,
we thought we might test this directly in the interview:</span></div>
<ul>
<li><span style="background: none repeat scroll 0% 0% white;">Ask the
candidate directly what information he is missing to answer the question?
This is good for knowledge questions.</span><span style="background: white;"> </span></li>
<li><span style="background: none repeat scroll 0% 0% white;">Ask a very
hard question. The candidate does not have a chance of answering. What we are
really looking for if to see if he realizes that instead of providing
false answers, he can show us his way of thinking.</span></li>
<li><span style="background: none repeat scroll 0% 0% white;"></span><span style="background: white;">Guesstimate questions.</span><span style="background: white;"> </span></li>
<li><span style="background: none repeat scroll 0% 0% white;">Ask
to design something with little information and hope he will ask you for what he is missing.</span></li>
</ul>
<div style="text-align: justify;">
<br /></div>
That's it. We hope it will help you add another aspect for your interviews.<br />11http://www.blogger.com/profile/05224022604837968582noreply@blogger.com0tag:blogger.com,1999:blog-2713252560567167671.post-81154963392060606562012-05-08T11:38:00.000+03:002012-05-08T11:40:28.984+03:00Developer's Fantasies<div style="text-align: justify;">
<span style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;">The moment I became
a proud father I almost lost all of my free time. Since then I became a proud
father two times more. To make a long story short – I have three kids. This
basically means no free time at all. Every now and then when I have five
minutes to think clearly I fantasize about things I would have done if only I
got the time. This includes learning how to play the guitar, teach high school
kids math, open my own pizzeria and much more. Even when I do find free time I
do not spend it on my fantasies because there is simply no point perusing any of them if I have no plan to stick with it.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;">As a
software developer we also have fantasies (job related - other fantasies
are out of scope). Each of us has his own ideas about a great change which will defiantly bring improvement. Those ideas are not realized
because they have no economical direct incentive. Such ideas range from developing
a smart text box which will use natural processing language and understands user
requests to replacing our existing old annoying build technology with
a new cool one. However, no one asked for a smart text box and the old annoying
build system works just fine.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="background-attachment: scroll; background-clip: initial; background-color: white; background-image: none; background-origin: initial; background-position: 0% 0%; background-repeat: repeat repeat;">What happens to
these fantasies in the agile era? Agile development teaches us to
pursue costumer value. Tasks are wrapped as user stories to ensure there
is no waste. Said stories are prioritized by value so at all time we work on the most important and valuable story. Technical debt and technical
user stories are dealt with extra care. We only work on the most painful ones.
We have been taught to adopt a new technology only if it helps us solve a
problem, not entertain us or keep us up to date. </span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="background-attachment: scroll; background-clip: initial; background-color: white; background-image: none; background-origin: initial; background-position: 0% 0%; background-repeat: repeat repeat;">The problem is
that besides the fact that it killed some of the fun in development it also
keeps our solutions close to where we found them.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="background-attachment: scroll; background-clip: initial; background-color: white; background-image: none; background-origin: initial; background-position: 0% 0%; background-repeat: repeat repeat;">Several algorithms
in computer science such as the Genetic Algorithm and the Simulated Annealing
Algorithm use randomization in order to escape minimum locality. In a
nutshell these algorithms are based on the following methodology: They start
with an initial solution to the problem. Then iteratively use 'smart' assumptions
to improve the solution by making small modifications to it. The more
iterations they undergo the better the solution they will find. The problem
with this approach is that the initial solution might be surrounded with bad
solution (minimum locality). In such scenario the algorithm will not perform
well and eventually return something close to the initial solution. How
do we escape such minimum locality? One suggestion is once in a while to change your
solution randomly without using your brain and smart assumptions. The idea is
that sometimes such a bounce will upgrade your solution so well that it will compensate
for other times where it did not help at all.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="background-attachment: scroll; background-clip: initial; background-color: white; background-image: none; background-origin: initial; background-position: 0% 0%; background-repeat: repeat repeat;">How can we escape minimum
locality in our development process? Even in the agile era we should spend some
time on our fantasies. Such random bounces in our iteration should be integrated
in the agile methodology. If we will stick to it long enough we will eventually
find better solutions for our problems. One thing we can promise. It will be
much more fun. </span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>11http://www.blogger.com/profile/05224022604837968582noreply@blogger.com0tag:blogger.com,1999:blog-2713252560567167671.post-49807885179440109622012-04-10T14:02:00.001+03:002012-04-11T14:51:57.328+03:00Performance Parameters - What should I expose?<div dir="LTR">
<br /></div>
<div dir="LTR">
<br />
<div style="margin-bottom: .0001pt; margin: 0in;">
<span style="font-size: 13.5pt;">This post begins with a short poll. Did you ever let your end-user
determine your application's thread pool size? Well if you didn't then you are
a better man then us, because we did and we were wrong doing so. Thread pool
size is just an example to a variety of performance parameters we
tend to publish as configuration. We don't mean to but do so at some point of
our application life cycle.<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0in;">
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0in;">
<span style="font-size: 13.5pt;">Like any good fairy tale at the beginning everyone are happy with
our new application. Then slowly but steady complaints start coming stating it
is too slow. To make it faster we use every trick we now. We start
optimizing SQL's, parallel what we can, use threads and refactor the code to be
more efficient. Everyone's happy? Not Yet! Now we get complaints
that although the job is done fast, the application takes too many
resources. "No problem", we say and immediately publish every performance
parameter we have in the code as configuration. That includes stuff like batch
size, poll interval, sleep time and naturally thread pool size.<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0in;">
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0in;">
<span style="font-size: 13.5pt;">This turns out to be a bad idea. It is a bad idea because the user
has no way of knowing which values are adequate. Moreover the values probably
depend on the hardware used, which as we know changes rapidly. It is a bad idea
because it uncovers implementation details. But it is a bad
idea mostly because it is not part of the user domain language.<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0in;">
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0in;">
<span style="font-size: 13.5pt;">Performance parameters should be handled just like any other
feature in the software. One should think of the user story behind it and
specify configuration accordingly. Some time it is only a terminology
change. Instead of using <i>"thread pool size"</i> you
use <i>"number of client served simultaneously"</i>. Sometimes
the mapping from the configuration parameter to an inner parameter will involve
some computation and heuristics. So you might configure "<i>Number of
items processed per minute</i>" which will be translated to <i>"batch
size"</i>, <i>"poll interval"</i> and so on....<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0in;">
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0in;">
<span style="font-size: 13.5pt;">So keep in mind. Performance parameters are not second-class
citizens. It should be specified with the same abstraction layer as the rest of
the software. It should hide any inner implementation details and if possible
it should be hardware independent.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</div>
<div dir="LTR">
<br /></div>
<div dir="LTR">
<br /></div>
<div dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;">
<br /></div>
<div class="MsoNormal" dir="RTL">
<br /></div>11http://www.blogger.com/profile/05224022604837968582noreply@blogger.com0tag:blogger.com,1999:blog-2713252560567167671.post-47876414621495878152012-03-22T12:21:00.000+02:002012-03-22T14:56:20.037+02:006 things they didn't teach me at the academy - Prepare yourself better for a developer's life<div class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; unicode-bidi: embed;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt;">Looking for your first position in the software world? Want to know more about developer's life? Improve your chances of getting hired and blend in better? Most cases you just finished your undergrad studies. The years you spent in the
academy are valuable and helpful in many ways, but don’t necessarily prepare
you for a developer's life. Now, this post is not about whether undergrad
studies are a necessary and sufficient condition for being a good programmer, nor
about which university prepares you better, but it is about pointing out what
might be overlooked during your study, what can be improved, and how one can have a head start when diving into this exciting world. We present you with 6 essential points that will help you in your upcoming venture:</span></div>
<div class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; unicode-bidi: embed;">
<br /></div>
<ul type="disc">
<li class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-left: 36.0pt; margin-right: 0cm; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-align: justify; unicode-bidi: embed;"><span style="font-family: "Times New Roman","serif"; font-size: 12pt;"><b>Understanding
the structure of a software company</b>. Although this can vary form company to company, in most cases there will be a distinction between Developers, QA's/Testers, Support, Product and IT. Understanding this structure beforehand will help a candidate understand the job description he is interviewing for. A new employee will blend in better, adopt business processes faster and utilize all the companies' capabilities.</span></li>
<li class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-left: 36pt; margin-right: 0cm; text-align: justify; unicode-bidi: embed;"><span style="font-family: "Times New Roman","serif"; font-size: 12pt;"><b>Development Methodologies.</b> Whether it's <a href="http://en.wikipedia.org/wiki/Waterfall_model" target="_blank">Waterfall </a>or <a href="http://en.wikipedia.org/wiki/Scrum_%28development%29" target="_blank">Scrum</a>, <a href="http://en.wikipedia.org/wiki/Agile_software_development" target="_blank">Agile </a>or not, understanding the different approaches in </span><span style="font-family: "Times New Roman","serif"; font-size: 12pt;"><a href="http://en.wikipedia.org/wiki/Software_development_methodologies" target="_blank">Development Methodologies</a> can give you a since of how your life will look like as a programmer. It could even help you choose a better suited company.</span></li>
<li class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-left: 36.0pt; margin-right: 0cm; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-align: justify; unicode-bidi: embed;"><span style="font-family: "Times New Roman","serif"; font-size: 12pt;"><b>Code Management tools and processes. </b> </span></li>
<ul>
<li class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-left: 36pt; margin-right: 0cm; text-align: justify; unicode-bidi: embed;"><span style="font-family: "Times New Roman","serif"; font-size: 12pt;">You can finish your degree with knowing slim to none about <b>code repository tools</b> such as <a href="http://subversion.apache.org/" target="_blank">SVN</a>, <a href="http://git-scm.com/" target="_blank">GIT</a>, etc, which are used extensively. </span></li>
<li class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-left: 36pt; margin-right: 0cm; text-align: justify; unicode-bidi: embed;"><span style="font-family: "Times New Roman","serif"; font-size: 12pt;"><a href="http://en.wikipedia.org/wiki/Continuous_integration" target="_blank"><b>Continuous Build</b></a> as a quality control process.</span></li>
<li class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-left: 36pt; margin-right: 0cm; text-align: justify; unicode-bidi: embed;"><span style="font-family: "Times New Roman","serif"; font-size: 12pt;"><b>Integration Test</b> as a phase in the development process. </span></li>
<li class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-left: 36pt; margin-right: 0cm; text-align: justify; unicode-bidi: embed;"><span style="font-family: "Times New Roman","serif"; font-size: 12pt;"><b>Issue tracking systems</b> such as <a href="http://trac.edgewall.org/" target="_blank">Trac </a>and <a href="http://www.atlassian.com/software/jira/overview" target="_blank">Jira </a>used to handle development process as a whole.</span></li>
</ul>
<li class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-left: 36pt; margin-right: 0cm; text-align: justify; unicode-bidi: embed;"><span style="font-family: "Times New Roman","serif"; font-size: 12pt;"><b>Coding
guidelines.</b> No need to be alarmed if you haven't coded much during your study. However - they say it takes 100 repeats to learn how to bench-press correctly, but if you learn it the wrong way then it takes 10000 to correct yourself. Teach yourself how to write good code from the very start. A great book to get you started is </span><a href="http://cc2e.com/" target="_blank">Code Complete, Second Edition</a><span style="font-family: "Times New Roman","serif"; font-size: 12pt;">. </span></li>
<li class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-left: 36.0pt; margin-right: 0cm; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-align: justify; unicode-bidi: embed;"><span style="font-family: "Times New Roman","serif"; font-size: 12pt;"><b>IDE usage</b>.</span></li>
<ul>
<li class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-left: 36pt; margin-right: 0cm; text-align: justify; unicode-bidi: embed;"><span style="font-family: "Times New Roman","serif"; font-size: 12pt;">IDE's are great - Don't you think? If you haven't mastered one during your studies - that's a shame. They really make life easier and supply easy access to new technologies.</span></li>
<li class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-left: 36pt; margin-right: 0cm; text-align: justify; unicode-bidi: embed;"><span style="font-family: "Times New Roman","serif"; font-size: 12pt;">However, on the downside - if you adopted one too fast - you might be baffled when someone will ask you to run something from the command line or mention the word classpath. Be aware that there is a world outside your IDE.</span></li>
</ul>
<li class="MsoNormal" dir="LTR" style="direction: ltr; line-height: normal; margin-left: 36.0pt; margin-right: 0cm; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-align: justify; unicode-bidi: embed;"><span style="font-family: "Times New Roman","serif"; font-size: 12pt;"><b>Utilizing
the power of open source.</b> Let's say you have a great idea for a new project. Most chances are that a large portion of your project's infrastructure is already available as open source. Moreover, choosing the right technology can save you an enormous amount of time. A new developer must understand that open source is a powerful tool that can be leveraged- there is no need to invent the wheel every time.</span></li>
</ul>
<span style="font-family: "Times New Roman","serif"; font-size: 12pt;"> </span><span style="font-family: "Times New Roman","serif"; font-size: 12pt;">As a final note, and from our point of view, the best tip that we can give a starting developer is <b>joining an open source code initiative. </b>This can certainly introduce him to most of the concepts mentioned above, get him a feel of the software world, and make the difference between him and other job seeking developers.</span><br />
<span style="font-family: "Times New Roman","serif"; font-size: 12pt;"><br /></span><br />
<span style="font-family: "Times New Roman","serif"; font-size: 12pt;"><br /></span>Roi Gamliel רועי גמליאלhttp://www.blogger.com/profile/07882658912051279530noreply@blogger.com0tag:blogger.com,1999:blog-2713252560567167671.post-16897900203252338712012-02-27T18:10:00.000+02:002012-02-27T18:10:44.359+02:00Junior Developers - Anthropological Review<span style="font-size: 11pt;">Junior Developers...You can't live with them and it is illegal to shoot them.
Well, except maybe for our North Korean readers. So how the hell can you pass software
development knowledge to someone who thinks that Maven is a city in Eastern Europe?</span><br />
<br />
<span style="font-size: 11pt;">In his book 'Software Development as a
Cooperative Game', Alistair Cockburn describes the three levels of learning in
Aikido. They are <b>Shu</b>, <b>Ha</b> and <b>Ri </b>which
roughly translate into <b>learn</b>, <b>detach</b> and <b>transcend</b>.</span><br />
<ul style="text-align: -webkit-auto;" type="disc">
<li class="MsoNormal" style="mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><span style="font-size: 11pt;">A
worrier in the <b>Shu </b>level learns techniques from his master
and copies them. This level is also called ‘Follow the Master’.</span></li>
<li class="MsoNormal" style="mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><span style="font-size: 11pt;">In
the <b>Ha</b> level the worrier learns the strengths and
limitations of a technique. He learns other techniques and can now choose
which one to use according to his position. </span></li>
<li class="MsoNormal" style="mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><span style="font-size: 11pt;">In
the last level <b>Ri</b> the worrier creates a blend of
techniques he knows, while also inventing new ones.</span></li>
</ul>
<span style="font-size: 11pt;">These three levels of learning exist in any
craft, software development included. The Junior is naturally at Shu level in
most aspects of software development. Consider Object Oriented Design for
example. A Junior will adequately follow the rules he just learned at the CRC
Object Oriented Design course. He is the one saying "We should
use smaller cards. In the course they told us to use 6 inch cards...”</span><br />
<br />
<span style="font-size: 11pt;">Let’s consider the communication between two
people in different levels. If we deduce it to our world then it is between a Senior
and a 'Shu' level worrier/developer. A Junior will always prefer to receive a
set of instructions/rules for every task he needs to accomplish.</span><br />
<br />
<span style="font-size: 11pt;">A Junior joining a software development team
has a lot of catching up to do. He doesn't know the product. He doesn't know
the business domain. He might not know all the tools and technologies you are
using. He definitely has no familiarity with software development
idioms such as Dependency Injections, Continues Build, etc. Make sure his
assigned tasks are with no more then one unknown domain. Moreover, make
sure he understands that one of the task goals is to better understand that
unknown domain. Taking a different approach will lead the Junior to the
mood of "the world is too complicated to understand", rushing to you
with problem descriptions like "That red thing is not talking to the green
part of my screen anymore. I tried to restart it but it doesn't help".
Remember that a software developer must be inspired to understand what is
happening under the hood. Throwing to much complexity at once might generate
the exact opposite. </span><br />
<br />
<span style="font-size: 11pt;">Embracing new technologies is a good practice
– depends when and where. Google-Guice home page describes how using the ‘new’
operator is old-school. In the Git home page they tell you that using a
client-server source control is old news - Distributed Source Control is Da -
Bomb. When visiting the Scala home page they will convince you that using
critical section and ‘synchronize’ is ancient history - STM (software transactional
memory) is buzzing. The Junior will believe them all. One day he will call
you all excited for a simple dialog application demo. It will be on a Git
branch, while all objects will be created using Guice, and instances will only
communicate using an inner event bus that uses weird syntax of embedded Scala
code... you get the idea. So please don't let a Junior embrace new
technologies without your review.</span><br />
<br />
<span style="font-size: 11pt;">The Junior only recently graduated from the
University. He already gain experience in problem solving. In the
University solutions are always elegant yet complicated where in the
real world most chances the best solution is naive yet simple. Once more
he will come to you showing off his latest coding. He was instructed to read
some configuration from a database and save it in-memory. You
are desperately trying to keep up with his explanation on
why he had to use a red-black tree (something about reducing
the complexity from O(nlogn) to O(lognlogn)) while also trying
to overcome the sharp pain you suddenly feel in the chest. So stop
mumbling "...but there were only 20 rows in that table..." and
remember that you must change his approach to the well known "keep it
simple".</span><br />
<br />
<span style="font-size: 11pt;">Stating the above, we cant ignore the benefits of Juniors. Their ability to adopt new technologies, highly motivated and hard working (usually they don't have 3 mouths to feed...)</span><br />
<span style="font-size: 11pt;"><br /></span><br />
<span style="font-size: 11pt;"><br /></span>11http://www.blogger.com/profile/05224022604837968582noreply@blogger.com0tag:blogger.com,1999:blog-2713252560567167671.post-11431686560830589672012-02-22T19:08:00.003+02:002012-02-22T19:08:58.326+02:00Extending the Task Service in Activiti EngineAs we described in our <a href="http://developer4life.blogspot.com/2012/02/activiti-authentication-and-identity.html" target="_blank">latest post</a>,
we have been trying out Activiti lately. A challenge we came across was
to create our own Human Task Service of some sort, as we
had used our own Identity Management. In a typical BPM system the Process Engine and Human Task Service are decoupled from one another. Moreover, a standard called WS-HumanTask Service exists for establishing a protocol between the last two. However, in Activiti's case the Human Task Service is embedded inside the engine.<br />
<br />
So we took a different approach as we wanted to use our own human task server. We thought that if we will be notified about changes occurring inside Activiti's engine concerning user tasks (e.g. create task event), we could propagate those notifications to <b>our </b>Human Task Service. Unfortunately, we found out that Activiti's engine does not have a notification mechanism as we hoped (at least in 5.8 - there are talking about an event bus in future releases), so we had to use another mechanism to achieve this task.<br />
<br />
Apparently Activiti does have a notification mechanism while parsing a BPMN process definition XML. It allows one to plug in a listener which will be notified in several events. One of those events is when a user task is being parsed. This was exactly what we needed. We plugged our own listener implementation and every time a user task was parsed we added a TaskListenr to the user task in the process definition. This listener was invoked by the engine when this task was created. Obviously the listener impl is to simply send a notification as "Task Created" to our own Human Task Service. Note: you will also have to manage the task life-cycle and update Activiti's engine using its services.<br />
<br />
Now for the technical details. As in our <a href="http://developer4life.blogspot.com/2012/02/activiti-authentication-and-identity.html" target="_blank">latest post</a>, this requires:<br />
<ul>
<li>adding a Java class implementing <a href="http://activiti.org/javadocs/org/activiti/engine/impl/bpmn/parser/class-use/BpmnParseListener.html" target="_blank"><b>BpmnParseListener</b></a>. This is the interface you want to implement to plug in your own listener.</li>
<li>injecting the Java class using the Spring xml config file.</li>
</ul>
<br />
<span style="font-size: large;"><u><b>BpmnParseListener Class </b></u></span><br />
We implement a <b>TaskListener </b>for each of the events we are interested in:<br />
<ul>
<li>CompleteTaskListenerImpl </li>
<li> AssigneTaskListenerImpl </li>
<li> CreateTaskListenerImpl </li>
</ul>
<br />
We Override the <b>parseUserTask</b> method so that in each time a parse event occurs our <b>TaskListeners </b>will add some logic on <b>our </b>WS-HumanTask Service/Task Service. The rest of the parse events will be ignored.<br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;">
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;">
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> 1:</span> <span style="color: blue;">package</span> my.great.company.com.businessprocessengine.listeners;</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum2" style="color: #606060;"> 2:</span> <span style="color: blue;">import</span> java.util.ArrayList;</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum3" style="color: #606060;"> 3:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum4" style="color: #606060;"> 4:</span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum5" style="color: #606060;"> 5:</span> <span style="color: blue;">public</span> <span style="color: blue;">class</span> MyBpmnParseListener <span style="color: blue;">implements</span> BpmnParseListener</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum6" style="color: #606060;"> 6:</span> { </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum7" style="color: #606060;"> 7:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum8" style="color: #606060;"> 8:</span> <span style="color: blue;">private</span> <span style="color: blue;">final</span> <span style="color: blue;">class</span> CompleteTaskListenerImpl <span style="color: blue;">implements</span> TaskListener {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum9" style="color: #606060;"> 9:</span> @Override</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum10" style="color: #606060;"> 10:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> notify(DelegateTask delegateTask) { </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum11" style="color: #606060;"> 11:</span> <span style="color: green;">//TODO: this is where your logic should be added</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum12" style="color: #606060;"> 12:</span> logger.info(<span style="color: #006080;">"TASK COMPLETE from Activiti "</span> + delegateTask.toString());</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum13" style="color: #606060;"> 13:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum14" style="color: #606060;"> 14:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum15" style="color: #606060;"> 15:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum16" style="color: #606060;"> 16:</span> <span style="color: blue;">private</span> <span style="color: blue;">final</span> <span style="color: blue;">class</span> AssigneTaskListenerImpl <span style="color: blue;">implements</span> TaskListener {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum17" style="color: #606060;"> 17:</span> @Override</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum18" style="color: #606060;"> 18:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> notify(DelegateTask delegateTask) {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum19" style="color: #606060;"> 19:</span> <span style="color: green;">//TODO: this is where your logic should be added </span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum20" style="color: #606060;"> 20:</span> logger.info(<span style="color: #006080;">"TASK ASSIGN from Activiti "</span> + delegateTask.toString());</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum21" style="color: #606060;"> 21:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum22" style="color: #606060;"> 22:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum23" style="color: #606060;"> 23:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum24" style="color: #606060;"> 24:</span> <span style="color: blue;">private</span> <span style="color: blue;">final</span> <span style="color: blue;">class</span> CreateTaskListenerImpl <span style="color: blue;">implements</span> TaskListener {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum25" style="color: #606060;"> 25:</span> @Override</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum26" style="color: #606060;"> 26:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> notify(DelegateTask delegateTask) {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum27" style="color: #606060;"> 27:</span> <span style="color: green;">//TODO: this is where your logic should be added </span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum28" style="color: #606060;"> 28:</span> logger.info(<span style="color: #006080;">"TASK CREATE from Activiti "</span> + taskEntity.toString());</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum29" style="color: #606060;"> 29:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum30" style="color: #606060;"> 30:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum31" style="color: #606060;"> 31:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum32" style="color: #606060;"> 32:</span> <span style="color: blue;">private</span> TaskListener createTaskListener = <span style="color: blue;">new</span> CreateTaskListenerImpl();</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum33" style="color: #606060;"> 33:</span> <span style="color: blue;">private</span> TaskListener assigneTaskListener = <span style="color: blue;">new</span> AssigneTaskListenerImpl();</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum34" style="color: #606060;"> 34:</span> <span style="color: blue;">private</span> TaskListener completeTaskListener = <span style="color: blue;">new</span> CompleteTaskListenerImpl(); </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum35" style="color: #606060;"> 35:</span> <span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">final</span> Logger logger = Logger.getLogger(MyBpmnParseListener.<span style="color: blue;">class</span>);</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum36" style="color: #606060;"> 36:</span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum37" style="color: #606060;"> 37:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum38" style="color: #606060;"> 38:</span> <span style="color: blue;">public</span> MyBpmnParseListener(){}</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum39" style="color: #606060;"> 39:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum40" style="color: #606060;"> 40:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum41" style="color: #606060;"> 41:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseUserTask(Element userTaskElement, ScopeImpl scope, ActivityImpl activity)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum42" style="color: #606060;"> 42:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum43" style="color: #606060;"> 43:</span> ActivityBehavior activitybehaviour = activity.getActivityBehavior();</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum44" style="color: #606060;"> 44:</span> <span style="color: blue;">if</span> (activitybehaviour <span style="color: blue;">instanceof</span> UserTaskActivityBehavior)</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum45" style="color: #606060;"> 45:</span> {</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum46" style="color: #606060;"> 46:</span> UserTaskActivityBehavior userTaskActivity = (UserTaskActivityBehavior) activitybehaviour;</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum47" style="color: #606060;"> 47:</span> <span style="color: blue;">if</span> (createTaskListener != null)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum48" style="color: #606060;"> 48:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum49" style="color: #606060;"> 49:</span> userTaskActivity.getTaskDefinition().addTaskListener(TaskListener.EVENTNAME_CREATE, createTaskListener);</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum50" style="color: #606060;"> 50:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum51" style="color: #606060;"> 51:</span> <span style="color: blue;">if</span> (assigneTaskListener != null)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum52" style="color: #606060;"> 52:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum53" style="color: #606060;"> 53:</span> userTaskActivity.getTaskDefinition().addTaskListener(TaskListener.EVENTNAME_ASSIGNMENT,assigneTaskListener);</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum54" style="color: #606060;"> 54:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum55" style="color: #606060;"> 55:</span> <span style="color: blue;">if</span> (completeTaskListener != null)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum56" style="color: #606060;"> 56:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum57" style="color: #606060;"> 57:</span> userTaskActivity.sgetTaskDefinition().addTaskListener(TaskListener.EVENTNAME_COMPLETE,completeTaskListener);</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum58" style="color: #606060;"> 58:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum59" style="color: #606060;"> 59:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum60" style="color: #606060;"> 60:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum61" style="color: #606060;"> 61:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum62" style="color: #606060;"> 62:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum63" style="color: #606060;"> 63:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseRootElement(Element arg0, List<ProcessDefinitionEntity> arg1)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum64" style="color: #606060;"> 64:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum65" style="color: #606060;"> 65:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum66" style="color: #606060;"> 66:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum67" style="color: #606060;"> 67:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum68" style="color: #606060;"> 68:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum69" style="color: #606060;"> 69:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseProcess(Element processElement, ProcessDefinitionEntity processDefinition)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum70" style="color: #606060;"> 70:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum71" style="color: #606060;"> 71:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum72" style="color: #606060;"> 72:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum73" style="color: #606060;"> 73:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum74" style="color: #606060;"> 74:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum75" style="color: #606060;"> 75:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseStartEvent(Element startEventElement, ScopeImpl scope, ActivityImpl startEventActivity)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum76" style="color: #606060;"> 76:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum77" style="color: #606060;"> 77:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum78" style="color: #606060;"> 78:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum79" style="color: #606060;"> 79:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum80" style="color: #606060;"> 80:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum81" style="color: #606060;"> 81:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseExclusiveGateway(Element exclusiveGwElement, ScopeImpl scope, ActivityImpl activity)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum82" style="color: #606060;"> 82:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum83" style="color: #606060;"> 83:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum84" style="color: #606060;"> 84:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum85" style="color: #606060;"> 85:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum86" style="color: #606060;"> 86:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum87" style="color: #606060;"> 87:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseParallelGateway(Element parallelGwElement, ScopeImpl scope, ActivityImpl activity)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum88" style="color: #606060;"> 88:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum89" style="color: #606060;"> 89:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum90" style="color: #606060;"> 90:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum91" style="color: #606060;"> 91:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum92" style="color: #606060;"> 92:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum93" style="color: #606060;"> 93:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseScriptTask(Element scriptTaskElement, ScopeImpl scope, ActivityImpl activity)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum94" style="color: #606060;"> 94:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum95" style="color: #606060;"> 95:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum96" style="color: #606060;"> 96:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum97" style="color: #606060;"> 97:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum98" style="color: #606060;"> 98:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum99" style="color: #606060;"> 99:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseServiceTask(Element serviceTaskElement, ScopeImpl scope, ActivityImpl activity)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum100" style="color: #606060;"> 100:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum101" style="color: #606060;"> 101:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum102" style="color: #606060;"> 102:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum103" style="color: #606060;"> 103:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum104" style="color: #606060;"> 104:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum105" style="color: #606060;"> 105:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseTask(Element taskElement, ScopeImpl scope, ActivityImpl activity)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum106" style="color: #606060;"> 106:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum107" style="color: #606060;"> 107:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum108" style="color: #606060;"> 108:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum109" style="color: #606060;"> 109:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum110" style="color: #606060;"> 110:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum111" style="color: #606060;"> 111:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseManualTask(Element manualTaskElement, ScopeImpl scope, ActivityImpl activity)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum112" style="color: #606060;"> 112:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum113" style="color: #606060;"> 113:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum114" style="color: #606060;"> 114:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum115" style="color: #606060;"> 115:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum116" style="color: #606060;"> 116:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum117" style="color: #606060;"> 117:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseEndEvent(Element endEventElement, ScopeImpl scope, ActivityImpl activity)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum118" style="color: #606060;"> 118:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum119" style="color: #606060;"> 119:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum120" style="color: #606060;"> 120:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum121" style="color: #606060;"> 121:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum122" style="color: #606060;"> 122:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum123" style="color: #606060;"> 123:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseBoundaryTimerEventDefinition(Element timerEventDefinition, <span style="color: blue;">boolean</span> interrupting,</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum124" style="color: #606060;"> 124:</span> ActivityImpl timerActivity)</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum125" style="color: #606060;"> 125:</span> {</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum126" style="color: #606060;"> 126:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum127" style="color: #606060;"> 127:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum128" style="color: #606060;"> 128:</span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum129" style="color: #606060;"> 129:</span> @Override</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum130" style="color: #606060;"> 130:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseSubProcess(Element subProcessElement, ScopeImpl scope, ActivityImpl activity)</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum131" style="color: #606060;"> 131:</span> {</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum132" style="color: #606060;"> 132:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum133" style="color: #606060;"> 133:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum134" style="color: #606060;"> 134:</span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum135" style="color: #606060;"> 135:</span> @Override</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum136" style="color: #606060;"> 136:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseCallActivity(Element callActivityElement, ScopeImpl scope, ActivityImpl activity)</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum137" style="color: #606060;"> 137:</span> {</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum138" style="color: #606060;"> 138:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum139" style="color: #606060;"> 139:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum140" style="color: #606060;"> 140:</span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum141" style="color: #606060;"> 141:</span> @Override</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum142" style="color: #606060;"> 142:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseProperty(Element propertyElement, VariableDeclaration variableDeclaration, ActivityImpl activity)</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum143" style="color: #606060;"> 143:</span> {</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum144" style="color: #606060;"> 144:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum145" style="color: #606060;"> 145:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum146" style="color: #606060;"> 146:</span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum147" style="color: #606060;"> 147:</span> @Override</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum148" style="color: #606060;"> 148:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseSequenceFlow(Element sequenceFlowElement, ScopeImpl scopeElement, TransitionImpl transition)</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum149" style="color: #606060;"> 149:</span> {</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum150" style="color: #606060;"> 150:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum151" style="color: #606060;"> 151:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum152" style="color: #606060;"> 152:</span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum153" style="color: #606060;"> 153:</span> @Override</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum154" style="color: #606060;"> 154:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseSendTask(Element sendTaskElement, ScopeImpl scope, ActivityImpl activity)</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum155" style="color: #606060;"> 155:</span> {</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum156" style="color: #606060;"> 156:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum157" style="color: #606060;"> 157:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum158" style="color: #606060;"> 158:</span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum159" style="color: #606060;"> 159:</span> @Override</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum160" style="color: #606060;"> 160:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseBusinessRuleTask(Element businessRuleTaskElement, ScopeImpl scope, ActivityImpl activity)</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum161" style="color: #606060;"> 161:</span> {</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum162" style="color: #606060;"> 162:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum163" style="color: #606060;"> 163:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum164" style="color: #606060;"> 164:</span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum165" style="color: #606060;"> 165:</span> @Override</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum166" style="color: #606060;"> 166:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseBoundaryErrorEventDefinition(Element errorEventDefinition, <span style="color: blue;">boolean</span> interrupting,</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum167" style="color: #606060;"> 167:</span> ActivityImpl activity, ActivityImpl nestedErrorEventActivity)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum168" style="color: #606060;"> 168:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum169" style="color: #606060;"> 169:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum170" style="color: #606060;"> 170:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum171" style="color: #606060;"> 171:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum172" style="color: #606060;"> 172:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum173" style="color: #606060;"> 173:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseIntermediateTimerEventDefinition(Element timerEventDefinition, ActivityImpl timerActivity)</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum174" style="color: #606060;"> 174:</span> {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum175" style="color: #606060;"> 175:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum176" style="color: #606060;"> 176:</span> }</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum177" style="color: #606060;"> 177:</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum178" style="color: #606060;"> 178:</span> @Override</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum179" style="color: #606060;"> 179:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseMultiInstanceLoopCharacteristics(Element activityElement, </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum180" style="color: #606060;"> 180:</span> Element multiInstanceLoopCharacteristicsElement, ActivityImpl activity)</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum181" style="color: #606060;"> 181:</span> {</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum182" style="color: #606060;"> 182:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum183" style="color: #606060;"> 183:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum184" style="color: #606060;"> 184:</span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum185" style="color: #606060;"> 185:</span> @Override</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum186" style="color: #606060;"> 186:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> parseInclusiveGateway(Element arg0, ScopeImpl arg1, ActivityImpl arg2) {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum187" style="color: #606060;"> 187:</span> <span style="color: green;">// Nothing to do here</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum188" style="color: #606060;"> 188:</span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum189" style="color: #606060;"> 189:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum190" style="color: #606060;"> 190:</span> }</pre>
</div>
</div>
<br />
<span style="font-size: large;"><u><b>Spring configuration</b></u></span><br />
<br />
The Spring file change will be done in our context XML file:<br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;">
<br />
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;">
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> 1:</span> ...<span style="color: blue;"> </span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum2" style="color: #606060;"> 2:</span> <span style="color: blue;"><</span><span style="color: maroon;">bean</span> <span style="color: red;">id</span><span style="color: blue;">="processEngineConfiguration"</span> <span style="color: red;">class</span><span style="color: blue;">="org.activiti.spring.SpringProcessEngineConfiguration"</span><span style="color: blue;">></span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum3" style="color: #606060;"> 3:</span> ...</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum4" style="color: #606060;"> 4:</span> <span style="color: blue;"><</span><span style="color: maroon;">property</span> <span style="color: red;">name</span><span style="color: blue;">="preParseListeners"</span><span style="color: blue;">></span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum5" style="color: #606060;"> 5:</span> <span style="color: blue;"><</span><span style="color: maroon;">list</span><span style="color: blue;">></span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum6" style="color: #606060;"> 6:</span> <span style="color: blue;"><</span><span style="color: maroon;">bean</span> <span style="color: red;">class</span><span style="color: blue;">="my.great.company.com.businessprocessengine.listeners.MyBpmnParseListener"</span><span style="color: blue;">></</span><span style="color: maroon;">bean</span><span style="color: blue;">></span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum7" style="color: #606060;"> 7:</span> <span style="color: blue;"></</span><span style="color: maroon;">list</span><span style="color: blue;">></span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum8" style="color: #606060;"> 8:</span> <span style="color: blue;"></</span><span style="color: maroon;">property</span><span style="color: blue;">></span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum9" style="color: #606060;"> 9:</span> ...</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum10" style="color: #606060;"> 10:</span> <span style="color: blue;"></</span><span style="color: maroon;">bean</span><span style="color: blue;">>...</span></pre>
<pre style="background-color: #f4f4f4; border-style: none; color: black; direction: ltr; font-family: 'Courier New',courier,monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding: 0px; text-align: left; width: 100%;"><span style="color: blue;"> </span></pre>
</div>
</div>
<br />
That's it. You are good to go and handle tasks on your own. Good luck.<br />
<br />11http://www.blogger.com/profile/05224022604837968582noreply@blogger.com1tag:blogger.com,1999:blog-2713252560567167671.post-511231816476649622012-02-15T20:21:00.000+02:002012-02-15T20:32:35.935+02:00Activiti Authentication And Identity Management TutorialThis time we focus on <a href="http://en.wikipedia.org/wiki/Business_process_management" target="_blank">Business Process Management </a>(BPM) and more precisely on <a href="http://www.activiti.org/">Activiti</a>. Activiti is an open source process engine for Java, that we decided to look into. One of the questions that arose during development was how to assimilate our users and groups into the Activiti platform. Luckily, this is supported by the Activiti engine, but not so well documented (to our knowledge). We have decided to take on the challenge, and create a quick tutorial on how to manage users and groups identity in Activiti (and more precisely Activiti 5.8).<br />
<br />
Activiti supports two main entry points that you need to implement in order to integrate your identity solution. These are the user manager and the group manager classes. We will first create a factory for group/user management, and then implement the class that we create in the factory. Lets take a dive into the code, implementing the <b>MyGroupManagerFactory</b> class first:<br />
<br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;">
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;">
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> 1:</span> <span style="color: blue;">package</span> my.great.company.com.businessprocessengine.identityservice;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum2" style="color: #606060;"> 2:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum3" style="color: #606060;"> 3:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.interceptor.Session;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum4" style="color: #606060;"> 4:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.interceptor.SessionFactory;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum5" style="color: #606060;"> 5:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.persistence.entity.GroupManager;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum6" style="color: #606060;"> 6:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum7" style="color: #606060;"> 7:</span> <span style="color: blue;">public</span> <span style="color: blue;">class</span> MyGroupManagerFactory <span style="color: blue;">implements</span> SessionFactory {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum8" style="color: #606060;"> 8:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum9" style="color: #606060;"> 9:</span> <span style="color: blue;">private</span> MyConnectionParams connectionParams;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum10" style="color: #606060;"> 10:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum11" style="color: #606060;"> 11:</span> <span style="color: blue;">public</span> MyGroupManagerFactory(MyConnectionParams params) {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum12" style="color: #606060;"> 12:</span> <span style="color: blue;">this</span>.connectionParams = params;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum13" style="color: #606060;"> 13:</span> }</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum14" style="color: #606060;"> 14:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum15" style="color: #606060;"> 15:</span> @Override</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum16" style="color: #606060;"> 16:</span> <span style="color: blue;">public</span> Class<?> getSessionType() {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum17" style="color: #606060;"> 17:</span> <span style="color: blue;">return</span> GroupManager.<span style="color: blue;">class</span>;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum18" style="color: #606060;"> 18:</span> }</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum19" style="color: #606060;"> 19:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum20" style="color: #606060;"> 20:</span> @Override</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum21" style="color: #606060;"> 21:</span> <span style="color: blue;">public</span> Session openSession() {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum22" style="color: #606060;"> 22:</span> <span style="color: blue;">return</span> <span style="color: blue;">new</span> MyGroupManager(connectionParams);</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum23" style="color: #606060;"> 23:</span> }</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum24" style="color: #606060;"> 24:</span> }</pre>
</div>
</div>
We will also want to provide a factory for user management classes, so here is the <b>MyUserManagerFactory</b> :<br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;">
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;">
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> 1:</span> <span style="color: blue;">package</span> my.great.company.com.businessprocessengine.identityservice;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum2" style="color: #606060;"> 2:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum3" style="color: #606060;"> 3:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.interceptor.Session;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum4" style="color: #606060;"> 4:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.interceptor.SessionFactory;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum5" style="color: #606060;"> 5:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.persistence.entity.UserManager;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum6" style="color: #606060;"> 6:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum7" style="color: #606060;"> 7:</span> <span style="color: blue;">public</span> <span style="color: blue;">class</span> MyUserManagerFactory <span style="color: blue;">implements</span> SessionFactory {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum8" style="color: #606060;"> 8:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum9" style="color: #606060;"> 9:</span> <span style="color: blue;">private</span> MyConnectionParams connectionParams;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum10" style="color: #606060;"> 10:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum11" style="color: #606060;"> 11:</span> <span style="color: blue;">public</span> MyUserManagerFactory(MyConnectionParams params) {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum12" style="color: #606060;"> 12:</span> <span style="color: blue;">this</span>.connectionParams = params;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum13" style="color: #606060;"> 13:</span> }</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum14" style="color: #606060;"> 14:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum15" style="color: #606060;"> 15:</span> @Override</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum16" style="color: #606060;"> 16:</span> <span style="color: blue;">public</span> Class<?> getSessionType() {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum17" style="color: #606060;"> 17:</span> <span style="color: blue;">return</span> UserManager.<span style="color: blue;">class</span>;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum18" style="color: #606060;"> 18:</span> }</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum19" style="color: #606060;"> 19:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum20" style="color: #606060;"> 20:</span> @Override</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum21" style="color: #606060;"> 21:</span> <span style="color: blue;">public</span> Session openSession() {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum22" style="color: #606060;"> 22:</span> <span style="color: blue;">return</span> <span style="color: blue;">new</span> MyUserManager(connectionParams);</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum23" style="color: #606060;"> 23:</span> }</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum24" style="color: #606060;"> 24:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum25" style="color: #606060;"> 25:</span> }</pre>
</div>
</div>
As you can see above we assume that we want to get connection prams in the instantiation of the classes (assume <b>MyConnectionParams</b> is a simple POJO, and implement it for your needs). Moreover, you will need the Activiti engine jar file in your classpath.<br />
<br />
We now implement <b>MyGroupManager</b> and <b>MyUserManager</b> classes. We did not not detail the entire code, but created an example to show what must be implemented and what you can skip. In <b>MyGroupManager</b> we only implemented the <i>findGroupByQueryCriteria</i>, and <i>findGroupCountByQueryCriteria</i>. Methods that are marked with TODO notation are mandatory in order to work with Activiti core engine. If you want to work with Activity Explorer - implement all the methods. <br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;">
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;">
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> 1:</span> package my.great.company.com.businessprocessengine.identityservice;</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum2" style="color: #606060;"> 2:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum3" style="color: #606060;"> 3:</span> <span style="color: blue;">import</span> java.util.ArrayList;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum4" style="color: #606060;"> 4:</span> <span style="color: blue;">import</span> java.util.List;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum5" style="color: #606060;"> 5:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum6" style="color: #606060;"> 6:</span> <span style="color: blue;">import</span> org.activiti.engine.ActivitiException;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum7" style="color: #606060;"> 7:</span> <span style="color: blue;">import</span> org.activiti.engine.identity.Group;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum8" style="color: #606060;"> 8:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.GroupQueryImpl;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum9" style="color: #606060;"> 9:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.Page;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum10" style="color: #606060;"> 10:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.persistence.entity.GroupEntity;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum11" style="color: #606060;"> 11:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.persistence.entity.GroupManager;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum12" style="color: #606060;"> 12:</span> <span style="color: blue;">import</span> org.apache.commons.lang.StringUtils;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum13" style="color: #606060;"> 13:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum14" style="color: #606060;"> 14:</span> <span style="color: blue;">public</span> <span style="color: blue;">class</span> MyGroupManager <span style="color: blue;">extends</span> GroupManager {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum15" style="color: #606060;"> 15:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum16" style="color: #606060;"> 16:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum17" style="color: #606060;"> 17:</span> <span style="color: blue;">public</span> MyGroupManager(MyConnectionParams connectionParams) {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum18" style="color: #606060;"> 18:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum19" style="color: #606060;"> 19:</span> }</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum20" style="color: #606060;"> 20:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum21" style="color: #606060;"> 21:</span> @Override</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum22" style="color: #606060;"> 22:</span> <span style="color: blue;">public</span> Group createNewGroup(String groupId) {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum23" style="color: #606060;"> 23:</span> <span style="color: blue;">throw</span> <span style="color: blue;">new</span> ActivitiException(<span style="color: #006080;">"My group manager doesn't support creating a new group"</span>);</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum24" style="color: #606060;"> 24:</span> }</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum25" style="color: #606060;"> 25:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum26" style="color: #606060;"> 26:</span> @Override</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum27" style="color: #606060;"> 27:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> insertGroup(Group group) {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum28" style="color: #606060;"> 28:</span> <span style="color: blue;">throw</span> <span style="color: blue;">new</span> ActivitiException(<span style="color: #006080;">"My group manager doesn't support inserting a new group"</span>);</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum29" style="color: #606060;"> 29:</span> }</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum30" style="color: #606060;"> 30:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum31" style="color: #606060;"> 31:</span> @Override</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum32" style="color: #606060;"> 32:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> updateGroup(Group updatedGroup) {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum33" style="color: #606060;"> 33:</span> <span style="color: blue;">throw</span> <span style="color: blue;">new</span> ActivitiException(<span style="color: #006080;">"My group manager doesn't support updating a new group"</span>);</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum34" style="color: #606060;"> 34:</span> }</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum35" style="color: #606060;"> 35:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum36" style="color: #606060;"> 36:</span> @Override</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum37" style="color: #606060;"> 37:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> deleteGroup(String groupId) {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum38" style="color: #606060;"> 38:</span> <span style="color: blue;">throw</span> <span style="color: blue;">new</span> ActivitiException(<span style="color: #006080;">"My group manager doesn't support deleting a new group"</span>);</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum39" style="color: #606060;"> 39:</span> }</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum40" style="color: #606060;"> 40:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum41" style="color: #606060;"> 41:</span> @Override</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum42" style="color: #606060;"> 42:</span> <span style="color: blue;">public</span> <span style="color: blue;">long</span> findGroupCountByQueryCriteria(Object query) {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum43" style="color: #606060;"> 43:</span> <span style="color: blue;">return</span> findGroupByQueryCriteria(query, null).size();</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum44" style="color: #606060;"> 44:</span> }</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum45" style="color: #606060;"> 45:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum46" style="color: #606060;"> 46:</span> @Override</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum47" style="color: #606060;"> 47:</span> <span style="color: blue;">public</span> List<Group> findGroupByQueryCriteria(Object query, Page page) {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum48" style="color: #606060;"> 48:</span> List<Group> groupList = <span style="color: blue;">new</span> ArrayList<Group>();</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum49" style="color: #606060;"> 49:</span> GroupQueryImpl groupQuery = (GroupQueryImpl) query;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum50" style="color: #606060;"> 50:</span> <span style="color: blue;">if</span> (StringUtils.isNotEmpty(groupQuery.getId())) {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum51" style="color: #606060;"> 51:</span> GroupEntity singleGroup = findGroupById(groupQuery.getId());</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum52" style="color: #606060;"> 52:</span> groupList.add(singleGroup);</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum53" style="color: #606060;"> 53:</span> <span style="color: blue;">return</span> groupList;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum54" style="color: #606060;"> 54:</span> } <span style="color: blue;">else</span> <span style="color: blue;">if</span> (StringUtils.isNotEmpty(groupQuery.getName())) {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum55" style="color: #606060;"> 55:</span> GroupEntity singleGroup = findGroupById(groupQuery.getId());</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum56" style="color: #606060;"> 56:</span> groupList.add(singleGroup);</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum57" style="color: #606060;"> 57:</span> <span style="color: blue;">return</span> groupList;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum58" style="color: #606060;"> 58:</span> } <span style="color: blue;">else</span> <span style="color: blue;">if</span> (StringUtils.isNotEmpty(groupQuery.getUserId())) {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum59" style="color: #606060;"> 59:</span> <span style="color: blue;">return</span> findGroupsByUser(groupQuery.getUserId());</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum60" style="color: #606060;"> 60:</span> } <span style="color: blue;">else</span> {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum61" style="color: #606060;"> 61:</span> <span style="color: green;">//TODO: get all groups from your identity domain and convert them to List<Group></span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum62" style="color: #606060;"> 62:</span> <span style="color: blue;">return</span> null;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum63" style="color: #606060;"> 63:</span> } <span style="color: green;">//TODO: you can add other search criteria that will allow extended support using the Activiti engine API</span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum64" style="color: #606060;"> 64:</span> }</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum65" style="color: #606060;"> 65:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum66" style="color: #606060;"> 66:</span> @Override</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum67" style="color: #606060;"> 67:</span> <span style="color: blue;">public</span> GroupEntity findGroupById(String activitiGroupID) {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum68" style="color: #606060;"> 68:</span> <span style="color: green;">//TODO</span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum69" style="color: #606060;"> 69:</span> <span style="color: blue;">throw</span> <span style="color: blue;">new</span> ActivitiException(<span style="color: #006080;">"My group manager doesn't support finding a group"</span>);</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum70" style="color: #606060;"> 70:</span> }</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum71" style="color: #606060;"> 71:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum72" style="color: #606060;"> 72:</span> @Override</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum73" style="color: #606060;"> 73:</span> <span style="color: blue;">public</span> List<Group> findGroupsByUser(String userLogin) {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum74" style="color: #606060;"> 74:</span> <span style="color: green;">//TODO</span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum75" style="color: #606060;"> 75:</span> <span style="color: blue;">throw</span> <span style="color: blue;">new</span> ActivitiException(<span style="color: #006080;">"My group manager doesn't support finding a group"</span>);</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum76" style="color: #606060;"> 76:</span> }</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum77" style="color: #606060;"> 77:</span> }</pre>
</div>
</div>
In <b>MyUserManager</b>, we have implemented <i>findUserCountByQueryCriteria</i> and <i>findUserByQueryCriteria</i>. Again - the methods that are marked with TODO notation are mandatory in order to work with Activiti core engine.<br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;">
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;">
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> 1:</span> <span style="color: blue;">package</span> my.great.company.com.businessprocessengine.identityservice;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum2" style="color: #606060;"> 2:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum3" style="color: #606060;"> 3:</span> <span style="color: blue;">import</span> java.util.ArrayList;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum4" style="color: #606060;"> 4:</span> <span style="color: blue;">import</span> java.util.List;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum5" style="color: #606060;"> 5:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum6" style="color: #606060;"> 6:</span> <span style="color: blue;">import</span> org.activiti.engine.ActivitiException;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum7" style="color: #606060;"> 7:</span> <span style="color: blue;">import</span> org.activiti.engine.identity.User;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum8" style="color: #606060;"> 8:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.Page;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum9" style="color: #606060;"> 9:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.UserQueryImpl;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum10" style="color: #606060;"> 10:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.persistence.entity.UserEntity;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum11" style="color: #606060;"> 11:</span> <span style="color: blue;">import</span> org.activiti.engine.impl.persistence.entity.UserManager;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum12" style="color: #606060;"> 12:</span> <span style="color: blue;">import</span> org.apache.commons.lang.StringUtils;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum13" style="color: #606060;"> 13:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum14" style="color: #606060;"> 14:</span> <span style="color: blue;">public</span> <span style="color: blue;">class</span> MyUserManager <span style="color: blue;">extends</span> UserManager {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum15" style="color: #606060;"> 15:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum16" style="color: #606060;"> 16:</span> <span style="color: blue;">public</span> MyUserManager(MyConnectionParams connectionParams) {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum17" style="color: #606060;"> 17:</span> }</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum18" style="color: #606060;"> 18:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum19" style="color: #606060;"> 19:</span> @Override</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum20" style="color: #606060;"> 20:</span> <span style="color: blue;">public</span> User createNewUser(String userId) {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum21" style="color: #606060;"> 21:</span> <span style="color: blue;">throw</span> <span style="color: blue;">new</span> ActivitiException(<span style="color: #006080;">"My user manager doesn't support creating a new user"</span>);</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum22" style="color: #606060;"> 22:</span> }</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum23" style="color: #606060;"> 23:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum24" style="color: #606060;"> 24:</span> @Override</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum25" style="color: #606060;"> 25:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> insertUser(User user) {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum26" style="color: #606060;"> 26:</span> <span style="color: blue;">throw</span> <span style="color: blue;">new</span> ActivitiException(<span style="color: #006080;">"My user manager doesn't support inserting a new user"</span>);</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum27" style="color: #606060;"> 27:</span> }</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum28" style="color: #606060;"> 28:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum29" style="color: #606060;"> 29:</span> @Override</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum30" style="color: #606060;"> 30:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> updateUser(User updatedUser) {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum31" style="color: #606060;"> 31:</span> <span style="color: blue;">throw</span> <span style="color: blue;">new</span> ActivitiException(<span style="color: #006080;">"My user manager doesn't support updating a user"</span>);</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum32" style="color: #606060;"> 32:</span> }</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum33" style="color: #606060;"> 33:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum34" style="color: #606060;"> 34:</span> @Override</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum35" style="color: #606060;"> 35:</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> deleteUser(String userId) {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum36" style="color: #606060;"> 36:</span> <span style="color: blue;">throw</span> <span style="color: blue;">new</span> ActivitiException(<span style="color: #006080;">"My user manager doesn't support deleting a user"</span>);</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum37" style="color: #606060;"> 37:</span> }</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum38" style="color: #606060;"> 38:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum39" style="color: #606060;"> 39:</span> @Override</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum40" style="color: #606060;"> 40:</span> <span style="color: blue;">public</span> UserEntity findUserById(String userLogin) {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum41" style="color: #606060;"> 41:</span> <span style="color: green;">//TODO: get my user according to userLogin and convert it to UserEntity</span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum42" style="color: #606060;"> 42:</span> <span style="color: blue;">throw</span> <span style="color: blue;">new</span> ActivitiException(<span style="color: #006080;">"My user manager doesn't support finding a user"</span>);</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum43" style="color: #606060;"> 43:</span> }</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum44" style="color: #606060;"> 44:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum45" style="color: #606060;"> 45:</span> @Override</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum46" style="color: #606060;"> 46:</span> <span style="color: blue;">public</span> List<User> findUserByQueryCriteria(Object query, Page page) {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum47" style="color: #606060;"> 47:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum48" style="color: #606060;"> 48:</span> List<User> userList = <span style="color: blue;">new</span> ArrayList<User>();</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum49" style="color: #606060;"> 49:</span> UserQueryImpl userQuery = (UserQueryImpl) query;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum50" style="color: #606060;"> 50:</span> <span style="color: blue;">if</span> (StringUtils.isNotEmpty(userQuery.getId())) {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum51" style="color: #606060;"> 51:</span> userList.add(findUserById(userQuery.getId()));</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum52" style="color: #606060;"> 52:</span> <span style="color: blue;">return</span> userList;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum53" style="color: #606060;"> 53:</span> } <span style="color: blue;">else</span> <span style="color: blue;">if</span> (StringUtils.isNotEmpty(userQuery.getLastName())) {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum54" style="color: #606060;"> 54:</span> userList.add(findUserById(userQuery.getLastName()));</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum55" style="color: #606060;"> 55:</span> <span style="color: blue;">return</span> userList;</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum56" style="color: #606060;"> 56:</span> } <span style="color: blue;">else</span> {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum57" style="color: #606060;"> 57:</span> <span style="color: green;">//TODO: get all users from your identity domain and convert them to List<User></span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum58" style="color: #606060;"> 58:</span> <span style="color: blue;">return</span> null;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum59" style="color: #606060;"> 59:</span> } <span style="color: green;">//TODO: you can add other search criteria that will allow extended support using the Activiti engine API</span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum60" style="color: #606060;"> 60:</span> }</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum61" style="color: #606060;"> 61:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum62" style="color: #606060;"> 62:</span> @Override</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum63" style="color: #606060;"> 63:</span> <span style="color: blue;">public</span> <span style="color: blue;">long</span> findUserCountByQueryCriteria(Object query) {</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum64" style="color: #606060;"> 64:</span> <span style="color: blue;">return</span> findUserByQueryCriteria(query, null).size();</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum65" style="color: #606060;"> 65:</span> }</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum66" style="color: #606060;"> 66:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum67" style="color: #606060;"> 67:</span> @Override</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum68" style="color: #606060;"> 68:</span> <span style="color: blue;">public</span> Boolean checkPassword(String userId, String password) {</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum69" style="color: #606060;"> 69:</span> <span style="color: green;">//TODO: check the password in your domain and return the appropriate boolean</span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum70" style="color: #606060;"> 70:</span> <span style="color: blue;">return</span> false;</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum71" style="color: #606060;"> 71:</span> }</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum72" style="color: #606060;"> 72:</span> }</pre>
</div>
</div>
The only thing left to do is to inject (using Spring) our classes to the Activity engine configuration. We will need to inject <b>MyConnectionParams </b>as well as the factories themselves. Find your configuration file and add:<br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;">
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;">
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> 1:</span> <span style="color: blue;"><?</span><span style="color: maroon;">xml</span> <span style="color: red;">version</span><span style="color: blue;">="1.0"</span> <span style="color: red;">encoding</span><span style="color: blue;">="UTF-8"</span>?<span style="color: blue;">></span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum2" style="color: #606060;"> 2:</span> <span style="color: blue;"><</span><span style="color: maroon;">beans</span> <span style="color: red;">xmlns</span><span style="color: blue;">="http://www.springframework.org/schema/beans"</span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum3" style="color: #606060;"> 3:</span> <span style="color: red;">xmlns:xsi</span><span style="color: blue;">="http://www.w3.org/2001/XMLSchema-instance"</span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum4" style="color: #606060;"> 4:</span> <span style="color: red;">xsi:schemaLocation</span><span style="color: blue;">="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"</span><span style="color: blue;">></span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum5" style="color: #606060;"> 5:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum6" style="color: #606060;"> 6:</span> <span style="color: blue;"><</span><span style="color: maroon;">bean</span> <span style="color: red;">id</span><span style="color: blue;">="processEngineConfiguration"</span> <span style="color: red;">class</span><span style="color: blue;">="org.activiti.spring.SpringProcessEngineConfiguration"</span><span style="color: blue;">></span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum7" style="color: #606060;"> 7:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum8" style="color: #606060;"> 8:</span> ...</pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum9" style="color: #606060;"> 9:</span> <span style="color: blue;"><</span><span style="color: maroon;">property</span> <span style="color: red;">name</span><span style="color: blue;">="customSessionFactories"</span><span style="color: blue;">></span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum10" style="color: #606060;"> 10:</span> <span style="color: blue;"><</span><span style="color: maroon;">list</span><span style="color: blue;">></span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum11" style="color: #606060;"> 11:</span> <span style="color: blue;"><</span><span style="color: maroon;">bean</span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum12" style="color: #606060;"> 12:</span> <span style="color: red;">class</span><span style="color: blue;">="my.great.company.com.businessprocessengine.identityservice.MyUserManagerFactory"</span><span style="color: blue;">></span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum13" style="color: #606060;"> 13:</span> <span style="color: blue;"><</span><span style="color: maroon;">constructor-arg</span> <span style="color: red;">ref</span><span style="color: blue;">="MyConnectionParams"</span> <span style="color: blue;">/></span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum14" style="color: #606060;"> 14:</span> <span style="color: blue;"></</span><span style="color: maroon;">bean</span><span style="color: blue;">></span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum15" style="color: #606060;"> 15:</span> <span style="color: blue;"><</span><span style="color: maroon;">bean</span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum16" style="color: #606060;"> 16:</span> <span style="color: red;">class</span><span style="color: blue;">="my.great.company.com.businessprocessengine.identityservice.MyGroupManagerFactory"</span><span style="color: blue;">></span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum17" style="color: #606060;"> 17:</span> <span style="color: blue;"><</span><span style="color: maroon;">constructor-arg</span> <span style="color: red;">ref</span><span style="color: blue;">="MyConnectionParams"</span> <span style="color: blue;">/></span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum18" style="color: #606060;"> 18:</span> <span style="color: blue;"></</span><span style="color: maroon;">bean</span><span style="color: blue;">></span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum19" style="color: #606060;"> 19:</span> <span style="color: blue;"></</span><span style="color: maroon;">list</span><span style="color: blue;">></span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum20" style="color: #606060;"> 20:</span> <span style="color: blue;"></</span><span style="color: maroon;">property</span><span style="color: blue;">></span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum21" style="color: #606060;"> 21:</span> ...</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum22" style="color: #606060;"> 22:</span> <span style="color: blue;"></</span><span style="color: maroon;">bean</span><span style="color: blue;">></span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum23" style="color: #606060;"> 23:</span> </pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum24" style="color: #606060;"> 24:</span> <span style="color: blue;"><</span><span style="color: maroon;">bean</span> <span style="color: red;">id</span><span style="color: blue;">="MyConnectionParams"</span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum25" style="color: #606060;"> 25:</span> <span style="color: red;">class</span><span style="color: blue;">="my.great.company.com.businessprocessengine.identityservice.MyConnectionParams"</span><span style="color: blue;">></span></pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum26" style="color: #606060;"> 26:</span> <span style="color: blue;"></</span><span style="color: maroon;">bean</span><span style="color: blue;">></span></pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum27" style="color: #606060;"> 27:</span> ...</pre>
<br />
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum28" style="color: #606060;"> 28:</span> </pre>
<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum29" style="color: #606060;"> 29:</span> <span style="color: blue;"></</span><span style="color: maroon;">beans</span><span style="color: blue;">></span></pre>
<br /></div>
<br /></div>
That’s it. You can now use your own users and groups to create
processes, deploy them, login to the Activiti Explorer or Rest API, etc.<br />
<br />
So, here are a few extra pointers about Activiti Identity:<br />
<ul>
<li>First of all there are 3 predefined <b>group types</b>:</li>
</ul>
<ul><ul>
<li>activity-role</li>
<li>assignment</li>
<li>user</li>
</ul>
</ul>
<ul>
<li>Now, no one tells you this, but if you are using Activiti Explorer, and you want your user to have admin privileges (i.e. be able to see the 'manage' tab), then the user's group type must be 'security-role' and the user's group name must be hard coded 'admin'. This means you will need to create some special code hacking for special users to use the Activiti Explorer.</li>
<li>Lets say you created a process that has a user task with a candidate group option (denote said group as X). <b>NOTE</b>: If you start a process instance, than only if the type of the group X is 'assignment' then users that belong to X will be able to claim the task. Otherwise, the user will not be able to claim the task at all.</li>
</ul>
<br />
<br />Roi Gamliel רועי גמליאלhttp://www.blogger.com/profile/07882658912051279530noreply@blogger.com12tag:blogger.com,1999:blog-2713252560567167671.post-70730450843827702202012-01-22T09:01:00.001+02:002012-01-22T11:49:54.891+02:00The Wizard Design PatternWe all love wizards.... (Software wizards I mean). We are always happy to jump on those ''Next" buttons like we were dancing the funky chicken on our… well you get the point. So today we bring you your beloved wizard into your coding experience. Let's jump right into an example.<br />
Say you want to design a <i>ConservativePerson</i> class.<br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"><div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> 1:</span> <span style="color: blue;">import</span> java.util.List; </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum2" style="color: #606060;"> 2:</span> <span style="color: blue;">class</span> ConservativePerson{ </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum3" style="color: #606060;"> 3:</span> </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum4" style="color: #606060;"> 4:</span> </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum5" style="color: #606060;"> 5:</span> <span style="color: blue;">private</span> <span style="color: blue;">boolean</span> isVirgin; </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum6" style="color: #606060;"> 6:</span> <span style="color: blue;">private</span> <span style="color: blue;">boolean</span> isMarried; </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum7" style="color: #606060;"> 7:</span> <span style="color: blue;">private</span> List<String> children; </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum8" style="color: #606060;"> 8:</span> </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum9" style="color: #606060;"> 9:</span> ConservativePerson(<span style="color: blue;">boolean</span> virgin, <span style="color: blue;">boolean</span> married, List<String> children) { </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum10" style="color: #606060;"> 10:</span> <span style="color: blue;">this.</span>isVirgin = virgin; </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum11" style="color: #606060;"> 11:</span> <span style="color: blue;">this.</span>isMarried = married; </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum12" style="color: #606060;"> 12:</span> <span style="color: blue;">this</span>.children = children; </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum13" style="color: #606060;"> 13:</span> } </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum14" style="color: #606060;"> 14:</span> </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum15" style="color: #606060;"> 15:</span> <span style="color: blue;">public</span> <span style="color: blue;">boolean</span> isVirgin() { </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum16" style="color: #606060;"> 16:</span> <span style="color: blue;">return</span> isVirgin; </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum17" style="color: #606060;"> 17:</span> } </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum18" style="color: #606060;"> 18:</span> <span style="color: blue;">public</span> <span style="color: blue;">boolean</span> isMarried() { </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum19" style="color: #606060;"> 19:</span> <span style="color: blue;">return</span> isMarried; </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum20" style="color: #606060;"> 20:</span> } </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum21" style="color: #606060;"> 21:</span> </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum22" style="color: #606060;"> 22:</span> <span style="color: blue;">public</span> List<String> getChildren() { </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum23" style="color: #606060;"> 23:</span> <span style="color: blue;">return</span> children; </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum24" style="color: #606060;"> 24:</span> } </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum25" style="color: #606060;"> 25:</span> } </pre></div></div><br />
As such it has some constrains.<br />
<br />
<ul><li>He must be married before he can be... well, not a virgin.</li>
<li>He can't be a virgin before he can have children (as far as we know).</li>
</ul><br />
In the old days, which is basically all days until today..., you would probably define all kinds of modifiers methods for this class which will throw an exception in case of invariant invalidation such as <i>NotMarriedException</i> and <i>VirginException</i>. Not anymore.<br />
<br />
Today we will do it by using the <i>Wizard Design Pattern</i>. We use a fluent interface style and utilize the power of a modern IDE to create a wizard-like feeling when building a <i>ConservativePerson</i> object. We know, we know, stop talking and show us the code... but before we will present the wizard code we will show you it usage so you will get a grasp of what we are talking about...<br />
<br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"><br />
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> 1:</span> <span style="color: blue;">public</span> <span style="color: blue;">class</span> Main { </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum2" style="color: #606060;"> 2:</span> <span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> main(String[] args) { </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum3" style="color: #606060;"> 3:</span> ConservativePersonWizardBuilder wizard = <span style="color: blue;">new</span> ConservativePersonWizardBuilder(); </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum4" style="color: #606060;"> 4:</span> ConservativePerson singlePerson = wizard. </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum5" style="color: #606060;"> 5:</span> createConservativePerson(). </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum6" style="color: #606060;"> 6:</span> whichIsSingle(). </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum7" style="color: #606060;"> 7:</span> getObject(); </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum8" style="color: #606060;"> 8:</span> ConservativePerson familyManPerson = wizard. </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum9" style="color: #606060;"> 9:</span> createConservativePerson(). </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum10" style="color: #606060;"> 10:</span> whichIsMarried(). </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum11" style="color: #606060;"> 11:</span> andNotVirgin(). </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum12" style="color: #606060;"> 12:</span> andHasChildNamed(<span style="color: #006080;">"Noa"</span>). </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum13" style="color: #606060;"> 13:</span> anotherChildNamed(<span style="color: #006080;">"Guy"</span>). </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum14" style="color: #606060;"> 14:</span> lastChildName(<span style="color: #006080;">"Alon"</span>). </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum15" style="color: #606060;"> 15:</span> getObject(); </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum16" style="color: #606060;"> 16:</span> } </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum17" style="color: #606060;"> 17:</span> </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum18" style="color: #606060;"> 18:</span> } </pre></div></div><br />
Now, it may look just like an ordinarily fluent interface, but the cool thing here is that a method is available for calling only if the current object state allows it. This means you will not be able to call the method <i>andNotVirgin</i> if you haven't called the method <i>whichIsMarried</i>.<br />
See the following set of screen shots:<br />
<br />
<a href="http://lh4.ggpht.com/-iMJ62XhHDZQ/TxlsMuNE0TI/AAAAAAAADeg/uh7s6rnKkVM/s1600-h/1%25255B3%25255D.png"><img alt="1" border="0" height="244" src="http://lh3.ggpht.com/-HwNpPKNyCUQ/TxlsOAnxFPI/AAAAAAAADeo/53msmaJcg3M/1_thumb%25255B1%25255D.png?imgmax=800" style="background-image: none; border-color: -moz-use-text-color; border-style: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="1" width="553" /></a><br />
<br />
and after we state he is married we can:<br />
<br />
<a href="http://lh4.ggpht.com/-VYvn4FYTdXc/TxlsOzk_6kI/AAAAAAAADew/vYZqOzIBoGk/s1600-h/2%25255B3%25255D.png"><img alt="2" border="0" height="195" src="http://lh3.ggpht.com/-j_W7TIOlXfo/TxlsQbiE_aI/AAAAAAAADe4/3uaIsDUgiZw/2_thumb%25255B1%25255D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="2" width="557" /></a><br />
<br />
Here is the wizard code. I urge you to copy/paste it to your IDE and give it a try by building an object with it.<br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; height: 249px; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"><br />
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> 1:</span> <span style="color: blue;">import</span> java.util.ArrayList; </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum2" style="color: #606060;"> 2:</span> <span style="color: blue;">import</span> java.util.List; </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum3" style="color: #606060;"> 3:</span> </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum4" style="color: #606060;"> 4:</span> <span style="color: blue;">public</span> <span style="color: blue;">class</span> ConservativePersonWizardBuilder { </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum5" style="color: #606060;"> 5:</span> <span style="color: blue;">private</span> <span style="color: blue;">boolean</span> isVirgin; </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum6" style="color: #606060;"> 6:</span> <span style="color: blue;">private</span> <span style="color: blue;">boolean</span> isMarried; </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum7" style="color: #606060;"> 7:</span> <span style="color: blue;">private</span> List<String> children = <span style="color: blue;">new</span> ArrayList<String>(); </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum8" style="color: #606060;"> 8:</span> </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum9" style="color: #606060;"> 9:</span> <span style="color: blue;">public</span> SetMarriedStep createConservativePerson(){ </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum10" style="color: #606060;"> 10:</span> <span style="color: blue;">return</span> <span style="color: blue;">new</span> SetMarriedStep(); </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum11" style="color: #606060;"> 11:</span> } </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum12" style="color: #606060;"> 12:</span> </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum13" style="color: #606060;"> 13:</span> <span style="color: blue;">class</span> SetMarriedStep { </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum14" style="color: #606060;"> 14:</span> <span style="color: blue;">public</span> SetVirginStep whichIsMarried(){ </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum15" style="color: #606060;"> 15:</span> isMarried = true; </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum16" style="color: #606060;"> 16:</span> <span style="color: blue;">return</span> <span style="color: blue;">new</span> SetVirginStep(); </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum17" style="color: #606060;"> 17:</span> } </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum18" style="color: #606060;"> 18:</span> </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum19" style="color: #606060;"> 19:</span> <span style="color: blue;">public</span> FinalStep whichIsSingle(){ </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum20" style="color: #606060;"> 20:</span> isMarried = false; </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum21" style="color: #606060;"> 21:</span> <span style="color: blue;">return</span> <span style="color: blue;">new</span> FinalStep(); </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum22" style="color: #606060;"> 22:</span> } </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum23" style="color: #606060;"> 23:</span> } </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum24" style="color: #606060;"> 24:</span> </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum25" style="color: #606060;"> 25:</span> <span style="color: blue;">class</span> SetVirginStep { </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum26" style="color: #606060;"> 26:</span> <span style="color: blue;">public</span> AddChildrenStep andNotVirgin(){ </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum27" style="color: #606060;"> 27:</span> isVirgin = false; </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum28" style="color: #606060;"> 28:</span> <span style="color: blue;">return</span> <span style="color: blue;">new</span> AddChildrenStep(); </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum29" style="color: #606060;"> 29:</span> } </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum30" style="color: #606060;"> 30:</span> <span style="color: blue;">public</span> FinalStep butStillAVirgin(){ </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum31" style="color: #606060;"> 31:</span> isVirgin = true; </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum32" style="color: #606060;"> 32:</span> <span style="color: blue;">return</span> <span style="color: blue;">new</span> FinalStep(); </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum33" style="color: #606060;"> 33:</span> } </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum34" style="color: #606060;"> 34:</span> } </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum35" style="color: #606060;"> 35:</span> </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum36" style="color: #606060;"> 36:</span> <span style="color: blue;">class</span> FinalStep { </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum37" style="color: #606060;"> 37:</span> <span style="color: blue;">public</span> ConservativePerson getObject(){ </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum38" style="color: #606060;"> 38:</span> <span style="color: blue;">return</span> <span style="color: blue;">new</span> ConservativePerson(isVirgin, isMarried, children); </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum39" style="color: #606060;"> 39:</span> } </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum40" style="color: #606060;"> 40:</span> } </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum41" style="color: #606060;"> 41:</span> </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum42" style="color: #606060;"> 42:</span> <span style="color: blue;">class</span> AddChildrenStep { </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum43" style="color: #606060;"> 43:</span> <span style="color: blue;">public</span> AddChildrenStep andHasChildNamed(String childName) { </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum44" style="color: #606060;"> 44:</span> children.add(childName); </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum45" style="color: #606060;"> 45:</span> <span style="color: blue;">return</span> <span style="color: blue;">new</span> AddChildrenStep(); </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum46" style="color: #606060;"> 46:</span> } </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum47" style="color: #606060;"> 47:</span> <span style="color: blue;">public</span> AddChildrenStep anotherChildNamed(String childName) { </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum48" style="color: #606060;"> 48:</span> children.add(childName); </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum49" style="color: #606060;"> 49:</span> <span style="color: blue;">return</span> <span style="color: blue;">new</span> AddChildrenStep(); </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum50" style="color: #606060;"> 50:</span> } </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum51" style="color: #606060;"> 51:</span> <span style="color: blue;">public</span> FinalStep lastChildName(String childName){ </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum52" style="color: #606060;"> 52:</span> children.add(childName); </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum53" style="color: #606060;"> 53:</span> <span style="color: blue;">return</span> <span style="color: blue;">new</span> FinalStep(); </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum54" style="color: #606060;"> 54:</span> } </pre><pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum55" style="color: #606060;"> 55:</span> } </pre><pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum56" style="color: #606060;"> 56:</span> } </pre></div></div><br />
As you can see the wizard consists of several steps. Each step is represented by a dedicated inner class. Each step reveals the legal available operations by its methods. Each method will then return a new step according to the change it has made. This way an attempt to create an illegal object will be detected at compile time instead of runtime.<br />
<br />
This pattern is actually being used in our production code. One example that comes to mind is the <i>MediaJob</i> class. This class describes a manipulation on some media files. In order to submit a job to the system, one has to create a <i>MediaJob</i> object. The problem is that this object has many parameters that could be assigned with contradicting values that create an illegal object state. By using the Wizard pattern, one can easily build a legal job without the need to know the entire (and complicated…) set of constrains.<br />
<br />
That is all for now. Hope you'll give it a try..... We plan to write a more formal description of it (GOF style) in the near future.11http://www.blogger.com/profile/05224022604837968582noreply@blogger.com7tag:blogger.com,1999:blog-2713252560567167671.post-89631085863921068282012-01-16T17:18:00.000+02:002012-01-16T17:18:44.018+02:00Intellij vs. Eclipse<!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style> <![endif]--> <div align="center" class="MsoNormal" style="text-align: center;"></div><div class="MsoNormal" style="text-align: justify;">Choosing the right IDE can make you or break you as a coder. Most developers would be lost without the comfort of their preferred IDE, which takes care of classpath, make files, command line arguments, etc. The problematic dependence on the IDE, while very beneficial, is off topic and a discussion for another post. We concentrate on 2 main platforms, Eclipse and Intellij Community Edition, comparing them, mainly in the Java SE context. <b>Disclosure</b>: Nadav uses Intellij on a regular basis, and Roi uses Eclipse. </div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;">Walking through history lane, Eclipse is around since 2001, while the real major release was Eclipse 3.0 in 2004. It began as an IBM project, but current <a href="http://www.eclipse.org/membership/exploreMembership.php">members</a> of the Eclipse Foundation range from Oracle to Google. Current release is Eclipse Indigo 3.7, and it is licensed under the <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>. Intellij is part of the JetBrains, which was founded in 2000 as a private company. Intellij for Java was first released in 2001, and the Community Edition supports Java, Groovy and Scala, and its free and <a href="http://www.blogger.com/jetbrains.org">open source</a> under the Apache 2.0 license. </div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;">We use Java as our main development language. Each developer chooses its own IDE. War between the IDE’s is waging around us, starting from our school days and University, and extends to our current workplace. While each side is certain in his righteousness, we believe there is no right or wrong answer, but rather choosing the right platform for your needs and challenges, taking into account the kind of programmer you are. We would like to share our own experience on when to use each. So here we go:</div><div class="MsoNormal" style="text-align: justify;"><br />
</div><ul style="margin-top: 0in;" type="disc"><li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list .5in; text-align: justify;"><b>Plugins:</b> Eclipse marketplace offers 1,276 plugins, and the Intellij Plugin Repository offers 727 plugins. This difference is not to be taken lightly, since plugins for new technologies will usually be developed mainly for Eclipse (e.g. Android, Drools, Activiti, etc). Moreover, Eclipse is easier to extend. When working on a specific technology most chances are that if a plugin exists, it will be an Eclipse plugin.</li>
</ul><div class="MsoNormal" style="text-align: justify;"><br />
</div><ul style="margin-top: 0in;" type="disc"><li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list .5in; text-align: justify;"><b>Multiple projects:</b> This is an Eclipse winner for sure. It has the ability to open multiple projects in the same window, giving the coder control over dependencies and relations. Intellij has an option to open one project with multiple modules, but we found it to be cumbersome, and in times a little buggy. If you are going to use a lot of projects together and hate to switch windows, Eclipse is your choice.</li>
</ul><div class="MsoNormal" style="text-align: justify;"><br />
</div><ul style="margin-top: 0in;" type="disc"><li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list .5in; text-align: justify;"><b>Multiple languages:</b> We have stated that we will only examine the Intellij Community Edition that supports Java, Groovy and Scala. However, if you plan to create a Python server, combined with Ajax & Html, joint with a java web server, or any other exotic language combinations, than Eclipse is your choice.</li>
</ul><div class="MsoNormal" style="text-align: justify;"><br />
</div><ul style="margin-top: 0in;" type="disc"><li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list .5in; text-align: justify;"><b>Code completion & inspection:</b> While Eclipse has the ability to add plugins such as <a href="http://eclipse-cs.sourceforge.net/">checkstyle</a>, this one definitely goes for Intellij. The default code completion and assistance in Intellij is faster and better. If you are a rookie developer, Intellij can improve your code.</li>
</ul><div class="MsoNormal" style="text-align: justify;"><br />
</div><ul style="margin-top: 0in;" type="disc"><li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list .5in; text-align: justify;"><b>Usability: </b>Intellij user experience is much easier to grasp. The learning curve in Intellij is by far faster. It seems using Intellij makes developing easier and more natural. Dropdowns, code completion, quick view, project wizards, etc, are all possible both in Eclipse and Intellij, but the experience in Intellij is much more satisfying.</li>
</ul><div class="MsoNormal" style="text-align: justify;"><br />
</div><ul style="margin-top: 0in;" type="disc"><li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list .5in; text-align: justify;"><b>Performance:</b> The more plugins are installed on the IDE, the more heavy it is for your computer. However, saying that, Eclipse handles very large projects faster. Moreover, both of the IDE’s seems to be RAM junkies. Projects usually open faster in Eclipse, as Intellij indexes the entire project on startup, but while working on an existing project, Intellij works smoother. For example we have a huge SOAP project, which is impossible to work on with Intellij, so some of us even learn Eclipse just for that.</li>
</ul><div class="MsoNormal" style="text-align: justify;"><br />
</div><ul style="margin-top: 0in;" type="disc"><li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list .5in; text-align: justify;"><b>Repository integration:</b> Both of the IDE’s have SVN\GIT\etc plugins. No doubt Intellij’s plugin is more reliable, has better GUI and easier to use.</li>
</ul><div class="MsoNormal" style="text-align: justify;"><br />
</div><ul style="margin-top: 0in;" type="disc"><li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list .5in; text-align: justify;"><b>GUI builder:</b> We found that the built in Intellij GUI builder is more comfortable, and as mentioned above, usability wise its easier to learn, and more enjoyable to develop.</li>
</ul><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><b>For a conclusion</b>, a programmer should be able to find the right tool given a specific task. This means that one should be acquainted with both of the IDE’s, in order to face the challenge with the right tool.</div>Roi Gamliel רועי גמליאלhttp://www.blogger.com/profile/07882658912051279530noreply@blogger.com41tag:blogger.com,1999:blog-2713252560567167671.post-73397814437536231652012-01-12T17:27:00.000+02:002012-01-12T17:44:26.747+02:00Effective Unit Testing - Not All Code is Created Equal<div dir="rtl" style="text-align: right;" trbidi="on"><div dir="ltr" style="text-align: left;"><!--[if gte mso 9]><xml> <w:worddocument> <w:view>Normal</w:View> <w:zoom>0</w:Zoom> <w:punctuationkerning/> <w:validateagainstschemas/> <w:saveifxmlinvalid>false</w:SaveIfXMLInvalid> <w:ignoremixedcontent>false</w:IgnoreMixedContent> <w:alwaysshowplaceholdertext>false</w:AlwaysShowPlaceholderText> <w:compatibility> <w:breakwrappedtables/> <w:snaptogridincell/> <w:wraptextwithpunct/> <w:useasianbreakrules/> <w:dontgrowautofit/> </w:Compatibility> <w:browserlevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:latentstyles deflockedstate="false" latentstylecount="156"> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;}</style> <![endif]--> </div><div class="MsoNormal" dir="ltr" style="text-align: justify;">Unit Testing is one of the most adopted methodologies for high quality code. Its contribution to a more stable, independent and documented code is well proven . Unit test code is considered and handled as an a integral part of your repository, and as such requires development and maintenance. However, developers often encounter a situation where the resources invested in unit tests where not as fruitful as one would expect. This leads us to wonder, as in any investment, where and how should resources be invested in unit tests?</div><div class="MsoNormal" dir="ltr" style="text-align: justify;"> </div><div class="MsoNormal" dir="ltr" style="text-align: justify;">Current metric used to assess the quality of unit testing utilize the notion of code coverage. Code coverage describes the effectiveness to which the source code of a program has been tested. In an ideal world every method we code will have a series of tests covering it’s code and validating it’s correctness. However, usually due to time limitations we either skip some tests or write poor quality ones. In such reality, while keeping in mind the amount of resources invested in unit testing development and maintenance, one must ask himself, given the available time, which code deserve testing the most? And from the existing tests, which tests are actually worth keeping and maintaining? We will try to answer those questions today. </div><div class="MsoNormal" dir="ltr" style="text-align: justify;"> </div><div class="MsoNormal" dir="ltr" style="text-align: justify;">We believe that <b>not all code is created equal</b>. There are certain code sections that are harder to test than others. Other code sections are more important than others. We suggest a few guidelines which will help determine in what code sections to invest in Unit Testing first, and maintaining as well:</div><ol dir="ltr" start="1" style="margin-top: 0in; text-align: left;" type="1"><li class="MsoNormal" style="text-align: justify;">Usages of code – when code is used frequently, it is important to unit test it.</li><li class="MsoNormal" style="text-align: justify;">Code dependencies – similar to (1), when other code is heavily dependent on the examined code, the more important it is to unit test it. On the other hand, when the examined code is greatly dependent on other code, it is harder to test and the chances to catch a fault is smaller.</li><li class="MsoNormal" style="text-align: justify;">I\O dependency – code which is dependent on I\O (DB, Networking, etc), is harder to test, as it requires creating mock objects which simulate the behavior of the I\O components. This mock objects require developing, maintenance and are vulnerable to bugs on their own. Moreover, writing mock objects that will simulate the exact behavior of any given I\O, such as faults is not trivial at all.</li><li class="MsoNormal" style="text-align: justify;">Multithreaded code –multithreaded code behavior is unexpected and as such harder to test.</li><li class="MsoNormal" style="text-align: justify;">Cyclomatic complexity – this metric is used to indicate the complexity of your source code. The higher the complexity, it is more important to test the code.</li><li class="MsoNormal" style="text-align: justify;">Code accessibility – this measure is related to the number of people that are acquainted with the source code in question. The bigger the accessibility is the less testing is needed, since problems will be identified and handled more rapidly. </li></ol><div class="MsoNormal" dir="ltr" style="text-align: justify;"><br /></div><div class="MsoNormal" dir="ltr" style="text-align: justify;">Regarding the latter question presented above, we suggest a new approach for managing Unit Tests. This preliminary idea defiantly needs some polish, and we only present a rough outline.</div><div class="MsoNormal" dir="ltr" style="text-align: justify;"><br /></div><div class="MsoNormal" dir="ltr" style="text-align: justify;">After taking all the above into account, the real bother is maintaining the tests. We suggest <b>thinking on a single unit test as a stock</b>. We can keep track on each test unit, treating them as dynamic objects that have initial value that can change over time. According to the above points, we can give each test a preliminary value, indicating its importance. Note that most of the attributes above, can be determined automatically. The change in value over time is related to our profit from the test. Each time a test fails and catches a real bug, its value increases and each time you invest in fixing the test itself, while not catching any real bug in your business logic, its value decreases. Moreover, each time you need to change the code of a test, as a result of change in your business logic, its value stays the same. </div><div class="MsoNormal" dir="ltr" style="text-align: justify;"><br /></div><div class="MsoNormal" dir="ltr" style="text-align: justify;">The above model is not complete, as we only wanted to give a general idea on effective unit testing. There is the question of how each value for our suggested points is computed? how will the preliminary value for each test will then be determined? and how much should we increase/decrease over time? This questions can be answered, for example, by using machine learning techniques, but it is out of the scope of this post.</div></div>Roi Gamliel רועי גמליאלhttp://www.blogger.com/profile/07882658912051279530noreply@blogger.com5