From: Jeremias Maerki Date: Thu, 11 Dec 2008 16:02:23 +0000 (+0000) Subject: Fixed parsing of document navigation namespace (its elements are no longer simple... X-Git-Tag: fop-1_0~115^2~114 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=75b0fbff7917f9877207b167fb6206e151e70ec6;p=xmlgraphics-fop.git Fixed parsing of document navigation namespace (its elements are no longer simple extension elements but get sent to a specific interface). git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign@725722 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/META-INF/services/org.apache.fop.util.ContentHandlerFactory b/src/java/META-INF/services/org.apache.fop.util.ContentHandlerFactory index 3745e6702..53fe41b13 100644 --- a/src/java/META-INF/services/org.apache.fop.util.ContentHandlerFactory +++ b/src/java/META-INF/services/org.apache.fop.util.ContentHandlerFactory @@ -1,4 +1,3 @@ org.apache.fop.render.afp.extensions.AFPExtensionHandlerFactory org.apache.fop.render.ps.extensions.PSExtensionHandlerFactory org.apache.fop.fo.extensions.xmp.XMPContentHandlerFactory -org.apache.fop.render.intermediate.extensions.DocumentNavigationExtensionHandlerFactory diff --git a/src/java/org/apache/fop/render/intermediate/IFParser.java b/src/java/org/apache/fop/render/intermediate/IFParser.java index e514ab889..6d037b0cf 100644 --- a/src/java/org/apache/fop/render/intermediate/IFParser.java +++ b/src/java/org/apache/fop/render/intermediate/IFParser.java @@ -50,6 +50,8 @@ import org.apache.fop.apps.FOUserAgent; import org.apache.fop.fo.ElementMapping; import org.apache.fop.fo.ElementMappingRegistry; import org.apache.fop.fo.expr.PropertyException; +import org.apache.fop.render.intermediate.extensions.DocumentNavigationExtensionConstants; +import org.apache.fop.render.intermediate.extensions.DocumentNavigationHandler; import org.apache.fop.traits.BorderProps; import org.apache.fop.traits.RuleStyle; import org.apache.fop.util.ColorUtil; @@ -122,6 +124,8 @@ public class IFParser implements IFConstants { private boolean inForeignObject; private Document foreignObject; + private ContentHandler navParser; + public Handler(IFDocumentHandler documentHandler, FOUserAgent userAgent, ElementMappingRegistry elementMappingRegistry) { this.documentHandler = documentHandler; @@ -174,6 +178,15 @@ public class IFParser implements IFConstants { } else { handled = false; } + } else if (DocumentNavigationExtensionConstants.NAMESPACE.equals(uri)) { + if (this.navParser == null) { + this.navParser = new DocumentNavigationHandler( + this.documentHandler.getDocumentNavigationHandler()); + } + delegate = this.navParser; + delegateDepth++; + delegate.startDocument(); + delegate.startElement(uri, localName, qName, attributes); } else { ContentHandlerFactoryRegistry registry = userAgent.getFactory().getContentHandlerFactoryRegistry(); diff --git a/src/java/org/apache/fop/render/intermediate/extensions/DocumentNavigationExtensionHandlerFactory.java b/src/java/org/apache/fop/render/intermediate/extensions/DocumentNavigationExtensionHandlerFactory.java deleted file mode 100644 index 9044a4a62..000000000 --- a/src/java/org/apache/fop/render/intermediate/extensions/DocumentNavigationExtensionHandlerFactory.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* $Id$ */ - -package org.apache.fop.render.intermediate.extensions; - -import java.awt.Point; -import java.util.Stack; - -import org.xml.sax.Attributes; -import org.xml.sax.ContentHandler; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import org.apache.fop.render.ps.extensions.PSExtensionAttachment; -import org.apache.fop.util.ContentHandlerFactory; -import org.apache.fop.util.XMLUtil; - -/** - * Factory for the ContentHandler that handles the IF document navigation namespace. - */ -public class DocumentNavigationExtensionHandlerFactory - implements ContentHandlerFactory, DocumentNavigationExtensionConstants { - - /** Logger instance */ - protected static Log log = LogFactory.getLog(DocumentNavigationExtensionHandlerFactory.class); - - /** {@inheritDoc} */ - public String[] getSupportedNamespaces() { - return new String[] {NAMESPACE}; - } - - /** {@inheritDoc} */ - public ContentHandler createContentHandler() { - return new Handler(); - } - - private static class Handler extends DefaultHandler - implements ContentHandlerFactory.ObjectSource { - - private StringBuffer content = new StringBuffer(); - private Stack objectStack = new Stack(); - - private Object objectBuilt; - private ObjectBuiltListener listener; - - /** {@inheritDoc} */ - public void startElement(String uri, String localName, String qName, Attributes attributes) - throws SAXException { - boolean handled = false; - if (NAMESPACE.equals(uri)) { - if (BOOKMARK_TREE.getLocalName().equals(localName)) { - if (!objectStack.isEmpty()) { - throw new SAXException(localName + " must be the root element!"); - } - BookmarkTree bookmarkTree = new BookmarkTree(); - objectStack.push(bookmarkTree); - } else if (BOOKMARK.getLocalName().equals(localName)) { - String title = attributes.getValue("title"); - String s = attributes.getValue("starting-state"); - boolean show = !"hide".equals(s); - Bookmark b = new Bookmark(title, show, null); - Object o = objectStack.peek(); - if (o instanceof AbstractAction) { - AbstractAction action = (AbstractAction)objectStack.pop(); - o = objectStack.peek(); - ((Bookmark)o).setAction(action); - } - if (o instanceof BookmarkTree) { - ((BookmarkTree)o).addBookmark(b); - } else { - ((Bookmark)o).addChildBookmark(b); - } - objectStack.push(b); - } else if (NAMED_DESTINATION.getLocalName().equals(localName)) { - if (!objectStack.isEmpty()) { - throw new SAXException(localName + " must be the root element!"); - } - String name = attributes.getValue("name"); - NamedDestination dest = new NamedDestination(name, null); - objectStack.push(dest); - } else if (GOTO_XY.getLocalName().equals(localName)) { - String id = attributes.getValue("id"); - int pageIndex = XMLUtil.getAttributeAsInt(attributes, "page-index"); - int x = XMLUtil.getAttributeAsInt(attributes, "x"); - int y = XMLUtil.getAttributeAsInt(attributes, "y"); - GoToXYAction action = new GoToXYAction(id, pageIndex, new Point(x, y)); - objectStack.push(action); - } else if (GOTO_URI.getLocalName().equals(localName)) { - String gotoURI = attributes.getValue("uri"); - String showDestination = attributes.getValue("show-destination"); - boolean newWindow = "new".equals(showDestination); - URIAction action = new URIAction(gotoURI, newWindow); - objectStack.push(action); - } else { - throw new SAXException( - "Invalid element " + localName + " in namespace: " + uri); - } - handled = true; - } - if (!handled) { - if (PSExtensionAttachment.CATEGORY.equals(uri)) { - throw new SAXException("Unhandled element " + localName + " in namespace: " - + uri); - } else { - log.warn("Unhandled element " + localName + " in namespace: " + uri); - } - } - } - - /** {@inheritDoc} */ - public void endElement(String uri, String localName, String qName) throws SAXException { - if (NAMESPACE.equals(uri)) { - if (BOOKMARK_TREE.getLocalName().equals(localName)) { - //nop - } else if (BOOKMARK.getLocalName().equals(localName)) { - if (objectStack.peek() instanceof AbstractAction) { - AbstractAction action = (AbstractAction)objectStack.pop(); - Bookmark b = (Bookmark)objectStack.pop(); - b.setAction(action); - } else { - objectStack.pop(); - } - } else if (NAMED_DESTINATION.getLocalName().equals(localName)) { - AbstractAction action = (AbstractAction)objectStack.pop(); - NamedDestination dest = (NamedDestination)objectStack.peek(); - dest.setAction(action); - } - } - content.setLength(0); // Reset text buffer (see characters()) - } - - /** {@inheritDoc} */ - public void characters(char[] ch, int start, int length) throws SAXException { - content.append(ch, start, length); - } - - /** {@inheritDoc} */ - public void endDocument() throws SAXException { - this.objectBuilt = objectStack.pop(); - assert objectStack.isEmpty(); - if (listener != null) { - listener.notifyObjectBuilt(this.objectBuilt); - } - } - - /** {@inheritDoc} */ - public Object getObject() { - return objectBuilt; - } - - /** {@inheritDoc} */ - public void setObjectBuiltListener(ObjectBuiltListener listener) { - this.listener = listener; - } - } - -} diff --git a/src/java/org/apache/fop/render/intermediate/extensions/DocumentNavigationHandler.java b/src/java/org/apache/fop/render/intermediate/extensions/DocumentNavigationHandler.java new file mode 100644 index 000000000..3351740e2 --- /dev/null +++ b/src/java/org/apache/fop/render/intermediate/extensions/DocumentNavigationHandler.java @@ -0,0 +1,191 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.render.intermediate.extensions; + +import java.awt.Point; +import java.awt.Rectangle; +import java.util.Stack; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.fop.render.intermediate.IFDocumentNavigationHandler; +import org.apache.fop.render.intermediate.IFException; +import org.apache.fop.util.XMLUtil; + +/** + * ContentHandler that handles the IF document navigation namespace. + */ +public class DocumentNavigationHandler extends DefaultHandler + implements DocumentNavigationExtensionConstants { + + /** Logger instance */ + protected static Log log = LogFactory.getLog(DocumentNavigationHandler.class); + + private StringBuffer content = new StringBuffer(); + private Stack objectStack = new Stack(); + + private IFDocumentNavigationHandler navHandler; + + /** + * Main constructor. + * @param navHandler the navigation handler that will receive the events + */ + public DocumentNavigationHandler(IFDocumentNavigationHandler navHandler) { + this.navHandler = navHandler; + } + + /** {@inheritDoc} */ + public void startElement(String uri, String localName, String qName, Attributes attributes) + throws SAXException { + boolean handled = false; + if (NAMESPACE.equals(uri)) { + if (BOOKMARK_TREE.getLocalName().equals(localName)) { + if (!objectStack.isEmpty()) { + throw new SAXException(localName + " must be the root element!"); + } + BookmarkTree bookmarkTree = new BookmarkTree(); + objectStack.push(bookmarkTree); + } else if (BOOKMARK.getLocalName().equals(localName)) { + String title = attributes.getValue("title"); + String s = attributes.getValue("starting-state"); + boolean show = !"hide".equals(s); + Bookmark b = new Bookmark(title, show, null); + Object o = objectStack.peek(); + if (o instanceof AbstractAction) { + AbstractAction action = (AbstractAction)objectStack.pop(); + o = objectStack.peek(); + ((Bookmark)o).setAction(action); + } + if (o instanceof BookmarkTree) { + ((BookmarkTree)o).addBookmark(b); + } else { + ((Bookmark)o).addChildBookmark(b); + } + objectStack.push(b); + } else if (NAMED_DESTINATION.getLocalName().equals(localName)) { + if (!objectStack.isEmpty()) { + throw new SAXException(localName + " must be the root element!"); + } + String name = attributes.getValue("name"); + NamedDestination dest = new NamedDestination(name, null); + objectStack.push(dest); + } else if (LINK.getLocalName().equals(localName)) { + if (!objectStack.isEmpty()) { + throw new SAXException(localName + " must be the root element!"); + } + Rectangle targetRect = XMLUtil.getAttributeAsRectangle(attributes, "rect"); + Link link = new Link(null, targetRect); + objectStack.push(link); + } else if (GOTO_XY.getLocalName().equals(localName)) { + String id = attributes.getValue("id"); + int pageIndex = XMLUtil.getAttributeAsInt(attributes, "page-index"); + int x = XMLUtil.getAttributeAsInt(attributes, "x"); + int y = XMLUtil.getAttributeAsInt(attributes, "y"); + GoToXYAction action = new GoToXYAction(id, pageIndex, new Point(x, y)); + objectStack.push(action); + } else if (GOTO_URI.getLocalName().equals(localName)) { + String gotoURI = attributes.getValue("uri"); + String showDestination = attributes.getValue("show-destination"); + boolean newWindow = "new".equals(showDestination); + URIAction action = new URIAction(gotoURI, newWindow); + objectStack.push(action); + } else { + throw new SAXException( + "Invalid element '" + localName + "' in namespace: " + uri); + } + handled = true; + } + if (!handled) { + if (NAMESPACE.equals(uri)) { + throw new SAXException("Unhandled element '" + localName + "' in namespace: " + + uri); + } else { + log.warn("Unhandled element '" + localName + "' in namespace: " + uri); + } + } + } + + /** {@inheritDoc} */ + public void endElement(String uri, String localName, String qName) throws SAXException { + if (NAMESPACE.equals(uri)) { + try { + if (BOOKMARK_TREE.getLocalName().equals(localName)) { + BookmarkTree tree = (BookmarkTree)objectStack.pop(); + if (hasNavigation()) { + this.navHandler.renderBookmarkTree(tree); + } + } else if (BOOKMARK.getLocalName().equals(localName)) { + if (objectStack.peek() instanceof AbstractAction) { + AbstractAction action = (AbstractAction)objectStack.pop(); + Bookmark b = (Bookmark)objectStack.pop(); + b.setAction(action); + } else { + objectStack.pop(); + } + } else if (NAMED_DESTINATION.getLocalName().equals(localName)) { + AbstractAction action = (AbstractAction)objectStack.pop(); + NamedDestination dest = (NamedDestination)objectStack.pop(); + dest.setAction(action); + if (hasNavigation()) { + this.navHandler.renderNamedDestination(dest); + } + } else if (LINK.getLocalName().equals(localName)) { + AbstractAction action = (AbstractAction)objectStack.pop(); + Link link = (Link)objectStack.pop(); + link.setAction(action); + if (hasNavigation()) { + this.navHandler.renderLink(link); + } + } else if (localName.startsWith("goto-")) { + if (objectStack.size() == 1) { + //Stand-alone action + AbstractAction action = (AbstractAction)objectStack.pop(); + if (hasNavigation()) { + this.navHandler.addResolvedAction(action); + } + } + } + } catch (IFException ife) { + throw new SAXException(ife); + } + } + content.setLength(0); // Reset text buffer (see characters()) + } + + private boolean hasNavigation() { + return this.navHandler != null; + } + + /** {@inheritDoc} */ + public void characters(char[] ch, int start, int length) throws SAXException { + content.append(ch, start, length); + } + + /** {@inheritDoc} */ + public void endDocument() throws SAXException { + assert objectStack.isEmpty(); + } + +}