Jason Dillon wrote:
Hi all... I was chatting with David Jencks in IRC today about GShell
and when server/trunk might be built with Java 1.5 and then it
occurred to me that if config.xml could include some extra
configuration to specify what version of Java a module required, that
we could ship an assembly with GShell but only enable it on JDK 1.5
since it requires 1.5 to run.
And then it occurred to me that we could use this same mechanism to
load a Yoko ORB module or a Sun ORB based on one config and one
assembly... and then I thought that if we had a configuration for
GShell built against 1.5, and then another that was retrostranslated,
then we could define a module that would enable on 1.4 and another on
1.5 and have both supported under one configuration. Now I am not
suggesting that we actually do that, but if we had a flexible way to
define a condition for a module to load, then we certainly could if we
wanted to.
So I took a stab at a quick example of how this might work. I added a
new attribute to local-attributes.xsd to the
moduleType/configurationType called "condition" which is a plain
string. Then in ConfigurationOverride I added a field of the same
name that gets initialized to the value, and then changed isLoad to:
public boolean isLoad() {
return load && parseCondition();
}
And added parseCondition(), which at the moment just uses a simple
JexlExpression to evaluate the text to a boolean. To give the
expression access to some system bits I bound a SystemUtils instance
(from commons-lang) and then ran some simple tests like:
<module
name="org.apache.geronimo.configs/remote-deploy-jetty/${pom.version}/car"
condition="!SystemUtils.IS_JAVA_1_5"/>
<module
name="org.apache.geronimo.configs/hot-deployer/${pom.version}/car"
condition="SystemUtils.IS_JAVA_1_5 and SystemUtils.JAVA_VENDOR
== 'sun'"/>
In these examples, remote-deploy-jetty will only be loaded if the JVM
is not 1.5 and hot-deployer will only be loaded if the JVM is 1.5 and
the vendor is 'sun'.
It appears to work well and I believe this adds some extra ability to
our configuration which can help to provide better JDK version
compatibility or vendor compatibility without needing to create new
assemblies.
I believe that only a small number of modules would need to use the
"condition" and modules which do not provide a condition will
automatically evaluate to true (so they will load with no changes).
So, adding this feature will not break any existing configurations, it
only adds some new functionality.
We could roll our own parser, though I think that Jexl is fairly
robust and flexible enough and not too big at ~130k. Probably want to
define some helper objects to provide the functionality that gets
picked up from commons-lang as most of that stuff does not need to be
there... or we could simply extract a few classes out of the jar to
include in the boot classpath.
Right now I only added this to module configurations, but it should
also be easy enough to expose this to gbean's too... so a module could
define a set of gbeans that would conditional load based on
configuration. Basically add the same bits to GBeanOverrides adding
the "condition" attribute to be processed on isLoad(), blah, blah, blah.
* * *
Any comments?
+1 This certainly would have made life a lot easier trying to sort out
the Yoko/sunorb stuff.
--jason