A new implementation aproach for luxor
Anakreon <[email protected]> Mon, 14 Jun 2004 20:47:00 +0300
| Newsgroups | gmane.comp.java.luxor-xul.devel |
|---|---|
| Message-ID | <[email protected]> |
This is a multi-part message in MIME format.
--------------010204040904070704080408
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Hello all.
The last 3 days I'm working on a new approach for the implementation of luxor.
Currently for each xml element a *Def objects is created and for most elements a
*Peer object as well. I was thinking for a way to avoid this, since all this
objects require memory and cup. During the design and implementation of the
approach, it easy made obvious that more advantages exist then just reduction of
cup and memory usage. I'd like to present the design of the approach hopping to
get feedback from the luxor team.
The design utilizes code generation techniques as well as inheritance and
polymorphisms.
From a configuration file (see the attachment) the code generation system
retrieves information about the supported tags and the properties and css
attributes each tag supports. Based on this information an abstract class is
generated which handles the tree walking of the XML document, and creates the
appropriate components for each tag and reports errors if something goes wrong
during the walk. The developer has to extend the class and implement the
abstract methods declared in the generated class and override few methods if
necessary. One obvious disadvantage of this approach is the fact that differs
aloat from the current implementation. For this reason, the advantages should be
very significant in order to adopt the new implementation model. I'll try to
display the advantages of the approach and I hope in your feedback in order to
decide if is worth it to adopt the new design. Let's mention that the existing
code base will not be thrown away. The functionality provided by the existing
classes should exist in the class which extends the generated class. The
existing code will be moved (with some modifications if needed) in the code of
the descendant class.
Advantages:
1)Less memory used. No intermediate objects are created during the component
construction and initialization. No references are kept to the Element object
from where the *Def object is created. The GC can free the memory the Element
objects occupy.
2)Less cup used. The cup time spent on the *Def and *Peer objects initialization
is saved. Also no runtime configuration is needed (in regard to the *Def object).
3)Reduction of code base. I executed the commands displayed bellow and found
that 82 *Def classes and 25 *Peer classes exist. The commands are:
locate -r .*Def.*.java | rep luxor | wc -l
83
One of the *Def is LuxorDefaultVelocityContext.java and for this reason the sum
is 82.
locate -r .*Peer.*.java | rep luxor | wc -l
25
Also interfaces like *Resolver are most likely unneeded. More interfaces and
classes like the NComponent various Factory classes and the Tag,
AbstractComponent, AbstractContainer .. will not be needed any more. So the code
base will be reduced by more then 107 classes. This
I believe will make it easier to mentain the code base.
4)Easier implementation. If you check the implementation of SwingXulManagerImpl
you'll notice that the methods are generally short and simple. Of course not all
the functionality required is provided since this is only a proof of concept.
The great gain I believe is that a new developer should not have to learn a
pretty complex and large object model in order to write code for further luxor
improvement.
5)Easier porting to other toolkits. This I count as the greatest benefit.
Recently I was looking to the java binding of wxWidgets toolkit (a cross
platform toolkit implemented in C++). In order to implement a port to an other
toolkit is not needed to duplicate the classes hierarchy which exist for the
swing, but simply implement the abstract methods of the generated class. I
estimate that the effort is far smaller.
6)Porting for other devices. This is a pure speculation because I have no
experience with small devices like cellular phones and the like. However, if
such a device can not support an XML parser due to the memory used by the object
model it generates, by modifying the template used for the code generation
system, a new implementation can be achieved which does not use xml for the gui
description, but a less memory demanding way. I recall there are other ways to
describe the GUI already (this was a post I red once but can't recall more
details). I didn't look at the implementation of those alternative ways of GUI
description but I speculate that a Document object was created from that
description and fed to luxor. Anyway, if the new approach achieves high
reduction of memory usage, we could hope to see luxor on those devices as well.
7)This is not really an advantage, but in order to add a new tag to luxor is
needed to modify the config.xml file (this should be easy), regenerate the base
class and if needed add some methods in the class which extends the generated
one. The effort needed should be equivalent (if not less) to the effort required
for the same task in the existing design.
8)Some tasks which could be achieved using Aspect programming or other
techniques can now be achieved by modifying the template the code generation
system uses. For example, if we wanted a LOG message whenever a new Element is
inspected we could modify the template.
9)The code generation system could be used for other tasks, like automatic dtd
generation.
Well this is all the advantages I could think of. Please have a look at the
config.xml file and the SwingXulManager* files.
One last comment. The code generation system produces methods like
setHeight(JComponent comp, int value) and the like. If the setHeight method
should be implemented differently for descendants of JComponent, you could
provide a method setHeight(JComponentDecendant comp, int value) and this method
will be called if the argument to the setHeight method is a JComponentDecendant
due to polymorphisms.
I'm looking forward for your comments.
Anakreon.
--------------010204040904070704080408
Content-Type: application/x-tar;
name="sample.tar.gz"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="sample.tar.gz"
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
tPLtyu3Kg+7pnu7pnu7pnq/4+X8oiWdVAJABAA==
--------------010204040904070704080408--
-------------------------------------------------------
This SF.Net email is sponsored by the new InstallShield X.
From Windows to Linux, servers to mobile, InstallShield X is the
one installation-authoring solution that does it all. Learn more and
evaluate today! http://www.installshield.com/Dev2Dev/0504