// polymorphic collection to insert artifical <menu-element>
// tags enabling Castor XML binding; see JETSPEED-INF/castor/page-mapping.xml
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
final XMLReaderAdapter readerAdapter = new XMLReaderAdapter(reader);
final InputSource readerInput = new InputSource(new InputStreamReader(new FileInputStream(f), PSML_DOCUMENT_ENCODING));
Unmarshaller unmarshaller = new Unmarshaller(this.mapping);
document = (Document) unmarshaller.unmarshal(new EventProducer()
{
public void setDocumentHandler(final DocumentHandler handler)
{
readerAdapter.setDocumentHandler(new DocumentHandler()
{
private int menuDepth = 0;
public void characters(char[] ch, int start, int length) throws SAXException
{
handler.characters(ch, start, length);
}
public void endDocument() throws SAXException
{
handler.endDocument();
}
public void endElement(String name) throws SAXException
{
// always include all elements
handler.endElement(name);
// track menu depth and insert menu-element nodes
// to encapsulate menu elements to support collection
// polymorphism in Castor
if (name.equals("menu"))
{
menuDepth--;
if (menuDepth > 0)
{
handler.endElement("menu-element");
}
}
else if ((menuDepth > 0) &&
(name.equals("options") || name.equals("separator") ||
name.equals("include") || name.equals("exclude")))
{
handler.endElement("menu-element");
}
}
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
{
handler.ignorableWhitespace(ch, start, length);
}
public void processingInstruction(String target, String data) throws SAXException
{
handler.processingInstruction(target, data);
}
public void setDocumentLocator(Locator locator)
{
handler.setDocumentLocator(locator);
}
public void startDocument() throws SAXException
{
handler.startDocument();
}
public void startElement(String name, AttributeList atts) throws SAXException
{
// track menu depth and insert menu-element nodes
// to encapsulate menu elements to support collection
// polymorphism in Castor
if (name.equals("menu"))
{
if (menuDepth > 0)
{
handler.startElement("menu-element", null);
}
menuDepth++;
}
else if ((menuDepth > 0) &&
(name.equals("options") || name.equals("separator") ||
name.equals("include") || name.equals("exclude")))
{
handler.startElement("menu-element", null);
}
// always include all elements
handler.startElement(name, atts);
}
});
}
public void start() throws SAXException
{
try
{
readerAdapter.parse(readerInput);
}
catch (IOException ioe)
{
throw new SAXException(ioe);
}