Hi!
Aaron Mulder wrote:
> Okay, here goes. First, let me say that it sounds like we'll
> definitely need to make the change so that the plugins are not handled
> statically - which is fine. I'll ponder the best way to achieve that.
> Oh, also, I'll be the first to admit that some of these reasons
> are more compelling and some are less compelling, but altogether I think a
> new structure makes sense.
I'll add my perspective from the current EJX code.
> 1) Source code in jboss with GPL license
Ok, so if I add the EJX code to CVS under GPL, there's no difference
here.
> 2) Data representation separate from GUI representation, GUI event
> handling, I/O (loading + saving), and logic. We all know about MVC,
> right?
Right. In the current incarnation GUI is separate from data, but I/O is
not. Also, logic is part of the structure which is, IMHO, a good OO
feature: objects are logic and data.
> 3) Uses modular plugins (yes, like EJX), but provides a unified interface
> to the properties from all sources - not necessary for a "client" to
> distinguish jBoss properties from JAWS properties.
The current EJX code uses this kind of mechanism for the container
configurations. Adding aspects to beans in a similar way is trivial.
> 4) When a new plugin is loaded, its metadata can be quickly and easily
> added to what is already available - it will never be necessary to load
> the same file twice to access the same data in different places.
Same with current code if above change is made.
> 5) Associates properties clearly with beans, methods, fields, or
> containers. The structures around each in jBoss can hald a reference to
> their exact level of metadata (that is, an EntityEnterpriseContext can
> have a reference directly to the BeanMetaData, a JawsCMPField can have a
> reference to a FieldMetaData, etc.)
Same with current code if above change is made.
> 6) You can ask any object what properties it has, and it will give you a
> list. If you're not sure what the name is of the property you're looking
> for, and you're not sure which source files to check to find out, you can
> find it at runtime relatively easily.
Same with current code if above change is made, although I would suggest
using strongly typed properties a la JavaBeans as it is now.
> 7) Severe changes to new structure will not break the current deployer
> GUI. While we could work around this with EJX & a branch, the advantages
> of that approach are debatable.
Are you saying you would not add a GUI to the new structure? The current
code is easily GUI-fiable due to its reliance on the JavaBeans API.
> 8) It can be easily optimized for speed - the data is coming
> straight out of instance variables and the access is handled by
> common components across all plugins, so we could easily handle any
> slowdowns caused by the current reflection implementation.
The current code doesn't use reflection AFAIK.
> 9) Code using the new structure is vastly clearer. There are fewer
> layers of objects to dig through, and the object names and accessor
> methods have obvious names. Many inobvious casts are eliminated
> (How many people know what you should cast the result of
> getBeanContext().getBeanContext().getBeanContext() into? Hint: it's not
> a BeanContext). Compare the following from JawsCMPField:
>
> BEFORE:
>
> String jdbc = ((JawsEjbJar)getBeanContext().getBeanContext()
> .getBeanContext()).getTypeMappings().getTypeMapping(
> ((JawsEjbJar)getBeanContext().getBeanContext()
> .getBeanContext()).getTypeMapping())
> .getJdbcTypeForJavaType(type.getType(),
> (JawsEntity)getBeanContext());
>
> AFTER:
>
> Integer jdbc = (Integer)getFieldMetaData().getProperty("jdbcType");
These two aren't strictly equal since I'm doing a computation
dynamically which you have done statically. If you feel it is a static
value, then simply compute it and add a strongly typed accessor. The
downside with the "after" approach is that you have to cast it. I would
prefer a JavaBean get/set accessor pair.
As I noted in private email, this is a truly minor issue as it is only
about untyped accessors. Fix by adding strongly typed accessors such as:
public EjbJar getEjbJar()
{
return (EjbJar)getBeanContext();
}
To summarize I personally cannot see that any of the features you
mention cannot be done as easily or better with the current EJX code.
> So, on to the goals. They're pretty well summed up by that last
> point. The goal is to make coding against the metadata accessible to more
> people.
> Finally, the motivation. I spent a significant amount of time
> digging through the existing structure to try to implement TxInterceptor.
> In the end, I had to simply copy code from elsewhere - it was impossible
> to examine the methods or fields of any particular metadata class and
> determine how to get what I wanted. There was no way to put in a call to
> "show me all the properties you've got" so I could figure out which one
> was appropriate. The naming was absurd - we don't have a bean holding a
> bean holding a bean, so why do we have a bean context holding a bean
> context holding a bean context? The casts are ridiculous - how on earth I
> was supposed to know exactly where and what to cast things into?
Yes, this is something that needs to be fixed, but a very weak point for
introducing a new structure as it only requires strongly typed accessors
to be fixed.
Ok, so now that you have shown me the reasons why you want to introduce
a new structure for metadata my opinion is that these are all very good
features and goals, but none of them aren't feasibly within the current
structure. Sorry, I just don't.
I do sympathize with your pain involved with debugging the structure to
get hold of the information you were looking for, but this is more
documentation issues than design/code issues.
regards,
Rickard
--
Rickard �berg
@home: +46 13 177937
Email: [EMAIL PROTECTED]
http://www.telkel.com
http://www.jboss.org
http://www.dreambean.com