[jdom-interest] JDOMTreeModel

adam flinton aflinton at armature.com
Tue Jan 15 08:26:46 PST 2002


Dear JDOM People,

Please scroll down to the "JDOMTreeModel:" bit.



-----------------------------------------------------

Dear All,

After much work over the Xmas period......I have the Alpha of the XMLDBMS
Mapbuilder. Actually I had it a while ago but then work + home + a load of
things stopped me writing this document......

This has been build against: JDK 1.2.2_006, JDOM Beta 7. 

You will need to include your DB JDBC drivers .zip or .jar in your
classpath.


I am including the XMLDBMS version 1.1 code I have been working against (Ron
could you do a merge as I don't think I've changed anything in that). You
can get the JDOM code from www.jdom.org.

Also in the zip is my test Properties file (MapProps.txt) & a test
Settings.xml

You can get this code from the binaries newsgroup in news.barkto.com

Look for a posting called "XMLDBMS Mapbuilder Alpha 1".

The Server Code is in there as well.

I have used the Version 1 DTD as a base however it should be easily capable
of moving to any Map Document (or indeed any XML Document). 

The main thing which needs looking at (apart from Version 2.0 Support) is
simply Interfaces & where to use them so as to ensure that the Mapbuilder
can load the right classes to deal with a specific Document type (inc the
relevant Menu's, Actions, JInternalFrame Handlers etc). It's not much work
however I simply wanted to chuck this out so people could play (& possibly
even help). 

There is a completely updated Properties Editor which is hopefully a heck of
a lot better than the old one (& can cope with using different class'es for
version 1 & 2 etc.

The Properties editor is where any testing of mapfile,XSLT, JMS etc. is doen
from At the moment there is a mini "test" GUI which is again simply not
wired up yet because of time constraints. Again it is simple & should be
rapid.



The Mapbuilder is a MapDesigner. Again some bits aren't wired up (e.g. the
"links" view (i.e. a tree of classmaps held together by their relationships
with each other).

The DB part produces a fairly complete JDBC Picture as an XML Doc which you
can save etc. It acts as a Cache. Some things need to be actively selected
via it's JTree Menus (e.g. SchemaDetails has an Option to get all
procedures, an getting fileds etc for a given table requires a selection.)

Again many things are lurking e.g. Possibly not every element refreshes
correctly etc. Find the probs. 

The code that builds the XML view of your JDBC enabled DB is in:

org.xmlmiddleware.xmldbms.gui.treebuilder.JDBCTreeBuilder


How to Use:

It uses the Std Version 1.1 Properties interface as such to start the
MapBuilder you simply call (from my .bat file)

SET JARHOME=D:\aat\Jars

java -cp
%JARHOME%\xmldbms.jar;%JARHOME%\classes12.zip;%JARHOME%\db2java.zip;%JARHOME
%\xerces.jar;%JARHOME%\xalan.jar;%JARHOME%\jaxp.jar;%JARHOME%\jdom.jar;.;
org.xmlmiddleware.xmldbms.gui.mapbuilder.Mapbuilder File=MapProps.txt 


The PropertiesEditor can be started either from the MapBuilder or on it's
own e.g.


SET JARHOME=D:\aat\Jars


java -cp
%JARHOME%\xmldbms.jar;%JARHOME%\xerces.jar;%JARHOME%\xalan.jar;%JARHOME%\jax
p.jar;%JARHOME%\jdom.jar;.; org.xmlmiddleware.xmldbms.gui.PropertiesEditor
File=MapProps.txt 


It uses a settings file & can use a DBCache XML file thus in the Properties
File there are 2 new values:

settingsfile
e.g. settingsfile=D\:\\Move\\aat\\Settings.xml

If this is not set then it will look into it's local dir for a file called
Settings.xml
If this is not found then it will create a new (blank) settings file
And 

dbfile
e.g. dbfile=D\:\\Move\\aat\\db.xml

If this is not set then it will look into it's local dir for a file called
db.xml
If this is not found then it will create a new (blank) DBCache

I have not yet produced a DTD for the settings simply because I was not sure
it has been finished. If people want I will run my Settings.xml off against
a DTD from Document tool.

The Elements which I have Written JInternalFrames for are:

ClassMap - org.xmlmiddleware.xmldbms.gui.v1.ClassMap
IgnoreRoot - org.xmlmiddleware.xmldbms.gui.v1.IgnoreRoot
Options - org.xmlmiddleware.xmldbms.gui.v1.Options

Equally you can select a table from the JDBC view & create a std ClassMap.


What makes (hopefully) the whole thing so extensible??? Well as they say the
fewer the lines of code the more thought is required & what you're seeing
here is about version 8...where all the others were scrapped. The key is the
JDOMTreeModel.


JDOMTreeModel:

I have been looking at the JTree & JDOM. We have 2 different forms of XML
Mapfile (version 1.0 & 2.0) & thus I had to cope with the idea of multiple
Docs. Also I built some code which creates a JDOM/XML "picture" of a
Database using the JDBC DB & ResultSet Metadata & had a settings Doc thus I
had 4 Docs. So I wanted an easy & generic way to bind a JDOM/XML Doc to a
JTree.

Thus I have created a JDOMTreeModel which extends DefaultTreeModel.

It uses a class called ElementNode which extends BasicNode which in turn
extends javax.swing.tree.DefaultMutableTreeNode.

The BasicNode is there because at some point I may need other sorts of
Nodes.

An Element Node Contains that element. It also overloads a some methods e.g.
getName such that (in getName) it returns the Value in an element (if there
is one) or if there isn't then it returns the Element Name. It also has a
method called getElement which simply returns the element for that Node.

The best idea is to have a static Node as a field in your GUI Class that
whenever the mouse reports that a Node has been selected you simply set the
"hidden node" to the selected Node. This gives you a single point to query
against.

This makes doing any Swing/JTree based GUI using an XML Document as a base
so easy......

example:

//To setup a JTM - It is usefull to provide a root node when constructing
even if you are then going
// to replace it via the document you're feeding in. 

JDOMTreeModel JTM = new JDOMTreeModel(new ElementNode(new Element("Root")));

// You then feed in your JDOM Doc

JTM.setDoc(Doc);

// Then you simply use it as the Model for your JTree e.g.

JTree DBTree = new JTree();
DBTree.setModel(JTM);

& You're done.

Other stuff:

I have created a std TreeListener

public class BasicTreeListener
    extends java.awt.event.MouseAdapter
    implements
        javax.swing.event.TreeExpansionListener,
        javax.swing.event.TreeSelectionListener

Useage Example:

	BasicTreeListener BTL = new BasicTreeListener( getDBTree(),
getTreePopupMenu());

	getDBTree().addTreeExpansionListener( BTL );
	getDBTree().addTreeSelectionListener( BTL );
	getDBTree().addMouseListener( BTL );

	getDBTree().setEditable(false);


All you have left to do....is decide what menu's you want adding onto the
JTree & thus the ActionPerformed.

Please look at
org.xmlmiddleware.xmldbms.gui.mapbuilder.Mapbuilder.initTree()
&
org.xmlmiddleware.xmldbms.gui.mapbuilder.Mapbuilder.addMenus()
& finally
org.xmlmiddleware.xmldbms.gui.mapbuilder.Mapbuilder.actionPerformed(ActionEv
ent)


to see how to do this.

So if you want to build something which can view any JDOM Doc (& thus any
XML) as a JTree and then have menu actions coming off from the Tree it
couldn't get much easier. In essence your GUI can edit an Element (e.g. I am
using code within JInternalFrames) & then the JDOM Doc is automatically
updated.

Enjoy


Adam
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://jdom.org/pipermail/jdom-interest/attachments/20020115/c60b9692/attachment.htm


More information about the jdom-interest mailing list