Sing Li (JIRA) wrote:
[ http://issues.apache.org/jira/browse/GERONIMO-680?page=comments#action_12314022 ]
Sing Li commented on GERONIMO-680:
----------------------------------
Thanks for the patch. The thought of being able to
eventually write GBeans entirely in a scripting
language is eerie; just picturing a REXX
script with an EJB fascade right now... hmmm...
I was thinking more along the lines of creating a property file like
syntax for configuring GBeans, at startup (sort of), via a scripting
engine. Here is one way this could work. A 'scripting' GBean is added to
geronimo. This GBean takes a Properties (or a List if possible) object
as an attribute. This object contains a list of all the files that are
to be executed by the embedded interpreted on startup. Now say that the
scripting language that is used supports operator overloading and that
the GBean also takes a 'library' file that is to be 'included' in all
the startup scripts. Say this script contains an object named 'getGBean'
that takes a GBean name as its argument and overloads the 'dot' operator
so that it calls kernel.setAttribute(...) on the gbean and it's
property. In Jython those files would look something like this (note
that this does not yet handle the case where the GBean we want to
configure is not running/loaded):
-------- header.py - Library (magic header fle) ---------
sys.add_package("org.apache.geronimo.kernel")
sys.add_package("org.apache.geronimo.gbean")
sys.add_package("javax.management")
from org.apache.geronimo.kernel import KernelRegistry
from javax.management import ObjectName
class getGBean:
def __init__(self, gbname):
self.gBeanName = ObjectName(gbname)
def __setattr__(self,name,value):
if name != 'gBeanName':
kernel = KernelRegistry.getSingleKernel()
kernel.setAttribute(self.gBeanName,name,value)
else:
self.__dict__[name]=value
-----------------------------------------------
-------- Configuration file possibly one (or more) for each
configurable module (header.py is injected into this file by the
interpreter GBean) ----
obj = getGBean('complete gbean name here'')
obj.someNumericAttribute = 10
obj.someStringAttribute = 'value'
....
-------------------------------------------------------------------------------------------------------------
The only difference from a regular properties file is the line with the
getGBean call..
I'll admit that this is indeed kludgy because it sets the attributes of
the GBean after they have been started where ideally you would want the
GBeans to start with their configured attributes. Add to that the fact
that there are some attributes that might require that the GBean be
re-started in order to have the desired effect (ie. the JettyConnector
and its port attribute). On the other hand, if module developers provide
'config files' in this format and add them to the list attribute of the
scripting gbean these can be packaged with the binary distribuition.
Users can then modify these files as they wish, restart geronimo and
have the changes take effect. No source download or compilation and no
need to look and edit at XML files.
HTH,
--
Dondi Imperial
Software Engineer
Exist Software Labs
Penthouse I, Prestige Tower,
F. Ortigas Jr. Ave. (formerly Emerald Ave.),
Ortigas Center, Pasig City 1605
Philippines
+632.687.7653
www.exist.com