There are also some metadata structures, those will vary at runtime.
For example, an XML fragment containing metadata like below:
<jdbc>
<source>
<driver class="jdbc.driver.ClassName" />
<connection url="jdbc:connection:url">
<user>user.name</user>
<password>user.passwd</password>
<property1>value1</property1>
<property2>value2</property2>
<property3>value3</property3>
</connection>
</source>
</jdbc>
This structure could be used to configure JDBC connections. Most of the
structure can be considered static, but the nodes nested under
jdbc/source/connection/
But this sets no difficulty for Meta Facility, just the following will read such a metadata structure.
Meta m = meta.getSubMeta("jdbc/source"); String drvClassName = m.getString("driver/@class"); Class.forName(drvClassName); url = m.getString("connection/@url"); Meta[] properties = m.getSubMetaArray("connection/*"); for (Meta p : properties) info.put(p.getName(), p.getString());This snippet is from av.rdb.ConnectionSource
The variables in blue are instance fields.
And the following will setup a JDBC connection properly:
public Connection getConnection() throws SQLException { return DriverManager.getConnection(url, info); }This snippet is from av.rdb.ConnectionSource
The variables in blue are instance fields.
For a more complicated example, to create popup menus from dynamic XML content.
To see a running result of the following sample, just visit The Official WoW Site or any other WoW site, start traversing there and click right mouse button to bring up a popup menu. -- That menu is created by the sample code below from the followed XML content.
You can obtain the full source code from The WoW Project.
Given the XML fragment as below:
<ui-structure> ..... <pop-up-menu> <!-- Define the common popup menu structure and group order here --> <group id="popHead" cascade="false"></group> <group id="toggleVis" display="toggleVisMenu" cascade="false" forceCascade="3"> <group id="toggleVisHead" cascade="false"></group> <group id="toggleVisTail" cascade="false"> <static command="toggleChildrenVisible" /> </group> </group> <group id="edit" display="editMenu" cascade="false" forceCascade="5" mnemonic="E"> <group id="editSpecial" cascade="false" /> <group id="editHead" cascade="false" /> <group id="operation" cascade="false" /> <group id="clipboard" cascade="false" /> </group> <group id="insert" display="insertMenu" mnemonic="I" cascade="true" forceTile="0" /> <group id="format" display="formatMenu" mnemonic="F" cascade="true" forceTile="3" /> <group id="delete" display="deleteMenu" mnemonic="D" cascade="false" forceCascade="3" /> <group id="info" display="infoMenu" cascade="false" forceCascade="3" mnemonic="N"> <group id="hist" display="histInfoMenu" cascade="false" forceCascade="4" mnemonic="H" /> </group> <group id="logon" display="logonMenu" mnemonic="O" cascade="true" forceTile="3"> <dynamic class="av.wow.traverser.actions.dynamic.UserAccountActions" /> <static command="register" mnemonic="G" /> </group> <group id="export" display="exportMenu" mnemonic="X" cascade="true" forceTile="1"> <static command="shotPic" mnemonic="S" /> <static command="print" mnemonic="P" /> </group> <group id="help" display="helpMenu" mnemonic="H" cascade="false"> <static command="aboutWoW" mnemonic="U" /> <static command="aboutSite" mnemonic="H" /> </group> </pop-up-menu> </ui-structure> <type-structure> <!-- Define type specific menu structures here, they'll be emerged into the group structures defined inside [ui-structure] at above, regarding the predefined group orders there. --> <av.wow.data.TheIdea> <group id="popHead"> <static command="openInNewWin" /> <static command="refresh" /> </group> <group id="toggleVis"> <group id="toggleVisHead"> <static command="toggleTagsVisible-security" /> </group> </group> <group id="edit"> <group id="editHead"> <static command="startEditing" /> </group> <group id="clipboard"> <static command="clip" /> <static command="moveHere" /> <static command="linkHere" /> <static command="pasteCopyHere" /> </group> <group id="placement" display="placementMenu" cascade="false" forceTile="5" mnemonic="P"> <static command="moveUp" /> <static command="moveDown" /> <static command="putLeft" /> <static command="putRight" /> </group> <group id="delete"> <static command="delete" /> </group> </group> <group id="insert"> <group id="nestedIdea" display="nestedIdea" mnemonic="N" cascade="true" separated="false"> <dynamic class="av.wow.traverser.actions.dynamic.AppendLeftRightIdeaActions" /> </group> <group id="parentIdea" display="parentIdea" mnemonic="P" cascade="true" separated="false"> <dynamic class="av.wow.traverser.actions.dynamic.InsertIdeaActions" /> </group> <group id="siblingIdea" display="siblingIdea" mnemonic="S" cascade="true" separated="false"> <dynamic class="av.wow.traverser.actions.dynamic.AppendUnderAboveIdeaActions" /> </group> </group> <group id="format"> <select command="setAppearance-" display="appearanceMenu" mnemonic="P" cascade="true" separated="false"> <choice value="bubble" display="bubbleAppearance" mnemonic="B" /> <choice value="fork" display="forkAppearance" mnemonic="F" /> <choice value="inherit" display="inheritAppearance" mnemonic="I" /> </select> <group id="font" display="fontMenu" mnemonic="F" cascade="true" separated="false"> <dynamic class="av.wow.traverser.actions.dynamic.SetFontActions" /> </group> <group id="color" display="colorMenu" mnemonic="C" cascade="true" separated="false"> <dynamic class="av.wow.traverser.actions.dynamic.SetColorActions" /> </group> <group id="bgColor" display="bgColorMenu" mnemonic="B" cascade="true" separated="false"> <dynamic class="av.wow.traverser.actions.dynamic.SetBgColorActions" /> </group> <group id="clear" cascade="false" separated="true"> <static command="clearFormats" /> </group> </group> <group id="info"> <group id="hist"> <static command="showHist" /> </group> </group> </av.wow.data.TheIdea> <av.wow.data.TheTopic> <group id="toggleVis"> <group id="toggleVisHead"> <static command="showMsgWin" /> <static command="hideMsgWin" /> </group> </group> <group id="edit"> <group id="editSpecial"> <dynamic class="av.wow.traverser.actions.dynamic.SetInheritPermissionsActions" /> </group> </group> <group id="info"> <group id="hist"> <static command="showMsgHist" /> </group> </group> </av.wow.data.TheTopic> <av.wow.data.ThePicture> <group id="edit"> <group id="editSpecial"> <static command="pastePic" /> </group> </group> </av.wow.data.ThePicture> <av.wow.data.TheSubject> <group id="edit"> <group id="editSpecial"> <static command="changeTitle" mnemonic="T" /> </group> </group> </av.wow.data.TheSubject> ..... .....This snippet is from
traverser/meta/av/wow/traverser/actions.metaof The WoW Project.
The following code snippet is to construct an ActionGroup
object by reading a nested structure:
public ActionGroup(WebTraverser traverser, ActionMap actMap, Meta m) { try { id = m.getStringAttribute("id"); } catch (MetaNotFoundException e) { } try { display = m.getStringAttribute("display"); } catch (MetaNotFoundException e) { } try { cascade = m.getBooleanAttribute("cascade"); } catch (MetaNotFoundException e) { } try { separated = m.getBooleanAttribute("separated"); } catch (MetaNotFoundException e) { } try { forceCascade = m.getIntegerAttribute("forceCascade"); } catch (MetaNotFoundException e) { } try { forceTile = m.getIntegerAttribute("forceTile"); } catch (MetaNotFoundException e) { } try { String mnemonicKey = m.getStringAttribute("mnemonic"); KeyStroke ks = KeyStroke.getKeyStroke(mnemonicKey); if (ks != null) mnemonic = ks.getKeyCode(); else msgr.warn(UNKNOWN_MNEMONIC_KEY, "key", mnemonicKey); } catch (MetaNotFoundException e) { } try { Meta[] sms = m.getSubMetaArray("*"); for (Meta sm : sms) { String name = sm.getName(); if ("group".equals(name)) { subsets.add(new ActionGroup(traverser, actMap, sm)); } else if ("dynamic".equals(name)) { String className = sm.getStringAttribute("class"); try { Class<?> klass = Class.forName(className); DynamicActionSet das = (DynamicActionSet) klass .newInstance(); das.bind2(traverser); subsets.add(das); } catch (Exception e) { msgr.warn(e, DYNAMIC_CLASS_ERROR, "class", className); } } else if ("select".equals(name)) { subsets.add(new RadioSet(actMap, sm)); } else if ("static".equals(name)) { String command = sm.getStringAttribute("command"); Action a = actMap.get(command); if (a != null) { int mnemonic = 0; try { String mnemonicKey = sm .getStringAttribute("mnemonic"); KeyStroke ks = KeyStroke.getKeyStroke(mnemonicKey); if (ks != null) mnemonic = ks.getKeyCode(); else msgr.warn(UNKNOWN_MNEMONIC_KEY, "key", mnemonicKey); } catch (MetaNotFoundException e) { } subsets.add(new StaticCommand(a, mnemonic)); } else { msgr.warn(UNDEFINED_COMMAND, "cmd", command); } } else { msgr.warn(UNKNOWN_ACTION_ELEMENT, "name", sm.getName(), "loc", sm.getLocation()); } } } catch (MetaNotFoundException e) { } }This snippet is from
traverser/src/av/wow/traverser/actions/menu/ActionGroup.javaof The WoW Project.