<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Commentaires sur : Les dynamic finders du pauvre</title>
	<atom:link href="http://blog.excilys.com/2010/01/29/les-dynamic-finders-du-pauvre/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.excilys.com/2010/01/29/les-dynamic-finders-du-pauvre/</link>
	<description>Langages, Architectures &#38; Méthodologies</description>
	<lastBuildDate>Wed, 11 Jan 2012 14:47:25 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>Par : Blog Excilys &#187; Classes proxy en PHP : l&#8217;AOP des pauvres</title>
		<link>http://blog.excilys.com/2010/01/29/les-dynamic-finders-du-pauvre/comment-page-1/#comment-636</link>
		<dc:creator>Blog Excilys &#187; Classes proxy en PHP : l&#8217;AOP des pauvres</dc:creator>
		<pubDate>Thu, 06 May 2010 13:07:41 +0000</pubDate>
		<guid isPermaLink="false">http://blog.excilys.com/?p=1154#comment-636</guid>
		<description>[...] une expression régulière , par exemple « findAll.* [...]</description>
		<content:encoded><![CDATA[<p>[...] une expression régulière , par exemple « findAll.* [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Bastien JANSEN</title>
		<link>http://blog.excilys.com/2010/01/29/les-dynamic-finders-du-pauvre/comment-page-1/#comment-152</link>
		<dc:creator>Bastien JANSEN</dc:creator>
		<pubDate>Wed, 10 Feb 2010 13:51:39 +0000</pubDate>
		<guid isPermaLink="false">http://blog.excilys.com/?p=1154#comment-152</guid>
		<description>A noter également que Doctrine, l&#039;ORM PHP utilisé notamment dans symfony, propose les &lt;a href=&quot;http://www.doctrine-project.org/documentation/manual/1_2/en/dql-doctrine-query-language#magic-finders&quot; rel=&quot;nofollow&quot;&gt;Magic Finders&lt;/a&gt; qui permettent de retrouver des objets en fonction de la valeur d&#039;une ou plusieurs colonnes, combinées avec des And ou des Or.

On pourra par exemple avoir un 
[cce lang=&quot;php&quot;]Doctrine_Core::getTable(&#039;User&#039;)-&gt;findOneByUsernameAndPassword(&#039;bastien&#039;, &#039;monSuperPassword&#039;);[/cce].</description>
		<content:encoded><![CDATA[<p>A noter également que Doctrine, l&#8217;ORM PHP utilisé notamment dans symfony, propose les <a href="http://www.doctrine-project.org/documentation/manual/1_2/en/dql-doctrine-query-language#magic-finders" rel="nofollow">Magic Finders</a> qui permettent de retrouver des objets en fonction de la valeur d&#8217;une ou plusieurs colonnes, combinées avec des And ou des Or.</p>
<p>On pourra par exemple avoir un</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Doctrine_Core<span style="color: #339933;">::</span><span style="color: #004000;">getTable</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'User'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">findOneByUsernameAndPassword</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'bastien'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'monSuperPassword'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Nicolas Delsaux</title>
		<link>http://blog.excilys.com/2010/01/29/les-dynamic-finders-du-pauvre/comment-page-1/#comment-127</link>
		<dc:creator>Nicolas Delsaux</dc:creator>
		<pubDate>Tue, 09 Feb 2010 14:54:19 +0000</pubDate>
		<guid isPermaLink="false">http://blog.excilys.com/?p=1154#comment-127</guid>
		<description>C&#039;est vraiment dans l&#039;air du temps, cette idée !
J&#039;ai implémenté exactement la même chose dans gaedo (http://gaedo.origo.ethz.ch/blog/%5Buser-raw%5D/dynamic_finders_the_reference). La différence, à mon sens, c&#039;est que je peux utiliser à peu près n&#039;importe quel back-end, que ce soit Google App Engine datastore, une base de donnée relationnelle, ...</description>
		<content:encoded><![CDATA[<p>C&#8217;est vraiment dans l&#8217;air du temps, cette idée !<br />
J&#8217;ai implémenté exactement la même chose dans gaedo (<a href="http://gaedo.origo.ethz.ch/blog/%5Buser-raw%5D/dynamic_finders_the_reference" rel="nofollow">http://gaedo.origo.ethz.ch/blog/%5Buser-raw%5D/dynamic_finders_the_reference</a>). La différence, à mon sens, c&#8217;est que je peux utiliser à peu près n&#8217;importe quel back-end, que ce soit Google App Engine datastore, une base de donnée relationnelle, &#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Eric BOTTARD</title>
		<link>http://blog.excilys.com/2010/01/29/les-dynamic-finders-du-pauvre/comment-page-1/#comment-102</link>
		<dc:creator>Eric BOTTARD</dc:creator>
		<pubDate>Fri, 29 Jan 2010 13:34:10 +0000</pubDate>
		<guid isPermaLink="false">http://blog.excilys.com/?p=1154#comment-102</guid>
		<description>Le framework Hades (que je découvre à l&#039;instant) dont parle Nicolas (merci!) est très intéressant (avec une doc soignée, en tout cas) : http://redmine.synyx.org/wiki/hades

Comme quoi, ce post qui relevait plus du POC et du mini tutorial sur Proxy/InvocationHandler, peut déboucher sur de belles découvertes !

J&#039;insiste en revanche sur le fait qu&#039;un DAO qui n&#039;est pas clair sur ce qu&#039;il fetche est un problème de perfs à la clef...

Sinon, Fonzie, c&#039;est coooooool</description>
		<content:encoded><![CDATA[<p>Le framework Hades (que je découvre à l&#8217;instant) dont parle Nicolas (merci!) est très intéressant (avec une doc soignée, en tout cas) : <a href="http://redmine.synyx.org/wiki/hades" rel="nofollow">http://redmine.synyx.org/wiki/hades</a></p>
<p>Comme quoi, ce post qui relevait plus du POC et du mini tutorial sur Proxy/InvocationHandler, peut déboucher sur de belles découvertes !</p>
<p>J&#8217;insiste en revanche sur le fait qu&#8217;un DAO qui n&#8217;est pas clair sur ce qu&#8217;il fetche est un problème de perfs à la clef&#8230;</p>
<p>Sinon, Fonzie, c&#8217;est coooooool</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : nicolas De loof</title>
		<link>http://blog.excilys.com/2010/01/29/les-dynamic-finders-du-pauvre/comment-page-1/#comment-101</link>
		<dc:creator>nicolas De loof</dc:creator>
		<pubDate>Fri, 29 Jan 2010 13:09:57 +0000</pubDate>
		<guid isPermaLink="false">http://blog.excilys.com/?p=1154#comment-101</guid>
		<description>La solution proposée est relativement identique à ce que Fait Hades (cf la session correspondante lors du dernier Devoxx). 

Pour ceux qui cherchent une autre piste, vous pouvez aussi tenter l&#039;aventure avec un dev perso qui se rapproche plutôt de Spring ROO  : Fonzie (http://code.google.com/p/loof/wiki/Fonzie) 

NB : ce n&#039;est pas un clone, je l&#039;ai sorti 2 jours avant l&#039;annonce officielle de Roo !</description>
		<content:encoded><![CDATA[<p>La solution proposée est relativement identique à ce que Fait Hades (cf la session correspondante lors du dernier Devoxx). </p>
<p>Pour ceux qui cherchent une autre piste, vous pouvez aussi tenter l&#8217;aventure avec un dev perso qui se rapproche plutôt de Spring ROO  : Fonzie (<a href="http://code.google.com/p/loof/wiki/Fonzie" rel="nofollow">http://code.google.com/p/loof/wiki/Fonzie</a>) </p>
<p>NB : ce n&#8217;est pas un clone, je l&#8217;ai sorti 2 jours avant l&#8217;annonce officielle de Roo !</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Pierre-Yves RICAU</title>
		<link>http://blog.excilys.com/2010/01/29/les-dynamic-finders-du-pauvre/comment-page-1/#comment-100</link>
		<dc:creator>Pierre-Yves RICAU</dc:creator>
		<pubDate>Fri, 29 Jan 2010 11:17:31 +0000</pubDate>
		<guid isPermaLink="false">http://blog.excilys.com/?p=1154#comment-100</guid>
		<description>&lt;a href=&quot;#comment-98&quot; rel=&quot;nofollow&quot;&gt;@Eric BOTTARD &lt;/a&gt; 
C&#039;est vrai que c&#039;est plus beau avec des annotations, mais dès lors l&#039;affirmation &quot;tout ce dont nous avons besoin se trouve déjà dans le JDK&quot; ne tient plus ;-) . Ceci dit, utiliser cglib c&#039;est pas la mort :-)</description>
		<content:encoded><![CDATA[<p><a href="#comment-98" rel="nofollow">@Eric BOTTARD </a><br />
C&#8217;est vrai que c&#8217;est plus beau avec des annotations, mais dès lors l&#8217;affirmation &#8220;tout ce dont nous avons besoin se trouve déjà dans le JDK&#8221; ne tient plus <img src='http://blog.excilys.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  . Ceci dit, utiliser cglib c&#8217;est pas la mort <img src='http://blog.excilys.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Maxime Picque</title>
		<link>http://blog.excilys.com/2010/01/29/les-dynamic-finders-du-pauvre/comment-page-1/#comment-99</link>
		<dc:creator>Maxime Picque</dc:creator>
		<pubDate>Fri, 29 Jan 2010 10:50:17 +0000</pubDate>
		<guid isPermaLink="false">http://blog.excilys.com/?p=1154#comment-99</guid>
		<description>Pour le cas des méthodes à la mano, je pense que nous pouvons imaginer un comportement du genre :

[cce lang=&quot;java&quot;]
dao.delete[All][ByProp]([params])
[/cce]

Il est donc tout à fait possible d&#039;ajouter le delete à notre dynamic finder (mais ça complexifie d&#039;autant plus le InvocationHandler) :

[cce lang=&quot;java&quot;]
public class FinderDescriptor {
    public final boolean delete;    

    public final boolean returnsAll; // findAll ou find unique ?
    public final BooleanCombinator comb; // And ou Or
    public final List props;
    ...
}
[/cce]

et

[cce lang=&quot;java&quot;]
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    FinderDescriptor descriptor = descriptors.get(method);
    
    if (descriptor.delete) {
        StringBuilder hqlQuery = new StringBuilder(&quot;delete from &quot;);
        builder.append(entityClassToUse(method).getName());
        if (descriptor.props != null &amp;&amp; !descriptor.props.isEmpty()) {
            builder.append(&quot; where &quot;);
            argIndex = 0;
            for (PropertyAndComparator pac : descriptor.props) {
                // ajout des différents paramètres
                builder.append(buildHQLRestrictionForProperty(pac, argIndex));
                argIndex += pac.comparator.nbArguments;
            }
        }

        Query query = obtainSession().createQuery(hqlQuery.toString());
        argIndex = 0;
        for (PropertyAndComparator pac : descriptor.props) {
            // ajout des paramètres de sélection
            setHQLRestriction(query, pac, args, argIndex);
            argIndex += pac.comparator.nbArguments;
        }
    } else {
        // finder
    }
}
[/cce]

avec pour la méthode buildHQLRestrictionForProperty et setHQLRestriction :

[cce lang=&quot;java&quot;]
private String buildHQLRestrictionForProperty(PropertyAndComparator pac, int argOffset) {
    switch (pac.comparator) {
    case Between:
        return pac.property + &quot; between :arg&quot; + argOffset + &quot; and :arg&quot; + (angOffser + 1);
    case Equals:
        return pac.property + &quot; = :arg&quot; + argOffset;
    [...]
    }
}

private void setHQLRestriction(Query query, PropertyAndComparator pac, Object[] args, int argOffset) {
    switch (pac.comparator) {
    case Between:
        query.setParameter(&quot;arg&quot; + argIndex, args[argIndex]);
        query.setParameter(&quot;arg&quot; + (argIndex + 1), args[argIndex + 1]);
        break;
    case Equals:
        query.setParameter(&quot;arg&quot; + argIndex, args[argIndex]);
        break;
    [...]
    }
}
[/cce]

PS : j&#039;ai fait ce code à la va vite, il pourrait y avoir des erreurs.</description>
		<content:encoded><![CDATA[<p>Pour le cas des méthodes à la mano, je pense que nous pouvons imaginer un comportement du genre :</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">dao.<span style="color: #006633;">delete</span><span style="color: #009900;">&#91;</span>All<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>ByProp<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span>params<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span></div></td></tr></tbody></table></div>
<p>Il est donc tout à fait possible d&#8217;ajouter le delete à notre dynamic finder (mais ça complexifie d&#8217;autant plus le InvocationHandler) :</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> FinderDescriptor <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">boolean</span> delete<span style="color: #339933;">;</span> &nbsp; &nbsp;<br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">boolean</span> returnsAll<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// findAll ou find unique ?</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> BooleanCombinator comb<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// And ou Or</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">List</span> props<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; ...<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>et</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> invoke<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> proxy, <span style="color: #003399;">Method</span> method, <span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Throwable</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; FinderDescriptor descriptor <span style="color: #339933;">=</span> descriptors.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>method<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>descriptor.<span style="color: #006633;">delete</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; StringBuilder hqlQuery <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> StringBuilder<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;delete from &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; builder.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>entityClassToUse<span style="color: #009900;">&#40;</span>method<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>descriptor.<span style="color: #006633;">props</span> <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span>descriptor.<span style="color: #006633;">props</span>.<span style="color: #006633;">isEmpty</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; builder.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; where &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; argIndex <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>PropertyAndComparator pac <span style="color: #339933;">:</span> descriptor.<span style="color: #006633;">props</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// ajout des différents paramètres</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; builder.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>buildHQLRestrictionForProperty<span style="color: #009900;">&#40;</span>pac, argIndex<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; argIndex <span style="color: #339933;">+=</span> pac.<span style="color: #006633;">comparator</span>.<span style="color: #006633;">nbArguments</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; Query query <span style="color: #339933;">=</span> obtainSession<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">createQuery</span><span style="color: #009900;">&#40;</span>hqlQuery.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; argIndex <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>PropertyAndComparator pac <span style="color: #339933;">:</span> descriptor.<span style="color: #006633;">props</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// ajout des paramètres de sélection</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setHQLRestriction<span style="color: #009900;">&#40;</span>query, pac, args, argIndex<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; argIndex <span style="color: #339933;">+=</span> pac.<span style="color: #006633;">comparator</span>.<span style="color: #006633;">nbArguments</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// finder</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>avec pour la méthode buildHQLRestrictionForProperty et setHQLRestriction :</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> buildHQLRestrictionForProperty<span style="color: #009900;">&#40;</span>PropertyAndComparator pac, <span style="color: #000066; font-weight: bold;">int</span> argOffset<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span>pac.<span style="color: #006633;">comparator</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">case</span> Between<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> pac.<span style="color: #006633;">property</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; between :arg&quot;</span> <span style="color: #339933;">+</span> argOffset <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; and :arg&quot;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>angOffser <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">case</span> Equals<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> pac.<span style="color: #006633;">property</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; = :arg&quot;</span> <span style="color: #339933;">+</span> argOffset<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#91;</span>...<span style="color: #009900;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> setHQLRestriction<span style="color: #009900;">&#40;</span>Query query, PropertyAndComparator pac, <span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args, <span style="color: #000066; font-weight: bold;">int</span> argOffset<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span>pac.<span style="color: #006633;">comparator</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">case</span> Between<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; query.<span style="color: #006633;">setParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;arg&quot;</span> <span style="color: #339933;">+</span> argIndex, args<span style="color: #009900;">&#91;</span>argIndex<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; query.<span style="color: #006633;">setParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;arg&quot;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>argIndex <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>, args<span style="color: #009900;">&#91;</span>argIndex <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">case</span> Equals<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; query.<span style="color: #006633;">setParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;arg&quot;</span> <span style="color: #339933;">+</span> argIndex, args<span style="color: #009900;">&#91;</span>argIndex<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#91;</span>...<span style="color: #009900;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>PS : j&#8217;ai fait ce code à la va vite, il pourrait y avoir des erreurs.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Eric BOTTARD</title>
		<link>http://blog.excilys.com/2010/01/29/les-dynamic-finders-du-pauvre/comment-page-1/#comment-98</link>
		<dc:creator>Eric BOTTARD</dc:creator>
		<pubDate>Fri, 29 Jan 2010 10:40:23 +0000</pubDate>
		<guid isPermaLink="false">http://blog.excilys.com/?p=1154#comment-98</guid>
		<description>Comme le mentionne PY, le code actuel sur le trunk a été enrichi pour permettre les stubs (même si je ne suis pas satisfait du couplage induit sur l&#039;interface, il serait plus pertinent d&#039;annoter la classe stub. On y travaille). Jetez un oeil au test nommé &lt;a href=&quot;http://code.google.com/p/excilys/source/browse/projects/dynamic-finders/trunk/src/test/java/com/excilys/oss/dao/dynamicfinders/DynamicFinderFactoryTest.java&quot; rel=&quot;nofollow&quot;&gt;annotationOnItfWithSpecifiedStub&lt;/a&gt;

Concernant la ruse avec deux interfaces, je pense qu&#039;un tel framework se doit d&#039;être le moins intrusif possible (Le but est de gagner du temps, on le rappelle). S&#039;il faut introduire une deuxième interface juste pour faire une pirouette technique, on n&#039;a finalement rien gagné :)</description>
		<content:encoded><![CDATA[<p>Comme le mentionne PY, le code actuel sur le trunk a été enrichi pour permettre les stubs (même si je ne suis pas satisfait du couplage induit sur l&#8217;interface, il serait plus pertinent d&#8217;annoter la classe stub. On y travaille). Jetez un oeil au test nommé <a href="http://code.google.com/p/excilys/source/browse/projects/dynamic-finders/trunk/src/test/java/com/excilys/oss/dao/dynamicfinders/DynamicFinderFactoryTest.java" rel="nofollow">annotationOnItfWithSpecifiedStub</a></p>
<p>Concernant la ruse avec deux interfaces, je pense qu&#8217;un tel framework se doit d&#8217;être le moins intrusif possible (Le but est de gagner du temps, on le rappelle). S&#8217;il faut introduire une deuxième interface juste pour faire une pirouette technique, on n&#8217;a finalement rien gagné <img src='http://blog.excilys.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Pierre-Yves RICAU</title>
		<link>http://blog.excilys.com/2010/01/29/les-dynamic-finders-du-pauvre/comment-page-1/#comment-97</link>
		<dc:creator>Pierre-Yves RICAU</dc:creator>
		<pubDate>Fri, 29 Jan 2010 09:55:27 +0000</pubDate>
		<guid isPermaLink="false">http://blog.excilys.com/?p=1154#comment-97</guid>
		<description>Le framework disponible sur le repository est bien plus complet que ce qui est présenté dans l&#039;article, je vous invite à y faire un tour c&#039;est très instructif.

Citation de l&#039;article : Il serait donc bon de pouvoir combiner des méthodes réellement écrites à la main (dans un « stub » de DAO, abstrait donc) et les méthodes générées automagiquement par notre librairie. [...] cela requiert l’utilisation d’une librairie telle que cglib.

On pourrait aussi y parvenir d&#039;une manière sioux en utilisant uniquement les proxy JDK : en définissant une interface mère comportant la définition des méthodes à la mano, et un stub qui implémenterait uniquement cette interface.

Exemple :

[cce lang=&quot;java&quot;]
public interface IStubUserDAO {
  Stroumph myCustomMethod();
}

[...]

@DataAccessObject(entityType=User.class)
public interface IUserDAO extends IStubUserDAO {
  User findByFirstname(String firstname);
}

[...]

public class StubUserDAO implements IStubUserDAO {
  public Stroumph myCustomMethod() {
    return new GrandStroumph();
  }
}

[...]

ClassLoader cl = IUserDAO.class.getClassLoader();
InvocationHandler h = new MyInvocationHandler(IUserDAO.class, new StubUserDAO());
IUserDAO dao = (IUserDAO) Proxy.newProxyInstance(cl, new Class[] {IUserDAO.class}, h);

dao.findByFirstname(&quot;&quot;);
dao.myCustomMethod();
[...]
[/cce]</description>
		<content:encoded><![CDATA[<p>Le framework disponible sur le repository est bien plus complet que ce qui est présenté dans l&#8217;article, je vous invite à y faire un tour c&#8217;est très instructif.</p>
<p>Citation de l&#8217;article : Il serait donc bon de pouvoir combiner des méthodes réellement écrites à la main (dans un « stub » de DAO, abstrait donc) et les méthodes générées automagiquement par notre librairie. [...] cela requiert l’utilisation d’une librairie telle que cglib.</p>
<p>On pourrait aussi y parvenir d&#8217;une manière sioux en utilisant uniquement les proxy JDK : en définissant une interface mère comportant la définition des méthodes à la mano, et un stub qui implémenterait uniquement cette interface.</p>
<p>Exemple :</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IStubUserDAO <span style="color: #009900;">&#123;</span><br />
&nbsp; Stroumph myCustomMethod<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#91;</span>...<span style="color: #009900;">&#93;</span><br />
<br />
@DataAccessObject<span style="color: #009900;">&#40;</span>entityType<span style="color: #339933;">=</span>User.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IUserDAO <span style="color: #000000; font-weight: bold;">extends</span> IStubUserDAO <span style="color: #009900;">&#123;</span><br />
&nbsp; User findByFirstname<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> firstname<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#91;</span>...<span style="color: #009900;">&#93;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> StubUserDAO <span style="color: #000000; font-weight: bold;">implements</span> IStubUserDAO <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">public</span> Stroumph myCustomMethod<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> GrandStroumph<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#91;</span>...<span style="color: #009900;">&#93;</span><br />
<br />
<span style="color: #003399;">ClassLoader</span> cl <span style="color: #339933;">=</span> IUserDAO.<span style="color: #000000; font-weight: bold;">class</span>.<span style="color: #006633;">getClassLoader</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #003399;">InvocationHandler</span> h <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyInvocationHandler<span style="color: #009900;">&#40;</span>IUserDAO.<span style="color: #000000; font-weight: bold;">class</span>, <span style="color: #000000; font-weight: bold;">new</span> StubUserDAO<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
IUserDAO dao <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>IUserDAO<span style="color: #009900;">&#41;</span> <span style="color: #003399;">Proxy</span>.<span style="color: #006633;">newProxyInstance</span><span style="color: #009900;">&#40;</span>cl, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000000; font-weight: bold;">Class</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span>IUserDAO.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#125;</span>, h<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
dao.<span style="color: #006633;">findByFirstname</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
dao.<span style="color: #006633;">myCustomMethod</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#91;</span>...<span style="color: #009900;">&#93;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
	</item>
</channel>
</rss>

