Best way of extending HopObject functions
Daniel Ruthardt <[email protected]> Wed, 30 Jul 2008 13:48:24 +0200
| Newsgroups | gmane.comp.java.helma.general |
|---|---|
| Message-ID | <[email protected]> |
Hi list,
first of all: feels good to be back (for those who still remember me) (-:
I am looking for the best way of extending predefined HopObject
functions like get(), getById(), and so on. I need to extend these
functions because I want to implement a security layer, which should
control access to HopObjects and properties. Yes, even getting and
setting properties. This is important to me, as with lots of generic
macros, the allow or not allow macro paradigm of Helma is not enough
anymore, and implementing security checks in each macro is a no go too.
I have two working solutions, but I feel like there are better ways to
do it.
Approach 1:
I changed the helma source and added calls to JS callback functions
(HopObject.canGet(), HopObject.canAdd(), HopObject.canWrite(),
HopObject.canRead(), ...). This way the predefined HopObject functions
are not overridden, but extended in their Java implementation. Works
fine, even for getting and setting generic properties, but touches the
helma source.
Approach2:
My second approach is JS based only and does not touch the helma source.
I simplified things below.
-----global/functions.js-----
function get(id) {
// do some security checks and eventually return something
// ...
return this._get(id);
}
-----Test/functions.js-----
function Test() {
this._get = this.get;
this.get = get;
}
The overriding get() function is defined in the global space as I only
need it once for all prototypes. The constructor of Test does only set
one new reference variable per instance. I would however prefer to set
the function reference on the prototype, but I did not find a way to do
this for Helma prototypes.
I also failed to implement generic getter / setter functions in JS. I
managed to implement specific ones, but not generic ones.
Anyone aware of how to improve the second approach?
Kind regards,
Daniel