]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Fixed parsing of document navigation namespace (its elements are no longer simple...
authorJeremias Maerki <jeremias@apache.org>
Thu, 11 Dec 2008 16:02:23 +0000 (16:02 +0000)
committerJeremias Maerki <jeremias@apache.org>
Thu, 11 Dec 2008 16:02:23 +0000 (16:02 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign@725722 13f79535-47bb-0310-9956-ffa450edef68

src/java/META-INF/services/org.apache.fop.util.ContentHandlerFactory
src/java/org/apache/fop/render/intermediate/IFParser.java
src/java/org/apache/fop/render/intermediate/extensions/DocumentNavigationExtensionHandlerFactory.java [deleted file]
src/java/org/apache/fop/render/intermediate/extensions/DocumentNavigationHandler.java [new file with mode: 0644]

index 3745e670217f21ef968ca48d477067bb044a472e..53fe41b13e5de134a8c08f695989ae85095139be 100644 (file)
@@ -1,4 +1,3 @@
 org.apache.fop.render.afp.extensions.AFPExtensionHandlerFactory\r
 org.apache.fop.render.ps.extensions.PSExtensionHandlerFactory\r
 org.apache.fop.fo.extensions.xmp.XMPContentHandlerFactory\r
-org.apache.fop.render.intermediate.extensions.DocumentNavigationExtensionHandlerFactory\r
index e514ab889213a1d6b1593ad987fb09d76c488d01..6d037b0cfe1116d6bb9028081c26d8fbf0b87068 100644 (file)
@@ -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 (file)
index 9044a4a..0000000
+++ /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 (file)
index 0000000..3351740
--- /dev/null
@@ -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();
+    }
+
+}