On Thu, Aug 27, 2015 at 5:44 PM, Xen <x...@dds.nl> wrote: > setAllLevels doesn't convey what the method does at all, in the sense that > it is going to 'traverse' a descendent hierarchy. > > If the nonqualification of setBranch was a problem, you could make it > setBranchLevel, but whatever. > > or setBranchLevels. > > I guess branch is not a concept in Log4J. > > it is a static method right?. > > setDescendentTreeLevels ;-). > > Well, anyway. >
Hm... but 'descendant' means the same as 'children' to me. I am not my own descendant so that word is just as 'wrong' as children. The word 'tree' does convey that we are not just looking at the immediate decendants/children. I like 'tree' better than 'branch'. setTreeLevel(String, Level)? Nice discussion :-) Gary > > > Quoting Gary Gregory <garydgreg...@gmail.com>: > > Ah! Tricky stuff, that typing ;-) >> >> Committed. >> >> Gary >> >> On Thu, Aug 27, 2015 at 12:44 PM, Ralph Goers <ralph.go...@dslextreme.com >> > >> wrote: >> >> No. Autocorrect at work. Should have been ?Sounds? >>> >>> Ralph >>> >>> On Aug 27, 2015, at 12:24 PM, Gary Gregory <garydgreg...@gmail.com> >>> wrote: >>> >>> Pardon my lack of urban engagement ;-) but do you mean "Spuds" as in >>> http://www.urbandictionary.com/define.php?term=Spud+Me >>> >>> Gary >>> >>> On Thu, Aug 27, 2015 at 12:07 PM, Ralph Goers < >>> ralph.go...@dslextreme.com> >>> wrote: >>> >>> Spuds ok to me >>>> >>>> Sent from my iPad >>>> >>>> On Aug 27, 2015, at 11:49 AM, Gary Gregory <garydgreg...@gmail.com> >>>> wrote: >>>> >>>> setAllChildLevels is nice and explicit, but like setChildren it does not >>>> convey the fact that the API sets the _given_ level _and_ its children. >>>> >>>> Maybe setAllLevels(String, Level) ? >>>> >>>> Gary >>>> >>>> On Thu, Aug 27, 2015 at 11:24 AM, Ralph Goers < >>>> ralph.go...@dslextreme.com >>>> > wrote: >>>> >>>> setBranch doesn?t resonate with me. Partly the problem is that you >>>>> don?t identify what is being set in the name. I would actually prefer >>>>> >>>>> something like setAllChildLevels. >>>>> >>>>> Ralph >>>>> >>>>> On Aug 27, 2015, at 11:17 AM, Gary Gregory <garydgreg...@gmail.com> >>>>> wrote: >>>>> >>>>> Ohhh, I like setBranch instead of setChildren. I'll let it simmer for a >>>>> little... >>>>> >>>>> Thoughts from others? >>>>> >>>>> Gary >>>>> >>>>> >>>>> >>>>> On Thu, Aug 27, 2015 at 7:15 AM, Xen <x...@dds.nl> wrote: >>>>> >>>>> Maybe you can call it setBranch() instead, since you are really trying >>>>>> to set an entire branch of a tree, and you are no so much worried >>>>>> about the >>>>>> fact that they are children. In other words, the parent is included >>>>>> too. >>>>>> >>>>>> >>>>>> >>>>>> On Wed, 26 Aug 2015, Gary Gregory wrote: >>>>>> >>>>>> On Sat, Aug 22, 2015 at 1:58 PM, Gary Gregory <garydgreg...@gmail.com >>>>>> > >>>>>> >>>>>>> wrote: >>>>>>> >>>>>>> In this case the caller is setChildren, so it would know. I've not >>>>>>> >>>>>>>> experimented with coding this yet though. >>>>>>>> >>>>>>>> >>>>>>>> A reminder that this new code has been in for a couple of days and >>>>>>> that I >>>>>>> am not in love with the API name setChildren, so I am open to >>>>>>> suggestions. >>>>>>> >>>>>>> Gary >>>>>>> >>>>>>> >>>>>>> Gary >>>>>>> >>>>>>>> >>>>>>>> On Sat, Aug 22, 2015 at 11:10 AM, Ralph Goers < >>>>>>>> ralph.go...@dslextreme.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>> Yes. Except that puts the burden on the caller to keep track of >>>>>>>> >>>>>>>>> everything they modified. >>>>>>>>> >>>>>>>>> Ralph >>>>>>>>> >>>>>>>>> On Aug 22, 2015, at 9:33 AM, Gary Gregory <garydgreg...@gmail.com> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>> Furthermore could loggerContext.updateLoggers() be optimized by >>>>>>>>> passing >>>>>>>>> it the the list of LoggerConfigs we modifed? >>>>>>>>> >>>>>>>>> Gary >>>>>>>>> >>>>>>>>> On Sat, Aug 22, 2015 at 9:04 AM, Gary Gregory < >>>>>>>>> garydgreg...@gmail.com> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>> Ah, like this then? >>>>>>>>> >>>>>>>>>> >>>>>>>>>> /** >>>>>>>>>> * Sets the levels of <code>parentLogger</code> and all >>>>>>>>>> 'child' >>>>>>>>>> loggers to the given <code>level</level>. >>>>>>>>>> * @param parentLogger the parent logger >>>>>>>>>> * @param level the new level >>>>>>>>>> */ >>>>>>>>>> public static void setChildren(final String parentLogger, >>>>>>>>>> final >>>>>>>>>> Level level) { >>>>>>>>>> // get logger config >>>>>>>>>> // if exact match? Use it, if not, create it. >>>>>>>>>> // set level >>>>>>>>>> // update loggers >>>>>>>>>> final LoggerContext loggerContext = >>>>>>>>>> LoggerContext.getContext(false); >>>>>>>>>> final Configuration config = >>>>>>>>>> loggerContext.getConfiguration(); >>>>>>>>>> boolean set = setLevel(parentLogger, level, config); >>>>>>>>>> final Map<String, LoggerConfig> loggerConfigMap = >>>>>>>>>> config.getLoggers(); >>>>>>>>>> for (Map.Entry<String, LoggerConfig> entry : >>>>>>>>>> loggerConfigMap.entrySet()) { >>>>>>>>>> if (entry.getKey().startsWith(parentLogger)) { >>>>>>>>>> set |= setLevel(entry.getValue(), level); >>>>>>>>>> } >>>>>>>>>> } >>>>>>>>>> if (set) { >>>>>>>>>> loggerContext.updateLoggers(); >>>>>>>>>> } >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> Gary >>>>>>>>>> >>>>>>>>>> On Sat, Aug 22, 2015 at 8:19 AM, Gary Gregory < >>>>>>>>>> garydgreg...@gmail.com> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> Let's say I have >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Logger com = ERROR (or even just the root Logger at ERROR). >>>>>>>>>>> >>>>>>>>>>> and I want Logger com.domain.foo and all its children set to >>>>>>>>>>> DEBUG >>>>>>>>>>> >>>>>>>>>>> If I get the LoggerConfig that matches the parent logger and call >>>>>>>>>>> setLevel on that, I will end up with Logger com at DEBUG, won't >>>>>>>>>>> I? >>>>>>>>>>> >>>>>>>>>>> Gary >>>>>>>>>>> >>>>>>>>>>> On Fri, Aug 21, 2015 at 9:53 PM, Ralph Goers < >>>>>>>>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>>> >>>>>>>>>>> That is definitely not how to implement it. >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> You should get the LoggerConfig that matches your parent logger >>>>>>>>>>>> and >>>>>>>>>>>> call setLevel on that. Then loop through all the loggerConfigs >>>>>>>>>>>> that start >>>>>>>>>>>> with the located LoggerConfigs name and then call setLevel on >>>>>>>>>>>> them. You >>>>>>>>>>>> typically aren?t going to have many LoggerConfigs while you >>>>>>>>>>>> could >>>>>>>>>>>> >>>>>>>>>>>> have >>>>>>>>>>>> thousands of Loggers, which all resolve to the same >>>>>>>>>>>> LoggerConfig. >>>>>>>>>>>> >>>>>>>>>>>> Ralph >>>>>>>>>>>> >>>>>>>>>>>> On Aug 21, 2015, at 9:30 PM, Gary Gregory < >>>>>>>>>>>> garydgreg...@gmail.com >>>>>>>>>>>> > >>>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>> On Wed, Aug 19, 2015 at 7:59 PM, Gary Gregory < >>>>>>>>>>>> garydgreg...@gmail.com> >>>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>> On Sat, Aug 15, 2015 at 3:56 PM, Gary Gregory < >>>>>>>>>>>> >>>>>>>>>>>>> garydgreg...@gmail.com >>>>>>>>>>>>> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> On Sat, Aug 15, 2015 at 3:07 PM, Ralph Goers < >>>>>>>>>>>>> >>>>>>>>>>>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Why do you want to set the level on the LoggerConfig and all >>>>>>>>>>>>>> its >>>>>>>>>>>>>> >>>>>>>>>>>>>>> descendants? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Because I clearly did not educate myself fully in this topic. >>>>>>>>>>>>>> ;-) >>>>>>>>>>>>>> Hence I am looking for a shortcut by asking on the ML :-) >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> Setting the level just on the LoggerConfig will achieve the >>>>>>>>>>>>>> same >>>>>>>>>>>>>> >>>>>>>>>>>>>>> thing, so long as none of its descendants has a LoggerConfig >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> That's cool, but... How can I know if any descendant has a >>>>>>>>>>>>>> LoggerConfig? How can do this generically? >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> Here is my proposal (including a test): >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> https://issues.apache.org/jira/secure/attachment/12751400/log4j.diff >>>>>>>>>>>>> >>>>>>>>>>>>> I am not crazy about the API name: setChildren(String >>>>>>>>>>>>> loggerName, >>>>>>>>>>>>> Level level). >>>>>>>>>>>>> >>>>>>>>>>>>> Thoughts? >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> Anyone? Bueller? :-) >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Gary >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> Gary >>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> Sent from my iPad >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Aug 15, 2015, at 8:25 AM, Gary Gregory < >>>>>>>>>>>>>>> garydgreg...@gmail.com> >>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Let's say I have a logger tree like: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> R >>>>>>>>>>>>>>> R.P >>>>>>>>>>>>>>> R.P.C1 >>>>>>>>>>>>>>> R.P.C1.L1 >>>>>>>>>>>>>>> R.P.C2.L2 >>>>>>>>>>>>>>> R.P.C2 >>>>>>>>>>>>>>> R.P.C2.L1 >>>>>>>>>>>>>>> R.P.C2.L2 >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> and I want to set R.P.C2 and all it's descendants to a given >>>>>>>>>>>>>>> level. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> In Log4j 1.2, I do: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> public static void setChildren(final Logger parentLogger, >>>>>>>>>>>>>>> final Level newLevel) { >>>>>>>>>>>>>>> final Enumeration<Logger> enumeration = >>>>>>>>>>>>>>> LogManager.getCurrentLoggers(); >>>>>>>>>>>>>>> while (enumeration.hasMoreElements()) { >>>>>>>>>>>>>>> final Logger logger = enumeration.nextElement(); >>>>>>>>>>>>>>> if (LoggerUtils.isChild(parentLogger, logger)) { >>>>>>>>>>>>>>> logger.setLevel(newLevel); >>>>>>>>>>>>>>> } >>>>>>>>>>>>>>> } >>>>>>>>>>>>>>> } >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> private static boolean isChild(final Logger >>>>>>>>>>>>>>> parentCandidate, >>>>>>>>>>>>>>> final Logger childCandidate) { >>>>>>>>>>>>>>> for (Category c = childCandidate; c != null; c = >>>>>>>>>>>>>>> c.getParent()) { >>>>>>>>>>>>>>> if (c.equals(parentCandidate)) { >>>>>>>>>>>>>>> return true; >>>>>>>>>>>>>>> } >>>>>>>>>>>>>>> } >>>>>>>>>>>>>>> return false; >>>>>>>>>>>>>>> } >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I suppose I could determine parent/child with a startWith on >>>>>>>>>>>>>>> the >>>>>>>>>>>>>>> logger name too. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I there a better way to do this with the Core in v2 aside >>>>>>>>>>>>>>> from >>>>>>>>>>>>>>> iterating over all loggers in a context and doing a kind of >>>>>>>>>>>>>>> isChild()? Can >>>>>>>>>>>>>>> additivity be used for this? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I'd like to add such a utility method to Configurator. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Gary >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>>>>>>>>>>>> <ggreg...@apache.org> >>>>>>>>>>>>>>> Java Persistence with Hibernate, Second Edition >>>>>>>>>>>>>>> <http://www.manning.com/bauer3/> >>>>>>>>>>>>>>> JUnit in Action, Second Edition < >>>>>>>>>>>>>>> http://www.manning.com/tahchiev/> >>>>>>>>>>>>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>>>>>>>>>>>> Blog: http://garygregory.wordpress.com >>>>>>>>>>>>>>> Home: http://garygregory.com/ >>>>>>>>>>>>>>> Tweet! http://twitter.com/GaryGregory >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>>>>>>>>>>> <ggreg...@apache.org> >>>>>>>>>>>>>> Java Persistence with Hibernate, Second Edition >>>>>>>>>>>>>> <http://www.manning.com/bauer3/> >>>>>>>>>>>>>> JUnit in Action, Second Edition < >>>>>>>>>>>>>> http://www.manning.com/tahchiev/> >>>>>>>>>>>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>>>>>>>>>>> Blog: http://garygregory.wordpress.com >>>>>>>>>>>>>> Home: http://garygregory.com/ >>>>>>>>>>>>>> Tweet! http://twitter.com/GaryGregory >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>>>>>>>>>> <ggreg...@apache.org> >>>>>>>>>>>>> Java Persistence with Hibernate, Second Edition >>>>>>>>>>>>> <http://www.manning.com/bauer3/> >>>>>>>>>>>>> JUnit in Action, Second Edition < >>>>>>>>>>>>> http://www.manning.com/tahchiev/> >>>>>>>>>>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>>>>>>>>>> Blog: http://garygregory.wordpress.com >>>>>>>>>>>>> Home: http://garygregory.com/ >>>>>>>>>>>>> Tweet! http://twitter.com/GaryGregory >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>>>>>>>>> <ggreg...@apache.org> >>>>>>>>>>>> Java Persistence with Hibernate, Second Edition >>>>>>>>>>>> <http://www.manning.com/bauer3/> >>>>>>>>>>>> JUnit in Action, Second Edition < >>>>>>>>>>>> http://www.manning.com/tahchiev/ >>>>>>>>>>>> > >>>>>>>>>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>>>>>>>>> Blog: http://garygregory.wordpress.com >>>>>>>>>>>> Home: http://garygregory.com/ >>>>>>>>>>>> Tweet! http://twitter.com/GaryGregory >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>>>>>>>> Java Persistence with Hibernate, Second Edition >>>>>>>>>>> <http://www.manning.com/bauer3/> >>>>>>>>>>> JUnit in Action, Second Edition < >>>>>>>>>>> http://www.manning.com/tahchiev/> >>>>>>>>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>>>>>>>> Blog: http://garygregory.wordpress.com >>>>>>>>>>> Home: http://garygregory.com/ >>>>>>>>>>> Tweet! http://twitter.com/GaryGregory >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>>>>>>> Java Persistence with Hibernate, Second Edition >>>>>>>>>> <http://www.manning.com/bauer3/> >>>>>>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/ >>>>>>>>>> > >>>>>>>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>>>>>>> Blog: http://garygregory.wordpress.com >>>>>>>>>> Home: http://garygregory.com/ >>>>>>>>>> Tweet! http://twitter.com/GaryGregory >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>>>>>> Java Persistence with Hibernate, Second Edition >>>>>>>>> <http://www.manning.com/bauer3/> >>>>>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>>>>>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>>>>>> Blog: http://garygregory.wordpress.com >>>>>>>>> Home: http://garygregory.com/ >>>>>>>>> Tweet! http://twitter.com/GaryGregory >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>> -- >>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>>>>> Java Persistence with Hibernate, Second Edition >>>>>>>> <http://www.manning.com/bauer3/> >>>>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>>>>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>>>>> Blog: http://garygregory.wordpress.com >>>>>>>> Home: http://garygregory.com/ >>>>>>>> Tweet! http://twitter.com/GaryGregory >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> -- >>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>>>> Java Persistence with Hibernate, Second Edition >>>>>>> <http://www.manning.com/bauer3/> >>>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>>>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>>>> Blog: http://garygregory.wordpress.com >>>>>>> Home: http://garygregory.com/ >>>>>>> Tweet! http://twitter.com/GaryGregory >>>>>>> >>>>>>> >>>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org >>>>>> For additional commands, e-mail: log4j-dev-h...@logging.apache.org >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>> Java Persistence with Hibernate, Second Edition >>>>> <http://www.manning.com/bauer3/> >>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>> Blog: http://garygregory.wordpress.com >>>>> Home: http://garygregory.com/ >>>>> Tweet! http://twitter.com/GaryGregory >>>>> >>>>> >>>>> >>>>> >>>> >>>> -- >>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>> Java Persistence with Hibernate, Second Edition >>>> <http://www.manning.com/bauer3/> >>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>>> Spring Batch in Action <http://www.manning.com/templier/> >>>> Blog: http://garygregory.wordpress.com >>>> Home: http://garygregory.com/ >>>> Tweet! http://twitter.com/GaryGregory >>>> >>>> >>>> >>> >>> -- >>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>> Java Persistence with Hibernate, Second Edition >>> <http://www.manning.com/bauer3/> >>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>> Spring Batch in Action <http://www.manning.com/templier/> >>> Blog: http://garygregory.wordpress.com >>> Home: http://garygregory.com/ >>> Tweet! http://twitter.com/GaryGregory >>> >>> >>> >>> >> >> -- >> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >> Java Persistence with Hibernate, Second Edition >> <http://www.manning.com/bauer3/> >> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >> Spring Batch in Action <http://www.manning.com/templier/> >> Blog: http://garygregory.wordpress.com >> Home: http://garygregory.com/ >> Tweet! http://twitter.com/GaryGregory >> >> > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org > For additional commands, e-mail: log4j-dev-h...@logging.apache.org > > -- E-Mail: garydgreg...@gmail.com | ggreg...@apache.org Java Persistence with Hibernate, Second Edition <http://www.manning.com/bauer3/> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> Spring Batch in Action <http://www.manning.com/templier/> Blog: http://garygregory.wordpress.com Home: http://garygregory.com/ Tweet! http://twitter.com/GaryGregory