532
Appendix C Source Code for bonForum Web Application
if(pathToSubTreeRootNode == null || pathToSubTreeRootNode.length() <
1) {
pathToSubTreeRootNode = “”;
}
parentNodeInDestination = parentNodeInDestination.trim();
if(parentNodeInDestination == null || parentNodeInDestination.length()
< 1) {
parentNodeInDestination = “things”;
}
// parse document
try {
DOMParser parser = new DOMParser();
parser.parse(xmlUri);
Document document = parser.getDocument();
try {
loadForumXML(pathToSubTreeRootNode,
parentNodeInDestination, document, “pathNameHashtable”, sessionId);
}
catch(Exception ee) {
log(sessionId, “err”, “caught exception trying to load
into bonForumXML: “+ xmlUri);
}
}
catch(Exception ex) {
log(sessionId, “err”, “caught exception trying to parse: “ +
xmlUri);
}
}
/** Loads XML from URI into “bonBufferXML” ForestHashtable member.
*
*
* @param pathToSubTreeRootNode String
* @param xmlUri String
* @param nodeKeyHashtableName String
* @param sessionId String
*/
protected void loadBufferXMLFromURI(String pathToSubTreeRootNode, String
parentNodeInDestination, String xmlUri, String nodeKeyHashtableName, String
sessionId) {
pathToSubTreeRootNode = pathToSubTreeRootNode.trim();
if(pathToSubTreeRootNode == null || pathToSubTreeRootNode.length() <
1) {
pathToSubTreeRootNode = “”;
}
parentNodeInDestination = parentNodeInDestination.trim();
if(parentNodeInDestination == null || parentNodeInDestination.length()
< 1) {
parentNodeInDestination = “things”;
}
// parse document
try {
15 1089-9 XC 6/26/01 7:40 AM Page 532
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
533
C.17 Filename: Projects\bonForum\src\de\tarent\forum\BonForumStore.java
DOMParser parser = new DOMParser();
parser.parse(xmlUri);
Document document = parser.getDocument();
try {
loadBufferXML(pathToSubTreeRootNode,
parentNodeInDestination, document, “pathNameHashtable”, sessionId);
}
catch(Exception ee) {
log(sessionId, “err”, “caught exception trying to load
into bonBufferXML: “+ xmlUri);
}
}
catch(Exception ex) {
log(sessionId, “err”, “caught exception trying to parse: “ +
xmlUri);
}
}
/** Loads XML from DOM node into “bonForumXML” ForestHashtable member.
*
*
* @param pathToSubTreeRootNode String
* @param parentNodeInDestination String
* @param node Node
* @param nodeKeyHashtableName String
* @param sessionId String
*/
protected void loadForumXML(String pathToSubTreeRootNode, String
parentNodeInDestination, Node node, String nodeKeyHashtableName, String sessionId)
{
Object parentNodeKey = null;
String nodeKeyPathName = “”;
boolean foundParentNodeKey = true; // assume success
if(parentNodeInDestination.equals(“actors”)) {
parentNodeKey = (Object)getActorsNodeKey();
}
else if(parentNodeInDestination.equals(“actions”)) {
parentNodeKey = (Object)getActionsNodeKey();
}
else if(parentNodeInDestination.equals(“things”)) {
parentNodeKey = (Object)getThingsNodeKey();
}
else {
if
(getBonForumXML().getNodeNameHashtable().containsKey(parentNodeInDestination)) {
parentNodeKey =
getBonForumXML().getNodeNameHashtable().get(parentNodeInDestination);
}
else {
foundParentNodeKey = false;
}
}
15 1089-9 XC 6/26/01 7:40 AM Page 533
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
534
Appendix C Source Code for bonForum Web Application
if(parentNodeKey != null && foundParentNodeKey) {
try {
// needs test and finishing, especially
pathToSubTreeRootNode argument
loadXMLSubTreeIntoForestHashtable(node, parentNodeKey,
bonForumXML, nodeKeyPathName, nodeKeyHashtableName, sessionId);
}
catch(Exception ee) {
log(sessionId, “err”, “loadForumXML() caught Exception
invoking loadXMLSubTreeIntoForestHashtable()”);
}
}
}
/** Loads XML from DOM node into the bonBufferXML ForestHashtable.
*
*
* @param pathToSubTreeRootNode String
* @param parentNodeInDestination String
* @param node Node
* @param nodeKeyHashtableName String
* @param sessionId String
*/
protected void loadBufferXML(String pathToSubTreeRootNode, String
parentNodeInDestination, Node node, String nodeKeyHashtableName, String sessionId)
{
Object parentNodeKey = null;
String nodeKeyPathName = “”;
boolean foundParentNodeKey = true; // assume success
if(parentNodeInDestination.equals(“actors”)) {
parentNodeKey = (Object)getBufferActorsNodeKey();
}
else if(parentNodeInDestination.equals(“actions”)) {
parentNodeKey = (Object)getBufferActionsNodeKey();
}
else if(parentNodeInDestination.equals(“things”)) {
parentNodeKey = (Object)getBufferThingsNodeKey();
}
else {
if
(bonBufferXML.getNodeNameHashtable().containsKey(parentNodeInDestination)) {
parentNodeKey =
bonBufferXML.getNodeNameHashtable().get(parentNodeInDestination);
}
else {
foundParentNodeKey = false;
}
}
if(parentNodeKey != null && foundParentNodeKey) {
try {
// needs test and finishing, especially
pathToSubTreeRootNode argument
15 1089-9 XC 6/26/01 7:40 AM Page 534
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
535
C.17 Filename: Projects\bonForum\src\de\tarent\forum\BonForumStore.java
loadXMLSubTreeIntoForestHashtable(node, parentNodeKey,
bonBufferXML, nodeKeyPathName, nodeKeyHashtableName, sessionId);
}
catch(Exception ee) {
log(sessionId, “err”, “loadBufferXML() caught Exception
invoking loadXMLSubTreeIntoForestHashtable()”);
}
}
}
/** Loads the specified node, recursively, into a ForestHashtable.
* NOTE: only loads element nodes with attributes, and any text node
children.
*
* @param node Node
* @param parentNodeKey Object
* @param forestHashtable ForestHashtable
* @param nodeKeyPathName String
* @param nodeKeyHashtableName String
* @param sessionId String
*/
protected void loadXMLSubTreeIntoForestHashtable(Node node, Object
parentNodeKey, ForestHashtable forestHashtable, String nodeKeyPathName, String
nodeKeyHashtableName, String sessionId) {
String nodeName = “”;
String nodeAttributes = “”;
String nodeContent = “”;
Object nextParentNodeKey = parentNodeKey;
String pathName = “”;
if ( node == null ) {
return;
}
// the ForestHashtable instance must exist for this method to work
int type = node.getNodeType();
switch(type) {
// process document node
case Node.DOCUMENT_NODE: {
loadXMLSubTreeIntoForestHashtable(((Document)node).getDocumentElement(),
parentNodeKey, forestHashtable, nodeKeyPathName, nodeKeyHashtableName, sessionId);
break;
}
// process element with attributes, and also get text nodes for content
case Node.ELEMENT_NODE: {
nodeName = node.getNodeName();
// LATER: here can wait for element named by
pathToSubTreeRootNode, ignoring ancestors
Attr attrs[] =
BonForumUtils.sortAttributes(node.getAttributes());
nodeAttributes = “”;
for ( int i = 0; i < attrs.length; i++ ) {
Attr attr = attrs[i];
15 1089-9 XC 6/26/01 7:40 AM Page 535
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
536
Appendix C Source Code for bonForum Web Application
nodeAttributes += (“ “);
nodeAttributes += (attr.getNodeName());
nodeAttributes += (“=\””);
nodeAttributes += (normalize(attr.getNodeValue()));
nodeAttributes += (“\””);
}
// adds node and gets its nodeKey
BonNode bonNode;
bonNode = forestHashtable.addChildNodeToNonRootNode(nodeName,
nodeAttributes, nodeContent, (NodeKey)parentNodeKey, nodeKeyHashtableName,
sessionId);
nextParentNodeKey =
(Object)forestHashtable.nodeKeyFromBonNode(bonNode);
// optionally save nodeKey in a hashtable to use for fast
lookups, pathname sorting, etc.
if(nodeKeyHashtableName != null && nodeKeyHashtableName != “”) {
if(nodeKeyHashtableName.equals(“pathNameHashtable”)) {
// here optionally save nodeKey with a pathName key
// only save descendants of bonForum.things.subjects
if (nodeKeyPathName.equals(“”)) {
if( (!(nodeName.equals(“bonForum”))) &&
(!(nodeName.equals(“things”))) &&
(!(nodeName.equals(“subjects”))) ) {
nodeKeyPathName = nodeName;
}
}
else {
// build the pathName by concatenating node
just added
nodeKeyPathName = nodeKeyPathName + “.” +
nodeName;
}
if(!nodeKeyPathName.equals(“”)) {
forestHashtable.getPathNameHashtable().put(nodeKeyPathName, nextParentNodeKey);
}
}
else {
// later we can add other types of hashtables here
}
}
// here we get text nodes for our content, and recursively visit
element descendants
// we are ignoring ENTITY_REFERENCE_NODE, CDATA_SECTION_NODE,
PROCESSING_INSTRUCTION_NODE
NodeList children = node.getChildNodes();
if ( children != null ) {
int len = children.getLength();
for ( int i = 0; i < len; i++ ) {
// get text if any, else recursively visit element
children
15 1089-9 XC 6/26/01 7:40 AM Page 536
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
537
C.17 Filename: Projects\bonForum\src\de\tarent\forum\BonForumStore.java
int nodeType = children.item(i).getNodeType();
if(nodeType == Node.TEXT_NODE) {
nodeContent += “ “ +
normalize(children.item(i).getNodeValue().trim());
}
else if(nodeType == Node.ELEMENT_NODE) {
// recursion to visit all subnodes
loadXMLSubTreeIntoForestHashtable(children.item(i),
nextParentNodeKey, forestHashtable, nodeKeyPathName, nodeKeyHashtableName,
sessionId);
}
}
}
// edit the node to add content from text node
nodeContent = nodeContent.trim();
if(nodeContent.length() > 0) {
NodeKey nk =
getBonForumXML().editBonNode((NodeKey)(nextParentNodeKey), null, null,
nodeContent);
}
break;
} // end case Node.ELEMENT_NODE
} // end switch
}
/** Adds a node to “bonForumXML” ForestHashtable member.
*
* @param command = “bonAddElement” (others could follow)
* @param parentNodeKeyKey String
* @param nameAndAttributes String
* @param content String
* @param forestHashtableName String
* @param nodeKeyHashtableName String
* @param sessionId String
* @return Object that can be cast to a NodeKey
*/
protected Object add(String command, String parentNodeKeyKey, String
nameAndAttributes, String content, String forestHashtableName, String
nodeKeyHashtableName, String sessionId) {
BonNode bonNode = new BonNode();
NodeKey nonRootNodeKey = new NodeKey();
nonRootNodeKey = (NodeKey)addNode(bonNode, nonRootNodeKey,
command, parentNodeKeyKey, nameAndAttributes, content, forestHashtableName,
nodeKeyHashtableName, sessionId);
return (Object)(nonRootNodeKey);
}
/** Adds a node to “bonBufferXML” ForestHashtable member.
*
* @param command = “bonAddElement” (others could follow)
* @param parentNodeKeyKey String
* @param nameAndAttributes String
* @param content String
15 1089-9 XC 6/26/01 7:40 AM Page 537
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
538
Appendix C Source Code for bonForum Web Application
* @param forestHashtableName String
* @param nodeKeyHashtableName String
* @param sessionId String
* @return Object that can be cast to a NodeKey
*/
protected Object addToBuffer(String command, String parentNodeKeyKey, String
nameAndAttributes, String content, String forestHashtableName, String
nodeKeyHashtableName, String sessionId) {
BonNode bonNode = new BonNode();
NodeKey nonRootNodeKey = new NodeKey();
nonRootNodeKey = (NodeKey)addNode(bonNode, nonRootNodeKey,
command, parentNodeKeyKey, nameAndAttributes, content, forestHashtableName,
nodeKeyHashtableName, sessionId);
return (Object)(nonRootNodeKey);
}
/** Adds a node to “bonForumXML”, or “bonBufferXML”, or other
ForestHashtable.
*
* @param bonNode BonNode
* @param nonRootNodeKey NodeKey
* @param command String =”bonAddElement”
(others could follow)
* @param parentNodeKeyKey String
* @param nameAndAttributes String
* @param content String
* @param forestHashtableName String
* @param nodeKeyHashtableName String
* @param sessionId String
* @return Object that can be cast to a NodeKey
*/
protected Object addNode(BonNode bonNode, NodeKey nonRootNodeKey, String
command, String parentNodeKeyKey, String nameAndAttributes, String content, String
forestHashtableName, String nodeKeyHashtableName, String sessionId) {
boolean fast = false;
ForestHashtable forestHashtable;
if(forestHashtableName.equals(“bonForumXML”)) {
forestHashtable = bonForumXML;
if (parentNodeKeyKey.equals(“actors”)) {
nonRootNodeKey = getActorsNodeKey();
fast = true;
}
else if (parentNodeKeyKey.equals(“actions”)) {
nonRootNodeKey = getActionsNodeKey();
fast = true;
}
else if (parentNodeKeyKey.equals(“things”)) {
nonRootNodeKey = getThingsNodeKey();
fast = true;
}
}
else if(forestHashtableName.equals(“bonBufferXML”)) {
15 1089-9 XC 6/26/01 7:40 AM Page 538
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
539
C.17 Filename: Projects\bonForum\src\de\tarent\forum\BonForumStore.java
forestHashtable = bonBufferXML;
if (parentNodeKeyKey.equals(“actors”)) {
nonRootNodeKey = getBufferActorsNodeKey();
fast = true;
}
else if (parentNodeKeyKey.equals(“actions”)) {
nonRootNodeKey = getBufferActionsNodeKey();
fast = true;
}
else if (parentNodeKeyKey.equals(“things”)) {
nonRootNodeKey = getBufferThingsNodeKey();
fast = true;
}
}
else {
forestHashtable = null;
}
if (command.equals(“bonAddElement”)) {
try {
if(!fast) { // not a “fast” parent nodeKey
//
// There are two possibilities (more later):
//
// 1. The parentNodeKey is saved in
nodeNameHashtable.
// The parentNodeKeyKey format has one of two
formats:
//
// The first format is:
//
sessionID_creationTimeMillis:parentElementName
// (e.g.,
“To1012mC7576871324604071At:985400336097:chat”)
//
// The second format is:
// sessionID:parentElementName
// (e.g.,
“To1012mC7576871324604071At:messageKey”)
//
// 2. The parentNodeKey is saved in
pathNameHashtable.
// The parentNodeKeyKey used is the pathName to
the
// subject node (e.g.,
“Vehicles.Motorcycles.Triumph”).
//
// If the parentNodeKeyKey is not “actors”,
“actions”, “things”,
// then the parentNodeKeyKey is a key into a
Hashtable
// with the name nodeKeyHashtableName
15 1089-9 XC 6/26/01 7:40 AM Page 539
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
540
Appendix C Source Code for bonForum Web Application
//
if(nodeKeyHashtableName.equals(“pathNameHashtable”))
{
if(forestHashtable.getPathNameHashtable().containsKey(parentNodeKeyKey)) {
nonRootNodeKey =
(NodeKey)forestHashtable.getPathNameHashtable().get(parentNodeKeyKey);
}
else {
log(sessionId, “err”, “add() DID NOT FIND
parentNodeKeyKey IN pathNameHashtable: “ + parentNodeKeyKey);
}
}
// The key should be in <sessionId:nodeName> format
// we could later check the incoming sessionId
prefix is valid
// using isRequestedSessionIdValid(prefix)
else if
(nodeKeyHashtableName.equals(“nodeNameHashtable”)) {
String temp = “” +
forestHashtable.getNodeNameHashtable().size();
if
(forestHashtable.getNodeNameHashtable().containsKey(parentNodeKeyKey)) {
nonRootNodeKey =
(NodeKey)forestHashtable.getNodeNameHashtable().get(parentNodeKeyKey);
}
else {
log(sessionId, “err”, “add() DID NOT
FIND parentNodeKeyKey IN nodeNameHashtable: “ + parentNodeKeyKey);
}
}
else {
log(sessionId, “err”, “UNRECOGNIZED
nodeKeyHashtableName in add(): “ + parentNodeKeyKey);
}
}
try {
if(nonRootNodeKey != null) {
if(nonRootNodeKey.aKey != null &&
nonRootNodeKey.aKey.length() > 0) {
String name = “”;
String attributes = “”;
if(nameAndAttributes == null) {
nameAndAttributes = “”;
}
int inx =
nameAndAttributes.trim().indexOf(‘ ‘);
if (inx > -1) { // space between name and
attributes
name =
nameAndAttributes.substring(0, inx);
15 1089-9 XC 6/26/01 7:40 AM Page 540
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
541
C.17 Filename: Projects\bonForum\src\de\tarent\forum\BonForumStore.java
attributes =
nameAndAttributes.substring(inx).trim();
}
else {
name = nameAndAttributes;
}
bonNode =
forestHashtable.addChildNodeToNonRootNode(name, attributes, content,
nonRootNodeKey, nodeKeyHashtableName, sessionId);
}
}
}
catch (Exception ex) {
log(sessionId, “err”, “addChildNodeToNonRootNode()
caused exception in add()”);
}
}
catch (Exception ee) {
log(sessionId, “err”, “Exception in add()”);
}
}
return (Object)(bonNode.nodeKey);
}
/** Removes a (session-dependent) node from “bonForumXML” ForestHashtable
member.
* @param command String = “bonRemoveElement” (others later)
* @param nodeKeyKey String
* @param leafOnly String if uppercased is “TRUE” nodes with
children not removed
* @param forestHashtableName String
*/
protected void remove(String command, String nodeKeyKey, String leafOnly,
String forestHashtableName) {
removeNode (command, nodeKeyKey, leafOnly, forestHashtableName);
}
/** Removes a (session-dependent) node from “bonBufferXML” ForestHashtable
member.
* @param command String = “bonRemoveElement” (others later)
* @param nodeKeyKey String
* @param leafOnly String if uppercased is “TRUE” nodes with
children not removed
* @param forestHashtableName String
*/
protected void removeFromBuffer(String command, String nodeKeyKey, String
leafOnly, String forestHashtableName) {
removeNode (command, nodeKeyKey, leafOnly, forestHashtableName);
}
/** Removes a node from a ForestHashtable.
* (for now: only non-global nodes removed)
* @param command String = “bonRemoveElement” (others later)
* @param nodeKeyKey String
15 1089-9 XC 6/26/01 7:40 AM Page 541
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
542
Appendix C Source Code for bonForum Web Application
* @param leafOnly String if uppercased is “TRUE” nodes with
children not removed
* @param forestHashtableName String
*/
protected void removeNode (String command, String nodeKeyKey, String
leafOnly, String forestHashtableName) {
NodeKey nonRootNodeKey = new NodeKey();
boolean fast = false;
// For now: just a choice between existing ForestHashtable instances
ForestHashtable forestHashtable = null;
if(forestHashtableName.equals(“bonForumXML”)) {
forestHashtable = bonForumXML;
if (nodeKeyKey.equals(“actors”)) {
nonRootNodeKey = getActorsNodeKey();
fast = true;
}
else if (nodeKeyKey.equals(“actions”)) {
nonRootNodeKey = getActionsNodeKey();
fast = true;
}
else if (nodeKeyKey.equals(“things”)) {
nonRootNodeKey = getThingsNodeKey();
fast = true;
}
}
else if(forestHashtableName.equals(“bonBufferXML”)) {
if (nodeKeyKey.equals(“actors”)) {
nonRootNodeKey = getBufferActorsNodeKey();
fast = true;
}
else if (nodeKeyKey.equals(“actions”)) {
nonRootNodeKey = getBufferActionsNodeKey();
fast = true;
}
else if (nodeKeyKey.equals(“things”)) {
nonRootNodeKey = getBufferThingsNodeKey();
fast = true;
}
}
NodeKey nodeKey = new NodeKey();
if (command.equals(“bonRemoveElement”)) {
try {
if(!fast) {
// does not have a “fast” global parent nodeKey
// For now, only non-fast nodes can be removed!
//
// Each NodeKey instance is saved in
nodeNameHashtable.
// “fast” nodes have a nodeKeyKey of
// “actors”, “actions”, or “things”,
// “non-fast” nodes hava a nodeKeyKey
15 1089-9 XC 6/26/01 7:40 AM Page 542
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
543
C.17 Filename: Projects\bonForum\src\de\tarent\forum\BonForumStore.java
// (a key into the nodeNameHashtable)
// with a key format that is either:
// sessionId_creationTimeInMillis:nodeName
// or, optionally:
// sessionId:nodeName
// We could later check the incoming sessionId
prefix
// is valid using isRequestedSessionIdValid(prefix)
if
(forestHashtable.getNodeNameHashtable().containsKey(nodeKeyKey)) {
nodeKey =
(NodeKey)forestHashtable.getNodeNameHashtable().get(nodeKeyKey);
}
}
try {
if(nodeKey.aKey != null && nodeKey.aKey.length() >
0) {
boolean deleteLeafOnly = false;
if(leafOnly.equalsIgnoreCase(“TRUE”)) {
deleteLeafOnly = true;
}
forestHashtable.deleteNode((NodeKey)nodeKey,
deleteLeafOnly);
}
}
catch (Exception ex) {
log(sessionId, “err”, “deleteNode() caused exception
in remove()”);
}
}
catch (Exception ee) {
log(sessionId, “err”, “Exception in remove()”);
}
}
}
/** Gets the NodeKey for a pathName in a pathNameHashtable.
* (The NodeKey for each element in the “subjects” subtree
* is also in a pathNameHashtable, with a pathName key).
*
* @param pathName String
* @param pathNameHashtable PathNameHashtable
* @return NodeKey for the pathName
*/
protected NodeKey subjectNodeKeyFromPathName(String pathName,
PathNameHashtable pathNameHashtable) {
return (NodeKey)pathNameHashtable.get(pathName);
}
/** Returns the BonNode for a subject from a ForestHashtable.
* (The subject pathName is a key value for a NodeKey in a
PathNameHashtable).
*
15 1089-9 XC 6/26/01 7:40 AM Page 543
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
544
Appendix C Source Code for bonForum Web Application
* @param pathName String
* @param pathNameHashtable PathNameHashtable
* @param forestHashtable ForestHashtable
* @return NodeKey for the pathName
*/
protected BonNode subjectBonNodeFromPathName(String pathName,
PathNameHashtable pathNameHashtable, ForestHashtable forestHashtable) {
NodeKey nodeKey = subjectNodeKeyFromPathName(pathName,
pathNameHashtable);
if(forestHashtable.getNodeNameHashtable().contains(nodeKey)) {
return (BonNode)forestHashtable.get(nodeKey);
}
else {
return(null);
}
}
/** Returns the pathName to a NodeKey in a ForestHashtable.
*
* @param nodeKey NodeKey
* @param forestHashtable ForestHashtable
* @return The pathName for the nodeKey as a String
*/
public String pathNameFromNodeKey(NodeKey nodeKey, ForestHashtable
forestHashtable)
{
String temp = “”;
BonNode bonNode;
NodeKey parentNodeKey;
try {
bonNode = forestHashtable.getBonNode(nodeKey);
temp = bonNode.nodeName;
parentNodeKey = bonNode.parentNodeKey;
boolean done = false;
while (!done) {
if(bonNode.parentNodeKey.aKey.equals(“”)) {
done = true;
break;
}
else {
bonNode = forestHashtable.getBonNode(parentNodeKey);
temp = bonNode.nodeName + “.” + temp;
parentNodeKey = bonNode.parentNodeKey;
}
}
}
catch(Exception ee) {
log(sessionId, “err”, “Exception caught in
pathNameFromNodeKey()”);
}
return temp;
}
15 1089-9 XC 6/26/01 7:40 AM Page 544
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
545
C.17 Filename: Projects\bonForum\src\de\tarent\forum\BonForumStore.java
/** Returns the pathKey to a NodeKey in a ForestHashtable.
* A pathKey is made up of the combined nodeKeys of all the nodes from the
root
* to the nodeKey argument.
* Each nodeKey is a triple-valued key used by a ForestHashtable.
* An Example of a pathKey is:
* 238493049323-384930493039-584954059453.463748293847-564738473623-
827347382374
* The nodeKeys is a pathKey are separated by a period, ‘.’, and the
* AKey, BKey and CKey in each nodeKey are separated by a dash, ‘-’.
*
* @param nodeKey NodeKey
* @param forestHashtable ForestHashtable
* @return The pathKey for the nodeKey as a String
*/
public String pathKeyFromNodeKey(NodeKey nodeKey, ForestHashtable
forestHashtable) {
String temp = “”;
BonNode bonNode;
NodeKey parentNodeKey;
try {
bonNode = forestHashtable.getBonNode(nodeKey);
temp = bonNode.nodeKey.aKey + “-” + bonNode.nodeKey.bKey + “-” +
bonNode.nodeKey.cKey;
parentNodeKey = bonNode.parentNodeKey;
boolean done = false;
while (!done) {
bonNode = forestHashtable.getBonNode(parentNodeKey);
temp = bonNode.nodeKey.aKey + “-” + bonNode.nodeKey.bKey +
“-” + bonNode.nodeKey.cKey + “.” + temp;
if(bonNode.parentNodeKey.aKey.equals(“”)) {
done = true;
break;
}
else {
parentNodeKey = bonNode.parentNodeKey;
}
}
}
catch(Exception ee) {
log(sessionId, “err”, “Exception caught in
pathKeyFromNodeKey()”);
}
return temp;
}
/** Outputs pathNames and nodeKeys from a bonForumXML subTree as a TreeMap.
* (except for chatItems!).
* The TreeMap can be used as a sorted list of the paths to all the nodes.
*
* NOTE: if you need method to output chatItem elements,
* You can add an option arg to do that!
15 1089-9 XC 6/26/01 7:40 AM Page 545
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
546
Appendix C Source Code for bonForum Web Application
* (chatItem elements have names that are equal to:
* “sessionID_” + chatCreatorHostSessionId +
chatNodeCreationTimeInMillis),
*
* @param command String (unused, available argument)
* @param pathToSubTreeRootNode String
* @param option1 String (reserved argument)
* @param option2 String (reserved argument)
* @return TreeMap
*/
protected TreeMap outputForumPathNames(String command, String
pathToSubTreeRootNode, String option1, String option2) {
// the command argument can later be used to provide tag-visible sub-
types of this method
if(!command.equals(“bonForumXML”)) {
if(command.equals(“bonBufferXML”)) {
return outputBufferPathNames(command,
pathToSubTreeRootNode, option1, option2);
}
else {
TreeMap errorTreeMap = new TreeMap();
errorTreeMap.put(“0”, “::::::::::::error in
command::::::::::::::”);
return errorTreeMap; // later this error causes
exception?
}
}
log(sessionId, “err”, “Hello, outputForumPathNames!”);
BonNode bonNode = null;
NodeKey nodeKey = new NodeKey();
TreeMap outputTreeMap = new TreeMap();
Enumeration enumeration = getBonForumXML().elements();
while(enumeration.hasMoreElements()) {
bonNode = (BonNode)enumeration.nextElement();
nodeKey = bonNode.nodeKey;
// LATER: pass option2 to pathNameFromNodeKey to replace all but
last nodeName with nbsp, for example
// LATER: pass option3 to pathNameFromNodeKey as the separator
String pathName = pathNameFromNodeKey(nodeKey, bonForumXML);
// ASSUMPTION: if element has chatTopic attribute it is
chatItem,
// and we want to suppress these in users display of forum
pathNames (e.g., chat subjects)
if (pathToSubTreeRootNode != null &&
pathToSubTreeRootNode.length() > 0) {
if(bonNode.nodeAttributes.indexOf(“chatTopic=\””) < 0) {
if(pathName.indexOf(pathToSubTreeRootNode) == 0) {
// strip off leftmost nodes
pathName =
pathName.substring(pathToSubTreeRootNode.length());
// strip off period separator
15 1089-9 XC 6/26/01 7:40 AM Page 546
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
547
C.17 Filename: Projects\bonForum\src\de\tarent\forum\BonForumStore.java
if(pathName.indexOf(“.”) == 0) {
pathName = pathName.substring(1);
}
if(pathName.length() > 0) {
outputTreeMap.put(pathName,
nodeKey.aKey);
}
}
}
}
else {
if(pathName.length() > 0) {
outputTreeMap.put(pathName, nodeKey.aKey);
}
}
}
if(outputTreeMap.size()<1) {
outputTreeMap.put(“.”, “0”); // these are empty output return
values
}
log(sessionId, “err”, “Goodbye, outputForumPathNames!”);
return outputTreeMap;
}
/** Outputs pathNames and nodeKeys from a bonBufferXML subTree as a TreeMap.
* The TreeMap can be used as a sorted list of the paths to all the nodes.
*
* @param command String (reserved argument, available from
ChoiceTag)
* @param pathToSubTreeRootNode String
* @param option1 String (reserved argument, available from
ChoiceTag)
* @param option2 String (reserved argument, available from
ChoiceTag)
* @return TreeMap
*/
protected TreeMap outputBufferPathNames(String command, String
pathToSubTreeRootNode, String option1, String option2) {
// the command argument can later be used to provide tag-visible sub-
types of this method
BonNode bonNode = null;
NodeKey nodeKey = new NodeKey();
TreeMap outputTreeMap = new TreeMap();
Enumeration enumeration = bonBufferXML.elements();
while(enumeration.hasMoreElements()) {
bonNode = (BonNode)enumeration.nextElement();
nodeKey = bonNode.nodeKey;
// LATER: pass option2 to pathNameFromNodeKey to replace all but
last nodeName with nbsp, for example
// LATER: pass option3 to pathNameFromNodeKey as the separator
String pathName = pathNameFromNodeKey(nodeKey, bonBufferXML);
// LATER: add pathToSubTreeRootNode processing here (see
15 1089-9 XC 6/26/01 7:40 AM Page 547
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
548
Appendix C Source Code for bonForum Web Application
outputForumPathNames)
outputTreeMap.put(pathName, nodeKey.aKey);
}
if(outputTreeMap.size()<1) {
outputTreeMap.put(“.”, “0”); // these are empty output return
values
}
return outputTreeMap;
}
/** Outputs the messages in the session’s current chat from bonForumXML as a
TreeMap.
* The TreeMap can be used as a sorted list of the messages for that
session’s chat.
*
* @param command String (reserved argument, available from
ChoiceTag)
* @param option1 String (reserved argument, available from
ChoiceTag)
* @param option2 String (reserved argument, available from
ChoiceTag)
* @param option3 String (reserved argument, available from
ChoiceTag)
* @param session HttpSession (e.g.,
pageContext.getSession())
* @return TreeMap
*/
protected TreeMap outputForumChatMessages(String command, String option1,
String option2, String option3, HttpSession session) {
// the command argument can later be used to provide tag-visible sub-
types of this method
// the optionN arguments are available, also from ChoiceTag as attrN
if(!command.equals(“bonForumXML”)) {
if(command.equals(“bonBufferXML”)) {
return outputBufferChatMessages(command, option1, option2,
option3, session);
}
else {
TreeMap errorTreeMap = new TreeMap();
errorTreeMap.put(“0”, “::::::::::::error in
command::::::::::::::”);
return errorTreeMap; // later this error causes
exception?
}
}
String messageTimeMillis = “”;
BonNode bonNode = null;
TreeMap outputTreeMap = new TreeMap();
TreeMap tempTreeMap = new TreeMap(Collections.reverseOrder());
Enumeration enumeration = getBonForumXML().elements();
// get this session’s itemKey (chat subject category) from session
Attribute
15 1089-9 XC 6/26/01 7:40 AM Page 548
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
549
C.17 Filename: Projects\bonForum\src\de\tarent\forum\BonForumStore.java
String itemKey = normalize((String)session.getAttribute(“itemKey”));
if(itemKey.trim().length() < 1) {
log(sessionId, “err”, “outputForumChatMessages() ERROR: session
has no itemKey!”);
}
else {
// get all messages that have this chat’s itemKey
while(enumeration.hasMoreElements()) {
// get bonNode and its name, attributes and content
bonNode = (BonNode)enumeration.nextElement();
String name = bonNode.nodeName;
String attributes = bonNode.nodeAttributes;
String content = bonNode.nodeContent;
// if the bonNode is a message
if(name.equals(“message”)) {
/* THESE WERE DEBUGGING TESTS FOR getAttributeValue
// test value with escaped double quote in it (xml
error!)
String testStr =
getBonForumXML().getAttributeValue(attributes, “type”);
//log(sessionId, “”, “outputForumChatMessages(),
testStr: “ + testStr);
// test attribute value not there (programming
error)
testStr =
getBonForumXML().getAttributeValue(attributes, “notThere”);
//log(sessionId, “”, “outputForumChatMessages(),
testStr: “ + testStr);
// test value without closing double quote (xml
error)
testStr =
getBonForumXML().getAttributeValue(attributes, “test1”);
//log(sessionId, “”, “outputForumChatMessages(),
testStr: “ + testStr);
*/
// get itemKey attribute value
String messageItemKey =
getBonForumXML().getAttributeValue(attributes, “itemKey”);
if(messageItemKey == null) {
// error, handle later
log(sessionId, “err”,
“outputForumChatMessages(), ERROR! NO ItemKey found in message attributes!”);
continue;
}
// if its this session’s itemKey, it is also this
session’s chat
if(messageItemKey.equals(itemKey)) {
// get message timeMillis attribute value
messageTimeMillis =
getBonForumXML().getAttributeValue(attributes, “timeMillis”);
if(messageTimeMillis == null) {
15 1089-9 XC 6/26/01 7:40 AM Page 549
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
550
Appendix C Source Code for bonForum Web Application
// error, handle later
log(sessionId, “err”,
“outputForumChatMessages(), ERROR! NO timeMillis found in message attributes!”);
continue;
}
}
else {
continue;
}
// assume content is “<normalized actorNickname>:: “
followed by chatMessage
// put content in TreeMap with timeMillis as key
tempTreeMap.put(messageTimeMillis, content);
} // end if
} // end while
} // end else
// keep track of last message by its time
session.setAttribute(“lastMessageTimeMillis”, messageTimeMillis);
// should we make sure here that currentTimeMillis is > largest
messageTimeMillis?
// the TreeMap chatHistoryTreeMap now contains the sorted chat lines
// ready to be put into the “output” choiceTag attribute,
// in a manner analogous to that use in the “bonOutputTable” choiceTag
command.
// Here we get a sorted subset of the messages according to session
attributes.
// This allows user to set size of output and page through messages
// messages array gets sorted message times in reverse order
String[] messages = (String[]) tempTreeMap.keySet().toArray(new
String[0]);
// keep track of how many there were at this output time
int numberOfMessages = messages.length;
String quantity =
(String)session.getAttribute(“chatMessagesPageSize”);
if (quantity == null) {
log(sessionId, “err”, “outputForumChatMessages(), quantity ==
null”);
quantity = “10”; // initialize
}
int numberPerPage = -1;
try {
numberPerPage = Integer.parseInt(quantity);
}
catch (NumberFormatException nFE) {
log(sessionId, “err”, “outputForumChatMessages(), cannot parse
quantity requested as int: “ + quantity);
numberPerPage = 10;
}
if(numberPerPage > numberOfMessages) {
numberPerPage = numberOfMessages;
}
15 1089-9 XC 6/26/01 7:40 AM Page 550
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
551
C.17 Filename: Projects\bonForum\src\de\tarent\forum\BonForumStore.java
int numberOfPages = 0;
try {
numberOfPages = (numberOfMessages / numberPerPage);
if((numberOfMessages % numberPerPage) != 0) {
++numberOfPages;
}
}
catch(Exception ee) {
numberOfPages = 0;
}
session.setAttribute(“chatNumberOfPages”,
Integer.toString(numberOfPages));
String pagesFromEnd = (String)session.getAttribute(“pagesFromEnd”);
int pagesToSkip = -1;
try {
pagesToSkip = Integer.parseInt(pagesFromEnd);
}
catch (NumberFormatException nFE) {
log(sessionId, “err”, “outputForumChatMessages(), cannot parse
session attribute pagesFromEnd: “ + pagesFromEnd);
pagesToSkip = -1;
}
if(pagesToSkip >= numberOfPages) {
pagesToSkip = numberOfPages - 1;
}
int pageNumber = numberOfPages - pagesToSkip;
if(pageNumber > numberOfPages) {
pageNumber = numberOfPages;
}
session.setAttribute(“chatPageNumber”, Integer.toString(pageNumber));
String navigation;
try {
navigation =
(String)session.getAttribute(“chatMessagesNavigator”);
if(!navigation.equals(“same”) && !navigation.equals(“first”) &&
!navigation.equals(“previous”) && !navigation.equals(“next”) &&
!navigation.equals(“last”)) {
navigation = “last”;
}
}
catch(Exception ee) {
log(sessionId, “err”, “outputForumChatMessages(), no session
attribute chatMessagesNavigator, using \”last\””);
navigation = “last”;
session.setAttribute(“chatMessagesNavigator”, “last”);
}
// We have reversed the sort order of messages in tempTreeMap,
// therefore these navigation cases will seem to be backwards!
// Also, it means that if there are more than one page of messages,
// then the first page of messages may be less than full,
// while the last will stay full. (This is more convenient, since the
15 1089-9 XC 6/26/01 7:40 AM Page 551
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.