<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Comments on: Grails at LinkedIn</title>
	<atom:link href="http://blog.linkedin.com/2008/06/11/grails-at-linkedin/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.linkedin.com/2008/06/11/grails-at-linkedin/</link>
	<description>The corporate blog of LinkedIn, the world's largest professional networking site.</description>
	<lastBuildDate>Sat, 12 Dec 2009 02:37:13 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Raja Periyasamy</title>
		<link>http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2536</link>
		<dc:creator>Raja Periyasamy</dc:creator>
		<pubDate>Mon, 30 Jun 2008 14:47:09 +0000</pubDate>
		<guid isPermaLink="false">http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2536</guid>
		<description>Brian,

I&#039;m doing research whether Grails is a good fit for our new enterprise application. From your experience, do you think Grails is ready for enterprise application that has large volume of data transactions and many concurrent users?

Thanks.

</description>
		<content:encoded><![CDATA[<p>Brian,</p>
<p>I&#8217;m doing research whether Grails is a good fit for our new enterprise application. From your experience, do you think Grails is ready for enterprise application that has large volume of data transactions and many concurrent users?</p>
<p>Thanks.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Shawn Hartsock</title>
		<link>http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2535</link>
		<dc:creator>Shawn Hartsock</dc:creator>
		<pubDate>Wed, 18 Jun 2008 15:28:00 +0000</pubDate>
		<guid isPermaLink="false">http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2535</guid>
		<description>@Doyle

Thanks for the example. I think you&#039;re right about needing to think differently with the webFlow. I think what trips up most folks on the lists... myself included... is we keep trying to treat the flow like a bunch of controller closures that happen to be chained together not as a state-machine. I&#039;ll definitely want to check out what you&#039;ve done.
</description>
		<content:encoded><![CDATA[<p>@Doyle</p>
<p>Thanks for the example. I think you&#8217;re right about needing to think differently with the webFlow. I think what trips up most folks on the lists&#8230; myself included&#8230; is we keep trying to treat the flow like a bunch of controller closures that happen to be chained together not as a state-machine. I&#8217;ll definitely want to check out what you&#8217;ve done.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Doyle</title>
		<link>http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2534</link>
		<dc:creator>Doyle</dc:creator>
		<pubDate>Mon, 16 Jun 2008 17:48:44 +0000</pubDate>
		<guid isPermaLink="false">http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2534</guid>
		<description>Shawn -

Webflow is wicked easy. I use it on my live production site. (I can&#039;t mention it in open form but you can email for the addy or for a more complete code set.) I spent about two hours figuring it out. I sorta had to change my idea of request response since it&#039;s just a state-machine. I had a few gotchas with the gsp&#039;s. Since there is a flow state. So I did something like this to help men out:








(copy and paste bad in this little box)
Now controlling those actions in the flow is cool. Since it&#039;s just a controller.

So here in one controller it&#039;s for a registration page that someone has already registered: (some names have been changed to protect the innocent)

//register user
registeruser {
render (view:&quot;userreg&quot;)
on(&quot;continue&quot;){
def userreg = new User(params)
flow.user = userreg
if(userreg.hasErrors() &#124;&#124; !userreg.validate()){
//FieldError -  Spring Class
def emailReg = userreg.errors.getFieldError(&quot;emailAddress&quot;)
if(emailReg != null){
//flow.alreadyReg = &quot;Yo Login here to continue!&quot;
}
return error()
}
userreg.save()
}.to &quot;makeGas&quot;
on (&quot;alreadyauser&quot;){
flow.flaction = &quot;fooaction&quot;
flow.actbutton =&quot;userlogin&quot;
}.to &quot;userlogin&quot;
on(Exception).to &quot;handleError&quot;
}


Then in another controller reusing the same view:

startComplete {
action {
flow.flaction = &quot;estimatecomplete&quot;
flow.actbutton =&quot;userlogin&quot;
}
on(&quot;success&quot;).to &quot;userlogin&quot;
}

userlogin{
render(view:&quot;/user/login&quot;)
on(&quot;userlogin&quot;){
def userdef = User.findByEmailAddress( params.email )
def vshop = FOOShop.findByEmailAddress(params.email)
println (&quot;vshop email&gt;&gt;&gt;&quot; + vshop)
if(userdef &amp;&amp; vshop) {
if(userdef.password == params.password &amp;&amp; userdef.emailAddress == vshop.emailAddress) {
session.user = userdef
flow.shop = vshop
}else {
flow.message = &quot;Incorrect password for ${params.email}&quot;
return error()
}
}else {
flow.message = &quot;User not found for login ${params.email} or you are not a Verified Shop&quot;
return error()
}
flow.user = userdef
flow.verShopId = vshop.id
}.to &quot;completedEstimate&quot;
//Become a FOO shop
on(&quot;backtoreg&quot;){
}.to &quot;apply&quot;
on(Exception).to &quot;handleError&quot;
}

The cool thing with webflow on spring is you can really get a lot of reuse out of existing views and domains. And they are not exposed. The url for the flow is sorta of annoying but you could jam that into a cookie if you really wanted to. (It screws up my analytics) but it&#039;s a catch 22 with that sort a thing.

On a side note do use the compress plugin very nice filter. Try it out with the yslow plugin.

I may have rambled but I really like this stuff.
-Doyle
</description>
		<content:encoded><![CDATA[<p>Shawn -</p>
<p>Webflow is wicked easy. I use it on my live production site. (I can&#8217;t mention it in open form but you can email for the addy or for a more complete code set.) I spent about two hours figuring it out. I sorta had to change my idea of request response since it&#8217;s just a state-machine. I had a few gotchas with the gsp&#8217;s. Since there is a flow state. So I did something like this to help men out:</p>
<p>(copy and paste bad in this little box)<br />
Now controlling those actions in the flow is cool. Since it&#8217;s just a controller.</p>
<p>So here in one controller it&#8217;s for a registration page that someone has already registered: (some names have been changed to protect the innocent)</p>
<p>//register user<br />
registeruser {<br />
render (view:&#8221;userreg&#8221;)<br />
on(&#8220;continue&#8221;){<br />
def userreg = new User(params)<br />
flow.user = userreg<br />
if(userreg.hasErrors() || !userreg.validate()){<br />
//FieldError &#8211;  Spring Class<br />
def emailReg = userreg.errors.getFieldError(&#8220;emailAddress&#8221;)<br />
if(emailReg != null){<br />
//flow.alreadyReg = &#8220;Yo Login here to continue!&#8221;<br />
}<br />
return error()<br />
}<br />
userreg.save()<br />
}.to &#8220;makeGas&#8221;<br />
on (&#8220;alreadyauser&#8221;){<br />
flow.flaction = &#8220;fooaction&#8221;<br />
flow.actbutton =&#8221;userlogin&#8221;<br />
}.to &#8220;userlogin&#8221;<br />
on(Exception).to &#8220;handleError&#8221;<br />
}</p>
<p>Then in another controller reusing the same view:</p>
<p>startComplete {<br />
action {<br />
flow.flaction = &#8220;estimatecomplete&#8221;<br />
flow.actbutton =&#8221;userlogin&#8221;<br />
}<br />
on(&#8220;success&#8221;).to &#8220;userlogin&#8221;<br />
}</p>
<p>userlogin{<br />
render(view:&#8221;/user/login&#8221;)<br />
on(&#8220;userlogin&#8221;){<br />
def userdef = User.findByEmailAddress( params.email )<br />
def vshop = FOOShop.findByEmailAddress(params.email)<br />
println (&#8220;vshop email&gt;&gt;&gt;&#8221; + vshop)<br />
if(userdef &amp;&amp; vshop) {<br />
if(userdef.password == params.password &amp;&amp; userdef.emailAddress == vshop.emailAddress) {<br />
session.user = userdef<br />
flow.shop = vshop<br />
}else {<br />
flow.message = &#8220;Incorrect password for ${params.email}&#8221;<br />
return error()<br />
}<br />
}else {<br />
flow.message = &#8220;User not found for login ${params.email} or you are not a Verified Shop&#8221;<br />
return error()<br />
}<br />
flow.user = userdef<br />
flow.verShopId = vshop.id<br />
}.to &#8220;completedEstimate&#8221;<br />
//Become a FOO shop<br />
on(&#8220;backtoreg&#8221;){<br />
}.to &#8220;apply&#8221;<br />
on(Exception).to &#8220;handleError&#8221;<br />
}</p>
<p>The cool thing with webflow on spring is you can really get a lot of reuse out of existing views and domains. And they are not exposed. The url for the flow is sorta of annoying but you could jam that into a cookie if you really wanted to. (It screws up my analytics) but it&#8217;s a catch 22 with that sort a thing.</p>
<p>On a side note do use the compress plugin very nice filter. Try it out with the yslow plugin.</p>
<p>I may have rambled but I really like this stuff.<br />
-Doyle</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: David Paquet</title>
		<link>http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2533</link>
		<dc:creator>David Paquet</dc:creator>
		<pubDate>Mon, 16 Jun 2008 13:47:43 +0000</pubDate>
		<guid isPermaLink="false">http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2533</guid>
		<description>Hmm, the slideshow don&#039;t seem to be available anymore :(
</description>
		<content:encoded><![CDATA[<p>Hmm, the slideshow don&#8217;t seem to be available anymore :(</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jason Swartz</title>
		<link>http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2532</link>
		<dc:creator>Jason Swartz</dc:creator>
		<pubDate>Fri, 13 Jun 2008 18:52:10 +0000</pubDate>
		<guid isPermaLink="false">http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2532</guid>
		<description>Hi, it looks like the slideshow was taken down or made private, can you reinstate it? I&#039;d like to check it out. Thanks!
</description>
		<content:encoded><![CDATA[<p>Hi, it looks like the slideshow was taken down or made private, can you reinstate it? I&#8217;d like to check it out. Thanks!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Brian Guan</title>
		<link>http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2531</link>
		<dc:creator>Brian Guan</dc:creator>
		<pubDate>Thu, 12 Jun 2008 18:49:52 +0000</pubDate>
		<guid isPermaLink="false">http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2531</guid>
		<description>Hi Shawn,

Yes, I like GORM a lot. Having worked with Hibernate and Toplink and raw JDBC, GORM is refreshing.  Even my most esteemed colleague with PhD in CS - Srinivas Yellamraju (http://www.linkedin.com/in/yellamrajusrinivas) who is suspicious of all things magical and fashionable (he is still using Emacs!) - pronounced that GORM is clean.  BTW, Y.V. learned Grails and Groovy by just glancing at my code in 1 afternoon, winces, and then proceed to build one of the most challenging module on the project.  He still thinks that Groovy is &quot;not quite LISP.&quot;

We do like other parts of Grails - simplified Spring MVC, command objects, GSP, taglibs - all made life so much easier.

As for Webflow, we tried it back in Grails 0.6 (over 6 months ago), it was having problem working with Command objects, we logged a few bugs and rewrote the use case in our app that would have been a perfect candidate - it has a 4 form flow with multiple entry and exit points - we eventually wrote it controller logic using model state and conditionals.  Not sexy, but it works.

It would be interesting to hear others&#039; experience on using WebFlow.  IMHO it is still a little too magical - so when things go wrong, hard to troubleshoot. This is not a critique of Grails per se, but Spring Webflow itself.  2 years ago on another project, I tried raw Spring WebFlow and my feeling was the same - so I am on the fence with this one.
</description>
		<content:encoded><![CDATA[<p>Hi Shawn,</p>
<p>Yes, I like GORM a lot. Having worked with Hibernate and Toplink and raw JDBC, GORM is refreshing.  Even my most esteemed colleague with PhD in CS &#8211; Srinivas Yellamraju (<a href="http://www.linkedin.com/in/yellamrajusrinivas" rel="nofollow">http://www.linkedin.com/in/yellamrajusrinivas</a>) who is suspicious of all things magical and fashionable (he is still using Emacs!) &#8211; pronounced that GORM is clean.  BTW, Y.V. learned Grails and Groovy by just glancing at my code in 1 afternoon, winces, and then proceed to build one of the most challenging module on the project.  He still thinks that Groovy is &#8220;not quite LISP.&#8221;</p>
<p>We do like other parts of Grails &#8211; simplified Spring MVC, command objects, GSP, taglibs &#8211; all made life so much easier.</p>
<p>As for Webflow, we tried it back in Grails 0.6 (over 6 months ago), it was having problem working with Command objects, we logged a few bugs and rewrote the use case in our app that would have been a perfect candidate &#8211; it has a 4 form flow with multiple entry and exit points &#8211; we eventually wrote it controller logic using model state and conditionals.  Not sexy, but it works.</p>
<p>It would be interesting to hear others&#8217; experience on using WebFlow.  IMHO it is still a little too magical &#8211; so when things go wrong, hard to troubleshoot. This is not a critique of Grails per se, but Spring Webflow itself.  2 years ago on another project, I tried raw Spring WebFlow and my feeling was the same &#8211; so I am on the fence with this one.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Shawn Hartsock</title>
		<link>http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2530</link>
		<dc:creator>Shawn Hartsock</dc:creator>
		<pubDate>Thu, 12 Jun 2008 17:46:33 +0000</pubDate>
		<guid isPermaLink="false">http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2530</guid>
		<description>Brian,

GORM is definitely the biggest win in Grails right now. I spent a little over a year using JPA before I discovered GORM and I think it&#039;s the strongest point of Grails.

But then, Grails has many strong points. Not the least of which is the TagLib _authoring_ facilities.

Probably the _hardest_ thing for me to use right now is the WebFlow. Have you used this yet? I&#039;d love to read your insights if you have any.
</description>
		<content:encoded><![CDATA[<p>Brian,</p>
<p>GORM is definitely the biggest win in Grails right now. I spent a little over a year using JPA before I discovered GORM and I think it&#8217;s the strongest point of Grails.</p>
<p>But then, Grails has many strong points. Not the least of which is the TagLib _authoring_ facilities.</p>
<p>Probably the _hardest_ thing for me to use right now is the WebFlow. Have you used this yet? I&#8217;d love to read your insights if you have any.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Reginaldo Delfino</title>
		<link>http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2529</link>
		<dc:creator>Reginaldo Delfino</dc:creator>
		<pubDate>Thu, 12 Jun 2008 17:40:18 +0000</pubDate>
		<guid isPermaLink="false">http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2529</guid>
		<description>The slides have been removed from slideshare, :(
</description>
		<content:encoded><![CDATA[<p>The slides have been removed from slideshare, :(</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Brian Guan</title>
		<link>http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2528</link>
		<dc:creator>Brian Guan</dc:creator>
		<pubDate>Thu, 12 Jun 2008 16:49:48 +0000</pubDate>
		<guid isPermaLink="false">http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2528</guid>
		<description>Hi Lars,

Grails shields you from dealing with Hibernate directly, while providing you the flexibility to bypass the ease-of-use layer to directly calls hibernate API, map POJO/POGO to tables/views/stored-procs, and/or issues HQL if necessary.

However, some conceptual knowledge of Hibernate or other ORM tools, and appreciation of their strengths and weaknesses would help with using it appropriately.

I personally find GORM (Grails&#039; ease-of-use layer on top of Hibernate) very easy to work with and flexible enough for our current needs, but I look forward to seeing GORM being decoupled as a standalone module so I can use it outside of webapps (like in a backend service),  and also use it to talk to more than 1 DB at a time (current limitation).  See Grails roadmap for 1.1: http://grails.org/Roadmap


Apart from programmatic and conceptual point of view, the configuration is also easier, but I suspect most serious usage would require more fine tuning of the various hibernate knobs and levers e.g. caching, connection pooling.

</description>
		<content:encoded><![CDATA[<p>Hi Lars,</p>
<p>Grails shields you from dealing with Hibernate directly, while providing you the flexibility to bypass the ease-of-use layer to directly calls hibernate API, map POJO/POGO to tables/views/stored-procs, and/or issues HQL if necessary.</p>
<p>However, some conceptual knowledge of Hibernate or other ORM tools, and appreciation of their strengths and weaknesses would help with using it appropriately.</p>
<p>I personally find GORM (Grails&#8217; ease-of-use layer on top of Hibernate) very easy to work with and flexible enough for our current needs, but I look forward to seeing GORM being decoupled as a standalone module so I can use it outside of webapps (like in a backend service),  and also use it to talk to more than 1 DB at a time (current limitation).  See Grails roadmap for 1.1: <a href="http://grails.org/Roadmap" rel="nofollow">http://grails.org/Roadmap</a></p>
<p>Apart from programmatic and conceptual point of view, the configuration is also easier, but I suspect most serious usage would require more fine tuning of the various hibernate knobs and levers e.g. caching, connection pooling.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Lars Fischer</title>
		<link>http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2527</link>
		<dc:creator>Lars Fischer</dc:creator>
		<pubDate>Thu, 12 Jun 2008 14:33:31 +0000</pubDate>
		<guid isPermaLink="false">http://blog.linkedin.com/2008/06/11/grails-at-linkedin/#comment-2527</guid>
		<description>Never used Grails but does it require you to know Hibernate syntax?
</description>
		<content:encoded><![CDATA[<p>Never used Grails but does it require you to know Hibernate syntax?</p>
]]></content:encoded>
	</item>
</channel>
</rss>
