<?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-9182279422841258293</id><updated>2011-09-12T07:27:58.732-07:00</updated><category term='ActionScript'/><category term='hibernate session transactions thread local'/><category term='Flex'/><category term='ArraysAsList'/><category term='hibernate entities rootclass hibernate.cfg.xml'/><category term='Flash'/><category term='Swiz'/><category term='dining philosopher java development blog'/><category term='alice kids computing'/><category term='ArrayList'/><category term='javaOne best sellers'/><category term='ThreadLocal HibernateSession variables'/><title type='text'>The Dining Philosopher</title><subtitle type='html'>Ramblings from a Software Engineer...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9182279422841258293.post-3400329960634306158</id><published>2011-01-19T07:17:00.000-08:00</published><updated>2011-01-19T07:45:00.116-08:00</updated><title type='text'></title><content type='html'>&lt;span style="font-weight:bold;"&gt;Review of: DSLs in Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Author: Debasish Ghosh &lt;br /&gt;Publisher: Manning Publications &lt;br /&gt;ISBN-10: 1935182455&lt;br /&gt;ISBN-13: 978-1935182450 &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HkRPBhcKMF0/TTcBSB7REvI/AAAAAAAAACY/W_G-X9AqG6k/s1600/ghosh_cover150.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 186px;" src="http://3.bp.blogspot.com/_HkRPBhcKMF0/TTcBSB7REvI/AAAAAAAAACY/W_G-X9AqG6k/s320/ghosh_cover150.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5563917273905828594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.manning.com/ghosh/"&gt;$44.99 (Manning publishing)&lt;/a&gt;  375 pgs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Overview&lt;/span&gt;&lt;br /&gt;Once you implement a domain model in your favorite programming language, it no longer speaks the dialect that the domain expert can understand. If your implementation doesn't conform exactly to the specifications you agreed on with the domain user there's no way it can be verified by the person who understands the domain rules.&lt;br /&gt;&lt;br /&gt;DSLs in Action addresses this by suggesting a DSL-driven application development model. Design your domain APIs around the syntax and semantics that the domain user understands. Then, even during the development of the code base, the user can do incremental verifications of the domain rule implementations. If your code speaks the language of the domain, it becomes clearer to the person who develops it, to the one who maintains it, and to a nonprogrammer domain expert who understands the business.&lt;br /&gt;&lt;br /&gt;You will learn how to design and implement DSLs using the modern languages Ruby, Groovy, Scala, Clojure and Java. In addition, discussions of the strengths and weaknesses of these languages when designing a DSL are included.&lt;br /&gt;&lt;br /&gt;Admittedly, not everyone will be familiar with all the programming languages used to implement the DSL structures in this book so the author has included short reference cards (or cheat sheets) for the languages in the appendixes. More thorough references are provided to complete texts to supplement them. The source code for all examples in this book is available from Manning's website, http://www.manning.com/DSLsinAction.&lt;br /&gt;&lt;br /&gt;The author, Debasish Ghosh (@debasishg on Twitter), is the chief technology evangelist at Anshinsoft (http://www.anshinsoft.com). He's a senior member of the ACM and his blog is at Ruminations of a Programmer (http://debasishg.blogspot.com).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Summary of Contents&lt;/span&gt;&lt;br /&gt;Part 1: Using DSLs&lt;br /&gt;Chapter 1:  Learning to Speak the Language of the Domain&lt;br /&gt;What a DSL actually is and the benefits it can provide start this chapter. The structure of a DSL is covered. The chapter concludes by tying in appendix A and discussing what makes a well-designed abstraction. &lt;br /&gt;&lt;br /&gt;Chapter 2:  The DSL in the Wild&lt;br /&gt;Here you create your first DSL using Java. Groovy is introduced to demonstrate how to make the DSL more Expressive. DSL implementation patterns are introduced and how to choose a DSL type is presented.&lt;br /&gt;&lt;br /&gt;Chapter 3: DSL-driven Application Development&lt;br /&gt;Integrating internal and external DSLs in an application is the main topic of this chapter. Once this topic is completed, error and exception management is discussed and performance optimization is covered.&lt;br /&gt;&lt;br /&gt;Part 2: Implementing DSLs&lt;br /&gt;Chapter 4: Internal DSL Implementation Patterns&lt;br /&gt;The author demonstrates how to build a programmer's toolbox of architectural patterns that can be used to implement DSLs. The use of metaprogramming to aid in the construction is extensively covered.&lt;br /&gt;&lt;br /&gt;Chapter 5: Internal DSL Design in Ruby, Groovy and Clojure&lt;br /&gt;The running application typical of Manning books, in this case a stock trading processor, is introduced here. The initial implementation is in Ruby and then it is improved with Groovy. Clojure is introduced to demonstrate how one must think a little differently with this language. A discussion of the pitfalls of each of these languages concluded the chapter,&lt;br /&gt;&lt;br /&gt;Chapter 6: Internal DSL Design in Scala&lt;br /&gt;This chapter is dedicated to Scala to which the author gives a good introduction. Developing an internal DSL with Scala is then covered. A discussion of monadic structures rounds out the chapter.&lt;br /&gt;&lt;br /&gt;Chapter 7: External DSL Implementation Artifacts&lt;br /&gt;This chapter is dedicated to the tools used to generate an external DSL. Parsers are discussed along with ANTLR, the Eclipse Modeling Framework and Xtext. &lt;br /&gt;&lt;br /&gt;Chapter 8: Designing External DSLs using Scala Parser Combinators&lt;br /&gt;Beginning with a discussion of exactly what parser combinators are this chapter continues with the Scala parser combinator library. A discussion of packrat parsers follows and then a dive into Scala DSL design with the combinators finishes up. &lt;br /&gt;&lt;br /&gt;Part 3: Future trends in DSL development&lt;br /&gt;Chapter 9: DSL Design: Looking Forward&lt;br /&gt;The main thrust of this chapter is to touch base on developing trends in the DSL world. DSL workbenches are canvassed. The important topic of DSL versioning and practices that you can adopt to ensure a smooth evolution of your DSL's syntax rounds out the book.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Opinion&lt;/span&gt;&lt;br /&gt;Not for beginners. At first this book comes at you so fast that it can seem overwhelming but hold on it does get better. Although this reviewer would not call this a 'Magnum Opus' it is as close as you get without being one. It becomes immediately clear that the author knows what he is doing and does this sort of thing everyday.&lt;br /&gt;&lt;br /&gt;Ruby, Groovy, Clojure and Scala along with Java are used in the examples and this reviewer and the author are willing to bet that the reader is fluent in at least one of those languages.  The good thing here, as the author says, is all of the code is understandable regardless of whether you have experience with one of them or not. It should also convince readers to do what they've said they were going to do for the last three years and learn a new programming language. One excellent side effect of so many languages in such a small space is that you will learn how each of them makes you think about and approach a problem differently.&lt;br /&gt;&lt;br /&gt;The book contains excellent discussions of domain cognizance with topics such as accidental complexity and minimalism in coding followed with a great review/introduction of the differences, strengths and weaknesses of Internal DSLs versus External DSLs. There is even a chapter dedicated to designing external DSLs via Scala parser combinators.&lt;br /&gt;&lt;br /&gt;It is an exhaustively wide and deep coverage of the subject. By the time you've finished reading the book, you'll have a thorough understanding of the concepts that you need to master in order to design domain abstractions that your users can understand and appreciate.  This will bring much added business value to any project.&lt;br /&gt;&lt;br /&gt;Five languages with no trivial examples all in one book, highly recommended.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-3400329960634306158?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/3400329960634306158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=3400329960634306158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/3400329960634306158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/3400329960634306158'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2011/01/review-of-dsls-in-action-author.html' title=''/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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://3.bp.blogspot.com/_HkRPBhcKMF0/TTcBSB7REvI/AAAAAAAAACY/W_G-X9AqG6k/s72-c/ghosh_cover150.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9182279422841258293.post-6282240299823627455</id><published>2010-12-15T06:22:00.000-08:00</published><updated>2010-12-15T06:41:57.854-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Swiz'/><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Swiz 1.0.0, finally!</title><content type='html'>For you Flex and ActionScript developers out there, Swiz 1.0.0 has finally hit the street! This is by far the easiest Flex related framework to use with the least amount of code necessary to make it work. I've been using it since version 0.6.4 and have been impressed with the many additions that have been added during the long road here. I can remember the (sometimes heated) discussions about it not being a legitimate framework because it was a version less than 1.0. Well, &lt;span style="font-weight:bold;"&gt;it's legitimate now!&lt;/span&gt;&lt;br /&gt;Everything you need, and more, has been provided for you. The &lt;a href="http://swizframework.jira.com/wiki/display/SWIZ/Release+Notes"&gt;release notes&lt;/a&gt;, &lt;a href="https://github.com/swiz/swiz-framework/tree/v1.0.0"&gt;source code&lt;/a&gt; in git, &lt;a href="http://swizframework.org/v1.0.0/docs/"&gt;ASDocs&lt;/a&gt; and a &lt;a href="http://swizframework.org/v1.0.0/"&gt;zip of the SWC, docs and source&lt;/a&gt; is available.&lt;br /&gt;&lt;br /&gt;Should you find yourself needing help, there is also a very active &lt;a href="http://groups.google.com/group/swiz-framework?pli=1"&gt;mailing list&lt;/a&gt; where you can get answers to any problems very quickly. For a while it seems I lived on that board.&lt;br /&gt;&lt;br /&gt;Congratulations to the Swiz team. Here we go!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-6282240299823627455?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/6282240299823627455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=6282240299823627455' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/6282240299823627455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/6282240299823627455'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2010/12/swiz-100-finally.html' title='Swiz 1.0.0, finally!'/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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-9182279422841258293.post-1355111382913803814</id><published>2010-10-28T11:58:00.000-07:00</published><updated>2010-10-28T12:08:05.448-07:00</updated><title type='text'></title><content type='html'>&lt;span style="font-weight:bold;"&gt;Review of: Flex On Java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Authors: Bernerd Allmon and Jeremy Anderson &lt;br /&gt;Publisher: Manning Publications &lt;br /&gt;ISBN-10: 1-933988-79-7 &lt;br /&gt;ISBN-13: 978-1-933988-79-5 &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HkRPBhcKMF0/TMnIcR56dmI/AAAAAAAAAB8/R34n85ZUpEk/s1600/allmon_cover150.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 187px;" src="http://3.bp.blogspot.com/_HkRPBhcKMF0/TMnIcR56dmI/AAAAAAAAAB8/R34n85ZUpEk/s320/allmon_cover150.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5533174005369566818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.manning.com/allmon/"&gt;$39.99 (Manning publishing)&lt;/a&gt; 266 pgs.&lt;br /&gt;&lt;br /&gt;Reviewer: John S. Griffin &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Overview&lt;/span&gt;&lt;br /&gt;Adobe Flex has become a prolific toolkit for building RIAs. A primary advantage of Flex for RIA development is that it integrates easily with any back-end technology. By providing native XML, SOAP, and Data Remoting capabilities, Flex enables developers to build rich new UIs on top of existing services. For Java developers this combination is especially compelling because many Java systems have already embraced service-oriented architectures with SOAP Web Services, Spring, or one of numerous other technologies.&lt;br /&gt;&lt;br /&gt;The book starts off by introducing the two technologies and building a sample Java application you can play with. After that you continue by building a Flex client for the Java application that ties into some Java web services. Part 1, introductory information, covers the first four chapters.&lt;br /&gt;&lt;br /&gt;Part 2, chapters 5 and 6, introduces topics that allow Flex to connect to Java through object remoting, logging, and messaging. In chapters 5 and 6 a deeper dive is taken into backend integration with Java on the server side. Using the Spring Framework for Flex integration is demonstrated.&lt;br /&gt;&lt;br /&gt;Part 3, chapters 7-11, covers a hodgepodge of topics, such as security and personalization, building graphs, desktop development with AIR, unit testing, and building a Flex and Grails application.&lt;br /&gt;&lt;br /&gt;Maven is the build tool of choice for this book and its configuration is delved into as needed for the examples.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Summary of Contents&lt;/span&gt;&lt;br /&gt;Part 1: Getting started&lt;br /&gt;Chapter 1: Some Flex with your Java? &lt;br /&gt;The book begins with a brief history of Java and Flex and continues with a rapid tour of Flex including how to start building a Flex application.&lt;br /&gt;&lt;br /&gt;Chapter 2: Beginning with Java&lt;br /&gt;This is a book about Java integration, but a simple Java web application is built. Frameworks were chosen that should ease the Java learning curve necessary to get a sample application up and running fast.&lt;br /&gt;&lt;br /&gt;Chapter 3: Getting rich with Flex&lt;br /&gt;A disconnected naked UI Flex client can take advantage of mock data and allow developers to easily prototype a UI without the complexity of external dependencies. This approach is demonstrated in chapter 3 where the beginnings of a rich UI for the FlexBugs sample application are created. This is the running application common to all Manning Publishing books.&lt;br /&gt;&lt;br /&gt;Chapter 4: Connecting to web services&lt;br /&gt;This chapter demonstrates connecting to the Java server side and how to leverage the Flex API for connecting to web services. Rather than use the typical approach of current literature, including the Flex online documentation, clean interfaces and views are created and a Flex client that will scale on demand is created.&lt;br /&gt;&lt;br /&gt;Part 2: Strengthening the backend&lt;br /&gt;Chapter 5: BlazeDS remoting and logging&lt;br /&gt;This chapter demonstrates further how to connect a Flex client more directly to the server side using the open source BlazeDS framework. BlazeDS provides a mechanism for allowing Flex to call methods on Java objects through binary serialization with the Action Message Format or AMF. This chapter also covers BlazeDS logging in detail.&lt;br /&gt;&lt;br /&gt;Chapter 6: Flex messaging&lt;br /&gt;Here is a demonstration of how to develop Flex applications that take advantage of simple polling. We have to wait until chapter 11 for the discussion on how to connect using Java Message Service (JMS).&lt;br /&gt;&lt;br /&gt;Part 3: Going above and beyond&lt;br /&gt;Chapter 7: Securing and personalizing your application&lt;br /&gt;This chapter demonstrates building authentication, authorization, and personalization with Spring Security (Acegi) integration.&lt;br /&gt;&lt;br /&gt;Chapter 8: Charting with Degrafa&lt;br /&gt;Degrafa is a declarative graphics framework that provides a suite of graphics classes. Degrafa is open source and can be used to build robust charts, tools, and other graph- ical elements with less effort and complexity than other frameworks. How to accomplish that is this chapter's topic.&lt;br /&gt;&lt;br /&gt;Chapter 9: Desktop 2.0 with AIR&lt;br /&gt;Comprehensive coverage of all aspects of converting a Flex application to an Air application including how to set up deployment is the topic of this chapter.&lt;br /&gt;&lt;br /&gt;Chapter 10: Testing your Flex application&lt;br /&gt;Every good programming book includes a discussion of unit testing. Some discuss Test Driven Design (TDD). This chapter discusses both of these topics.&lt;br /&gt;&lt;br /&gt;Chapter 11: Flex on Grails&lt;br /&gt;This chapter assumes that you are at least somewhat familiar with both Groovy and Grails, but if you have never seen or done any development using either, you should still be able to follow along. Idiomatic Groovy code is shown but not much detail about what the code does is given as that is apparently beyond the scope of this chapter. A simplified contact management application called Flex Contacts is built. Included are the details of exposing a Grails service to Flex and integrating Flex with JMS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Opinion&lt;/span&gt;&lt;br /&gt;To begin with, readers of this book should be familiar with software development in general, specifically Flex and Java. Although the book was written to teach integration techniques for Flex and Java, not language fundamentals, it was done in a manner making it easy for even Flex or Java beginners to get rolling quickly with both.&lt;br /&gt;&lt;br /&gt;This book is absolutely loaded with example code and every (that's right, every) configuration file change is delved into step-by-step.&lt;br /&gt;&lt;br /&gt;Chapter 5 is the bomb! To paraphrase a fellow reviewer, this chapter alone is easily worth the price of the book! The simplifications presented here utilizing Spring will easily save both Java and Flex developers a ton of time in development. The how to of Java/Flex messaging implementation leaves chapter 6 not far behind.&lt;br /&gt;&lt;br /&gt;More and more of the upper class of technical books are dedicating at least some time to discussion of application testing. Flex on Java takes this a little further with coverage of Test Driven Development (TDD). It contains a very welcome and much needed canvas of continuous integration with Hudson.&lt;br /&gt;&lt;br /&gt;When this reviewer first examined this book, Chapter 11 seemed to be kind of a redheaded stepchild chapter until the realization that co-author Jeremy Anderson is quite involved in the Groovy scene. This chapter's strengths are two-fold. It demos Rapid Prototype Development (RPD) by taking leave of the running application and presenting a new pared down application. Secondly, it shows the implementation of JMS and ActiveMQ but since this is done in a Groovy environment it is of questionable value to Java/Flex developers. Groovy developers should appreciate it, however.&lt;br /&gt;&lt;br /&gt;If you are a Java and/or a Flex developer that must interface between one and the other of these technologies then this book's plentiful examples and timesaving techniques are for you. You can't go wrong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-1355111382913803814?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/1355111382913803814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=1355111382913803814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/1355111382913803814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/1355111382913803814'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2010/10/review-of-flex-on-java-authors-bernerd.html' title=''/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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://3.bp.blogspot.com/_HkRPBhcKMF0/TMnIcR56dmI/AAAAAAAAAB8/R34n85ZUpEk/s72-c/allmon_cover150.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9182279422841258293.post-6131776579402489962</id><published>2010-10-04T13:20:00.000-07:00</published><updated>2010-11-12T06:20:03.094-08:00</updated><title type='text'></title><content type='html'>Here's another review. This one is of Manning Publication's Flex 4 in Action.&lt;br /&gt;&lt;br /&gt;Review of: &lt;span style="font-weight: bold;"&gt;Flex 4 in Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Author:  Tariq Ahmed et al&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HkRPBhcKMF0/TN1MuPAGeII/AAAAAAAAACE/CYK2kedlEFw/s1600/ahmed2_cover150.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 186px;" src="http://2.bp.blogspot.com/_HkRPBhcKMF0/TN1MuPAGeII/AAAAAAAAACE/CYK2kedlEFw/s320/ahmed2_cover150.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5538667473920227458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Publisher: Manning Publications&lt;br /&gt;ISBN-10: 1935182420&lt;br /&gt;ISBN-13: 978-1935182429&lt;br /&gt;Available: 28 Oct 2010&lt;br /&gt;&lt;br /&gt;$33.74 (amazon.com) 600 pgs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Overview&lt;/span&gt;&lt;br /&gt;Flex 4 in Action is a rewrite and update of the original Flex 3 in Action published in February of 2009. The book retains its overall topic flow so it will feel like an old warm blanket for those that learned Flex 3 from the previous edition or used it as a reference. New readers will feel just as welcome as it is an easy-to-read, thorough tutorial of what you need to know to come up to speed with the new Flex 4. There are also a couple of additions to the book that take it a step above the others.&lt;br /&gt;The authors are acknowledged experts in their respective fields and have converted organizations to utilizing Flex for enterprise class applications.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary of Contents&lt;/span&gt;&lt;br /&gt;Part One: Application Basics&lt;br /&gt;Chapter One: Making the case&lt;br /&gt;The book starts by talking about challenges that a web developer faces and how to solve them using Flex by Adobe. It also dives into the mechanics of a Flex application and discusses the Flex ecosystem as a whole.&lt;br /&gt;&lt;br /&gt;Chapter Two: Getting Started&lt;br /&gt;The authors show you how to take advantage of open source tools. They spend a good part of this chapter discussing Flash Builder and how to begin producing Flex applications.&lt;br /&gt;&lt;br /&gt;Chapter Three: Working with ActionScript&lt;br /&gt;Chapter 2 introduced ActionScript and this chapter is dedicated to it. The authors admit that entire books could be and are written about it. This chapter focuses on ActionScript?s core concepts of variable types, operators, loops, conditions, arrays and functions.&lt;br /&gt;&lt;br /&gt;Chapter Four: Layout and Containers&lt;br /&gt;In this chapter Flex?s visual building blocks and types of containers are discussed. These components can be anything from buttons, tables and graphics to other containers.&lt;br /&gt;&lt;br /&gt;Chapter Five: Displaying forms and capturing user input&lt;br /&gt;Creating forms in Flex is the topic here using input components (controls) and capturing user input.&lt;br /&gt;&lt;br /&gt;Chapter Six: Validating user input&lt;br /&gt;In this chapter how Flex handles validation and the different types of validators?such as those which verify the proper formatting of phone numbers and the structure of email addresses is covered. They are put to use, employing several different approaches.&lt;br /&gt;&lt;br /&gt;Chapter Seven: Formatting Data&lt;br /&gt;Formatting raw data with Flex?s built-in formatters is the subject of this chapter. This includes types of formatters, real-time formatting, scripted formatting and finally dealing with formatting errors.&lt;br /&gt;&lt;br /&gt;Chapter Eight: MX DataGrids, lists, and trees&lt;br /&gt;The authors cover everything you ever wanted to know about using list-based components from the MX library. Topics include list-based components displaying flat data, displaying hierarchical data, handling user interactions and retrieving selected items from List-based components.&lt;br /&gt;&lt;br /&gt;Chapter Nine: Using the Spark List controls&lt;br /&gt;In this chapter, you learn about the list-based features and functionality that ship with the Spark library, which is new to Flex 4. The discussion starts with the Spark list-based component architecture, and continues with how to leverage the new list-based Spark functionality in your Flex 4 applications.&lt;br /&gt;&lt;br /&gt;Chapter Ten: List customization&lt;br /&gt;This builds on chapter 9 by demonstrating how to customize the list-based components. Topics covered include the labelField property, label functions, overriding itemToLabel, item renderers and editors, advanced item renderers and filter functions.&lt;br /&gt;&lt;br /&gt;Part Two: Application flow and structure&lt;br /&gt;Chapter Eleven: Events&lt;br /&gt;The event system is introduced along with its all-important role in a Flex application. Integrating native and custom events in an application while gaining an understanding of event nuances is also covered.&lt;br /&gt;&lt;br /&gt;Chapter Twelve: Application Navigation&lt;br /&gt;This chapter looks at the following components that you?ll use to add standard navigational features to your application:  Menu, MenuBar, ViewStack, ButtonBar, TabNavigator and Accordion.&lt;br /&gt;&lt;br /&gt;Chapter Thirteen: Introduction to pop-ups&lt;br /&gt;The different ways of creating and managing pop-ups as well as simple ways to style them are here along with how to utilize the pop-up manager to help you create, delete, position, close, and destroy windows.&lt;br /&gt;&lt;br /&gt;Chapter Fourteen: Implementing View States&lt;br /&gt;This chapter starts by introducing the concept of view states in general. It then continues by covering everything you need to know about them.&lt;br /&gt;&lt;br /&gt;Chapter Fifteen: Working with data services&lt;br /&gt;This comprehensive chapter is all about data-centric development with Flash Builder. Starting with connecting to web services it continues with using the HTTPService and WebService components and understanding the Action Message Format (AMF). Communication with JavaEE using BlazeDS, ColdFusion Communication and communicating with PHP via Zend_AMF rounds out the discussion.&lt;br /&gt;&lt;br /&gt;Chapter Sixteen: Objects and classes&lt;br /&gt;Exploration of a fundamental feature of Flex, objects and classes, is the core of this chapter along with some OO theory. Covered topics include OO concepts, implementing OO concepts, using ActionScript classes, how to create, invoke and destroy them, and extend those that already exist.&lt;br /&gt;&lt;br /&gt;Chapter Seventeen: Custom components&lt;br /&gt;This chapter covers the basics of creating and utilizing custom components and tackles ways of getting your components to communicate with each other. Starting off by taking a look at how components are handled in Flex 4 and the Spark architecture, the discussion continues on with types of components and the difference between simple and composite objects.&lt;br /&gt;&lt;br /&gt;Chapter Eighteen: Creating Reusable Components&lt;br /&gt;Code reuse is the topic of this chapter. The example used in this chapter takes a look at a scenario where a component that reveals content must be created, but in many different ways, yet without having to write a separate component for each implementation.&lt;br /&gt;&lt;br /&gt;Chapter Nineteen: Architectural Design Patterns&lt;br /&gt;A deep look into Flex-driven design patterns and the thought process behind the core Flex architecture is taken. Then, rolling your own Flex application architecture is discussed without getting over-complicated. This chapter covers the Model-View-Controller pattern, how to roll your own architecture and mentions the frameworks Mate, Cairngorm, Parsley, and Swiz along with a deeper discourse into the Robotlegs framework.&lt;br /&gt;&lt;br /&gt;Part Three: The Finishing Touches&lt;br /&gt;Chapter Twenty: Customizing the Experience&lt;br /&gt;This chapter focuses on the user experience and how you can leverage user experience design techniques in Flex to enhance your applications. The VIBE Model, themes and skins, CSS in Flex 4 and best practices are discussed.&lt;br /&gt;&lt;br /&gt;Chapter Twenty-One: Working with Effects&lt;br /&gt;This chapter first explains what effects are and how to use them and then the types of out-of-the-box effects are discussed.&lt;br /&gt;&lt;br /&gt;Chapter Twenty-Two: Drag-and-Drop&lt;br /&gt;D&amp;amp;D is considered from a usability point of view rather than just because you can use it or because of the coolness factor. The authors discuss how a mindset change is needed to accomplish this.&lt;br /&gt;&lt;br /&gt;Chapter Twenty-Three: Exploring Flex-Charting Chapter&lt;br /&gt;In this chapter, exploration of what makes up a chart, the charts that come with Flex, and how to customize them is covered.&lt;br /&gt;&lt;br /&gt;Twenty-Four: Debugging and Testing&lt;br /&gt;Debugging applications using the Flex debugger, using the Flash Builder Profiler and Unit and Functional testing of your applications is discussed.&lt;br /&gt;&lt;br /&gt;Chapter Twenty-Five: Wrapping up a project&lt;br /&gt;Tying up loose ends and getting the project out the door by customizing the HTML wrapper and deploying it to a production server is this chapter?s topic.&lt;br /&gt;&lt;br /&gt;Chapter Twenty-Six: Working with XML&lt;br /&gt;In this final chapter, Flex's robust XML support, from its ability to use XML as a source of data, to how you can use Flex to directly manipulate XML code is presented.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Opinion&lt;/span&gt;&lt;br /&gt;This new edition contains a thorough coverage of the new Spark components of Flex 4. It contains all you need to know to write applications with the new API.&lt;br /&gt;&lt;br /&gt;The authors know from experience what you, as a developer, need to succeed and they make an admirable attempt at conveying it. This is nowhere more prevalent than their discussion in chapter 22 where they attempt to make you understand that just because something is 'cool' is not the reason to implement it in an application. When a feature will get the job done is the time to put it to use. You just need to change the way you look at things.&lt;br /&gt;&lt;br /&gt;The book features two new chapters one of which was sorely missing from the previous edition. Chapter 19, Architectural Design Patterns, is a long overdue and very welcome addition. This chapter is a critically needed discussion of software architecture and assistive frameworks for Flex. Most books get atrociously overcomplicated, stay solely with theory and fail to bring those concepts to reality. They need to actually go through the process of designing architectures for actual enterprise applications. This chapter gives you the basics of how to go about it. This reviewer believes that a little two much time is spent with RobotLegs in this chapter at the expense of the others mentioned (one of the authors, Joel Hooks, plays a large part in the development and support of RobotLegs so that explains that). There aren?t even simple examples of the other second-generation frameworks Mate (pronounced ma-tay) and, this reviewer?s personal favorite, Swiz.&lt;br /&gt;&lt;br /&gt;Chapter 9, Using the Spark List Controls, is the other new addition. This includes a thorough discussion of the Spark List Controls' class hierarchy and customization.&lt;br /&gt;&lt;br /&gt;In chapter 24, Debugging, the authors could have spent a little more time on the Network Monitor and Profiler that comes with Flash Builder. There is a little more discussion of the Profiler but both of these topics are cursory at best. Also, this chapter provides sample code for unit testing Flex with the FlexUnit library. This is an absolutely essential addition.&lt;br /&gt;&lt;br /&gt;Taken as a whole this new edition gives you good thorough coverage of the new Flex 4 and provides some sweet additions at the same time.&lt;br /&gt;&lt;br /&gt;Those of you reading this who decided to pass on buying one of the other Flex 4 books before Flex 4 in Action made its appearance on shelves will be well served. It was worth the wait.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-6131776579402489962?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/6131776579402489962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=6131776579402489962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/6131776579402489962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/6131776579402489962'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2010/10/heres-another-review.html' title=''/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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://2.bp.blogspot.com/_HkRPBhcKMF0/TN1MuPAGeII/AAAAAAAAACE/CYK2kedlEFw/s72-c/ahmed2_cover150.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9182279422841258293.post-4413438204009498329</id><published>2010-09-28T06:08:00.000-07:00</published><updated>2010-11-12T06:24:50.255-08:00</updated><title type='text'></title><content type='html'>Well, after a year layoff I'm back in the saddle again. I've been doing a lot of reading lately so I thought I'd make my comeback with a review of Manning Publication's &lt;span style="font-style: italic;"&gt;iText in Action&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Review of: iText in Action 2nd edition &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HkRPBhcKMF0/TN1Nyp-tkVI/AAAAAAAAACM/1N0BmH_wxJQ/s1600/lowagie2_cover150.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 186px;" src="http://3.bp.blogspot.com/_HkRPBhcKMF0/TN1Nyp-tkVI/AAAAAAAAACM/1N0BmH_wxJQ/s320/lowagie2_cover150.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5538668649393262930" /&gt;&lt;/a&gt;&lt;br /&gt;Author: Bruno Lowagie&lt;br /&gt;Publisher: Manning Publications&lt;br /&gt;ISBN-10: 1935182617&lt;br /&gt;ISBN-13: 9781935182610&lt;br /&gt;&lt;br /&gt;$37.79 (amazon.com) 700 pgs.&lt;br /&gt;Reviewer: John S. Griffin&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Overview&lt;/span&gt;&lt;br /&gt;iText makes it possible to enhance applications with dynamic PDF solutions. It is one of the world's leading F/OSS (Free/Open Source Software) PDF libraries and is released under the Affero General Public License (AGPL). iText is available in two versions: the original Java version, and the C# port, iTextSharp. The iText web site is located at &lt;a href="http://itextpdf.com/"&gt;http://itextpdf.com/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Both editions were written by the man who created the API. In the first edition of "iText in Action", readers learned why things work the way they do in iText, complemented with simple examples. This second edition takes readers further with more real-life examples and presenting comprehensive code samples that you can use to solve everyday problems.&lt;br /&gt;&lt;br /&gt;The book utilizes a movie database, created for a (fictional) film festival as the running application for the examples as is usual for any Manning book. It is accessed from a series of simple programs and PDF files are created and manipulated in different ways that could be useful for the visitors of the imaginary film festival.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary of Contents&lt;/span&gt;&lt;br /&gt;Part 1: Creating PDF documents from scratch&lt;br /&gt;This section demonstrates how to create a document from scratch. Concepts such as iText's basic building blocks and direct content are introduced. Adding columns and tables to a document are discussed in great detail. Part one concludes by explaining how to add the finishing touch to your document using page events for headers, footers, page numbers and watermarks.&lt;br /&gt;&lt;br /&gt;Chapter 1: Introduction&lt;br /&gt;Creating a series of PDF documents from scratch begins the book. SQL statements are used to query a movie database, loop over the ResultSet, and add the data from each record to a PDF document using high-level objects such as Chunks, Phrases, Paragraphs, and so on. The creation of PDF documents without having to know anything about the PDF specification is the goal here.&lt;br /&gt;&lt;br /&gt;Chapter 2: Composing a document using iText's Basic Building Blocks&lt;br /&gt;Lines, shapes, and text are demonstrated to create a time table visualizing movie screenings, using a different color for every film festival category. To achieve this, low-level operations that demand a sound understanding of how PDFs work are utilized.&lt;br /&gt;&lt;br /&gt;Chapter 3: Adding content at absolute positions&lt;br /&gt;This chapter covers the basics of adding content to a page using methods that are referred to as low-level operations because they write PDF syntax directly to the content stream of the page. The ColumnText object is covered and reusing content with the PdfTemplate object is also discussed.&lt;br /&gt;&lt;br /&gt;Chapter 4: Organizing content in tables&lt;br /&gt;In one of the most important chapters of the first part, documents containing tabular data are created from the database. Almost everything there is to know about the PdfPTable and PdfPCell objects is presented.&lt;br /&gt;&lt;br /&gt;Chapter 5: Completing your layout using table, cell, and page events&lt;br /&gt;Knowledge about tables and cells will be completed by learning how to add custom behavior to a table and its cells using events. Also page events are discussed. The finishing touch to documents in the form of headers, footers, page numbers and a watermark is presented.&lt;br /&gt;&lt;br /&gt;Part 2: Manipulating existing PDF documents&lt;br /&gt;Part two deals with existing PDF files; be it documents created with iText as discussed in part one, or PDFs created with Adobe Acrobat, Open Office, or any other PDF producer. Different ways to copy, stamp, split and merge documents re examined. Actions and JavaScript are discussed along with everything on the subject of filling out interactive forms.&lt;br /&gt;&lt;br /&gt;Chapter 6: Working with existing PDFs&lt;br /&gt;PdfReader is used to access an existing PDF file, and one or more of these document manipulation classes is chosen for further changes depending on particular circumstances:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;PdfWriter in combination with PdfImportedPage objects - taking "photocopies" of specific pages&lt;/li&gt;&lt;li&gt;PdfStamper - adding content to one existing PDF document&lt;/li&gt;&lt;li&gt;PdfCopy, PdfSmartCopy, or PdfCopyFields - combining a selection of pages from different, existing documents into a new PDF document&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Chapter 7: Making documents interactive&lt;br /&gt;A closer look at the PdfStamper class is taken. It is used to annotate a single document.&lt;br /&gt;&lt;br /&gt;Chapter 8: Filling out interactive forms&lt;br /&gt;A special type of annotation in PDFs are interactive form fields. They are used in forms by implementing AcroForm technology. Another type of PDF form is based on the XML Forms Architecture (XFA). Both types of interactive forms are discussed in chapter 8.&lt;br /&gt;&lt;br /&gt;Part 3: Essential iText Skills&lt;br /&gt;Parts one and two showed how to build a standalone application that is able to create and/or manipulate a PDF document in black and white, using standard fonts, and so on. Part three tells you how to integrate it into a web application, how to create images and colors, how to choose and use different fonts, and finally how to protect your document.&lt;br /&gt;&lt;br /&gt;Chapter 9: Integrate iText in your web applications&lt;br /&gt;For the sake of simplicity, most of the examples in this book are standalone applications, but a majority of projects use iText as a PDF engine in server-side web applications. You'll certainly benefit from chapter 9 if you want to avoid the pitfalls you might encounter while integrating your iText application into a Java Servlet.&lt;br /&gt;Once your proof of concept is online, you'll probably be confronted with many extra user requirements some of which are covered in the next three chapters.&lt;br /&gt;&lt;br /&gt;Chapter 10: Brighten up your PDF with color and images&lt;br /&gt;There are eleven different color spaces available in PDF. Color spaces are expressed as PDF dictionaries. A reference to these dictionaries can be found in the resources entry of a PDF stream. This is explained in great detail in the PDF reference. How iText hides this complex theory by providing color classes is discussed.&lt;br /&gt;&lt;br /&gt;Chapter 11: Choose the right font&lt;br /&gt;How does one choose a particular font? Which font files can be used with iText? How about special writing systems? In some languages, you have to write from right to left, and from top to bottom. This chapter demonstrates that iText contains convenience classes that make it easier to select a font.&lt;br /&gt;&lt;br /&gt;Chapter 12: Protect your PDF&lt;br /&gt;Several important topics are presented in this chapter:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Providing metadata - information about the owner of this data and how to add and access it&lt;/li&gt;&lt;li&gt;Compressing and decompressing PDFs - the content of a document is compressed by default. iText can decompress content streams to read the PDF syntax that makes up a page or a form XObject.&lt;/li&gt;&lt;li&gt;Encrypting documents - PDF protection via passwords and encryption&lt;/li&gt;&lt;li&gt;Adding digital signatures - public and private keys&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Part 4: Under the hood&lt;br /&gt;An overview of the history of PDF is presented in chapter 13. It takes a look at the inner workings of a PDF document. It explains the different parts of a PDF file: the header, the body, the cross-reference table, and the trailer. Since the body of a PDF file consists of a series of objects, an examination of the different types of objects in the Carousel Object System is presented. The three final chapters focus on stream objects.&lt;br /&gt;&lt;br /&gt;Chapter 13: PDF files inside-out&lt;br /&gt;One of Adobe's important goals, was that every new version of the PDF specification had to be backward compatible. This was possible thanks to the well designed architecture of a PDF file, a.k.a. the Carousel Object System. By studying the different objects that make up a PDF document, you'll learn how iText creates a PDF file.&lt;br /&gt;&lt;br /&gt;Chapter 14: The imaging model&lt;br /&gt;The streams holding the content of a page in a PDF document is the focus of this chapter. All the methods to draw lines and shapes (graphics state), and to write letters and words (text state) are listed.&lt;br /&gt;&lt;br /&gt;Chapter 15: Page content and structure&lt;br /&gt;Making content optional is discussed, and also structure in the content stream of a page is introduced. A fair attempt to parse content streams of existing PDF pages is made and a closer look is taken at the other streams that can be found in a PDF document: images, fonts, file attachments, and rich media.&lt;br /&gt;&lt;br /&gt;Chapter 16: PDF streams&lt;br /&gt;In this final chapter, streams that contain images, fonts, file attachments, and rich media are covered.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Opinion&lt;/span&gt;&lt;br /&gt;This book is a rewrite of the first edition. When this reviewer first started the book and read what the author had done with it compared to the first edition he was a little worried that interested readers might have to buy both books in order to completely understand the iText library and API. After reading deeper into it you can rest assured that this is not the case. iText beginners will have no problem understanding the API.&lt;br /&gt;&lt;br /&gt;The chapters concerning basic building blocks (to get you started), fonts, tables, colors, web applications and all the others are still there and with better examples and explanations. Speaking of examples, there are a hugh number of them in this book which is an improvement over the first edition. Many of them can be used right out of the book to solve problems that the author is sure you will run into. They have also been updated from Java4 to Java5.&lt;br /&gt;&lt;br /&gt;New topics include PDF security which covers public/private keys, encryption, compression, passwords and the like, manipulating existing PDFs (what you can and cannot do) and a deep dive into the imaging model and the actual inner workings of the page among other topics.&lt;br /&gt;&lt;br /&gt;In this reviewer's previous work experience there were many copies of the first edition on the desks of report developers. This is one of the most important niches for iText. Yes, there are more pieces of PDF generation software out there today than you can count but their problem is that they are very difficult to automate for on demand, detailed, ad hoc reports. That is a very large workspace for iText. This reviewer expects to see many more copies of the new edition out there than there were original ones.&lt;br /&gt;&lt;br /&gt;All in all, the book is well written and the examples are vastly improved over the first book. If you are creating a system for generating ad hoc reports, programmatically generating PDFs on the fly for web or other applications,  modifying existing PDFs without their original documentation or doing just about anything else with PDFs, this is the book you need. Highly recommended.&lt;br /&gt;&lt;br /&gt;It won't be another year before I write again. I'm going to put another review here soon on a book I'm extremely impressed with, Manning's &lt;span style="font-style: italic;"&gt;DSLs in Action.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-4413438204009498329?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/4413438204009498329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=4413438204009498329' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/4413438204009498329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/4413438204009498329'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2010/09/well-after-year-layoff-im-back-in.html' title=''/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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://3.bp.blogspot.com/_HkRPBhcKMF0/TN1Nyp-tkVI/AAAAAAAAACM/1N0BmH_wxJQ/s72-c/lowagie2_cover150.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9182279422841258293.post-4277771300805031721</id><published>2009-09-15T07:49:00.000-07:00</published><updated>2009-09-15T08:01:01.552-07:00</updated><title type='text'>Update on my Speaking Engagement</title><content type='html'>&lt;a href="http://2009.utosc.com/pages/home/"&gt;The Utah Open Source Conference&lt;/a&gt;&lt;br /&gt;Things have settled down now and I'll be speaking on Friday the 9th at 6:15 PM on Lucene. Right after that I'm holding a BOF on how Hibernate Search solves Lucene's scalability problems along with several other shortcomings. Hope to see you there.&lt;br /&gt;&lt;a href="http://attend.utosc.com/"&gt;&lt;img src="http://dl.utosc.com/09/badges/utosc2009_Speaker.png" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-4277771300805031721?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/4277771300805031721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=4277771300805031721' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/4277771300805031721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/4277771300805031721'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2009/09/update-on-my-speaking-engagement.html' title='Update on my Speaking Engagement'/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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-9182279422841258293.post-719974177750847643</id><published>2009-09-04T07:52:00.001-07:00</published><updated>2009-09-04T07:55:35.409-07:00</updated><title type='text'></title><content type='html'>Hey, I was just notified that my proposal to speak on Apache Lucene at the Utah Open Source Conference was accepted. The conference is October 8 - 10. I will also give a short discussion on Hibernate Search as it applies to the Lucene engine and how it fixes some of Lucene's shortcomings.&lt;br /&gt;If you get a chance attend the conference. The admission change is minimal and if you volunteer to help it's free admission!!&lt;br /&gt;Hope to see you there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-719974177750847643?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/719974177750847643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=719974177750847643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/719974177750847643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/719974177750847643'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2009/09/hey-i-was-just-notified-that-my.html' title=''/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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-9182279422841258293.post-7540569349649427977</id><published>2009-07-11T14:45:00.000-07:00</published><updated>2009-09-25T14:07:47.090-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArraysAsList'/><category scheme='http://www.blogger.com/atom/ns#' term='ArrayList'/><title type='text'></title><content type='html'>Viral Patel gave a short discussion on his blog entitled Convert ArrayList to Arrays in Java. This is a good thing to know how to do but he did not cover the reverse operation, converting arrays to lists. It holds a few surprises for you. So here is a short snippet that demonstrates this opposite operation.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Arrays;&lt;br /&gt;&lt;br /&gt;public class ArraysAsList {&lt;br /&gt;public statis void main(String[] args) {&lt;br /&gt; new ArraysAsList().start();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void start() {&lt;br /&gt; String[] countries = {"India", "Switzerland", "Italy", "France"};&lt;br /&gt; List list = Arrays.asList(countries);&lt;br /&gt; list.add("India");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If we run this small program we get.....&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;WHAT!!!! an exception?!?!?!What going on here?&lt;/span&gt; All we wanted to do  was add an element to the generated array.   Here's the exception:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:131)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Whaddaya mean unsupported operation?&lt;/span&gt; Let's look at the javadoc and see what it says:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Returns a fixed-size list backed by the specified array."&lt;/span&gt;&lt;br /&gt;Aha! there's the problem. That means that I can't remove anything either. Try it.&lt;br /&gt;Don't forget this in your coding, it can bite you. Not a big deal but just what you need to deal with when you're under the pressure of a deadline.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 255, 153);"&gt;Thanks to Damien for reminding me to show you the correct way to do this:&lt;/span&gt;&lt;br /&gt;&lt;pre style="color: rgb(102, 255, 153);"&gt;List list = Arrays.asList(countries);&lt;/pre&gt;&lt;span style="color: rgb(102, 255, 153);"&gt;should be:&lt;/span&gt;&lt;br /&gt;&lt;pre style="color: rgb(102, 255, 153);"&gt;List list = new ArrayList(Arrays.asList(countries));&lt;/pre&gt;&lt;span style="color: rgb(102, 255, 153);"&gt;This fixes the problem. Now you can add, delete, whatever.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-7540569349649427977?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/7540569349649427977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=7540569349649427977' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/7540569349649427977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/7540569349649427977'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2009/07/viral-patel-gave-short-discussion-on.html' title=''/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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-9182279422841258293.post-3645139659275555079</id><published>2009-07-04T11:39:00.000-07:00</published><updated>2009-07-04T20:56:44.431-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='alice kids computing'/><title type='text'>Get more kids into Computing, Alice.</title><content type='html'>Ok, I digress from technical topics again. This time though I think it's an important digression. Let's get more kids interested in computing!!&lt;br /&gt;As of 2004 only 4.1% of all &lt;a href="http://www.cra.org/info/education/us/"&gt;Bachelors degrees awarded&lt;/a&gt; were in Computer Science (that's the latest data the CRA had). In 2008, only 11.8 percent of U.S. bachelor's degrees in computer science went to women. This is another sore point but I'll make that a topic for another blog post someday. The point is we need to get more kids interested in computing!!&lt;br /&gt;Many kids think that computing isn't fun (some programmers think the same thing) so we need to make it fun. Thus enters &lt;a href="http://www.alice.org/"&gt;Alice&lt;/a&gt;. With support from the National Science Foundation, professor Susan Rodger of Duke University is hoping that Alice will get kids interested in computer science.&lt;br /&gt;A ScienceDaily &lt;a href="http://www.sciencedaily.com/releases/2009/06/090623112115.htm"&gt;site&lt;/a&gt; gives an overview of the problem and discusses Alice at a high level. Basically, Alice is a 3D programming environment that makes creating animation for story telling easy. It is designed to be a first exposure to object-oriented programming and is available for Windows and Mac. According to the site, kids that have been introduced to Alice have a hard time stopping once they get started.&lt;br /&gt;Yes, I know, maybe you consider this a rant and not a blog post but as I said earlier this is important if we are going to maintain a technological edge in computing. I can't believe I'm saying this but I'm thinking of trying to start a computing summer camp for younger children. I just have to fine the financial backing&lt;br /&gt;(I don't believe I just said that?!?!) How about some other ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-3645139659275555079?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/3645139659275555079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=3645139659275555079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/3645139659275555079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/3645139659275555079'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2009/07/get-more-kids-into-computing-alice.html' title='Get more kids into Computing, Alice.'/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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-9182279422841258293.post-8635260932573552509</id><published>2009-06-07T20:47:00.000-07:00</published><updated>2009-06-07T22:14:34.170-07:00</updated><title type='text'>ARE YOU KIDDING ME?!?!?!</title><content type='html'>Alright alright, I apologize in advance about this digression from my technical postings but this was just toooo good to be true.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ok Mabel, it's not an urban legend anymore!!&lt;/span&gt; I done seen it with my own eyes.&lt;br /&gt;&lt;br /&gt;JavaOne 2009&lt;br /&gt;Session - Cloud Computing, Show Me The Money.&lt;br /&gt;&lt;br /&gt;Amazon, Google, Intuit, Microsoft and some other unlucky SOB are giving their cloud computing demo for the session. Each speaker was alloted 5 minutes max to demo their app and I have to admit some of these were really cool.&lt;br /&gt;The first one was the capturing of San Francisco traffic maps, analyzing the data obtained from these and putting it into the cloud for everyone to use. Cool if you live in San Francisco but useless in New York.&lt;br /&gt;The next demo consisted of a very simple 'hello world' servlet app written, compiled and uploaded to the cloud right in front of us. Quite easy and cool. Could we have had a litle more than 5 minutes please!!&lt;br /&gt;Intuit was next with a similar easily deployable application. Sorry, but for the life of me I can't remember what the app did (&lt;span style="font-style: italic;"&gt;that &lt;/span&gt;was impressive).&lt;br /&gt;-----------------------------&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Then it was Microsoft's turn. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The presenter hyped Azure and how easy it made deployment to the cloud. He had a pre-built application to upload and (you probably by now have guessed it) CRAAAAAASSSSSHHHH!!! The session attendees around me just started laughing (hence the title of this post) and since the URI was on the overhead several of them immediately went there (what?? are they masochists?) and captured a stack trace. Here it is and my apologies for unreadables but I OCRed this from an image:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;HTTP Status 500 -&lt;/span&gt;  &lt;span style="font-family:arial;"&gt;Exception report&lt;/span&gt;  &lt;span style="font-family:arial;"&gt;description The.server encountered an internal error Q that prevented, it from fulfilling, this request.&lt;/span&gt;  &lt;span style="font-family:arial;"&gt;javax.servlet.ServletException:  /index.jsp(45,16)   '#{AzureResultBean.top5Results)'  Error reading 'top5Results'  on type com._____.javaone javax.faces.webapp.FacesServlet.service(FacesServlet.Java:&lt;/span&gt; &lt;span style="font-family:arial;"&gt;root cause&lt;/span&gt; &lt;span style="font-family:arial;"&gt;org.apache.jasper.el.JspELException:  /index.jsp(45,16)   '#{AzureResultBean.topSResults}'  Error reading  1top5Results' on type com._____.je org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.Java:107) javax.faces.component.UIData.getValue(UIData.Java:582) javax.faces.component.UIData.getDataModel(UIData.Java:1063) javax.faces.component.UIData.setRowIndex(UIData.Java:417 J&lt;/span&gt; &lt;span style="font-family:arial;"&gt;com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.Java:85)&lt;/span&gt; &lt;span style="font-family:arial;"&gt;javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.Java:788)&lt;/span&gt; &lt;span style="font-family:arial;"&gt;javax.faces.component.UIData.encodeBegin(UIData.Java:879)&lt;/span&gt; &lt;span style="font-family:arial;"&gt;javax.faces.component.UlComponent.encodeAll(UlComponent.Java:884)&lt;/span&gt; &lt;span style="font-family:arial;"&gt;javax.faces.render.Renderer.encodeChildren(Renderer.Java:137 J&lt;/span&gt; &lt;span style="font-family:arial;"&gt;javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.Java:812) javax.faces.component.UlComponent.encodeAll(UlComponent.Java:886) javax.faces.component.UlComponent.encodeAll(UlComponent.Java:892)&lt;/span&gt; &lt;span style="font-family:arial;"&gt;com.sun.faces.application.ViewHandlerlmpl.doRenderViewfViewHandlerlmpl.Java:245) com.sun.faces.application.ViewHandlerlmpl.renderView(ViewHandlerlmpl.Java:176) com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.Java:106) com.sun.faces.lifecycle.Lifecyclelmpl.phase(Lifecyclelmpl.Java:251) com.sun.faces.lifecycle.Lifecyclelmpl.render(Lifecyclelmpl.Java:144) javax.faces.webapp.FacesServlet.service(FacesServlet.Java:245)&lt;/span&gt; &lt;span style="font-family:arial;"&gt;...&lt;/span&gt; &lt;span style="font-family:arial;"&gt;javax.xml.ws.WebServiceException:  Java.net.SocketException: Connection reset&lt;/span&gt; &lt;span style="font-family:arial;"&gt;com.sun.xml.ws.transport.http.client.HttpClientTransport.readResponseCodeAndMessagef HttpClientTransport.Java:210)&lt;/span&gt; &lt;span style="font-family:arial;"&gt;com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.Java:160)&lt;/span&gt; &lt;span style="font-family:arial;"&gt;com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.Java:93)&lt;/span&gt; &lt;span style="font-family:arial;"&gt;com.sun.xml.ws.api.pipe.Fiber.    doRun(Fiber.Java:598)&lt;/span&gt; &lt;span style="font-family:arial;"&gt;com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.Java:557)&lt;/span&gt; &lt;span style="font-family:arial;"&gt;com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.Java:542)&lt;/span&gt; &lt;span style="font-family:arial;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I kinda felt sorry for the presenter when he clicked go... you could audibly hear him say 'pleeeease, don't do this to me!' Well, on second thought, maybe I didn't, he makes a lot more money than I do and, yes, sometimes my code doesn't work either but it does when it &lt;span style="font-weight: bold;"&gt;HAS &lt;/span&gt;to.&lt;br /&gt;&lt;br /&gt;I hope the girl sitting next to me enjoys this post because she said she would definitely check it out. Sorry it took until Sunday but ya gotta admit it was worth the gloat... I mean wait (I really liked your EEEPC).&lt;br /&gt;&lt;br /&gt;Next time back to the technical stuff (gloat, guffaw and I'll be damned, it's not just an urban legend).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-8635260932573552509?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/8635260932573552509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=8635260932573552509' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/8635260932573552509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/8635260932573552509'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2009/06/are-you-kidding-me.html' title='ARE YOU KIDDING ME?!?!?!'/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9182279422841258293.post-2167593467579220441</id><published>2009-06-06T12:55:00.000-07:00</published><updated>2009-06-10T08:52:33.483-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javaOne best sellers'/><title type='text'>JavaOne 2009 Best Sellers</title><content type='html'>Just back from JavaOne 2009 and finally have the gumption to write about something. Here are the best sellers from the bookstore. Some surprises, some not, some wtfs. Would you expect anything less?&lt;br /&gt;&lt;br /&gt;1.  JavaFX: Building Rich Internet Applications - Addison Wesley ISBN: 013701287X&lt;br /&gt;2.  Essential JavaFX - PTR (out June 11, 2009) ISBN: 0137042795&lt;br /&gt;3.  Effective Java 2nd ed. - PTR ISBN: 0321356683&lt;br /&gt;4.  Java Puzzlers - Addison Wesley ISBN: 032133678X&lt;br /&gt;5.  Programming in Scala - Artima ISBN: 0981531601&lt;br /&gt;6.  Java Concurrency in Practice - Addison Wesley ISBN:0321349601&lt;br /&gt;7.  Beginning Java EE 6 Platform with Glassfish 3: From Novice to Professional - Apress ISBN: 1430219548&lt;br /&gt;8.  The Definitive Guide to Lift - Apress ISBN: 1430224215&lt;br /&gt;9.  Beginning Scala - Apress ISBN: 1430219890&lt;br /&gt;10. OpenSolaris Bible - Wiley ISBN: 0470385480&lt;br /&gt;&lt;br /&gt;At the end of the first day Programming in Scala was #1.&lt;br /&gt;After Josh Bloch and Neal Gafter's Java Puzzlers session it moved to #1.&lt;br /&gt;The JavaFX books moved to the top two positions towards the end of the show. Is Sun/Oracle too late with this language (shrug)? Only time will tell (and a short time at that).&lt;br /&gt;The classics 'Effective Java' and 'Java Concurrency in Practice' were there as expected.&lt;br /&gt;The ever growing Scala interest (including Lift) is very intriguing. Is it the next one? That's for the community to decide. Comeon people make a decision!!&lt;br /&gt;&lt;br /&gt;I've got another post for tomorrow again from JavaOne. This is about Microsoft at JavaOne (what?!?!?!). It ain't no urban legend anymore Joyce!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-2167593467579220441?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/2167593467579220441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=2167593467579220441' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/2167593467579220441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/2167593467579220441'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2009/06/javaone-2009-best-sellers.html' title='JavaOne 2009 Best Sellers'/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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-9182279422841258293.post-2160523049837422294</id><published>2008-12-10T05:51:00.000-08:00</published><updated>2008-12-10T06:03:07.981-08:00</updated><title type='text'>Free Chapters!</title><content type='html'>Manning has made two chapters from the book available for free download (there isn't much available for free these days) from their &lt;a href="http://www.manning.com/bernard/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;MEAP&lt;/span&gt;&lt;/a&gt; program.&lt;br /&gt;Chapter 2 entitled "Getting started with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Hibernate&lt;/span&gt; Search" will give you an over-view of Hibernate Search: how to use it, how to express full-text queries, and how it fits into the Hibernate programmatic model.&lt;br /&gt;Chapter 11 entitled "Accessing &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Lucene&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;natively&lt;/span&gt;" starts with looking at Hibernate Search’s &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;SearchFactory&lt;/span&gt;, which is the key entry point to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Lucene&lt;/span&gt;. It also examines the effects that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;sharding&lt;/span&gt; presents, writing a custom &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;DirectoryProvider&lt;/span&gt; and what you must take into account when you do.&lt;br /&gt; We’ll also show you how to access the legacy &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Lucene&lt;/span&gt; document and several related values by utilizing a &lt;span style="font-style: italic;"&gt;projection&lt;/span&gt;, and we’ll demonstrate how it affects performance.&lt;br /&gt;Manning has also provided the book's source code for download from the same link.&lt;br /&gt;&lt;br /&gt;Download them, sit back, do a little reading and see what you think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-2160523049837422294?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/2160523049837422294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=2160523049837422294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/2160523049837422294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/2160523049837422294'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2008/12/free-chapters.html' title='Free Chapters!'/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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-9182279422841258293.post-8525513470271104608</id><published>2008-12-01T06:40:00.000-08:00</published><updated>2008-12-01T06:54:30.002-08:00</updated><title type='text'>Our Hibernate Search Refcard is out!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.dzone.com/links/themes/reader/images/dzlogo-tagline-small.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 202px; height: 50px;" src="http://www.dzone.com/links/themes/reader/images/dzlogo-tagline-small.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;has just released our &lt;a href="http://refcardz.dzone.com/refcardz/getting-started-with-hibernate"&gt;&lt;span style="font-weight:bold;"&gt;Refcard&lt;/span&gt;&lt;/a&gt; on Hibernate Search. This is a 6 page "cheatsheet" for new and experienced users of this technology filled with summary information for quick lookup. We hope you enjoy it and its makes life a little easier for you.&lt;br /&gt;&lt;br /&gt;It looks like we will just make the December launch of &lt;span style="font-style:italic;"&gt;Hibernate Search in Action&lt;/span&gt;. We're hoping to be on the shelves during the last week of December. It will make a great 'IOU one Christmas present' for that someone you know. It would also be a fantastic birthday present. &lt;span style="font-style:italic;"&gt;Buy it, you'll like it!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-8525513470271104608?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/8525513470271104608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=8525513470271104608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/8525513470271104608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/8525513470271104608'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2008/12/our-hibernate-search-refcard-is-out.html' title='Our Hibernate Search Refcard is out!'/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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-9182279422841258293.post-4009429574604635200</id><published>2008-10-13T07:57:00.000-07:00</published><updated>2008-10-13T08:20:02.242-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate session transactions thread local'/><title type='text'>Hibernate Session and Transaction Utilizing ThreadLocal Variables</title><content type='html'>At long last here is the post I promised that uses ThreadLocal variables to handle Hibernate sessions and transactions. The rather long helper class contains methods to obtain the current session (if one doesn't already exist it creates one), close the session, obtain a transaction, commit the transaction and rollback. &lt;br /&gt;This is a good demonstration of the use of ThreadLocal variables and presents workable code that I hope you can use everyday. There is a lot more that can be added to this helper but that's a reader exercise.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public final class HibernateHelper&lt;br /&gt;{&lt;br /&gt;   private static final ThreadLocal&lt;Session&gt; threadSession = &lt;br /&gt;      new ThreadLocal&lt;Session&gt;();&lt;br /&gt;   private static final ThreadLocal&lt;Transaction&gt; threadTransaction = &lt;br /&gt;      new ThreadLocal&lt;Transaction&gt;();&lt;br /&gt;   private static SessionFactory mSessionFactory;&lt;br /&gt;&lt;br /&gt;   static {&lt;br /&gt;      mSessionFactory = ServiceLocator.getInstance().getSessionFactory();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static Session getCurrentSession() {&lt;br /&gt;      Session s = threadSession.get();&lt;br /&gt;      try {&lt;br /&gt;         if (s == null || !s.isOpen()) {&lt;br /&gt;            if (mLogger.isInfoEnabled()) {&lt;br /&gt;               mLogger.info("Opening new Session for this thread.");&lt;br /&gt;            }&lt;br /&gt;            s = mSessionFactory.openSession();&lt;br /&gt;            threadSession.set(s);&lt;br /&gt;         }&lt;br /&gt;         else {&lt;br /&gt;            if (mLogger.isInfoEnabled()) {&lt;br /&gt;               mLogger.info("Using current session in this thread.");&lt;br /&gt;            }&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;      catch (HibernateException ex) {&lt;br /&gt;         throw ("unable to open hibernate session");&lt;br /&gt;      }&lt;br /&gt;      return s;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static void closeSession() {&lt;br /&gt;      try {&lt;br /&gt;         final Session s = threadSession.get();&lt;br /&gt;         if (s != null &amp;&amp; s.isOpen()) {&lt;br /&gt;            mLogger.info("Closing Session of this thread.");&lt;br /&gt;            s.close();&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;      catch (HibernateException ex) {&lt;br /&gt;         Throw.loggable(HBM_CLOSE_SESSION, ex, false);&lt;br /&gt;      }&lt;br /&gt;      finally {&lt;br /&gt;         threadSession.set(null);&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static void beginTransaction() {&lt;br /&gt;      Transaction tx = threadTransaction.get();&lt;br /&gt;      try {&lt;br /&gt;         if (tx != null &amp;&amp; !tx.isActive()) {&lt;br /&gt;            tx = null;&lt;br /&gt;            threadTransaction.set(null);&lt;br /&gt;         }&lt;br /&gt;         if (tx == null) {&lt;br /&gt;            if (mLogger.isInfoEnabled()) {&lt;br /&gt;               mLogger.info("Starting new database transaction in this thread.");&lt;br /&gt;            }&lt;br /&gt;            if (threadSession.get() != null &amp;&amp; threadSession.get().isOpen()) {&lt;br /&gt;               threadSession.get().close();&lt;br /&gt;               threadSession.set(null);&lt;br /&gt;            }&lt;br /&gt;            tx = getCurrentSession().beginTransaction();&lt;br /&gt;            threadTransaction.set(tx);&lt;br /&gt;         }&lt;br /&gt;         else {&lt;br /&gt;            if (mLogger.isInfoEnabled()) {&lt;br /&gt;               mLogger.info("Using current database transaction in this thread.");&lt;br /&gt;               mLogger.info("Opening new Session for this thread.");&lt;br /&gt;            }&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;      catch (HibernateException ex) {&lt;br /&gt;         Throw.loggable(HBM_BEGIN_TRANSACTION, ex, false);&lt;br /&gt;      }&lt;br /&gt;      finally {&lt;br /&gt;         if (threadSession.get() == null || !threadSession.get().isOpen()) {&lt;br /&gt;            getCurrentSession();&lt;br /&gt;         }&lt;br /&gt;         else {&lt;br /&gt;            threadSession.get().clear();&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static void commitTransaction() {&lt;br /&gt;      final Transaction tx = threadTransaction.get();&lt;br /&gt;      try {&lt;br /&gt;         if (tx != null &amp;&amp; !tx.wasCommitted() &amp;&amp; !tx.wasRolledBack())&lt;br /&gt;         {&lt;br /&gt;            Session s = getCurrentSession();&lt;br /&gt;            s.flush();&lt;br /&gt;            if (mLogger.isInfoEnabled()) {&lt;br /&gt;               mLogger.info("Flushing session and committing transaction of this thread.");&lt;br /&gt;            }&lt;br /&gt;            tx.commit();&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;      catch (HibernateException ex) {&lt;br /&gt;         rollbackTransaction();&lt;br /&gt;         Throw.loggable(HBM_COMMIT_TRANSACTION, ex, false);&lt;br /&gt;      }&lt;br /&gt;      finally {&lt;br /&gt;         threadTransaction.set(null);&lt;br /&gt;         closeSession();&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static void rollbackTransaction() {&lt;br /&gt;      final Transaction tx = threadTransaction.get();&lt;br /&gt;      try {&lt;br /&gt;         if (tx != null &amp;&amp; !tx.wasCommitted() &amp;&amp; !tx.wasRolledBack()) {&lt;br /&gt;            mLogger.info("Trying to rollback database transaction of this thread.");&lt;br /&gt;            tx.rollback();&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;      catch (HibernateException ex) {&lt;br /&gt;         Throw.loggable(HBM_ROLLBACK_TRANSACTION, ex, false);&lt;br /&gt;      }&lt;br /&gt;      finally {&lt;br /&gt;         threadTransaction.set(null);&lt;br /&gt;         closeSession();&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next installment I want to continue our ThreadLocal variable discussion and problems you can run into when using them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-4009429574604635200?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/4009429574604635200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=4009429574604635200' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/4009429574604635200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/4009429574604635200'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2008/10/hibernate-session-and-transaction-with.html' title='Hibernate Session and Transaction Utilizing ThreadLocal Variables'/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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-9182279422841258293.post-9035391360507346130</id><published>2008-07-21T08:59:00.000-07:00</published><updated>2008-07-25T09:27:46.265-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ThreadLocal HibernateSession variables'/><title type='text'>Help Me ThreadLocal Variables!</title><content type='html'>I attended a local NoFluffJustStuff seminar last weekend and enjoyed every discussion  I attended. Ted Neward was in excellent form as usual. There was one thing that bothered me though. There were quite a few attendees that did not know how to utilize ThreadLocal variables and some had never heard of them.&lt;br /&gt;I'll discuss and demonstrate them here and in the next post I'll demo using hibernate Sessions with ThreadLocal variables. Hopefully, this will help out a lot of people.&lt;br /&gt;ThreadLocal variables are instances of the &lt;tt&gt;java.lang.ThreadLocal&amp;lt;T&amp;gt;&lt;/tt&gt; class. There are two methods (it has more) that we are concerned with &lt;tt&gt;get()&lt;/tt&gt; and &lt;tt&gt;set(T value)&lt;/tt&gt; which perform the normal accessor and mutator functionality. &lt;span style="font-style: italic;"&gt;Here's the main point!&lt;/span&gt; These variables differ from the variables you are used to in that each thread that accesses a ThreadLocal variable via its  &lt;tt&gt;get&lt;/tt&gt; or &lt;tt&gt;set&lt;/tt&gt; method has its own, &lt;span style="font-style: italic;"&gt;independently initialized  copy of the variable&lt;/span&gt;. That's where the class' name came from, the variable is local to the Thread that has it.&lt;br /&gt;Each thread holds an implicit reference to its copy of a thread-local  variable as long as the thread is alive and the &lt;tt&gt;ThreadLocal&lt;/tt&gt;  instance is accessible. When a Thread dies all of its ThreadLocal variables are garbage collected if there are no references to them.&lt;br /&gt;This gives you what I call &lt;span style="font-style: italic;"&gt;poor man's thread safety&lt;/span&gt;. Other threads won't bother it and it won't bother other threads. So how can I utilize these variables? It's actually quite simple. Here's the example I promised.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Class UserHelper {&lt;br /&gt;  private static final ThreadLocal&lt;String&gt; threadUser = new ThreadLocal&lt;String&gt;();&lt;br /&gt;&lt;br /&gt;   /** Retrieves the user name of this thread. */&lt;br /&gt;   public static String getThreadUser() {&lt;br /&gt;      return threadUser.get();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /** Stores the user name of this thread. */&lt;br /&gt;   public static void setThreadUser(String username) {&lt;br /&gt;      threadUser.set(username);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This class stores the current user's name in a threadlocal variable attached to the current thread of execution and the Thread lugs it around wherever it goes. In any part of the application this user name can be accessed by simply calling the &lt;code&gt;getThreadUser()&lt;/code&gt; method. Even though you may have two different threads executing the same part of an application, when the application calls the get method each thread returns it's own user's name. Simple huh?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Warning&lt;/span&gt;&lt;br /&gt;Always remember that the &lt;code&gt;ThreadLocal&lt;/code&gt; data is connected to the thread, not the user (in our example it has the user name but that's it) or anything else. A good idea is to delete the &lt;code&gt;ThreadLocal&lt;/code&gt; data when it's no longer used.&lt;br /&gt;&lt;code&gt;MyThreadLocal.set(null);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;We'll talk about the Hibernate ThreadLocal Session pattern in the next installment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-9035391360507346130?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/9035391360507346130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=9035391360507346130' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/9035391360507346130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/9035391360507346130'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2008/07/help-me-threadlocal-variables.html' title='Help Me ThreadLocal Variables!'/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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-9182279422841258293.post-8851000885763498998</id><published>2008-05-23T10:01:00.000-07:00</published><updated>2008-08-12T13:24:18.498-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate entities rootclass hibernate.cfg.xml'/><title type='text'>Entity Method Instances From hibernate.cfg.xml</title><content type='html'>Wouldn't it be cool if you could obtain an instance of a particular annotated method from a Hibernate entity by simply examining the hibernate.cfg.xml file? It's not as difficult as you may think.&lt;br /&gt;The key to the whole process is knowing how to read the configuration file and manipulate what it returns. Let's examine some code that does just that. We'll examine all the classes in our config file and retrieve information on each of the methods annotated with @Id. We'll put this information in a map with the map's keys being the classes themselves and the values being Hibernate IdMetaData objects.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Map&lt;class, idmetadata=""&gt; idMap = new HashMap&lt;class, idmetadata=""&gt;();&lt;br /&gt;1  Configuration config = new AnnotationConfiguration().configure();&lt;br /&gt;&lt;br /&gt;2  for (Iterator iter = config.getClassMappings(); iter.hasNext();)&lt;br /&gt;{&lt;br /&gt;3     RootClass root = ((RootClass)iter.next());&lt;br /&gt;&lt;br /&gt;   try {&lt;br /&gt;4       Class clazz = root.getMappedClass();&lt;br /&gt;&lt;br /&gt;5        Method idGetter = root.getIdentifierProperty()&lt;br /&gt;                                 .getGetter(clazz).getMethod();&lt;br /&gt;6        Method idSetter = root.getIdentifierProperty()&lt;br /&gt;                                 .getSetter(clazz).getMethod();&lt;br /&gt;7        Class type = idGetter.getReturnType();&lt;br /&gt;8        IdMetaData md = new IdMetaData();&lt;br /&gt;9        md.setIdGetter(idGetter);&lt;br /&gt;10       md.setIdSetter(idSetter);&lt;br /&gt;11       md.setType(type);&lt;br /&gt;12       idMap.put(clazz, md);&lt;br /&gt;13       mLogger.info("mapping Id for " + clazz.getName());&lt;br /&gt; }&lt;br /&gt; catch (Exception e) {&lt;br /&gt;     throw new Error("unable to initialize annotation map");&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/class,&gt;&lt;/class,&gt;&lt;/pre&gt;Line 1 is the standard way to generate a Hibernate configuration instance. The Iterator of line 2 returns  a Hibernate RootClass  (line 3) for each of the defined classes in the config file. This class is the gateway to a lot of information.&lt;br /&gt;root.getIdentifierProperty() in lines 5 and 6 returns a Hibernate Property object of the method marked with the @Id annotation. This allows access to the actual getter and setter methods. IdMetaData is a simple bean class that holds any information obtained from the RootClass object. Line 12 fills a HashMap with the class as the map key and the IdMetaData as the value. Once you know the trick you can programatically get at any information you wish to.&lt;br /&gt;&lt;div style="text-align: center;"&gt;------------------&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;Developers read APIs, Engineers read the source code!&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/9182279422841258293-8851000885763498998?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/8851000885763498998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=8851000885763498998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/8851000885763498998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/8851000885763498998'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2008/05/getting-entity-method-instances-from.html' title='Entity Method Instances From hibernate.cfg.xml'/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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-9182279422841258293.post-6459709380764061975</id><published>2008-05-21T12:08:00.000-07:00</published><updated>2008-05-27T08:58:06.249-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dining philosopher java development blog'/><title type='text'>Whence the name?</title><content type='html'>The &lt;b&gt;dining philosophers problem&lt;/b&gt; is an illustrative example of a common computing problem in concurrency.&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;br /&gt;Five philosophers sit at a table doing one of two things - eating or thinking. While eating, they are not thinking, and while thinking, they are not eating. The five philosophers sit at a circular table with a large bowl of spaghetti in the center. A fork is placed in between each philosopher, and as such, each philosopher has one fork to his or her left and one fork to his or her right. As spaghetti is difficult to serve and eat with a single fork, it is assumed that a philosopher must eat with two forks. The philosopher can only use the fork on his or her immediate left or right. &lt;div class="thumb tright"&gt; &lt;div class="thumbinner" style="width: 202px;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Image:Dining_philosophers.png" class="image" title="Illustration of the dining philosophers problem"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;The philosophers never speak to each other, which creates a dangerous possibility of deadlock when every philosopher holds a left fork and waits perpetually for a right fork (or vice versa).&lt;/p&gt;&lt;p&gt;Visit the DP Problem link on the right to see how it turns out.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9182279422841258293-6459709380764061975?l=thediningphilosopher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thediningphilosopher.blogspot.com/feeds/6459709380764061975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9182279422841258293&amp;postID=6459709380764061975' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/6459709380764061975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9182279422841258293/posts/default/6459709380764061975'/><link rel='alternate' type='text/html' href='http://thediningphilosopher.blogspot.com/2008/05/whence-name.html' title='Whence the name?'/><author><name>John G</name><uri>http://www.blogger.com/profile/01114958921963179384</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></feed>
