// (notesType is NotesAny.)
//
NOTES_TYPE addedNotesType = NOTES_TYPE.NotesAny;
XMLNode addedNotes = new XMLNode();
//------------------------------------------------------------
//
// STEP1 : identifies the type of the given notes
//
//------------------------------------------------------------
if (name == "notes")
{
/* check for notes tags on the added notes and strip if present and
the notes tag has "html" or "body" element */
if (notes.getChildCount() > 0)
{
// notes.getChildAt(0) must be "html", "body", or any XHTML
// element that would be permitted within a "body" element
// (e.g. <p>..</p>, <br>..</br> and so forth).
String cname = notes.getChildAt(0).getName();
if (cname == "html")
{
addedNotes = notes.getChildAt(0);
addedNotesType = NOTES_TYPE.NotesHTML;
}
else if (cname == "body")
{
addedNotes = notes.getChildAt(0);
addedNotesType = NOTES_TYPE.NotesBody;
}
else
{
// the notes tag must NOT be stripped if notes.getChildAt(0) node
// is neither "html" nor "body" element because the children of
// the addedNotes will be added to the current notes later if the node
// is neither "html" nor "body".
addedNotes = notes;
addedNotesType = NOTES_TYPE.NotesAny;
}
}
else
{
// the given notes is empty
// TODO : log an error
return;
}
}
else
{
// if the XMLNode argument notes has been created from a string and
// it is a set of subelements there may be a single empty node
// as parent - leaving this in doesn't affect the writing out of notes
// but messes up the check for correct syntax
// TODO : check that we are doing that when parsing a String into XMLNode
if (!notes.isStart() && !notes.isEnd() && !notes.isText() )
{
if (notes.getChildCount() > 0)
{
addedNotes = notes;
addedNotesType = NOTES_TYPE.NotesAny;
}
else
{
// the given notes is empty
return;
}
}
else
{
if (name == "html")
{
addedNotes = notes;
addedNotesType = NOTES_TYPE.NotesHTML;
}
else if (name == "body")
{
addedNotes = notes;
addedNotesType = NOTES_TYPE.NotesBody;
}
else
{
// The given notes node needs to be added to a parent node
// if the node is neither "html" nor "body" element because the
// children of addedNotes will be added to the current notes later if the
// node is neither "html" nor "body" (i.e. any XHTML element that
// would be permitted within a "body" element)
addedNotes.addChild(notes);
addedNotesType = NOTES_TYPE.NotesAny;
}
}
}
//
// checks the addedNotes of "html" if the html tag contains "head" and
// "body" tags which must be located in this order.
//
if (addedNotesType == NOTES_TYPE.NotesHTML)
{
if ((addedNotes.getChildCount() != 2) ||
( (addedNotes.getChildAt(0).getName() != "head") ||
(addedNotes.getChildAt(1).getName() != "body")
)
)
{
// TODO : log an error to the user or throw an exception or both ?
return;
}
}
// We do not have a Syntax checker working on XMLNode !!
// check whether notes is valid xhtml ?? (libsbml is doing that)
if ( notesXMLNode != null )
{
//------------------------------------------------------------
//
// STEP2: identifies the type of the existing notes
//
//------------------------------------------------------------
NOTES_TYPE curNotesType = NOTES_TYPE.NotesAny;
XMLNode curNotes = notesXMLNode;
// curNotes.getChildAt(0) must be "html", "body", or any XHTML
// element that would be permitted within a "body" element .
String cname = curNotes.getChildAt(0).getName();
if (cname == "html")
{
XMLNode curHTML = curNotes.getChildAt(0);
//
// checks the curHTML if the html tag contains "head" and "body" tags
// which must be located in this order, otherwise nothing will be done.
//
if ((curHTML.getChildCount() != 2) ||
( (curHTML.getChildAt(0).getName() != "head") ||
(curHTML.getChildAt(1).getName() != "body")
)
)
{
// TODO : log an error
return;
}
curNotesType = NOTES_TYPE.NotesHTML;
}
else if (cname == "body")
{
curNotesType = NOTES_TYPE.NotesBody;
}
else
{
curNotesType = NOTES_TYPE.NotesAny;
}
/*
* BUT we also have the issue of the rules relating to notes
* contents and where to add them ie we cannot add a second body element
* etc...
*/
//------------------------------------------------------------
//
// STEP3: appends the given notes to the current notes
//
//------------------------------------------------------------
int i;
if (curNotesType == NOTES_TYPE.NotesHTML)
{
XMLNode curHTML = curNotes.getChildAt(0);
XMLNode curBody = curHTML.getChildAt(1);
if (addedNotesType == NOTES_TYPE.NotesHTML)
{
// adds the given html tag to the current html tag
XMLNode addedBody = addedNotes.getChildAt(1);
for (i=0; i < addedBody.getChildCount(); i++)
{
if (curBody.addChild(addedBody.getChildAt(i)) < 0 )
// TODO : log an error
return;
}
}
else if ((addedNotesType == NOTES_TYPE.NotesBody) || (addedNotesType == NOTES_TYPE.NotesAny))
{
// adds the given body or other tag (permitted in the body) to the current
// html tag
for (i=0; i < addedNotes.getChildCount(); i++)
{
if (curBody.addChild(addedNotes.getChildAt(i)) < 0 )
// TODO : log an error
return;
}
}
}
else if (curNotesType == NOTES_TYPE.NotesBody)
{
if (addedNotesType == NOTES_TYPE.NotesHTML)
{
// adds the given html tag to the current body tag
XMLNode addedHTML = new XMLNode(addedNotes);
XMLNode addedBody = addedHTML.getChildAt(1);
XMLNode curBody = curNotes.getChildAt(0);
for (i=0; i < curBody.getChildCount(); i++)
{
addedBody.insertChild(i,curBody.getChildAt(i));
}
curNotes.removeChildren();
if (curNotes.addChild(addedHTML) < 0)
// TODO : log an error
return;
}
else if ((addedNotesType == NOTES_TYPE.NotesBody) || (addedNotesType == NOTES_TYPE.NotesAny))
{
// adds the given body or other tag (permitted in the body) to the current
// body tag
XMLNode curBody = curNotes.getChildAt(0);
for (i=0; i < addedNotes.getChildCount(); i++)
{
if (curBody.addChild(addedNotes.getChildAt(i)) < 0)
// TODO : log an error
return;
}
}
}
else if (curNotesType == NOTES_TYPE.NotesAny)
{
if (addedNotesType == NOTES_TYPE.NotesHTML)
{
// adds the given html tag to the current any tag permitted in the body.
XMLNode addedHTML = new XMLNode(addedNotes);
XMLNode addedBody = addedHTML.getChildAt(1);
for (i=0; i < curNotes.getChildCount(); i++)
{
addedBody.insertChild(i,curNotes.getChildAt(i));
}
curNotes.removeChildren();
if (curNotes.addChild(addedHTML) < 0)
// TODO : log an error
return;
}
else if (addedNotesType == NOTES_TYPE.NotesBody)
{
// adds the given body tag to the current any tag permitted in the body.
XMLNode addedBody = new XMLNode(addedNotes);
for (i=0; i < curNotes.getChildCount(); i++)
{
addedBody.insertChild(i,curNotes.getChildAt(i));
}
curNotes.removeChildren();
if (curNotes.addChild(addedBody) < 0)
// TODO : log an error