<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5873740620497062724</id><updated>2012-01-24T23:32:13.856-08:00</updated><category term='events'/><category term='event'/><category term='conference'/><title type='text'>Errai Developer Blog</title><subtitle type='html'>Errai offers a set of components for building rich web applications using The Google Web Toolkit. The framework provides a unified federation and RPC infrastructure with true, uniform, asynchronous messaging across the client and server.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Heiko Braun</name><uri>http://www.blogger.com/profile/17987290811990461031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-5202684862117351407</id><published>2012-01-17T11:54:00.000-08:00</published><updated>2012-01-17T12:01:20.545-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='event'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='events'/><title type='text'>Talking Errai in India and Brno</title><content type='html'>If you're in Bangalore in India or Brno in Czech Republic over the next few weeks, you have an opportunity to see Errai getting talked up by myself (Mike Brock) and Christian Sadilek.&lt;br /&gt;&lt;br /&gt;I'll be giving two talks at JUDCon India on January 24th. And if you come out for that, we've got a full schedule of other cool things for you to check out while you're there. See the JUDCon website for &lt;a href="http://www.jboss.org/events/JUDCon/2012/india"&gt;details and schedules&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;On February 17th, Christian Sadilek will be giving a talk at the Fedora Developer Conference in Brno. Check out the &lt;a href="http://fedoraproject.org/wiki/DeveloperConference2012"&gt;details here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-5202684862117351407?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/5202684862117351407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2012/01/talking-errai-in-india-and-brno.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/5202684862117351407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/5202684862117351407'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2012/01/talking-errai-in-india-and-brno.html' title='Talking Errai in India and Brno'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-6990836833958975457</id><published>2011-12-17T14:16:00.000-08:00</published><updated>2011-12-18T12:44:59.542-08:00</updated><title type='text'>Thoughts on HTML5 and Development Methodologies</title><content type='html'>Over the past few months the Errai team has been busy at work preparing the next version of the Errai Framework, Errai 2.0.&lt;br /&gt;&lt;br /&gt;It is a significant update that leverages all the best ideas that Errai 1.x had, while retiring some ideas and approaches that didn’t quite work out the way we’d planned. &lt;br /&gt;&lt;br /&gt;Errai has developed a philosophy about rich application development in the browser. That philosophy might be summed up as: Your Application. Everywhere. Literally. &lt;br /&gt;&lt;br /&gt;However, there’s been some people who’ve criticized this methodology. I’d like to respond to some of this now.&lt;br /&gt;&lt;br /&gt;We have eschewed much of the conventional wisdom about how you should architect a web application by focusing on not just rich user experience, but rich developer experience. We believe that the latter ultimately leads to a better former. &lt;br /&gt;&lt;br /&gt;We reject the need for polyglot applications as necessary -- the idea that the best way to build an application is to arrange a constellation of disparate languages and frameworks into a coherent single application is simply the “best approach” is something we don’t agree with.&lt;br /&gt;&lt;br /&gt;You’re building your application in Java on the server. Why do you build the other part of it in JavaScript? The common response to this is, well, “that’s just the best way to do it”. But is it? &lt;br /&gt;&lt;br /&gt;We don’t think it is. At the end of the day, the whole HTML5 group of technologies is just a specification that tells us how to make a browser do things.&lt;br /&gt;&lt;br /&gt;Whether we write HTML and JavaScript directly or not, whether it’s translated from CoffeeScript, Dart, or in the case of Errai -- Java -- is immaterial. And it’s wrong to even suggest that Errai, with its use of the GWT compiler, sandboxes you into a world that proscribes any of these things. It doesn’t. &lt;br /&gt;&lt;br /&gt;With Errai, your application can contain no JavaScript, or be almost all JavaScript. &lt;br /&gt;&lt;br /&gt;The important part is how Errai helps you share not just model between the client and the server, but functionality. Without the need to write it twice, or write marshalling code, or worry about setting up your own comet or websockets. The communication model is central to the application development model.&lt;br /&gt;&lt;br /&gt;Being able to share functionality, using the same code, with the same functionality is a good thing. You get all the benefits of type checking, code reuse, and productivity.&lt;br /&gt;&lt;br /&gt;The implication that some make that, this sort of thing “hides the true nature of the web” is always one that puzzled me among those who advocate for a pure JavaScript approach. &lt;br /&gt;&lt;br /&gt;I’ve always been of the opinion that such essentialist notions of pretty much anything are probably notions you should be suspicious of.  I mean, the Java compiler hides bytecode. The C++ and C that the JVM is written in hides machine code. &lt;br /&gt;&lt;br /&gt;It goes without saying that JavaScript itself is hiding all of this. &lt;br /&gt;&lt;br /&gt;Moreover, JavaScript isn’t a terribly good language for large applications. And it surprises me that some of the very same people who trumpet the advantages of Java over other languages, will so willingly jettison their arguments in favor Java when it comes to JavaScript. There’s no immutability, side effects are hard to control, the object model is a mess, there’s nothing resembling a threading model, etc. &lt;br /&gt;&lt;br /&gt;To which, counterarguments often include techniques about how JavaScript prototypes can be used in ways that simulate classes and inheritance, unit testing can guard against unintended side effects in large codebase, concurrency concerns do not apply in the world of the future, etc -- as if any of this somehow redeems JavaScript in any way in the eyes of someone who buys into these notions as being intrinsically good parts of a language. &lt;br /&gt;&lt;br /&gt;JavaScript isn’t a bad language. Don’t get me wrong. It is mature and well understood. It does what its supposed to do. But the problem is, it was never designed with large application development in mind. Its designers did not envision a world where there’d be codebases of 100,000 lines of JavaScript code. &lt;br /&gt;&lt;br /&gt;Yet, this is the world we’re quickly moving into. And the reality is, that technologies like GWT are extremely good solutions to manage these sorts of projects. &lt;br /&gt;&lt;br /&gt;Over the next few weeks we’re going to show you why. Watch this space.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-6990836833958975457?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/6990836833958975457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2011/12/thoughts-on-html5-and-development.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/6990836833958975457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/6990836833958975457'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2011/12/thoughts-on-html5-and-development.html' title='Thoughts on HTML5 and Development Methodologies'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-3693016469272725082</id><published>2011-11-23T10:31:00.001-08:00</published><updated>2011-11-23T12:54:37.666-08:00</updated><title type='text'>Setting the Record Straight on GWT</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: 12px;"&gt;Since joining the Errai team, I've been telling lots of people about our project. Every time I do this, I find myself dispelling some common misconceptions about what GWT is and how it can be used. I also find people are surprised that GWT code has easy access to the browser's native environment: although GWT smooths out implementation details between browsers, it is not a firewall that cuts you off from the underlying environment.&lt;/span&gt;&lt;br /&gt;&lt;div style="font-weight: normal; font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;So what is GWT?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-weight: normal; font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;GWT, the &lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt;, is a project with many independent parts. Here's a partial list:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-weight: normal; font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;A Java-to-JavaScript &lt;a href="http://code.google.com/webtoolkit/doc/latest/DevGuideCompilingAndDebugging.html#DevGuideJavaToJavaScriptCompiler"&gt;compiler&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;A class library providing:&lt;/span&gt;&lt;/li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/webtoolkit/doc/latest/RefJreEmulation.html"&gt;a subset&lt;/a&gt; of the Java SE 5 standard library (most notably java.lang and java.util)&lt;/li&gt;&lt;li&gt;A programmatic &lt;a href="http://code.google.com/webtoolkit/doc/latest/DevGuideUi.html"&gt;UI framework&lt;/a&gt; (somewhat like Swing)&lt;/li&gt;&lt;li&gt;Java wrappers for native browser functionality such as &lt;a href="http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsJSON.html"&gt;JSON&lt;/a&gt; and &lt;a href="http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsXML.html"&gt;XML&lt;/a&gt; manipulation, XMLHttpRequest (AJAX and Comet), and HTML 5 features like Canvas, Local storage,&amp;nbsp;Audio and Video.&lt;/li&gt;&lt;li&gt;An &lt;a href="http://code.google.com/webtoolkit/doc/latest/DevGuideServerCommunication.html#DevGuideRemoteProcedureCalls"&gt;RPC mechanism&lt;/a&gt; you can use if your application's backend happens to be written in Java (GWT RPC can't easily be retrofitted on an existing object model, but you can use it to build a server-side RPC layer)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/webtoolkit/tools/gwtdesigner/quick_start.html"&gt;GWT Designer&lt;/a&gt;, a visual UI layout tool that generates code for the Swing-like UI framework&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/webtoolkit/doc/latest/DevGuideUiBinder.html"&gt;UiBinder&lt;/a&gt;, a system for declarative UI (you define layout in files that are essentially XHTML interspersed with GWT widgets, with named elements automatically bound to fields in a companion Java class)&lt;/li&gt;&lt;li&gt;Plugins for Eclipse, Maven, and Ant that help with creating, building, testing, and debugging GWT applications&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style="font-weight: normal; font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;The compiler itself is fundamental to any usage of GWT. Everything that follows is optional: you can take it or leave it, mix and match, use third-party alternatives, or invent your own replacements.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-weight: normal;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-weight: normal; font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;And what isn't GWT?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-weight: normal;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-weight: normal; font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Now that we've listed off the highlights of what &lt;i&gt;is&lt;/i&gt; included in GWT, it's important to address what it's not:&lt;/span&gt;&lt;/div&gt;&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;ol&gt;&lt;li style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;GWT doesn't mandate a single, prescribed way of creating user interfaces. In particular, you don't have to create UIs in a "Swing for the browser" mindset unless you want to.&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;GWT is not a server-centric system like JSF. Your GWT application compiles down to a collection of static files: HTML, CSS, images, and JavaScript. The application runs autonomously in the browser, communicating with the server only when it wants to. If you're not using GWT RPC, your apps need not be hosted on a Java web server.&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;GWT does not require any browser plugins. Your compiled app is just one or more standards-based web pages.&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;GWT does not prevent you from writing JavaScript directly. You can write inline JavaScript in your Java classes using JSNI, you can expose your Java APIs to JavaScript, and you can call JavaScript APIs from Java.&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;GWT is &lt;a href="http://googlewebtoolkit.blogspot.com/2011/11/gwt-and-dart.html"&gt;not a dead project&lt;/a&gt;. Rumours of its demise are greatly exaggerated.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;If my GWT app just boils down to JavaScript and HTML, why bother with all this?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-weight: normal;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-weight: normal; font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;That's a great question. Thanks for asking. There are many compelling reasons to use GWT over raw HTML and JavaScript. I will address my favourite reasons in a future post, along with another question that I hope is burning in your mind: &lt;i&gt;if GWT does all this, what does Errai add to the mix?&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-3693016469272725082?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/3693016469272725082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2011/11/setting-record-straight-on-gwt.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3693016469272725082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3693016469272725082'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2011/11/setting-record-straight-on-gwt.html' title='Setting the Record Straight on GWT'/><author><name>Jonathan Fuerth</name><uri>http://www.blogger.com/profile/15510681605825943196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-2669969393582921468</id><published>2011-10-17T08:18:00.000-07:00</published><updated>2011-10-17T08:18:59.497-07:00</updated><title type='text'>Errai 1.3.0.GA released!</title><content type='html'>The Errai team is proud to announce the release of 1.3.0.GA. This is the final 1.3.0 release and includes improvements and fixes based on community feedback. We would like to thank the Errai community for raising questions, suggesting improvements and reporting problems. Please stay tuned, there's a lot more to come in the near future.&lt;br /&gt;&lt;br /&gt;Furthermore, Mike Brock's hard work and epic late-night battle with the Maven Release Plugin (which he demonstrably won) deserves a big thank you from the rest of the Errai team (Jonathan Fuerth and myself).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-2669969393582921468?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/2669969393582921468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2011/10/errai-130ga-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/2669969393582921468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/2669969393582921468'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2011/10/errai-130ga-released.html' title='Errai 1.3.0.GA released!'/><author><name>Christian Sadilek</name><uri>http://www.blogger.com/profile/08658409475172892811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-8169855937677787325</id><published>2011-10-04T15:43:00.000-07:00</published><updated>2011-11-25T13:23:40.540-08:00</updated><title type='text'>JAX-RS in GWT with Errai</title><content type='html'>&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 12.0px 0.0px;"&gt;The JAX-RS integration module is our latest extension to the Errai Framework. It brings another enterprise standard to the browser and simplifies the integration of REST-based services in GWT client applications.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 12.0px 0.0px;"&gt;&lt;b&gt;How does it work?&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 12.0px 0.0px;"&gt;To jump right in, let's assume we have the following JAX-RS interface which we want our clients to send requests to:&lt;/div&gt;&lt;div style="color: #98fb98; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #efefef;"&gt;@Path&lt;/span&gt;&lt;span style="color: white;"&gt;(&lt;/span&gt;"customers"&lt;span style="color: white;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #b0e0e6;"&gt;public&lt;/span&gt; &lt;span style="color: #b0e0e6;"&gt;interface&lt;/span&gt; CustomerService {&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; @GET&lt;/div&gt;&lt;div style="color: #98fb98; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: white;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #efefef;"&gt;@Produces&lt;/span&gt;&lt;span style="color: white;"&gt;(&lt;/span&gt;"application/json"&lt;span style="color: white;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #efefef;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #b0e0e6;"&gt;public&lt;/span&gt;&lt;span style="color: #efefef;"&gt; &lt;/span&gt;List&amp;lt;Customer&amp;gt; listAllCustomers();&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; @POST&lt;/div&gt;&lt;div style="color: #98fb98; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: white;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #efefef;"&gt;@Consumes&lt;/span&gt;&lt;span style="color: white;"&gt;(&lt;/span&gt;"application/json"&lt;span style="color: white;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; @Produces(&lt;span style="color: #98fb98;"&gt;"text/plain"&lt;/span&gt;)&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #efefef;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #b0e0e6;"&gt;public&lt;/span&gt;&lt;span style="color: #efefef;"&gt; &lt;/span&gt;&lt;span style="color: #b0e0e6;"&gt;long&lt;/span&gt;&lt;span style="color: #efefef;"&gt; &lt;/span&gt;createCustomer(Customer customer);&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; @PUT&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; @Path(&lt;span style="color: #98fb98;"&gt;"/{id}"&lt;/span&gt;)&lt;/div&gt;&lt;div style="color: #98fb98; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: white;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #efefef;"&gt;@Consumes&lt;/span&gt;&lt;span style="color: white;"&gt;(&lt;/span&gt;"application/json"&lt;span style="color: white;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #98fb98; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: white;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #efefef;"&gt;@Produces&lt;/span&gt;&lt;span style="color: white;"&gt;(&lt;/span&gt;"application/json"&lt;span style="color: white;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #efefef;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #b0e0e6;"&gt;public&lt;/span&gt;&lt;span style="color: #efefef;"&gt; &lt;/span&gt;Customer updateCustomer(&lt;span style="color: #efefef;"&gt;@PathParam(&lt;/span&gt;&lt;span style="color: #98fb98;"&gt;"id"&lt;/span&gt;&lt;span style="color: #efefef;"&gt;) &lt;/span&gt;&lt;span style="color: #b0e0e6;"&gt;long&lt;/span&gt;&lt;span style="color: #efefef;"&gt; &lt;/span&gt;id&lt;span style="color: #efefef;"&gt;, &lt;/span&gt;Customer&lt;span style="color: #efefef;"&gt; &lt;/span&gt;customer);&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; @DELETE&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; @Path(&lt;span style="color: #98fb98;"&gt;"/{id}"&lt;/span&gt;)&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #efefef;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #b0e0e6;"&gt;public&lt;/span&gt;&lt;span style="color: #efefef;"&gt; &lt;/span&gt;&lt;span style="color: #b0e0e6;"&gt;void&lt;/span&gt;&lt;span style="color: #efefef;"&gt; &lt;/span&gt;deleteCustomer(&lt;span style="color: #efefef;"&gt;@PathParam(&lt;/span&gt;&lt;span style="color: #98fb98;"&gt;"id"&lt;/span&gt;&lt;span style="color: #efefef;"&gt;) &lt;/span&gt;&lt;span style="color: #b0e0e6;"&gt;long&lt;/span&gt;&lt;span style="color: #efefef;"&gt; &lt;/span&gt;id);&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; @GET&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; @Path(&lt;span style="color: #98fb98;"&gt;"/{id}"&lt;/span&gt;)&lt;/div&gt;&lt;div style="color: #98fb98; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: white;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #efefef;"&gt;@Produces&lt;/span&gt;&lt;span style="color: white;"&gt;(&lt;/span&gt;"application/json"&lt;span style="color: white;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #efefef;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #b0e0e6;"&gt;public&lt;/span&gt;&lt;span style="color: #efefef;"&gt; &lt;/span&gt;Customer&lt;span style="color: #efefef;"&gt; &lt;/span&gt;retrieveCustomerById(&lt;span style="color: #efefef;"&gt;@PathParam(&lt;/span&gt;&lt;span style="color: #98fb98;"&gt;"id"&lt;/span&gt;&lt;span style="color: #efefef;"&gt;) &lt;/span&gt;&lt;span style="color: #b0e0e6;"&gt;long&lt;/span&gt;&lt;span style="color: #efefef;"&gt; &lt;/span&gt;id);&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 11.0px 0.0px;"&gt;We simply put this interface somewhere in our client packages (e.g. client.shared) where the GWT compiler can find it. To create a request all that needs to be done is to invoke &lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;RestClient.create()&lt;/span&gt;, thereby providing the JAX-RS interface, a response callback and to invoke the corresponding interface method.&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;@EntryPoint&lt;/div&gt;&lt;div style="color: #b0e0e6; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;public&lt;span style="color: white;"&gt; &lt;/span&gt;class&lt;span style="color: white;"&gt; App {&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;...&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &lt;span style="color: #b0e0e6;"&gt;final&lt;/span&gt; RemoteCallback&amp;lt;Long&amp;gt; callback = &lt;span style="color: #b0e0e6;"&gt;new&lt;/span&gt; RemoteCallback&amp;lt;Long&amp;gt;() {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #b0e0e6;"&gt;public&lt;/span&gt; &lt;span style="color: #b0e0e6;"&gt;void&lt;/span&gt; callback(Long id) {&lt;/div&gt;&lt;div style="color: #98fb98; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: white;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Window.alert(&lt;/span&gt;"Customer created with ID: "&lt;span style="color: white;"&gt; + id);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; };&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #efefef; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: white;"&gt;&amp;nbsp; &lt;/span&gt;@PostConstruct&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &lt;span style="color: #b0e0e6;"&gt;public&lt;/span&gt; &lt;span style="color: #b0e0e6;"&gt;void&lt;/span&gt; init() {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #b0e0e6;"&gt;final&lt;/span&gt; Button create = &lt;span style="color: #b0e0e6;"&gt;new&lt;/span&gt; Button(&lt;span style="color: #98fb98;"&gt;"Create"&lt;/span&gt;, &lt;span style="color: #b0e0e6;"&gt;new&lt;/span&gt; ClickHandler() {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #b0e0e6;"&gt;public&lt;/span&gt; &lt;span style="color: #b0e0e6;"&gt;void&lt;/span&gt; onClick(ClickEvent clickEvent) {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Customer customer = &lt;span style="color: #b0e0e6;"&gt;new&lt;/span&gt; Customer(firstName, lastName, postalCode);&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RestClient.create(CustomerService.&lt;span style="color: #b0e0e6;"&gt;class&lt;/span&gt;, callback).createCustomer(customer);&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;...&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; }&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 11.0px 0.0px;"&gt;&lt;b&gt;Error Handling&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 11.0px 0.0px;"&gt;For handling errors, the existing error callback mechanism can be reused and the error callback can be passed to the &lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;RestClient.create()&lt;/span&gt; call. The &lt;span style="font: normal normal normal 13px/normal 'Courier New';"&gt;ResponseException&lt;/span&gt; provides access to the &lt;span style="font: normal normal normal 13px/normal 'Courier New';"&gt;Response&lt;/span&gt; object containing all details of the underlying HTTP response.&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 11.0px 0.0px;"&gt;&lt;span style="color: #b0e0e6;"&gt;final&lt;/span&gt; ErrorCallback errorCallback = &lt;span style="color: #b0e0e6;"&gt;new&lt;/span&gt; ErrorCallback() {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &lt;span style="color: #b0e0e6;"&gt;public&lt;/span&gt; &lt;span style="color: #b0e0e6;"&gt;boolean&lt;/span&gt; error(Message message, Throwable throwable) {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #b0e0e6;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #b0e0e6;"&gt;throw&lt;/span&gt; throwable;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #b0e0e6;"&gt;catch&lt;/span&gt; (ResponseException e) {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Response response = e.getResponse();&lt;/div&gt;&lt;div style="color: #4e9072; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: white;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;// process unexpected response&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; response.getStatusCode();&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;span style="color: #b0e0e6;"&gt;&amp;nbsp; &amp;nbsp; catch&lt;/span&gt; (Throwable t) {&lt;/div&gt;&lt;div style="color: #4e9072; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: white;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;// process unexpected error (e.g. a network problem)&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style="color: #b0e0e6; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: white;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;return&lt;span style="color: white;"&gt; &lt;/span&gt;false&lt;span style="color: white;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; }&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;};&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 11.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 11.0px 0.0px;"&gt;&lt;b&gt;What does this buy you?&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 11.0px 0.0px;"&gt;Errai will take care of generating the HTTP request logic for you and will automatically serialize/deserialize your method parameters. This helps alleviating boilerplate code for creating the URL, setting the HTTP headers, parsing the response, etc. By default, Errai's wire format will be used, but don't be dissuaded by that fact. Errai's wire format really is just simple JSON.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 11.0px 0.0px;"&gt;&lt;b&gt;Future work&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 11.0px 0.0px;"&gt;We are currently improving Errai's marshalling capabilities. One outcome of this will be a mechanism for pluggable custom serializers. So in the near future you will have the flexibility to choose your serialization format.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 11.0px 0.0px;"&gt;&lt;b&gt;Interested and want to give it a try?&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 11.0px 0.0px;"&gt;We have prepared a maven archetype, which generates a working JAX-RS CRUD application: &lt;span style="color: #002fee; text-decoration: underline;"&gt;&lt;a href="https://docs.jboss.org/author/display/ERRAI/JAX-RS+Quickstart+Guide"&gt;https://docs.jboss.org/author/display/ERRAI/JAX-RS+Quickstart+Guide&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 11.0px 0.0px;"&gt;This should help getting you started quickly.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 11.0px 0.0px;"&gt;As always, feedback is welcome and appreciated!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-8169855937677787325?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/8169855937677787325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2011/10/jax-rs-in-gwt-with-errai.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/8169855937677787325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/8169855937677787325'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2011/10/jax-rs-in-gwt-with-errai.html' title='JAX-RS in GWT with Errai'/><author><name>Christian Sadilek</name><uri>http://www.blogger.com/profile/08658409475172892811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-7505233095240356705</id><published>2011-09-10T08:14:00.001-07:00</published><updated>2011-09-10T08:17:12.980-07:00</updated><title type='text'>Welcome Jonathan Fuerth</title><content type='html'>On behalf of the Errai team and the rest of Red Hat, and JBoss, I would like to extend my warm welcome to Jonathan Fuerth who joins the team, right here in Toronto.&lt;br /&gt;&lt;br /&gt;Jonathan has an extensive background in software engineering, and has been actively involved in open source Java development for years, as well as being a community builder here in the Toronto area as a co-organizer of the Toronto Java User's Group.&lt;br /&gt;&lt;br /&gt;Expect to here more from Jonathan in the coming weeks and months, right here in this space.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-7505233095240356705?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/7505233095240356705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2011/09/welcome-jonathan-fuerth.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/7505233095240356705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/7505233095240356705'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2011/09/welcome-jonathan-fuerth.html' title='Welcome Jonathan Fuerth'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-574761330392115630</id><published>2011-08-26T15:00:00.000-07:00</published><updated>2011-08-30T08:01:32.419-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='event'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><title type='text'>Speaking at FOSSLC: SC2011 Ottawa</title><content type='html'>If you're in the Ottawa area, stop by and check out my Errai talk at FOSSCL's Software Developers' Haven on Saturday August 27th.&lt;br /&gt;&lt;br /&gt;You can find details here: &lt;a href="http://fosslc.org/drupal/sc2011"&gt;http://fosslc.org/drupal/sc2011&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll also be hanging around for beers and talk afterwards.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-574761330392115630?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/574761330392115630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2011/08/speaking-at-fosslc-sc2011-ottawa.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/574761330392115630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/574761330392115630'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2011/08/speaking-at-fosslc-sc2011-ottawa.html' title='Speaking at FOSSLC: SC2011 Ottawa'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-3553618269084125202</id><published>2011-08-25T13:53:00.000-07:00</published><updated>2011-08-25T13:55:37.385-07:00</updated><title type='text'>Errai 1.3 CR1</title><content type='html'>We're almost there. Today we have release &lt;a href="https://www.jboss.org/author/errai/Downloads"&gt;Errai 1.3 Candidate Release 1&lt;/a&gt;. There's no new features to talk about since the beta release, of course. But the bug fixes are in, and we're excited to be closing in on the final!&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-3553618269084125202?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/3553618269084125202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2011/08/errai-13-cr1.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3553618269084125202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3553618269084125202'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2011/08/errai-13-cr1.html' title='Errai 1.3 CR1'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-3049896506326724371</id><published>2011-08-05T11:42:00.000-07:00</published><updated>2011-08-12T13:17:34.781-07:00</updated><title type='text'>Errai 1.3 Beta is Here!</title><content type='html'>About four months of hardcore, heads down work, I am pleased to announce the first official beta release of Errai 1.3. Don’t be dissuaded by the relatively small increment to the version number -- this is a big release!&lt;br /&gt;&lt;br /&gt;The number one philosophy of Errai is to erase boilerplate and bring the power of server-side programming to the browser. In 1.3, we’ve made great strides in this area.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Enterprise&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First and foremost, much of our efforts have been focused on our Errai enterprise integration around Java EE6 technologies. We wanted more than just dependency-injection in the browser, we wanted the full power of CDI in the browser. And while we still fall short of 100% of the CDI specification being implemented, we have managed to implement a significant footprint of the specification.&lt;br /&gt;&lt;br /&gt;A big priority for 1.3 was making the CDI integration even more invisible. So, if you’re going to do CDI in the browser, than it should be against the standard APIs. So, gone if the old client Event interface, and in is use of the javax.enterprise.event.Event interface for CDI events.&lt;br /&gt;&lt;br /&gt;Qualifiers for events and injection are now fully supported in Errai client code. And even for server-client events, in both directions!&lt;br /&gt;&lt;br /&gt;We also now have support for CDI Producers and private-method PostConstructs. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Framework&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Implementing the aforementioned requires a lot of framework infrastructure. So we went back to the drawing board and revisited the way in which Errai generates code. And in so doing, we implemented a brand new class meta model, which completely abstracts away the GWT generator API, and we then implemented our core IOC engine on top of it.  The end result is all the ridiculously awesome stuff we’re doing with CDI! &lt;br /&gt;&lt;br /&gt;This new code generation framework, forms the basis for how we foresee going forward and implementing integration for more of the EE6 stack, as well as other great technologies like Infinispan, for instance.&lt;br /&gt;&lt;br /&gt;Our latest team member to join, Christian Sadilek, has put a lot of effort into developing our test harness and getting our test coverage up to a respectable level, and I think that will pay dividends in the quality of this release as well as future releases. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Docs&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;We are renovating our documentation. And we’ve already done a lot. But there’s more to do. For the latest docs -- which we’ll be updating frequently in the coming weeks -- please check out or &lt;a href="https://docs.jboss.org/author/display/ERRAI/Home"&gt;Confluence Wiki here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Archetype&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;To get started with Errai SE, you can run this command right now:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mvn archetype:generate \&lt;br /&gt;-DarchetypeGroupId=org.jboss.errai.archetypes \&lt;br /&gt;-DarchetypeArtifactId=bus-quickstart \&lt;br /&gt;-DarchetypeVersion=1.3.0-SNAPSHOT \&lt;br /&gt;-DarchetypeRepository=https://repository.jboss.org/nexus/content/repositories/snapshots/&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To get started with Errai EE, you can run this command right now:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mvn archetype:generate \&lt;br /&gt;-DarchetypeGroupId=org.jboss.errai.archetypes \&lt;br /&gt;-DarchetypeArtifactId=cdi-quickstart \&lt;br /&gt;-DarchetypeVersion=1.3.0-SNAPSHOT \&lt;br /&gt;-DarchetypeRepository=https://repository.jboss.org/nexus/content/repositories/snapshots/&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;….&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Downloads&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;If you’re allergic to Maven, our downloads page is here: &lt;a href="http://www.jboss.org/errai/Downloads"&gt;http://www.jboss.org/errai/Downloads&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also, expect an awesome &lt;a href="http://seamframework.org/Documentation/SeamForge"&gt;Forge plugin&lt;/a&gt; to be on the horizon -- especially considering that I co-founded that project (I know, I know… it’s embarrassing that i don’t have a plugin yet. But i’m a busy guy!)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Future&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;We are only at the beginning. We expect to add a third team member in the next few weeks, and we are working closely with other JBoss projects, like Seam and RichFaces to expand the reach of the benefits which we bring to the JBoss web technology ecosystem. &lt;br /&gt;&lt;br /&gt;Since we’re a framework which looks so heavily to the power of the browser, you can expect that over the next few months, our focus will shift intensely to leveraging the scope of capabilities that HTML5 brings to the table for developing rich applications. &lt;br /&gt;&lt;br /&gt;Our ideas are vast, and we hope to share them with you going forward. So stay tuned.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Gratitude&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Thank you for everyone in the community who has given us feedback, reported bugs and supported us. Thanks to Heiko Braun for helping to get this project off the ground, and we’ll miss him as he moves on to work on other things. Thanks to Christian Sadilek for coming out of left-field and being incredibly awesome in every way. Thanks to Rodney Russ for being the world’s awesomest manager. Thanks to Mark Little for supporting all this from day one. Thanks to Dan Allen for his evangelization. Thanks to Pete Muir for his support. Thanks to Lincoln Baxter, Jay Balunas, and Shane Bryzak! And thanks to you for reading this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-3049896506326724371?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/3049896506326724371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2011/08/errai-13-beta-is-here.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3049896506326724371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3049896506326724371'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2011/08/errai-13-beta-is-here.html' title='Errai 1.3 Beta is Here!'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-2954755833224784672</id><published>2011-06-21T10:31:00.000-07:00</published><updated>2011-06-21T10:57:27.579-07:00</updated><title type='text'>Pervasive CDI: Errai at the JBoss World Keynote</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-fvk0q0xr4zo/TgDYAoqtNwI/AAAAAAAAAD8/4HeggnNHaqs/s1600/Screen%2Bshot%2B2011-06-20%2Bat%2B5.39.40%2BPM.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://2.bp.blogspot.com/-fvk0q0xr4zo/TgDYAoqtNwI/AAAAAAAAAD8/4HeggnNHaqs/s320/Screen%2Bshot%2B2011-06-20%2Bat%2B5.39.40%2BPM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5620729840386520834" /&gt;&lt;/a&gt;&lt;br /&gt;        &lt;p class="p1"&gt;JBoss World kicked off with a &lt;a href="http://www.jboss.org/jbw2011keynote"&gt;real cool keynote presentation&lt;/a&gt; which represented a confluence of JBoss’s cutting-edge technology.&lt;/p&gt;&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;span class="s1"&gt;The demo brought together &lt;a href="http://www.jboss.org/jbossas/"&gt;JBoss AS&lt;/a&gt;, &lt;a href="http://www.jboss.org/infinispan/"&gt;Infinispan&lt;/a&gt;, &lt;a href="http://planet.jboss.org/post/hibernate_ogm_birth_announcement"&gt;HibernateOGM&lt;/a&gt;, &lt;a href="http://seamframework.org/Weld"&gt;CDI&lt;/a&gt; and &lt;a href="http://www.jboss.org/errai"&gt;Errai&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;span class="s1"&gt;Of course, our little part of the presentation was the demonstration of Errai powering a real-time tag cloud which really brought home the concept of the "real-time web"; most certainly not something which hasn’t been done before, but it was &lt;i&gt;&lt;a href="http://infinispan.blogspot.com/2011/06/keynote-of-decade-behind-scenes.html"&gt;how&lt;/a&gt;&lt;/i&gt; &lt;a href="http://in.relation.to/Bloggers/RichFacesAndTheMobileWebForTheJBossWorld2011Keynote"&gt;we&lt;/a&gt; &lt;a href="http://in.relation.to/Bloggers/WhatYouDidNotSeeAtTheJBossWorld2011KeynoteDemo"&gt;did&lt;/a&gt; &lt;a href="http://community.jboss.org/people/kconner/blog/2011/06/20/jboss-world-2011-and-that-keynote-demo"&gt;it&lt;/a&gt; that makes it interesting.&lt;/span&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;span class="s1"&gt;I'm not going to rehash too much of what has already been said in the aforementioned blog posts, and I highly recommend you click the hyperlinks and check them out. Instead, I'm going to talk about CDI and Errai.&lt;/p&gt;&lt;/span&gt;&lt;p class="p1"&gt;&lt;span class="s1"&gt;CDI is a technology we’re pushing really aggressively at JBoss, and Errai is no exception. In fact, we’re relatively sure that we’re the one and only in-browser CDI engine.&lt;/span&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;span class="s1"&gt;It was only natural we’d want to show this off at JBoss World.  And that we did.&lt;/span&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;span class="s1"&gt;The demo involved bringing in a live tweet stream from Twitter and then producing real-time information based on what hashtags were most popular. The key was to have a fully dynamic tag cloud which would be updated the instant that the information was available. And as such, we used Errai’s push technology to display the information to every browser simultaneously and in real time.&lt;/span&gt;&lt;/p&gt;&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;CDI in the Browser&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;span class="s1"&gt;So what does CDI in the browser look like? Well, this might come as a shock: it looks &lt;i&gt;exactly &lt;/i&gt;as it does in your server-side code. Consider the following server code:&lt;/span&gt;&lt;/p&gt;&lt;tt style='color:black;'&gt;&lt;span style='color:darkgoldenrod;'&gt;@ApplicationScoped&lt;/span&gt;&lt;br/&gt;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;&lt;strong style='color:darkblue'&gt;class&lt;/strong&gt;&amp;nbsp;MyService&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:darkgoldenrod;'&gt;@Inject&lt;/span&gt;&amp;nbsp;&lt;span style='color:darkgoldenrod;'&gt;@Updated&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;private&lt;/strong&gt;&amp;nbsp;&amp;lt;&amp;gt;Event&lt;Tag&gt;&amp;nbsp;updatedTagEvent;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&amp;nbsp;&lt;br/&gt;&lt;br/&gt;}&lt;/tt&gt;&lt;p&gt;&lt;span class="s1"&gt;And now consider the following client GWT code:&lt;/span&gt;&lt;/p&gt; &lt;tt style='color:black;'&gt;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;&lt;strong style='color:darkblue'&gt;void&lt;/strong&gt;&amp;nbsp;onTagUpdated(&lt;span style='color:darkgoldenrod;'&gt;@Observes&lt;/span&gt;&amp;nbsp;&lt;span style='color:darkgoldenrod;'&gt;@Updated&lt;/span&gt;&amp;nbsp;Tag&amp;nbsp;tag)&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&lt;span style='color:darkgreen'&gt;"Tag&amp;nbsp;was&amp;nbsp;updated:&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;tag)&lt;br/&gt;}&lt;/tt&gt; &lt;p class="p2"&gt;In the former code snipped we setup a CDI event consumer, and in the latter, we setup a CDI event observer.  Believe it or not, that’s pretty much everything you need to know about push messaging with Errai CDI. &lt;span class="s1"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;In fact, this is exactly how&lt;a href="https://github.com/errai/JBWDemo"&gt; our tag cloud&lt;/a&gt; was updated. Using our transparent push mechanism, serialization and bus framework, all of the boilerplate associated with doing “push” is eliminated. &lt;span class="s1"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;Yes, it’s &lt;i&gt;that&lt;/i&gt; cool. I’m not going to show you a bunch of XML , property or boilerplate class files because, well, there are none. &lt;span class="s1"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;As a developer you simply want to think about your logic and your data. Utilizing Errai and CDI to build your rich web applications allows you to do just that. &lt;span class="s1"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;&lt;b&gt;How does it work?&lt;/b&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;Errai is very much a compile-time framework. In order to provide the runtime infrastructure to transparently communicate between browser code (written in GWT) and the server, we provide a significant amount of code generation to support functionality based on declarative configuration.&lt;span class="s1"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;For instance, we provide a straight forward annotation, @ExposeEntity which effectively instructs Errai to produce marshaller and demarshaller wrappers -- ultimately compiled down to JavaScript -- for the entity.  &lt;span class="s1"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;The other aspect of Errai is a powerful messaging bus which, consistently with Errai’s “pervasive” theme, runs concurrently in the browser and on the server. As opposed to thinking about client vs server, we have aggressively pursued a flat architecture where the client and server APIs are common and shared.  So there isn’t one way to write server code for Errai and another way to write client code.&lt;span class="s1"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;This also provides the underlying application with transport agnosticism. That is to say, this only contract is between the bus APIs and the client code for all client-server communication. Or even more high-level in the case of Errai CDI, between the application and the CDI eventing system. This means the method of communication, be it WebSockets or COMET is invisible to the application. Developers no longer need to worry about the particularities of working with those technologies. &lt;span class="s1"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;The future?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;We think the future of the web is rich applications. But not only that pervasive applications. And the demo we showed at JBoss World which can be viewed here at about 35 minutes into the presentation is merely a taste of how powerful pervasive computing can be.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-2954755833224784672?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/2954755833224784672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2011/06/pervasive-cdi-errai-at-jboss-world.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/2954755833224784672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/2954755833224784672'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2011/06/pervasive-cdi-errai-at-jboss-world.html' title='Pervasive CDI: Errai at the JBoss World Keynote'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-fvk0q0xr4zo/TgDYAoqtNwI/AAAAAAAAAD8/4HeggnNHaqs/s72-c/Screen%2Bshot%2B2011-06-20%2Bat%2B5.39.40%2BPM.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-9161526210381866327</id><published>2011-04-21T11:29:00.000-07:00</published><updated>2011-05-10T12:00:14.160-07:00</updated><title type='text'>Latest enhancements to the Errai CDI integration module</title><content type='html'>&lt;div class="p1"&gt;&lt;b&gt;CDI event qualifiers&lt;/b&gt;&lt;/div&gt;&lt;div class="p2"&gt;The Errai CDI integration module (see a previous blog &lt;a href="http://errai-blog.blogspot.com/2010/08/enjoy-benefits-of-java-ee-6-component.html"&gt;post&lt;/a&gt;) has support for event qualifiers now, both for event producers and observers. Multiple qualifiers can be specified for an event and of course custom qualifiers can be used.&lt;br /&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;b&gt;CDI conversations&lt;/b&gt;&lt;/div&gt;&lt;div class="p2"&gt;The simple use of @Conversational allows a server to directly address a single client in response to an event.&lt;br /&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;b&gt;BusReadyEvent&lt;/b&gt;&lt;/div&gt;&lt;div class="p2"&gt;Clients can observe a BusReadyEvent to be notified when the CDI event system has been initialized and the message bus is ready to be used.&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;The example code below shows how to use these new features. Notice again the use of a uniform API on both the client and server.&amp;nbsp; For more details on Errai's CDI support see the online &lt;a href="http://download.jboss.org/errai/docs/1.2.2/userguide/index.html#cd"&gt;documentation&lt;/a&gt;.&amp;nbsp;Any feedback is appreciated!&lt;/div&gt;&lt;br /&gt;&lt;div class="p1" style="color: #777777; font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;@EntryPoint&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1" style="color: #941965;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;class&lt;/span&gt;&amp;nbsp;SimpleDocumentClient&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;extends&lt;/span&gt;&amp;nbsp;LayoutPanel {&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #777777;"&gt;@Inject&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;private&lt;/span&gt;&amp;nbsp;Event&amp;lt;DocumentSubscription&amp;gt;&amp;nbsp;&lt;span class="s3" style="color: #102bc3;"&gt;documentSubscriptionEvent&lt;/span&gt;;&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #777777;"&gt;@Inject&lt;span class="s2" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;@Published&lt;/span&gt;&lt;/div&gt;&lt;div class="p4" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;private&lt;/span&gt;&lt;span class="s2" style="color: black;"&gt;&amp;nbsp;Event&amp;lt;Document&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #102bc3;"&gt;publishedDocumentEvent&lt;/span&gt;&lt;span class="s2" style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;void&lt;/span&gt;&amp;nbsp;buildUI(&lt;span class="s4" style="color: #777777;"&gt;@Observes&lt;/span&gt;&amp;nbsp;BusReadyEvent busReadyEvent) {&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s3" style="color: #102bc3;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;documentSubscriptionEvent&lt;/span&gt;.fire(&lt;span class="s1" style="color: #941965;"&gt;new&lt;/span&gt;&amp;nbsp;DocumentSubscription());&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;span class="Apple-style-span" style="color: #4d9075;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ...&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;new&lt;/span&gt;&amp;nbsp;Button().addClickHandler(&lt;span class="s1" style="color: #941965;"&gt;new&lt;/span&gt;&amp;nbsp;ClickHandler() {&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;void&lt;/span&gt;&amp;nbsp;onClick(ClickEvent event) {&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s3"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s3" style="color: #102bc3;"&gt;publishedDocumentEvent&lt;/span&gt;.fire(&lt;span class="s1" style="color: #941965;"&gt;new&lt;/span&gt;&amp;nbsp;Document());&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;});&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;void&lt;/span&gt;&amp;nbsp;onDocumentsReceived(&lt;span class="s4" style="color: #777777;"&gt;@Observes&lt;/span&gt;&amp;nbsp;Documents document) {&lt;/div&gt;&lt;div class="p5" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #4d9075;"&gt;// this event is received as a direct response to the subscription event&lt;/span&gt;&lt;/div&gt;&lt;div class="p5" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #4d9075;"&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1" style="color: #941965;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public&lt;/span&gt;&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;void&lt;/span&gt;&amp;nbsp;onDocumentCreated(&lt;span class="s4" style="color: #777777;"&gt;@Observes&lt;/span&gt;&amp;nbsp;&lt;span class="s4" style="color: #777777;"&gt;@New&lt;/span&gt;&amp;nbsp;Document document) {&lt;/div&gt;&lt;div class="p5" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="Apple-style-span" style="color: #4d9075;"&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1" style="color: #941965;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public&lt;/span&gt;&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;void&lt;/span&gt;&amp;nbsp;onDocumentUpdated(&lt;span class="s4" style="color: #777777;"&gt;@Observes&lt;/span&gt;&amp;nbsp;&lt;span class="s4" style="color: #777777;"&gt;@Updated&lt;/span&gt;&amp;nbsp;Document document) {&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="Apple-style-span" style="color: #4d9075;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; // ...&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;void&lt;/span&gt;&amp;nbsp;onDocumentDeleted(&lt;span class="s4" style="color: #777777;"&gt;@Observes&lt;/span&gt;&amp;nbsp;&lt;span class="s4" style="color: #777777;"&gt;@Deleted&lt;/span&gt;&amp;nbsp;Document document) {&lt;/div&gt;&lt;div class="p5" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="Apple-style-span" style="color: #4d9075;"&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;}&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="color: #777777; font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;@ApplicationScoped&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1" style="color: #941965;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;class&lt;/span&gt;&amp;nbsp;SimpleDocumentService {&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #777777;"&gt;@Inject&lt;/span&gt;&lt;/div&gt;&lt;div class="p4" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;private&lt;/span&gt;&lt;span class="s2" style="color: black;"&gt;&amp;nbsp;Event&amp;lt;Documents&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #102bc3;"&gt;subscriptionResponseEvent&lt;/span&gt;&lt;span class="s2" style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #777777;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@Inject&lt;span class="s2" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;@New&lt;/span&gt;&lt;/div&gt;&lt;div class="p4" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;private&lt;/span&gt;&lt;span class="s2" style="color: black;"&gt;&amp;nbsp;Event&amp;lt;Document&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #102bc3;"&gt;documentCreatedEvent&lt;/span&gt;&lt;span class="s2" style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #777777;"&gt;@Inject&lt;span class="s2" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;@Updated&lt;/span&gt;&lt;/div&gt;&lt;div class="p4" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;private&lt;/span&gt;&lt;span class="s2" style="color: black;"&gt;&amp;nbsp;Event&amp;lt;Document&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #102bc3;"&gt;documentUpdatedEvent&lt;/span&gt;&lt;span class="s2" style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #777777;"&gt;@Inject&lt;span class="s2" style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;@Deleted&lt;/span&gt;&lt;/div&gt;&lt;div class="p4" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;private&lt;/span&gt;&lt;span class="s2" style="color: black;"&gt;&amp;nbsp;Event&amp;lt;Document&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #102bc3;"&gt;documentDeletedEvent&lt;/span&gt;&lt;span class="s2" style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div class="p1" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #777777;"&gt;@Conversational&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;void&lt;/span&gt;&amp;nbsp;onDocumentSubscription(&lt;span class="s4" style="color: #777777;"&gt;@Observes&lt;/span&gt;&amp;nbsp;DocumentSubscription subscription) {&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Documents documents =&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;new&lt;/span&gt;&amp;nbsp;Documents();&lt;/div&gt;&lt;div class="p5" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #4d9075;"&gt;//...&lt;/span&gt;&lt;/div&gt;&lt;div class="p5" style="color: #4d9075; font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// respond to the client directly&lt;/div&gt;&lt;div class="p4" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #102bc3;"&gt;subscriptionResponseEvent&lt;span class="s2" style="color: black;"&gt;.fire(documents);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;void&lt;/span&gt;&amp;nbsp;onDocumentPublished(&lt;span class="s4" style="color: #777777;"&gt;@Observes&lt;/span&gt;&amp;nbsp;&lt;span class="s4" style="color: #777777;"&gt;@Published&lt;/span&gt;&amp;nbsp;Document document) {&lt;/div&gt;&lt;div class="p5" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #4d9075;"&gt;// receive document published events from the clients&lt;/span&gt;&lt;/div&gt;&lt;div class="p5" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #4d9075;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//...&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;void&lt;/span&gt;&amp;nbsp;createDocument(Document document) {&lt;/div&gt;&lt;div class="p5" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #4d9075;"&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;div class="p5" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #4d9075;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #102bc3;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;documentCreatedEvent&lt;span class="s2" style="color: black;"&gt;.fire(document);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;void&lt;/span&gt;&amp;nbsp;updateDocument(Document document) {&lt;/div&gt;&lt;div class="p5" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #4d9075;"&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;div class="p4" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #102bc3;"&gt;documentUpdatedEvent&lt;span class="s2" style="color: black;"&gt;.fire(document);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="p3" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 15px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;span class="s1"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="s1" style="color: #941965;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="s1" style="color: #941965;"&gt;void&lt;/span&gt;&amp;nbsp;deleteDocument(Document document) {&lt;/div&gt;&lt;div class="p5" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #4d9075;"&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;div class="p4" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #102bc3;"&gt;documentDeletedEvent&lt;span class="s2" style="color: black;"&gt;.fire(document);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div class="p2" style="font: normal normal normal 11px/normal Monaco; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;}&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-9161526210381866327?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/9161526210381866327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2011/04/latest-enhancements-to-errai-cdi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/9161526210381866327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/9161526210381866327'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2011/04/latest-enhancements-to-errai-cdi.html' title='Latest enhancements to the Errai CDI integration module'/><author><name>Christian Sadilek</name><uri>http://www.blogger.com/profile/08658409475172892811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-3822450498065199018</id><published>2011-03-24T11:32:00.000-07:00</published><updated>2011-03-24T12:07:23.138-07:00</updated><title type='text'>Errai 1.2 released.</title><content type='html'>I am pleased to announce the &lt;a href="http://www.jboss.org/errai/Downloads"&gt;public release of Errai 1.2&lt;/a&gt;.  This is a maintenance release on Errai, with big fixes, better support for CDI integration and so on. &lt;br /&gt;&lt;br /&gt;Existing users of Errai 1.1 should be able to directly upgrade to 1.2. &lt;br /&gt;&lt;br /&gt;We have recently expanded our team and we plan on aggressively pushing the project in new and exciting directions going forward. So please check this space often. There's a lot in the offing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-3822450498065199018?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/3822450498065199018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2011/03/errai-12-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3822450498065199018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3822450498065199018'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2011/03/errai-12-released.html' title='Errai 1.2 released.'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-963840494931132258</id><published>2010-10-19T05:32:00.000-07:00</published><updated>2010-10-19T05:33:18.791-07:00</updated><title type='text'>Community Asylum Podcast</title><content type='html'>This time we got Heiko and Pete talking with us about JUDCon Berlin and Heiko's work on the Errai project.&lt;br /&gt;&lt;br /&gt;As usual we also cover short news from the JBoss Community, but if you've wondered what Errai actually is and what it brings to the table then take a listen from about 30 minutes in, Heiko outlines it all in this episode.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://asylum.libsyn.com/podcast-14-jud-con-berlin-and-errai"&gt;Get it here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-963840494931132258?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/963840494931132258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/10/community-asylum-podcast.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/963840494931132258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/963840494931132258'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/10/community-asylum-podcast.html' title='Community Asylum Podcast'/><author><name>HBraun</name><uri>http://www.blogger.com/profile/07103829051346814127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-1388959901900699522</id><published>2010-10-16T04:21:00.001-07:00</published><updated>2010-10-16T04:25:01.398-07:00</updated><title type='text'>Slides from JUDCon Berlin</title><content type='html'>"Errai offers a set of components for building rich web applications using The Google Web Toolkit. The framework provides a unified federation and RPC infrastructure with true, uniform, asynchronous messaging across the client and server.&lt;br /&gt;&lt;br /&gt;It extends the Google Web Toolkit in two distinct areas:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- True asynchronous bi-directional communication between GWT clients and backend systems &lt;br /&gt;- Integration with enterprise component models and technologies.&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;In this session we'll look at CDI integration module. It offers seamless integration of CDI backend components with GWT client applications. Build as an extension to the Errai core framework, it allows you to transparently access CDI beans while harnessing the power of the core framework.&lt;br /&gt;&lt;br /&gt;Beans that are deployed to a CDI container (i.e. JBoss 6) will automatically be registered with Errai and exposed to your GWT client application. Communication between GWT client components and CDI beans can be done in several ways:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- RPC style invocations on beans through a typed interface&lt;br /&gt;- Access beans in a publish/subscribe manner&lt;br /&gt;- Wiring up your GWT application with the CDI event subsystem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After this session you should have a good idea about the core framework capabilities and CDI integration in particular."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_5440626"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/hbraun/gwt-cdi-judconberlin" title="Gwt cdi jud_con_berlin"&gt;Gwt cdi jud_con_berlin&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5440626" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gwtcdijudconberlin-101014035623-phpapp01&amp;stripped_title=gwt-cdi-judconberlin&amp;userName=hbraun" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5440626" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gwtcdijudconberlin-101014035623-phpapp01&amp;stripped_title=gwt-cdi-judconberlin&amp;userName=hbraun" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/hbraun"&gt;hbraun&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-1388959901900699522?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/1388959901900699522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/10/slides-from-judcon-berlin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/1388959901900699522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/1388959901900699522'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/10/slides-from-judcon-berlin.html' title='Slides from JUDCon Berlin'/><author><name>HBraun</name><uri>http://www.blogger.com/profile/07103829051346814127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-4101465845570806695</id><published>2010-09-23T01:35:00.000-07:00</published><updated>2010-09-23T01:39:52.358-07:00</updated><title type='text'>Errai at JUDCon Berlin, October 2010</title><content type='html'>We'll be presenting Errai at the JBoss Developer Conference in Berlin next month.&lt;br /&gt;Besides the core framework features we'll take a particular look at the CDI integration capabilities.&lt;br /&gt;Bring your laptops, because we'll wait for you at the hackfest Thursday night.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jboss.org/events/JUDCon/JUDCon2010Berlin.html"&gt;More information here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-4101465845570806695?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/4101465845570806695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/09/errai-at-judcon-berlin-october-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/4101465845570806695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/4101465845570806695'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/09/errai-at-judcon-berlin-october-2010.html' title='Errai at JUDCon Berlin, October 2010'/><author><name>Heiko Braun</name><uri>http://www.blogger.com/profile/17987290811990461031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-7995783282463018370</id><published>2010-08-19T03:11:00.000-07:00</published><updated>2010-08-19T04:05:16.689-07:00</updated><title type='text'>Enjoy the benefits of the Java EE 6 component model using GWT as an alternative view layer technology.</title><content type='html'>&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;br /&gt;The CDI integration module offers seamless integration of CDI backend components with GWT client applications. &lt;a href="http://anonsvn.jboss.org/repos/errai/projects/weld-integration/trunk/"&gt;Build as an extension to the Errai core framework&lt;/a&gt;, it allows you to transparently access CDI beans while harnessing the power of the core framework.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;Beans that are deployed to a CDI container (i.e. JBoss 6) will automatically be registered with Errai and exposed to your GWT client application. Communication between GWT client components and CDI beans can be done in several ways:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RPC style invocations on beans through a typed interface&lt;/li&gt;&lt;li&gt;Access beans in a publish/subscribe manner&lt;/li&gt;&lt;li&gt;Wiring up your GWT application with the CDI event subsystem&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;RPC Style Invocations&lt;/b&gt;&lt;br /&gt;When chosing RPC style invocations on beans, you basically rely on a typed java interface the CDI managed bean needs to expose. A GWT client component can then create an invocation proxy based on this interface. For more information see &lt;a href="http://download.jboss.org/errai/docs/1.1.0-CR1/userguide/index.html#rpc"&gt;chapter on RPC mechanism&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Publish/Subscribe with CDI managed components&lt;/b&gt;&lt;br /&gt;If you chose publish/subscribe then your CDI bean needs to implement the &lt;a href="http://download.jboss.org/errai/docs/1.1.0-CR1/javadocs/index.html"&gt;MessageCallback&lt;/a&gt; interface, as described in &lt;a href="http://download.jboss.org/errai/docs/1.1.0-CR1/userguide/index.html#pubsub"&gt;chapter 'Messaging'&lt;/a&gt;. Any bean exposed in this way can be accessed through the &lt;a href="http://download.jboss.org/errai/docs/1.1.0-CR1/javadocs/index.html"&gt;MessageBuilder API&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Integration with the CDI event subsystem&lt;/b&gt;&lt;br /&gt;Any CDI managed component may produce and consume events. This allows beans to interact in a completely decoupled fashion. Beans consume events by registering for a particular event type and qualifier. &lt;a href="http://www.jboss.org:80/errai/Components/CDI-Integration.html"&gt;The Errai CDI extension&lt;/a&gt; simply extends this concept into the client tier. A GWT client application can simply register an Observer for a particular event type and thus receive events that are produced on the server side. Likewise GWT clients can produce events that are consumed by a server side component.&lt;br /&gt;&lt;br /&gt;Let's take a look at an example GWT component:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class FraudClient extends LayoutPanel {&lt;br /&gt;&lt;br /&gt;@Inject&lt;br /&gt;public Event event;                                    (1)&lt;br /&gt;&lt;br /&gt;private HTML responsePanel;&lt;br /&gt;&lt;br /&gt;public FraudClient() {&lt;br /&gt;  super(new BoxLayout(BoxLayout.Orientation.VERTICAL));&lt;br /&gt;&lt;br /&gt;  Button button = new Button("Create activity", new ClickHandler() {&lt;br /&gt;    public void onClick(ClickEvent clickEvent) {&lt;br /&gt;      event.fire(new AccountActivity());&lt;br /&gt;    }&lt;br /&gt;  });&lt;br /&gt;&lt;br /&gt;  responsePanel = new HTML();&lt;br /&gt;&lt;br /&gt;  add(button);&lt;br /&gt;  add(responsePanel);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void processFraud(@Observes Fraud fraudEvent) { (2)&lt;br /&gt;  responsePanel.setText("Fraud detected: " + fraudEvent.getTimestamp());&lt;br /&gt;}&lt;br /&gt;}             &lt;br /&gt;&lt;/pre&gt;Two things are notable in this example:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Injection of an event dispatcher proxy&lt;/li&gt;&lt;li&gt;Creation of an Oberserver method for a particular event type&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Event dispatcher proxy&lt;/b&gt;&lt;/div&gt;The event dispatcher is responsible to send events created on the client side to the server side event subsystem (CDI container). This means any event that is fired through a dispatcher will eventually be consumed by a CDI managed bean. If there is an Observer registered for it on the server side.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Client side observer methods&lt;/b&gt;&lt;br /&gt;In order to consume events that are created on the server side you need to declare an Observer method for a particular event type. In case an event is fired on the server side this method will be invoked with an event instance of the type you declared.&lt;br /&gt;&lt;br /&gt;To complete this exercise, let's look at the corresponding CDI managed bean as well:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@ApplicationScoped&lt;br /&gt;public class AccountService {&lt;br /&gt;  @Inject @Any&lt;br /&gt;  Event&lt;outbound&gt; event;&lt;br /&gt;&lt;br /&gt;  public void watchActivity(@Observes @Inbound AccountActivity activity) {&lt;br /&gt;      Fraud payload = new Fraud(System.currentTimeMillis());&lt;br /&gt;      event.fire(new Outbound(payload));&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/outbound&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Whetting your appetite? Here are some links to get you going:&lt;ul&gt;&lt;li&gt;&lt;a href="http://anonsvn.jboss.org/repos/errai/projects/weld-integration/trunk/examples/gui/src/main/java/org/jboss/errai/cdi/"&gt;Some more examples&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://community.jboss.org/wiki/WorkingwithGWTCDIandErrai"&gt;Create a project and import it into Eclipse&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.jboss.org/errai/docs/1.1.0-CR1/userguide/index.html"&gt;Errai 1.1.0-CR1 Userguide&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://seamframework.org/Weld"&gt;Weld, the CDI reference implementation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-7995783282463018370?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/7995783282463018370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/08/enjoy-benefits-of-java-ee-6-component.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/7995783282463018370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/7995783282463018370'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/08/enjoy-benefits-of-java-ee-6-component.html' title='Enjoy the benefits of the Java EE 6 component model using GWT as an alternative view layer technology.'/><author><name>Heiko Braun</name><uri>http://www.blogger.com/profile/17987290811990461031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-7477408773372031673</id><published>2010-08-19T02:14:00.000-07:00</published><updated>2010-08-19T04:00:50.425-07:00</updated><title type='text'>"Fueling the rocket" - Approaching 1.1-Final</title><content type='html'>&lt;table border="0px"&gt;&lt;br /&gt;&lt;tr valign="top"&gt;&lt;br /&gt;&lt;td&gt;&lt;br /&gt;Ready for lift-off? The 1.1 Candidate Release has been released today. We got plenty of goodies baked into this one:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Serialization&lt;/b&gt;&lt;br /&gt;Plenty of bugfixes and performance improvements. &lt;br /&gt;Up to 40% performance gain and a much better memory footprint.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Deployment&lt;/b&gt;&lt;br /&gt;Complete replacement for the meta data facilities and deployment hooks. This a fixes a lot of problems with nested deployment artifacts (i.e. WAR inside EAR)&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Monitoring&lt;/b&gt;&lt;br /&gt;Improvement activity monitoring tools. Added capabilities to query for certain  message types/payload patterns.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://www.jboss.org:80/errai/Components/CDI-Integration.html"&gt;CDI Integration&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;Seamless integration of CDI backend components with GWT client applications.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;And much more ...&lt;/b&gt;&lt;br /&gt;Check the &lt;a href="http://download.jboss.org/errai/docs/1.1.0-CR1/userguide/index.html"&gt;Userguide&lt;/a&gt; for a complete reference of new features.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jboss.org:80/errai/Downloads.html"&gt;Download it now&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://download.jboss.org/errai/docs/1.1.0-CR1/userguide/index.html"&gt;Browse the Userguide&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://anonsvn.jboss.org/repos/errai/"&gt;Get the sources&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;the Errai Team&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QxIFVLQdHS0/TGz2NZWpm-I/AAAAAAAAAHk/t9L_n2Nb9W0/s1600/rocketship.jpg"&gt;&lt;img style="margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 102px; height: 320px;" src="http://1.bp.blogspot.com/_QxIFVLQdHS0/TGz2NZWpm-I/AAAAAAAAAHk/t9L_n2Nb9W0/s320/rocketship.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5507047154371894242" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-size:small;color:#cccccc;"&gt;Image from "Fortress on a Skyhook" written and illustrated by Frank Tinsley, Mechanix Illustrated April, 1949&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-7477408773372031673?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/7477408773372031673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/08/fueling-rocket-approaching-11-final.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/7477408773372031673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/7477408773372031673'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/08/fueling-rocket-approaching-11-final.html' title='&quot;Fueling the rocket&quot; - Approaching 1.1-Final'/><author><name>Heiko Braun</name><uri>http://www.blogger.com/profile/17987290811990461031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_QxIFVLQdHS0/TGz2NZWpm-I/AAAAAAAAAHk/t9L_n2Nb9W0/s72-c/rocketship.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-4448491187649618485</id><published>2010-07-19T09:56:00.000-07:00</published><updated>2010-07-19T10:13:17.612-07:00</updated><title type='text'>Dependency Injection in the Browser!</title><content type='html'>One of the things that will be coming in Errai 1.1 is our new IOC module which provides a dependency injection framework, based on JSR-330 in the browser.  Now, this is not just Gin packaged with Errai.  Rather, it's an implementation which has been built specifically to intermix with Errai's code generation infrastructure and provide a boiler-plate free experience.&lt;br /&gt;&lt;br /&gt;When we release 1.1, gone will be the days of having to access the bus or the dispatchers through static factories.  Rather, your client-side code will look even more like your server-side code.&lt;br /&gt;&lt;br /&gt;Check out our new HelloWorld example built atop our new DIfoundations.&lt;br /&gt;&lt;br /&gt;&lt;tt style='color:black;'&gt;&lt;span style='color:darkgoldenrod;'&gt;@EntryPoint&lt;/span&gt;&amp;nbsp;&lt;span style='color:darkgoldenrod;'&gt;@Service&lt;/span&gt;&lt;br/&gt;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;&lt;strong style='color:darkblue'&gt;class&lt;/strong&gt;&amp;nbsp;HelloWorld&amp;nbsp;&lt;strong style='color:darkblue'&gt;extends&lt;/strong&gt;&amp;nbsp;VerticalPanel&amp;nbsp;&lt;strong style='color:darkblue'&gt;implements&lt;/strong&gt;&amp;nbsp;MessageCallback&lt;br/&gt;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;private&lt;/strong&gt;&amp;nbsp;Button&amp;nbsp;sayHello;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;private&lt;/strong&gt;&amp;nbsp;Label&amp;nbsp;label;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;private&lt;/strong&gt;&amp;nbsp;MessageBus&amp;nbsp;bus;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:darkgoldenrod;'&gt;@Inject&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;HelloWorld(MessageBus&amp;nbsp;bus)&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.bus&amp;nbsp;=&amp;nbsp;bus;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;&lt;strong style='color:darkblue'&gt;void&lt;/strong&gt;&amp;nbsp;callback(Message&amp;nbsp;message)&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;label.setText(SimpleMessage.get(message));&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:darkgoldenrod;'&gt;@PostConstruct&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;&lt;strong style='color:darkblue'&gt;void&lt;/strong&gt;&amp;nbsp;init()&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sayHello&amp;nbsp;=&amp;nbsp;&lt;strong style='color:darkblue'&gt;new&lt;/strong&gt;&amp;nbsp;Button(&lt;span style='color:darkgreen'&gt;"Say&amp;nbsp;Hello!"&lt;/span&gt;);&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:grey'&gt;/**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Register&amp;nbsp;click&amp;nbsp;handler.&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sayHello.addClickHandler(&lt;strong style='color:darkblue'&gt;new&lt;/strong&gt;&amp;nbsp;ClickHandler()&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;&lt;strong style='color:darkblue'&gt;void&lt;/strong&gt;&amp;nbsp;onClick(ClickEvent&amp;nbsp;event)&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBuilder.createMessage()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.toSubject(&lt;span style='color:darkgreen'&gt;"HelloWorldService"&lt;/span&gt;)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.with(MessageParts.ReplyTo,&amp;nbsp;&lt;span style='color:darkgreen'&gt;"HelloWorld"&lt;/span&gt;)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.done().sendNowWith(bus);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;label&amp;nbsp;=&amp;nbsp;&lt;strong style='color:darkblue'&gt;new&lt;/strong&gt;&amp;nbsp;Label();&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add(sayHello);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add(label);&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RootPanel.get().add(this);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;}&lt;br/&gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Notice use of the @EntryPoint annotation.  When you use @EntryPoint you don't need to implement your own GWT EntryPoint class, we build that for you.  &lt;br /&gt;&lt;br /&gt;You're probably already wondering if you can provide your own arbitrary providers to inject custom services, widgets and other components.  And the answer is yes.  We've provided a simple Provider interface that you can annotate to be discovered by the container at compile time to provide an injectable dependency.  In fact both MessageBus and RequestDispatcher plug-in using this mechanism.  Here's the provider for MessageBus:&lt;br /&gt;&lt;br /&gt;&lt;tt style='color:black;'&gt;&lt;span style='color:darkgoldenrod;'&gt;@Provider&lt;/span&gt;&lt;br/&gt;&lt;span style='color:darkgoldenrod;'&gt;@Singleton&lt;/span&gt;&lt;br/&gt;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;&lt;strong style='color:darkblue'&gt;class&lt;/strong&gt;&amp;nbsp;MessageBusProvider&amp;nbsp;&lt;strong style='color:darkblue'&gt;implements&lt;/strong&gt;&amp;nbsp;TypeProvider&amp;lt;MessageBus&amp;gt;&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;MessageBus&amp;nbsp;provide()&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;return&lt;/strong&gt;&amp;nbsp;ErraiBus.get();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;}&lt;br/&gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Pretty cool, huh?  Doing more sophisticated things requires tying into the code generator which is used to generate the wiring code, and there will be documentation on how to do that.   But the code generation interfaces will be surprisingly easy to use if you want to do anything particularly advanced, such as provide custom annotations for the container to process during the bootstrap process.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is just one of the many cool features coming to Errai 1.1.  Stay tuned for more!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-4448491187649618485?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/4448491187649618485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/07/dependency-injection-in-browser.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/4448491187649618485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/4448491187649618485'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/07/dependency-injection-in-browser.html' title='Dependency Injection in the Browser!'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-3103871602715880518</id><published>2010-05-30T08:47:00.000-07:00</published><updated>2010-06-04T01:22:27.978-07:00</updated><title type='text'>GWT, CDI and Errai at Jazoon</title><content type='html'>If you happen to be at &lt;a href="http://jazoon.com/"&gt;Jazoon&lt;/a&gt; this year and you are interested in GWT, CDI and Errai then these sessions may be interesting to you:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Patterns and Best Practices for building large GWT applications&lt;/b&gt;&lt;br /&gt;Tuesday, 1 June 2010, 14:00-14:50, Arena 3&lt;br /&gt;&lt;br /&gt;In this presentation we’ll see how to organize a nontrivial GWT application. We’ll go through the lessons learned in a real world project and take a look the complete development lifecycle and best practices that go beyond what GWT has to offer out-of-the-box. This talk does focus on modularity of GWT applications and how to overcome the burdens of compile-time linking. We’ll talk about client side patterns and server side implementation options and explore different approaches that allow for quick turn around times without sacrificing maintainability.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;GWT, CDI and JAX-RS: A match made in heaven&lt;/b&gt;&lt;br /&gt;Tuesday, 1 June 2010, 15:00-15:50, Arena 3&lt;br /&gt;&lt;br /&gt;Every non-trivial GWT application requires integration with the server side. While GWT itself ships with the integration capabilities (i.e GWT RPC) it doesn't go beyond that. Developers have to decide how to build the backend to their GWT applications. While freedom of choice is a good thing, it doesn’t always lead to a good decision. In this session we’ll look at two options, JSR-299 [1] and JSR-311 [2], both part of the EE6 specification and see how they interplay with GWT. We'll discuss the use cases and justifications for each technology see how they are applied in practice by looking at some code examples.&lt;br /&gt;&lt;br /&gt;[1] JSR-299: Java Contexts and Dependency Injection for the Java EE platform (CDI) is the new Java standard for dependency injection and contextual lifecycle management.&lt;br /&gt;&lt;br /&gt;[2] JSR-311: A that specification defines a set of Java APIs for the development of Web services built according to the Representational State Transfer[1] (REST) architectural style.&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_4408967"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/hbraun/gwt-cdi-jaxrshbraun" title="Gwt cdi jaxrs_hbraun"&gt;Gwt cdi jaxrs_hbraun&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4408967" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gwtcdijaxrshbraun-100604030845-phpapp01&amp;stripped_title=gwt-cdi-jaxrshbraun" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4408967" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gwtcdijaxrshbraun-100604030845-phpapp01&amp;stripped_title=gwt-cdi-jaxrshbraun" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/hbraun"&gt;hbraun&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The complete schedule can be found &lt;a href="http://jazoon.com/Conference"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-3103871602715880518?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/3103871602715880518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/05/gwt-cdi-and-errai-at-jazoon.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3103871602715880518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3103871602715880518'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/05/gwt-cdi-and-errai-at-jazoon.html' title='GWT, CDI and Errai at Jazoon'/><author><name>Heiko Braun</name><uri>http://www.blogger.com/profile/17987290811990461031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-8171329765077058288</id><published>2010-05-12T11:59:00.000-07:00</published><updated>2010-05-12T12:07:53.228-07:00</updated><title type='text'>Hello, 1.1 Milestone 1!</title><content type='html'>Today, we’re pleased to announce our first step towards version 1.1, which sets us solidly on a course with 1.1 destiny.  &lt;br /&gt;&lt;br /&gt;This milestone release is a big step towards honing the concepts that we introduced in 1.0, driving someone them towards their logical conclusions, and smoothing out the rough edges.  Community feedback was important to us, and we’ve worked diligently to respond to it.&lt;br /&gt;&lt;br /&gt;This release brings a range of new features, including (but not limited to):&lt;br /&gt;&lt;br /&gt;* Support for more servlet containers.&lt;br /&gt;* New &lt;a href="http://errai-blog.blogspot.com/2010/04/introducing-new-asynchronous-task-apis.html"&gt;Async Task API&lt;/a&gt;&lt;br /&gt;* A &lt;a href="http://errai-blog.blogspot.com/2010/03/visual-bus-monitor.html"&gt;new bus monitor&lt;/a&gt; to make troubleshooting easier&lt;br /&gt;* A new RPC API, that leverages the bus architecture, and provides an alternative to GWT-RPC.&lt;br /&gt;* Better error handling.&lt;br /&gt;* &lt;a href="http://download.jboss.org/errai/docs/1.1.0.M1/userguide/index.html"&gt;Better documentation.&lt;/a&gt;&lt;br /&gt;* Bug fixes galore!&lt;br /&gt;&lt;br /&gt;We think you should take a look.  And we hope you have as much fun using it as we did building it.   &lt;br /&gt;&lt;br /&gt;Remember, Errai is always looking for community contributions.  So if you’re interested in becoming a contributor, drop us a line. &lt;a href="http://www.jboss.org/errai/Downloads.html"&gt; Download it&lt;/a&gt; before it gets cold.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-8171329765077058288?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/8171329765077058288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/05/hello-11-milestone-1.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/8171329765077058288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/8171329765077058288'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/05/hello-11-milestone-1.html' title='Hello, 1.1 Milestone 1!'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-9179135743470690921</id><published>2010-05-05T10:41:00.000-07:00</published><updated>2010-05-10T07:39:54.616-07:00</updated><title type='text'>Best Practices</title><content type='html'>Fellow JBoss core developer, and lead engineer for JBoss's security initiatives, &lt;a href="http://anil-identity.blogspot.com/"&gt;Anil Saldhana&lt;/a&gt; took a deep dive into Errai in recent weeks, and he's documented &lt;a href="http://community.jboss.org/wiki/ErraiBestPractices"&gt;some best practices here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;He offers some valuable advice worth checking out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-9179135743470690921?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/9179135743470690921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/05/best-practices.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/9179135743470690921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/9179135743470690921'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/05/best-practices.html' title='Best Practices'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-1656970174059310392</id><published>2010-04-25T18:33:00.000-07:00</published><updated>2010-04-26T09:04:50.124-07:00</updated><title type='text'>Introducing new asynchronous task APIs</title><content type='html'>One of the things that we've come to realize while developing Errai is that when you work with a framework such as Errai, where &lt;span style="font-style:italic;"&gt;push messaging&lt;/span&gt; is basically free, easy and awesome -- you end up wanting to do things like stream live data across the wire.  Stuff like stock quotes, news feeds, twitter feeds, clocks, weather patterns, and the migration activity of pigeons.&lt;br /&gt;&lt;br /&gt; A lot of our demos have involved creating threads and pushing data across completely asynchronously.  And it's always messy code.  You need to worry about managing those threads, making sure they die when the session dies, or when the subject is unsubscribed, etc.  Having to worry about all this creates security problems, resource management issues, and it makes your code messy.&lt;br /&gt;&lt;br /&gt;Well, worry no longer!  The latest commit into trunk introduces a new comprehensive (and simple) way of creating asynchronously running tasks -- as part of the the standard MessageBuilder API.&lt;br /&gt;&lt;br /&gt;Take our TimeDisplay demo, where we stream a bunch of updates from the server to the client containing &lt;tt&gt;System.currentTimeMillis()&lt;/tt&gt; results.  &lt;br /&gt;&lt;br /&gt;Up until now, the demo consisted of a thread that looped around and around and built new messages to send.   Through the addition of a new API extensions, this demo is greatly simplified.&lt;br /&gt;&lt;br /&gt;The first addition is some helper classes that help you create managed contexts to store stuff in the session.  One is called &lt;tt&gt;SessionContext&lt;/tt&gt;, and the other is called &lt;tt&gt;LocalContext&lt;/tt&gt;.   &lt;tt&gt;SessionContext&lt;/tt&gt; allows you to create session scoped attributes, and &lt;tt&gt;LocalContext&lt;/tt&gt; lets you create locally-scoped, as in, page-scoped.  So if a user has multiple browser windows open, or multiple tabs, each window or tab is it's own &lt;tt&gt;LocalContext&lt;/tt&gt;.  This is a pretty powerful little tool.&lt;br /&gt;&lt;br /&gt;The second addition is the implementation of what I'm calling &lt;em&gt;provided message parts&lt;/em&gt;.  Unlike regular message parts, these parts are resolved via providers at the time of transmission.  This is a key aspect of what we're about to show below, as it creates message re-usability. &lt;br /&gt;&lt;br /&gt;The third addition is the implementation of a repeating and delayed message transmission calls as part of the standard messaging API.&lt;br /&gt;&lt;br /&gt;Let's take a look at the example:&lt;br /&gt;&lt;br /&gt;&lt;div style="overflow:scroll; white-space:nowrap; font-size:11px; background-color:whitesmoke; border: 1px dashed darkgray;"&gt;&lt;br /&gt;&lt;tt style='color:black;'&gt;AsyncTask&amp;nbsp;task&amp;nbsp;=&amp;nbsp;MessageBuilder.createConversation(message)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.toSubject(&lt;span style='color:darkgreen'&gt;"TimeChannel"&lt;/span&gt;).signalling()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.withProvided(TimeServerParts.TimeString,&amp;nbsp;&lt;strong style='color:darkblue'&gt;new&lt;/strong&gt;&amp;nbsp;&amp;lt;&amp;gt;ResourceProvider&lt;String&gt;()&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;String&amp;nbsp;get()&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;return&lt;/strong&gt;&amp;nbsp;String.valueOf(System.currentTimeMillis());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}).noErrorHandling().replyRepeating(TimeUnit.MILLISECONDS,&amp;nbsp;100);&lt;/tt&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In this example, we create a conversational message which replies not just once, but replies continuously.  Once every 100 milliseconds as it would turn out.  The &lt;tt&gt;replyRepeating()&lt;/tt&gt; and &lt;tt&gt;replyDelayed()&lt;/tt&gt;, &lt;tt&gt;sendRepeating()&lt;/tt&gt; and &lt;tt&gt;sendDelayed()&lt;/tt&gt; methods all return an instance of &lt;tt&gt;AsyncTask&lt;/tt&gt;, which is a handle on the task being performed.  You can use this object to cancel the task.&lt;br /&gt;&lt;br /&gt;Doing so is pretty easy.&lt;br /&gt;&lt;br /&gt;&lt;tt style='color:black;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;task.cancel(true)&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Knowing all this, which isn't very much -- and that's the cool part -- let's put it all together:&lt;br /&gt;&lt;br /&gt;&lt;div style="overflow:scroll; white-space:nowrap; font-size:11px; background-color:whitesmoke; border: 1px dashed darkgray;"&gt;&lt;br /&gt;&lt;tt style='color:black;'&gt;&lt;span style='color:darkgoldenrod;'&gt;@Service&lt;/span&gt;(&lt;span style='color:darkgreen'&gt;"TimeServer"&lt;/span&gt;)&lt;br/&gt;&lt;span style='color:darkgoldenrod;'&gt;@RequireAuthentication&lt;/span&gt;&lt;br/&gt;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;&lt;strong style='color:darkblue'&gt;class&lt;/strong&gt;&amp;nbsp;TimeDisplay&amp;nbsp;&lt;strong style='color:darkblue'&gt;implements&lt;/strong&gt;&amp;nbsp;MessageCallback&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;private&lt;/strong&gt;&amp;nbsp;MessageBus&amp;nbsp;bus;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:darkgoldenrod;'&gt;@Inject&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;TimeDisplay(MessageBus&amp;nbsp;bus)&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.bus&amp;nbsp;=&amp;nbsp;bus;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;&lt;strong style='color:darkblue'&gt;void&lt;/strong&gt;&amp;nbsp;callback(&lt;strong style='color:darkblue'&gt;final&lt;/strong&gt;&amp;nbsp;Message&amp;nbsp;message)&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;if&lt;/strong&gt;&amp;nbsp;(message.getCommandType()&amp;nbsp;==&amp;nbsp;null)&amp;nbsp;return;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:grey'&gt;/**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;local&amp;nbsp;context&amp;nbsp;to&amp;nbsp;store&amp;nbsp;state&amp;nbsp;that&amp;nbsp;is&amp;nbsp;unique&amp;nbsp;to&amp;nbsp;this&amp;nbsp;client&amp;nbsp;instance.&amp;nbsp;(not&amp;nbsp;session&amp;nbsp;wide).&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;final&lt;/strong&gt;&amp;nbsp;LocalContext&amp;nbsp;context&amp;nbsp;=&amp;nbsp;LocalContext.get(message);&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:grey'&gt;/**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Switch&amp;nbsp;on&amp;nbsp;the&amp;nbsp;TimeServerCommand&amp;nbsp;type&amp;nbsp;provided&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;switch&lt;/strong&gt;&amp;nbsp;(TimeServerCommands.valueOf(message.getCommandType()))&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;case&lt;/strong&gt;&amp;nbsp;Start:&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:grey'&gt;/**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;We&amp;nbsp;want&amp;nbsp;to&amp;nbsp;start&amp;nbsp;streaming.&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AsyncTask&amp;nbsp;task&amp;nbsp;=&amp;nbsp;MessageBuilder.createConversation(message)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.toSubject(&lt;span style='color:darkgreen'&gt;"TimeChannel"&lt;/span&gt;).signalling()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.withProvided(TimeServerParts.TimeString,&amp;nbsp;&lt;strong style='color:darkblue'&gt;new&lt;/strong&gt;&amp;nbsp;&amp;lt;&amp;gt;ResourceProvider&lt;String&gt;()&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;String&amp;nbsp;get()&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;return&lt;/strong&gt;&amp;nbsp;String.valueOf(System.currentTimeMillis());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}).noErrorHandling().replyRepeating(TimeUnit.MILLISECONDS,&amp;nbsp;100);&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:grey'&gt;/**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Store&amp;nbsp;the&amp;nbsp;task&amp;nbsp;as&amp;nbsp;an&amp;nbsp;attribute&amp;nbsp;uniquely&amp;nbsp;identified&amp;nbsp;by&amp;nbsp;it's&amp;nbsp;class&amp;nbsp;type.&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.setAttribute(AsyncTask.class,&amp;nbsp;task);&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:grey'&gt;/**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;listener&amp;nbsp;that&amp;nbsp;will&amp;nbsp;kill&amp;nbsp;the&amp;nbsp;task&amp;nbsp;gracefully&amp;nbsp;if&amp;nbsp;the&amp;nbsp;subject&amp;nbsp;is&amp;nbsp;unsubscribed.&amp;nbsp;&amp;nbsp;This&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;isn't&amp;nbsp;100%&amp;nbsp;necessary,&amp;nbsp;as&amp;nbsp;the&amp;nbsp;task&amp;nbsp;will&amp;nbsp;be&amp;nbsp;auto-killed&amp;nbsp;ungracefully.&amp;nbsp;&amp;nbsp;But&amp;nbsp;this&amp;nbsp;provides&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;and&amp;nbsp;opportunity&amp;nbsp;to&amp;nbsp;clean&amp;nbsp;up&amp;nbsp;after&amp;nbsp;ourselves.&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bus.addUnsubscribeListener(&lt;strong style='color:darkblue'&gt;new&lt;/strong&gt;&amp;nbsp;UnsubscribeListener()&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;public&lt;/strong&gt;&amp;nbsp;&lt;strong style='color:darkblue'&gt;void&lt;/strong&gt;&amp;nbsp;onUnsubscribe(SubscriptionEvent&amp;nbsp;event)&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;if&lt;/strong&gt;&amp;nbsp;(&lt;span style='color:darkgreen'&gt;"TimeChannel"&lt;/span&gt;.equals(event.getSubject()))&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:grey'&gt;/**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Delete&amp;nbsp;this&amp;nbsp;listener&amp;nbsp;after&amp;nbsp;this&amp;nbsp;execution.&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;event.setDisposeListener(true);&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:grey'&gt;/**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Stop&amp;nbsp;the&amp;nbsp;task&amp;nbsp;from&amp;nbsp;running.&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.getAttribute(AsyncTask.class).cancel(true);&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:grey'&gt;/**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Destroy&amp;nbsp;the&amp;nbsp;local&amp;nbsp;context.&amp;nbsp;&amp;nbsp;Sort&amp;nbsp;of&amp;nbsp;unnecessary,&amp;nbsp;but&amp;nbsp;helps&amp;nbsp;reduce&amp;nbsp;memory&amp;nbsp;usage.&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.destroy();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style='color:darkblue'&gt;case&lt;/strong&gt;&amp;nbsp;Stop:&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:grey'&gt;/**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Access&amp;nbsp;our&amp;nbsp;stored&amp;nbsp;AsyncTask&amp;nbsp;from&amp;nbsp;this&amp;nbsp;instance&amp;nbsp;and&amp;nbsp;cancel&amp;nbsp;it.&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.getAttribute(AsyncTask.class).cancel(true);&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:grey'&gt;/**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Destroy&amp;nbsp;the&amp;nbsp;local&amp;nbsp;context.&amp;nbsp;&amp;nbsp;Sort&amp;nbsp;of&amp;nbsp;unnecessary,&amp;nbsp;but&amp;nbsp;helps&amp;nbsp;reduce&amp;nbsp;memory&amp;nbsp;usage.&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.destroy();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;}&lt;/tt&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;That's all there is to it. It's pretty sweet.   This API works on both the client and the server side.  All the thread scheduling is all transparently managed by an executor service on the server, and by a simple Timer based implementation in the client.    I'm hoping people will find this a welcome addition to Errai-land.&lt;br /&gt;&lt;br /&gt;There will be more details coming as I iron out the bugs.  This code is all new, so proceed at your own risk and all that stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-1656970174059310392?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/1656970174059310392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/04/introducing-new-asynchronous-task-apis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/1656970174059310392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/1656970174059310392'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/04/introducing-new-asynchronous-task-apis.html' title='Introducing new asynchronous task APIs'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-3356341345915353603</id><published>2010-04-20T05:56:00.000-07:00</published><updated>2010-04-20T05:57:49.621-07:00</updated><title type='text'>Errai goes Berlin, 27.04 FU-Berlin, Informatik Institut‎</title><content type='html'>I will be speaking about Errai in Berlin next week:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.xing.com/events/patterns-and-best-practices-for-building-large-gwt-applications-496953"&gt;http://www.xing.com/events/patterns-and-best-practices-for-building-large-gwt-applications-496953&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you are around, make sure to stop by.&lt;br /&gt;&lt;br /&gt;Heiko&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-3356341345915353603?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/3356341345915353603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/04/errai-goes-berlin-2704-fu-berlin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3356341345915353603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3356341345915353603'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/04/errai-goes-berlin-2704-fu-berlin.html' title='Errai goes Berlin, 27.04 FU-Berlin, Informatik Institut‎'/><author><name>Heiko Braun</name><uri>http://www.blogger.com/profile/17987290811990461031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-5079682638007292624</id><published>2010-03-29T13:23:00.000-07:00</published><updated>2010-03-29T13:34:50.554-07:00</updated><title type='text'>Visual Bus Monitor</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_opPJJBqX7mE/S7EORr6X_kI/AAAAAAAAACM/YyyDy-J75ec/s1600/Screen+shot+2010-03-29+at+4.23.02+PM.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 281px;" src="http://1.bp.blogspot.com/_opPJJBqX7mE/S7EORr6X_kI/AAAAAAAAACM/YyyDy-J75ec/s320/Screen+shot+2010-03-29+at+4.23.02+PM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5454156320730512962" /&gt;&lt;/a&gt;&lt;br /&gt;For the past few weeks, I've been focusing on seeing how we can improve the development / debugging experience with ErraiBus.  The biggest component of this, is our new Swing-based ErraiBus Monitor application.  &lt;br /&gt;&lt;br /&gt;It's really straight-forward to get up and running.&lt;br /&gt;&lt;br /&gt;You simply add it as a runtime dependency, and bootstrap GWT Development Mode with the &lt;tt&gt;-Derrai.tools.bus_monitor_attach=true&lt;/tt&gt; VM flag, and this magical UI should automatically appear as ErraiBus bootstraps.   &lt;br /&gt;&lt;br /&gt;When the monitor is activated, it attaches probes in into the bus and records all activity accordingly.  You can drill down into individual services and examine individual messages that have been received to debug any mysterious problems that arise. &lt;br /&gt;&lt;br /&gt;There will be more details to come as I firm up the tool, but I thought I'd share my progress with the community since Heiko says I don't blog enough :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-5079682638007292624?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/5079682638007292624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/03/visual-bus-monitor.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/5079682638007292624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/5079682638007292624'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/03/visual-bus-monitor.html' title='Visual Bus Monitor'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_opPJJBqX7mE/S7EORr6X_kI/AAAAAAAAACM/YyyDy-J75ec/s72-c/Screen+shot+2010-03-29+at+4.23.02+PM.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-5005186164525048385</id><published>2010-03-09T10:17:00.001-08:00</published><updated>2010-03-09T10:17:58.219-08:00</updated><title type='text'>What is Errai Workspaces and what can be used for?</title><content type='html'>&lt;div style="width:425px" id="__ss_3378016"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/hbraun/errai-workspaces" title="Errai Workspaces"&gt;Errai Workspaces&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=erraiworkspaces-100309121323-phpapp01&amp;stripped_title=errai-workspaces" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=erraiworkspaces-100309121323-phpapp01&amp;stripped_title=errai-workspaces" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/hbraun"&gt;hbraun&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-5005186164525048385?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/5005186164525048385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/03/what-is-errai-workspaces-and-what-can.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/5005186164525048385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/5005186164525048385'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/03/what-is-errai-workspaces-and-what-can.html' title='What is Errai Workspaces and what can be used for?'/><author><name>Heiko Braun</name><uri>http://www.blogger.com/profile/17987290811990461031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-3254813900719987291</id><published>2010-03-05T01:41:00.000-08:00</published><updated>2010-03-05T01:45:59.307-08:00</updated><title type='text'>Errai-Seam integration: Student projects</title><content type='html'>The seam team is offering a range of student projects related that aim at improving the integration with Errai. I.e:&lt;br /&gt;&lt;br /&gt;"Errai is a new project from JBoss.org, aiming to ease building GWT applications. Errai provides a bus which is used to communicate either from client to client or client to server. To build an Errai based application, you are likely to want to communicate with services on the server. CDI's services (and the integrations it offers with Java EE technologies as well as it's extension ecosystem) should be available for use here. A particular challenge here is to provide a mapping between the type safe injection facilities of CDI in pure Java code, and the compiled Java to Javascript that GWT produces."&lt;br /&gt;&lt;br /&gt;&lt;a href="http://seamframework.org/Community/StudentProjects"&gt;More information can be found here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-3254813900719987291?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/3254813900719987291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/03/errai-seam-integration-student-project.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3254813900719987291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3254813900719987291'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/03/errai-seam-integration-student-project.html' title='Errai-Seam integration: Student projects'/><author><name>Heiko Braun</name><uri>http://www.blogger.com/profile/17987290811990461031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-2615335898134604262</id><published>2010-03-02T10:39:00.000-08:00</published><updated>2010-03-02T10:40:30.942-08:00</updated><title type='text'>Errai 1.0!</title><content type='html'>I am pleased to announce our 1.0 Release of the Errai Framework.  It rounds out the first stepping stone in our journey towards building a truly innovative way to build next-generation web applications.&lt;br /&gt;&lt;br /&gt;I would like to thank the entire team for their hard work on this: Heiko Braun, Lillian Angel, Rodney Russ, and myself for contributing to getting us to this goal.&lt;br /&gt;&lt;br /&gt;We'd especially like to thank our early adopters who helped us work out the kinks, report bugs, and make us aware of what the community needs.&lt;br /&gt;&lt;br /&gt;Some of the important highlights and milestone of this release include:&lt;br /&gt;&lt;br /&gt;- Async IO support in ErraiBus for Apache Tomcat, JBoss AS, and Jetty.  As well as standard synchronous IO support for all servlet containers.&lt;br /&gt;- Easy to use homogeneous programming model that permeates both the server and client. &lt;br /&gt;- Initial public release of our Workspaces RAD console/app framework.&lt;br /&gt;&lt;br /&gt;Version 1.1, which will be released in the coming weeks will add support for Glassfish, WebLogic and WebSphere.  &lt;br /&gt;&lt;br /&gt;We encourage anybody interested in contributing to contact us on our mailing lists.  For more information on Errai, check our main project website here: &lt;a href="http://www.jboss.org/errai"&gt;http://www.jboss.org/errai&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-2615335898134604262?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/2615335898134604262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/03/errai-10.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/2615335898134604262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/2615335898134604262'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/03/errai-10.html' title='Errai 1.0!'/><author><name>Mike Brock</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-3859884507174825856</id><published>2010-02-19T05:34:00.000-08:00</published><updated>2010-02-19T05:55:14.792-08:00</updated><title type='text'>Mission Control: Prepare for landing</title><content type='html'>I am glad to announce that we've begun preparing the 1.0 release of Errai:&lt;br /&gt;&lt;a href="http://anonsvn.jboss.org/repos/errai/branches/errai-1.0.x/"&gt;http://anonsvn.jboss.org/repos/errai/branches/errai-1.0.x/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cbsnews.com/network/news/space/125/125graphics/fd3/traj.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 432px; height: 349px;" src="http://www.cbsnews.com/network/news/space/125/125graphics/fd3/traj.jpg" border="0" alt="" /&gt;&lt;br /&gt;(Image courtesey of &lt;a href="http://www.cbsnews.com/network/news/space/125/125graphics/fd3/traj.jpg"&gt;CBSNEWS&lt;/a&gt;)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We will add another round of QA during the next week and polish our documentation. If you are an early adopter, this would be a good time to tell us what problems you experience. So make sure to &lt;a href="https://jira.jboss.org/jira/browse/ERRAI"&gt;file your bugs&lt;/a&gt; and let us now through &lt;a href="http://jboss.org/errai/MailingLists.html"&gt;the mailing list&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-3859884507174825856?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/3859884507174825856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/02/mission-control-prepare-for-landing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3859884507174825856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3859884507174825856'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/02/mission-control-prepare-for-landing.html' title='Mission Control: Prepare for landing'/><author><name>Heiko Braun</name><uri>http://www.blogger.com/profile/17987290811990461031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-3437705827364748271</id><published>2010-02-17T07:13:00.000-08:00</published><updated>2010-02-17T07:15:10.960-08:00</updated><title type='text'>Errai at the JUG Toronto @ 18.0.2010</title><content type='html'>Mike Brock will be presenting Errai at the Toronto Java User's Group on Thursday, February 18th at the Free Time Cafe (320 College St, Toronto). Details &lt;a href="http://groups.google.com/group/torontojug"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-3437705827364748271?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/3437705827364748271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/02/errai-at-jug-toronto-1802010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3437705827364748271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/3437705827364748271'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/02/errai-at-jug-toronto-1802010.html' title='Errai at the JUG Toronto @ 18.0.2010'/><author><name>Heiko Braun</name><uri>http://www.blogger.com/profile/17987290811990461031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-6470463430776747178</id><published>2010-02-17T07:08:00.000-08:00</published><updated>2010-03-04T06:54:31.825-08:00</updated><title type='text'>Errai at the Java User Group Zurich, Switzerland</title><content type='html'>Heiko will be talking about Errai in Zurich at the 2.3.2010:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Patterns and Best Practices for building large GWT applications&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this presentation weʼll see how to organize a nontrivial GWT application. Weʼll go through the lessons learned in a real world project and take a look the complete development lifecycle and best practices that go beyond what GWT has to offer out-of-the-box. This talk does focus on modularity of GWT applications and how to overcome the burdens of compile-time linking. Weʼll talk about client side patterns and server side implementation options and explore different approaches that allow for quick turn around times without sacriﬁcing maintainability.&lt;br /&gt;&lt;br /&gt;Travel details can be found here:&lt;br /&gt;&lt;a href="http://www.jugs.ch/html/events.html"&gt;http://www.jugs.ch/html/events.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_3335307"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/hbraun/jug-zurich-slides" title="Jug Zurich Slides"&gt;Jug Zurich Slides&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jugzurichslides-100304085020-phpapp01&amp;stripped_title=jug-zurich-slides" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jugzurichslides-100304085020-phpapp01&amp;stripped_title=jug-zurich-slides" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/hbraun"&gt;hbraun&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-6470463430776747178?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/6470463430776747178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2010/02/errai-at-java-user-group-zurich.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/6470463430776747178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/6470463430776747178'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2010/02/errai-at-java-user-group-zurich.html' title='Errai at the Java User Group Zurich, Switzerland'/><author><name>Heiko Braun</name><uri>http://www.blogger.com/profile/17987290811990461031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-5245771244102893252</id><published>2009-12-08T04:37:00.000-08:00</published><updated>2010-04-13T05:42:23.106-07:00</updated><title type='text'>Integrating Errai with Weld (CDI), Part 1</title><content type='html'>While GWT is strong on the client side it doesn't provide any server side programming models. There is GWT RPC, but that's merely an integration layer. We've been discussing various options within the Errai team, looking for some best practice recommendations. In this article we'll look into &lt;a href="http://docs.jboss.org/cdi/spec/1.0/"&gt;CDI&lt;/a&gt;, which is part of the EE6 specification and offers a concise, easy to use programming model. &lt;br /&gt;&lt;br /&gt;In the first part of this series, we'll focus on the&lt;a href="http://docs.jboss.org/cdi/spec/1.0/html_single/#events"&gt; CDI Event API&lt;/a&gt; and see how it integrates with &lt;a href="http://jboss.org/errai/ErraiBus"&gt;Errai Bus&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Some knowledge about Errai Bus and GWT is recommended before reading any further. If you don't know about the Bus and it's purpose, then checkout the &lt;a href="http://jboss.org/errai/ErraiBus"&gt;project page&lt;/a&gt; first.&lt;br /&gt;&lt;/blockquote&gt; &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Creating a CDI event consumer&lt;/h3&gt;&lt;br /&gt;To begin with, we'll create a simple CDI component that listens on paticular event types:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@ApplicationScoped&lt;br /&gt;public class EchoService&lt;br /&gt;{  &lt;br /&gt;  @Inject&lt;br /&gt;  BeanManager beanManager;&lt;br /&gt;&lt;br /&gt;  public void echo(&lt;tt&gt;@Observes EchoRequest&lt;/tt&gt; message)&lt;br /&gt;  {&lt;br /&gt;    String replyText = message.getMessageText() + " Response";&lt;br /&gt;    &lt;br /&gt;    beanManager.fireEvent(&lt;br /&gt;        new EchoResponse(replyText),&lt;br /&gt;        new ErraiBusQualifier()&lt;br /&gt;    );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this example the &lt;code&gt;echo(...)&lt;/code&gt; operation will be invoked  on any occurance of an event type &lt;code&gt;EchoRequest&lt;/code&gt;. It will create an &lt;code&gt;EchoResponse&lt;/code&gt; event type and dispatch it through the &lt;code&gt;BeanManager&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;A simple GWT client&lt;/h3&gt;&lt;br /&gt;Now that we've got our server side component implementation, it's time to look at the GWT client. The client component basically needs to do two things:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt; Fire events that will ultimately invoke our server side component&lt;br /&gt;&lt;li&gt; Listen to events that are send in response &lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Create an event producer&lt;/b&gt;&lt;br /&gt;We keep it simple and fire event when a button is clicked:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Button b = new Button("Send", new ClickHandler()&lt;br /&gt;    {&lt;br /&gt;      public void onClick(ClickEvent clickEvent)&lt;br /&gt;      {&lt;br /&gt;        CommandMessage.create(WeldCommands.WELD_EVENT)&lt;br /&gt;            &lt;tt&gt;.toSubject("weldDispatcher")&lt;/tt&gt;&lt;br /&gt;            .set(WeldProtocol.TYPE, EchoRequest.class.getName())&lt;br /&gt;            .set(WeldProtocol.OBJECT_REF, &lt;br /&gt;                    new EchoRequest("Message from client"))&lt;br /&gt;            .sendNowWith(bus);&lt;br /&gt;      }&lt;br /&gt;    });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Register a listener for response messages:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; &lt;tt&gt;MessageBus.subscribe("echoClient"&lt;/tt&gt;,  // local endpoint&lt;br /&gt;        new MessageCallback()&lt;br /&gt;        {&lt;br /&gt;          public void callback(CommandMessage message)&lt;br /&gt;          {&lt;br /&gt;                [...]&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;    );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this case, we've create a listener that will receive messages that are send to the subject "echoClient".&lt;br /&gt;&lt;br /&gt;Great, now we have a GWT event producer that sends messages through Errai Bus and we've created a CDI event consumer that listens on the internal CDI event subsystem. But how do we introduce them to each other? &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bridge between Errai Bus and the CDI Event Subsystem&lt;/b&gt;&lt;br /&gt;If you carefully followed the example, you might have realized the event producer sends messages to a subject called &lt;code&gt;"weldDispatcher"&lt;/code&gt;. Actually this is an Errai server side service consuming messages send from a GWT client. That means any message put on the Bus that addresses this particular subject will be directed to a service that is registered to this subject:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;tt&gt;@Service("weldDispatcher")&lt;/tt&gt;&lt;br /&gt;@ApplicationScoped&lt;br /&gt;public class WeldDispatcher implements MessageCallback&lt;br /&gt;{&lt;br /&gt;  [...]&lt;br /&gt;  &lt;br /&gt;  // Invoked by Errai&lt;br /&gt;  public void callback(CommandMessage message)&lt;br /&gt;  {   &lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;      switch (WeldCommands.valueOf(message.getCommandType()))&lt;br /&gt;      {&lt;br /&gt;        case WELD_EVENT:&lt;br /&gt;          String type = &lt;br /&gt;               message.get(String.class, WeldProtocol.TYPE);&lt;br /&gt;          Class clazz = &lt;br /&gt;               getClass().getClassLoader().loadClass(type);&lt;br /&gt;          Object o = message.get(clazz, WeldProtocol.OBJECT_REF);&lt;br /&gt;          beanManager.fireEvent(o);&lt;br /&gt;          break;&lt;br /&gt;        default:&lt;br /&gt;          throw new IllegalArgumentException(&lt;br /&gt;             "Unknown command type "+message.getCommandType()&lt;br /&gt;          );&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    catch (Exception e)&lt;br /&gt;    {&lt;br /&gt;      throw new RuntimeException(&lt;br /&gt;            "Failed to dispatch Weld Event", e&lt;br /&gt;      );&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // Invoked by Weld Event producer&lt;br /&gt;  public void sendMessage(&lt;tt&gt;@Observes @ErraiBus Object message&lt;/tt&gt;)&lt;br /&gt;  {&lt;br /&gt;      String subject = null;&lt;br /&gt;      ErraiBus busAnnotation = &lt;br /&gt;          message.getClass().getAnnotation(ErraiBus.class);&lt;br /&gt;      if(busAnnotation!=null)&lt;br /&gt;        subject = busAnnotation.subject();&lt;br /&gt;&lt;br /&gt;      assert subject!=null : "Missing subject declaration";&lt;br /&gt;&lt;br /&gt;      // put on the bus&lt;br /&gt;      CommandMessage.create(WeldCommands.WELD_EVENT)&lt;br /&gt;          .toSubject(subject)&lt;br /&gt;          .set(WeldProtocol.TYPE, message.getClass().getName())&lt;br /&gt;          .set(WeldProtocol.OBJECT_REF, message)&lt;br /&gt;          .sendNowWith(erraiBus);    &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [...]&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;What's happening here? &lt;br /&gt;&lt;br /&gt;The WeldDispatcher implementation acts a bridge between the Errai Bus and the CDI event subsystem. It does listen on messages in both directions and fowards the event message to the corresponding subsystem: either Errai Bus or CDI.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Receiving messages send from the client&lt;/b&gt;&lt;br /&gt;When a messages is send to the &lt;code&gt;"weldDispatcher"&lt;/code&gt; subject the &lt;code&gt;callback(CommandMessage message)&lt;/code&gt; operation will be invoked. It umarshalls the the event type and forwards it to CDI using the &lt;code&gt;BeanManager&lt;/code&gt; API:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;String type = message.get(String.class, WeldProtocol.TYPE);&lt;br /&gt;Class clazz = getClass().getClassLoader().loadClass(type);&lt;br /&gt;Object o = message.get(clazz, WeldProtocol.OBJECT_REF);&lt;br /&gt;beanManager.fireEvent(o);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Forwarding events produced on the server side&lt;/b&gt;&lt;br /&gt;The CDI component that we've shown in the beginning of this article, fires &lt;code&gt;EchoResponse&lt;/code&gt; events in response to it's invocation.  These events are caught by a CDI ObserverMethod (&lt;code&gt;sendMessage(@Observes @ErraiBus Object message)&lt;/code&gt;) that extracts the recipient subject, creates an Errai message and put's it on the bus:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CommandMessage.create(WeldCommands.WELD_EVENT)&lt;br /&gt;          .toSubject(subject)&lt;br /&gt;          .set(WeldProtocol.TYPE, message.getClass().getName())&lt;br /&gt;          .set(WeldProtocol.OBJECT_REF, message)&lt;br /&gt;          .sendNowWith(erraiBus);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Wrap up&lt;/h3&gt;&lt;br /&gt;That's it for today. To sum up, here's what we've shown in this example:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;We've created a simple example that uses GWT on the client side. &lt;br /&gt;&lt;li&gt;It does leverage Errai Bus for integrating with the server side&lt;br /&gt;&lt;li&gt;We've used a CDI component on the server side to back our application&lt;br /&gt;&lt;li&gt;All communication is done asynchronously, using a bridge between Errai Bus and the CDI event subsystem&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Stay tuned. More articles on Errai and CDI integration are following.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt;&lt;br /&gt;More recent examples can be found here:&lt;br /&gt;&lt;a href="http://anonsvn.jboss.org/repos/errai/projects/weld-integration/trunk/"&gt;http://anonsvn.jboss.org/repos/errai/projects/weld-integration/trunk/&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-5245771244102893252?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/5245771244102893252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2009/12/integrating-errai-with-weld-cdi-part-1.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/5245771244102893252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/5245771244102893252'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2009/12/integrating-errai-with-weld-cdi-part-1.html' title='Integrating Errai with Weld (CDI), Part 1'/><author><name>Heiko Braun</name><uri>http://www.blogger.com/profile/17987290811990461031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873740620497062724.post-1166768007308903115</id><published>2009-10-14T00:13:00.000-07:00</published><updated>2009-12-08T06:25:07.738-08:00</updated><title type='text'>Community site launched</title><content type='html'>We've just launched the Errai community site: &lt;a href="http://www.jboss.org/errai"&gt;http://www.jboss.org/errai&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We are launching this community site early in the process to spark interest and engage the open source community.&lt;br /&gt;&lt;br /&gt;For one, because we believe in what were doing, and we feel that the project is now at a point where it's time to branch out and join the greater OSS community and let our hard work finally see the light of day.&lt;br /&gt;&lt;br /&gt;So, on behalf of the Errai Team, welcome!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873740620497062724-1166768007308903115?l=errai-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://errai-blog.blogspot.com/feeds/1166768007308903115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://errai-blog.blogspot.com/2009/10/community-side-launched.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/1166768007308903115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873740620497062724/posts/default/1166768007308903115'/><link rel='alternate' type='text/html' href='http://errai-blog.blogspot.com/2009/10/community-side-launched.html' title='Community site launched'/><author><name>Heiko Braun</name><uri>http://www.blogger.com/profile/17987290811990461031</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
