[jbosstools-dev] [jboss-as7-dev] Modeling Management Objects (was: birth of "console ui" in eclipse)
Rob Cernich
rcernich at redhat.com
Fri Mar 2 10:12:45 EST 2012
----- Original Message -----
> >>>> I know very little about AutoBean framework so cannot say how/if
> >>>> it
> >>>> will work.
> >>>
> >>> The framework creates a dynamic proxy for a bean interface which
> >>> is
> >>> backed by JSON, and can serialize object instances to JSON. The
> >>> shared component would be the interfaces. The nice bit here is
> >>> that it really simplifies the task of converting to/from JSON
> >>> (much easier than managing ModelNode objects).
> >>
> >> That's a subjective argument. The amount of code to build a DMR
> >> request is roughly equivalent to the amount used with static
> >> javabeans. The trade-off is giving up nice compiler static typing
> >> in
> >> favor of being able to handle forward and backwards compatibility,
> >> supporting dynamic clients, and being friendly to detyped
> >> languages.
> >
> > It certainly is subjective, but my preference is:
> >
> > String foo = bar.getFoo()
> >
> > over:
> >
> > String foo;
> > if (barNode.hasDefined("foo")
> > foo = barNode.get("foo").asString();
> > else
> > foo = null;
> >
> > The notion of static typing is more philosophical. (I won't start
> > a philosophical debate.)
>
> This is all good as long as there are ways to handle:
>
> if (runtime.supportsX()) {
> node.doX();
> } else {
> node.doY();
> }
>
> And that you can have doX() and doY() even if the schema for the
> latest version only contains support for doX().
>
> >> The first management prototype was static and attempted to solve
> >> these issues part way, but it turned out to not only fall short
> >> but
> >> was also cumbersome from a long term maintenance standpoint. A
> >> client had to have a jar for every subsystem that it potentially
> >> used, so you factor in the limitations of the Java type system,
> >> which leads to multiple additional interfaces or multiple jars for
> >> multiple versions and it gets messy pretty quickly.
> >
> > That is true, but now one is coding directly against the schema.
> > If the schema changes, I may not need to rebuild, but if "foo"
> > becomes "fu" it's broken either way. Now I need to scour my
> > source for instances of "foo" and change it to "fu," but luckily
> > I've wrapped all my ModelNode manipulation with my own API
> > (whether that's static string variables or something more
> > sophisticated), so my search scope is limited. (Add arguments for
> > or against static typing...)
> >
> > I can see where this would be burdensome if changes were made to a
> > part of the schema that you weren't using. (Then again, the
> > classes associated with those areas would never be loaded, so it
> > wouldn't matter whether I rebuilt my library or not.)
> >
> > The real benefit here is that the provider is free to change the
> > structure without worrying about breaking clients, or requiring
> > them to recompile. However, if the client is impacted by the
> > changes, they'll be forced to update their library anyway. And
> > maintenance is pushed onto them by forcing them to accommodate for
> > various versions of the schema. Continuing the example:
> >
> > String foo;
> > if (bar.hasDefined("fu"))
> > foo = bar.get("fu").asString();
> > else if (bar.hasDefined("foo"))
> > foo = bar.get("foo").asString();
> > else
> > foo = null;
> >
> > (Perhaps too trivial an example, as it's more likely that
> > structural changes will occur, as opposed to simple name changes,
> > but it illustrates the point.)
>
> Yes - so can you support/handle such changes via AutoBeans ?
I believe so. You would simply need to add the changes to your interfaces. For example:
interface Bar {
/*
* @since 1.0
* @deprecated 2.0
*/
String getFoo();
void setFoo(String value);
/*
* @since 2.0
*/
String getFu();
void setFu(String value);
}
And because the interface is simply wrapping JSON, you still get the "benefit" of having your features "mostly" work if there were changes to the underlying structure.
> >> I have always thought a stub compiler based on DMR descriptions
> >> would
> >> be a nice way to bring back static typing without hampering the
> >> model. A nice side project for someone...
> >
> > While it may not generate the code for you, the AutoBean framework
> > allows you to wrap the underlying JSON with an API. Continuing
> > the above example:
> >
> > interface Bar {
> > String getFoo();
> > void setFoo(String value);
> > }
> > interface BarBeanFactory extends AutoBeanFactory {
> > AutoBean<Bar> newBar();
> > }
> > Bar bar = AutoBeanCodex.decode(barBeanFactory, Bar.class,
> > barNode.toJSONString(true)).as();
> >
> > In my original post, I was simply asking if anybody had attempted
> > to use the AutoBean framework outside a GWT environment and
> > whether or not it would be beneficial to reuse a set of interfaces
> > representing management objects (e.g. interface Bar above). It
> > sounds like the answer to the latter is, "We advise against that."
>
> For the question on usage within AutoBean then my reading on it
> sounds like it should technically be doable (you might need to use
> eclipse buddyclassloading to make it work since the fwk need to load
> user classees - I didn't find a way to set the classloader used but
> that might just be me not looking closely enough).
>
> But sharing classes with runtime specific binaries I do advise
> against by default since it more often than not cannot be
> encapsulated to allow the client to use multiple versions without a
> massive hassle.
>
> /max
>
>
>
>
>
More information about the jbosstools-dev
mailing list