From 365f117dfac9f039f402ab59a0dd84b5854e112c Mon Sep 17 00:00:00 2001 From: Adrian Cumiskey Date: Tue, 29 Jul 2008 08:52:31 +0000 Subject: [PATCH] Merged revisions 680369,680378 via svnmerge from https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk ........ r680369 | jeremias | 2008-07-28 15:24:51 +0100 (Mon, 28 Jul 2008) | 2 lines Bugzilla #45470: Added LayoutManagerMapping.registerMaker() to make registration of custom layout managers easier. ........ r680378 | jeremias | 2008-07-28 16:05:14 +0100 (Mon, 28 Jul 2008) | 4 lines Reverted revision 670341 and replaced it with a different solution as discussed: addCharacters() is now deprecated and called by the new characters() method which uses start/length instead of start/end. Fixed bugs in the AFP and PS extensions (ArrayIndexOutOfBoundsExceptions). They were not properly changed when the interface changed. Discussion: http://markmail.org/message/pdgzf6odxrnhflby ........ git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AFPGOCAResources@680649 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/fop/fo/FONode.java | 23 +++++- src/java/org/apache/fop/fo/FOText.java | 2 +- src/java/org/apache/fop/fo/FOTreeBuilder.java | 2 +- src/java/org/apache/fop/fo/FObjMixed.java | 4 +- src/java/org/apache/fop/fo/UnknownXMLObj.java | 16 ++-- src/java/org/apache/fop/fo/XMLObj.java | 23 +++--- .../pagination/bookmarks/BookmarkTitle.java | 5 +- .../fop/layoutmgr/LayoutManagerMapping.java | 76 ++++++++++--------- .../AbstractAFPExtensionObject.java | 9 ++- .../AbstractPSExtensionElement.java | 16 +--- .../extensions/AbstractPSExtensionObject.java | 4 +- status.xml | 4 + 12 files changed, 101 insertions(+), 83 deletions(-) diff --git a/src/java/org/apache/fop/fo/FONode.java b/src/java/org/apache/fop/fo/FONode.java index 087bcf96c..07d8f472c 100644 --- a/src/java/org/apache/fop/fo/FONode.java +++ b/src/java/org/apache/fop/fo/FONode.java @@ -274,17 +274,36 @@ public abstract class FONode implements Cloneable { * * @param data array of characters containing text to be added * @param start starting array element to add - * @param length number of elements to add + * @param end ending array element to add * @param pList currently applicable PropertyList * @param locator location in the XSL-FO source file. * @throws FOPException if there's a problem during processing + * @deprecated Please override {@code #characters(char[], int, int, PropertyList, Locator)} + * instead! */ - protected void addCharacters(char[] data, int start, int length, + protected void addCharacters(char[] data, int start, int end, PropertyList pList, Locator locator) throws FOPException { // ignore } + /** + * Adds characters. Does nothing by default. To be overridden in subclasses + * that allow #PCDATA content. + * + * @param data array of characters containing text to be added + * @param start starting array element to add + * @param length number of elements to add + * @param pList currently applicable PropertyList + * @param locator location in the XSL-FO source file. + * @throws FOPException if there's a problem during processing + */ + protected void characters(char[] data, int start, int length, + PropertyList pList, + Locator locator) throws FOPException { + addCharacters(data, start, start + length, pList, locator); + } + /** * Called after processNode() is called. Subclasses can do additional processing. * diff --git a/src/java/org/apache/fop/fo/FOText.java b/src/java/org/apache/fop/fo/FOText.java index eb0627b4b..08ffa40a3 100644 --- a/src/java/org/apache/fop/fo/FOText.java +++ b/src/java/org/apache/fop/fo/FOText.java @@ -93,7 +93,7 @@ public class FOText extends FONode implements CharSequence { } /** {@inheritDoc} */ - protected void addCharacters(char[] data, int start, int length, + protected void characters(char[] data, int start, int length, PropertyList list, Locator locator) throws FOPException { if (this.charBuffer == null) { diff --git a/src/java/org/apache/fop/fo/FOTreeBuilder.java b/src/java/org/apache/fop/fo/FOTreeBuilder.java index 762cd0d46..7c77f0697 100644 --- a/src/java/org/apache/fop/fo/FOTreeBuilder.java +++ b/src/java/org/apache/fop/fo/FOTreeBuilder.java @@ -371,7 +371,7 @@ public class FOTreeBuilder extends DefaultHandler { public void characters(char[] data, int start, int length) throws FOPException { if (currentFObj != null) { - currentFObj.addCharacters(data, start, length, + currentFObj.characters(data, start, length, currentPropertyList, getEffectiveLocator()); } } diff --git a/src/java/org/apache/fop/fo/FObjMixed.java b/src/java/org/apache/fop/fo/FObjMixed.java index 64faa3253..5dc5dd49d 100644 --- a/src/java/org/apache/fop/fo/FObjMixed.java +++ b/src/java/org/apache/fop/fo/FObjMixed.java @@ -50,7 +50,7 @@ public abstract class FObjMixed extends FObj { } /** {@inheritDoc} */ - protected void addCharacters(char[] data, int start, int length, + protected void characters(char[] data, int start, int length, PropertyList pList, Locator locator) throws FOPException { if (ft == null) { @@ -60,7 +60,7 @@ public abstract class FObjMixed extends FObj { ft.bind(pList); } } - ft.addCharacters(data, start, length, null, null); + ft.characters(data, start, length, null, null); } /** {@inheritDoc} */ diff --git a/src/java/org/apache/fop/fo/UnknownXMLObj.java b/src/java/org/apache/fop/fo/UnknownXMLObj.java index 4db2cf0fe..ac6676427 100644 --- a/src/java/org/apache/fop/fo/UnknownXMLObj.java +++ b/src/java/org/apache/fop/fo/UnknownXMLObj.java @@ -21,6 +21,8 @@ package org.apache.fop.fo; import org.xml.sax.Locator; +import org.apache.fop.apps.FOPException; + /** * Class for handling generic XML from a namespace not recognized by FOP */ @@ -72,9 +74,7 @@ public class UnknownXMLObj extends XMLObj { return null; //We don't know that in this case. } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ protected void addChildNode(FONode child) { if (doc == null) { createBasicDocument(); @@ -82,15 +82,13 @@ public class UnknownXMLObj extends XMLObj { super.addChildNode(child); } - /** - * {@inheritDoc} - */ - protected void addCharacters(char data[], int start, int length, - PropertyList pList, Locator locator) { + /** {@inheritDoc} */ + protected void characters(char[] data, int start, int length, + PropertyList pList, Locator locator) throws FOPException { if (doc == null) { createBasicDocument(); } - super.addCharacters(data, start, length, pList, locator); + super.characters(data, start, length, pList, locator); } } diff --git a/src/java/org/apache/fop/fo/XMLObj.java b/src/java/org/apache/fop/fo/XMLObj.java index 97aa435e7..3330f41a5 100644 --- a/src/java/org/apache/fop/fo/XMLObj.java +++ b/src/java/org/apache/fop/fo/XMLObj.java @@ -25,14 +25,16 @@ import java.util.HashMap; import javax.xml.parsers.DocumentBuilderFactory; -import org.apache.fop.apps.FOPException; -import org.apache.fop.datatypes.Length; -import org.apache.fop.util.ContentHandlerFactory.ObjectBuiltListener; import org.w3c.dom.Document; import org.w3c.dom.Element; + import org.xml.sax.Attributes; import org.xml.sax.Locator; +import org.apache.fop.apps.FOPException; +import org.apache.fop.datatypes.Length; +import org.apache.fop.util.ContentHandlerFactory.ObjectBuiltListener; + /** * Abstract class modelling generic, non-XSL-FO XML objects. Such objects are * stored in a DOM. @@ -203,17 +205,10 @@ public abstract class XMLObj extends FONode implements ObjectBuiltListener { } } - /** - * Add parsed characters to this object - * - * @param data array of characters contaning the text to add - * @param start starting array element to add - * @param length number of characters from the array to add - * @param pList the currently applicable property list - * @param locator location in fo source file. - */ - protected void addCharacters(char[] data, int start, int length, - PropertyList pList, Locator locator) { + /** {@inheritDoc} */ + protected void characters(char[] data, int start, int length, + PropertyList pList, Locator locator) throws FOPException { + super.characters(data, start, length, pList, locator); String str = new String(data, start, length); org.w3c.dom.Text text = doc.createTextNode(str); element.appendChild(text); diff --git a/src/java/org/apache/fop/fo/pagination/bookmarks/BookmarkTitle.java b/src/java/org/apache/fop/fo/pagination/bookmarks/BookmarkTitle.java index fc508dc96..028cdc7df 100644 --- a/src/java/org/apache/fop/fo/pagination/bookmarks/BookmarkTitle.java +++ b/src/java/org/apache/fop/fo/pagination/bookmarks/BookmarkTitle.java @@ -21,8 +21,8 @@ package org.apache.fop.fo.pagination.bookmarks; import org.xml.sax.Locator; -import org.apache.fop.fo.FObj; import org.apache.fop.fo.FONode; +import org.apache.fop.fo.FObj; import org.apache.fop.fo.PropertyList; import org.apache.fop.fo.ValidationException; @@ -52,9 +52,10 @@ public class BookmarkTitle extends FObj { * @param data the character data * @param start the start position in the data array * @param length the length of the character array + * @param pList currently applicable PropertyList * @param locator location in fo source file. */ - protected void addCharacters(char[] data, int start, int length, + protected void characters(char[] data, int start, int length, PropertyList pList, Locator locator) { title += new String(data, start, length); diff --git a/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java b/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java index 26933ee4c..cab2dd0ba 100644 --- a/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java +++ b/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java @@ -20,14 +20,15 @@ package org.apache.fop.layoutmgr; import java.util.ArrayList; -import java.util.Map; import java.util.HashMap; -import java.util.List; import java.util.Iterator; +import java.util.List; +import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.fop.area.AreaTreeHandler; import org.apache.fop.fo.FOElementMapping; import org.apache.fop.fo.FONode; import org.apache.fop.fo.FOText; @@ -65,8 +66,6 @@ import org.apache.fop.fo.pagination.PageSequence; import org.apache.fop.fo.pagination.SideRegion; import org.apache.fop.fo.pagination.StaticContent; import org.apache.fop.fo.pagination.Title; -import org.apache.fop.area.AreaTreeHandler; - import org.apache.fop.layoutmgr.inline.BasicLinkLayoutManager; import org.apache.fop.layoutmgr.inline.BidiLayoutManager; import org.apache.fop.layoutmgr.inline.CharacterLayoutManager; @@ -78,8 +77,8 @@ import org.apache.fop.layoutmgr.inline.InlineLayoutManager; import org.apache.fop.layoutmgr.inline.InlineLevelLayoutManager; import org.apache.fop.layoutmgr.inline.InstreamForeignObjectLM; import org.apache.fop.layoutmgr.inline.LeaderLayoutManager; -import org.apache.fop.layoutmgr.inline.PageNumberCitationLayoutManager; import org.apache.fop.layoutmgr.inline.PageNumberCitationLastLayoutManager; +import org.apache.fop.layoutmgr.inline.PageNumberCitationLayoutManager; import org.apache.fop.layoutmgr.inline.PageNumberLayoutManager; import org.apache.fop.layoutmgr.inline.TextLayoutManager; import org.apache.fop.layoutmgr.inline.WrapperLayoutManager; @@ -107,41 +106,50 @@ public class LayoutManagerMapping implements LayoutManagerMaker { * Initializes the set of maker objects associated with this LayoutManagerMapping */ protected void initialize() { - makers.put(FOText.class, new FOTextLayoutManagerMaker()); - makers.put(FObjMixed.class, new Maker()); - makers.put(BidiOverride.class, new BidiOverrideLayoutManagerMaker()); - makers.put(Inline.class, new InlineLayoutManagerMaker()); - makers.put(Footnote.class, new FootnodeLayoutManagerMaker()); - makers.put(InlineContainer.class, + registerMaker(FOText.class, new FOTextLayoutManagerMaker()); + registerMaker(FObjMixed.class, new Maker()); + registerMaker(BidiOverride.class, new BidiOverrideLayoutManagerMaker()); + registerMaker(Inline.class, new InlineLayoutManagerMaker()); + registerMaker(Footnote.class, new FootnodeLayoutManagerMaker()); + registerMaker(InlineContainer.class, new InlineContainerLayoutManagerMaker()); - makers.put(BasicLink.class, new BasicLinkLayoutManagerMaker()); - makers.put(Block.class, new BlockLayoutManagerMaker()); - makers.put(Leader.class, new LeaderLayoutManagerMaker()); - makers.put(RetrieveMarker.class, new RetrieveMarkerLayoutManagerMaker()); - makers.put(RetrieveTableMarker.class, new Maker()); - makers.put(Character.class, new CharacterLayoutManagerMaker()); - makers.put(ExternalGraphic.class, + registerMaker(BasicLink.class, new BasicLinkLayoutManagerMaker()); + registerMaker(Block.class, new BlockLayoutManagerMaker()); + registerMaker(Leader.class, new LeaderLayoutManagerMaker()); + registerMaker(RetrieveMarker.class, new RetrieveMarkerLayoutManagerMaker()); + registerMaker(RetrieveTableMarker.class, new Maker()); + registerMaker(Character.class, new CharacterLayoutManagerMaker()); + registerMaker(ExternalGraphic.class, new ExternalGraphicLayoutManagerMaker()); - makers.put(BlockContainer.class, + registerMaker(BlockContainer.class, new BlockContainerLayoutManagerMaker()); - makers.put(ListItem.class, new ListItemLayoutManagerMaker()); - makers.put(ListBlock.class, new ListBlockLayoutManagerMaker()); - makers.put(InstreamForeignObject.class, + registerMaker(ListItem.class, new ListItemLayoutManagerMaker()); + registerMaker(ListBlock.class, new ListBlockLayoutManagerMaker()); + registerMaker(InstreamForeignObject.class, new InstreamForeignObjectLayoutManagerMaker()); - makers.put(PageNumber.class, new PageNumberLayoutManagerMaker()); - makers.put(PageNumberCitation.class, + registerMaker(PageNumber.class, new PageNumberLayoutManagerMaker()); + registerMaker(PageNumberCitation.class, new PageNumberCitationLayoutManagerMaker()); - makers.put(PageNumberCitationLast.class, + registerMaker(PageNumberCitationLast.class, new PageNumberCitationLastLayoutManagerMaker()); - makers.put(Table.class, new TableLayoutManagerMaker()); - makers.put(TableBody.class, new Maker()); - makers.put(TableColumn.class, new Maker()); - makers.put(TableRow.class, new Maker()); - makers.put(TableCell.class, new Maker()); - makers.put(TableFooter.class, new Maker()); - makers.put(TableHeader.class, new Maker()); - makers.put(Wrapper.class, new WrapperLayoutManagerMaker()); - makers.put(Title.class, new InlineLayoutManagerMaker()); + registerMaker(Table.class, new TableLayoutManagerMaker()); + registerMaker(TableBody.class, new Maker()); + registerMaker(TableColumn.class, new Maker()); + registerMaker(TableRow.class, new Maker()); + registerMaker(TableCell.class, new Maker()); + registerMaker(TableFooter.class, new Maker()); + registerMaker(TableHeader.class, new Maker()); + registerMaker(Wrapper.class, new WrapperLayoutManagerMaker()); + registerMaker(Title.class, new InlineLayoutManagerMaker()); + } + + /** + * Registers a Maker class for a specific formatting object. + * @param clazz the formatting object class + * @param maker the maker for the layout manager + */ + protected void registerMaker(Class clazz, Maker maker) { + makers.put(clazz, maker); } /** diff --git a/src/java/org/apache/fop/render/afp/extensions/AbstractAFPExtensionObject.java b/src/java/org/apache/fop/render/afp/extensions/AbstractAFPExtensionObject.java index a9bbbcfcf..c0e9c2c89 100644 --- a/src/java/org/apache/fop/render/afp/extensions/AbstractAFPExtensionObject.java +++ b/src/java/org/apache/fop/render/afp/extensions/AbstractAFPExtensionObject.java @@ -20,13 +20,14 @@ package org.apache.fop.render.afp.extensions; // FOP +import org.xml.sax.Attributes; +import org.xml.sax.Locator; + import org.apache.fop.apps.FOPException; import org.apache.fop.fo.FONode; import org.apache.fop.fo.PropertyList; import org.apache.fop.fo.ValidationException; import org.apache.fop.fo.extensions.ExtensionAttachment; -import org.xml.sax.Attributes; -import org.xml.sax.Locator; /** * Base class for the AFP-specific extension elements. @@ -66,10 +67,10 @@ public abstract class AbstractAFPExtensionObject extends FONode { /** * {@inheritDoc} */ - protected void addCharacters(char[] data, int start, int end, + protected void characters(char[] data, int start, int length, PropertyList pList, Locator locator) throws FOPException { ((AFPExtensionAttachment)getExtensionAttachment()).setContent( - new String(data, start, end - start)); + new String(data, start, length)); } /** diff --git a/src/java/org/apache/fop/render/ps/extensions/AbstractPSExtensionElement.java b/src/java/org/apache/fop/render/ps/extensions/AbstractPSExtensionElement.java index 14865a8c9..3f534af7e 100644 --- a/src/java/org/apache/fop/render/ps/extensions/AbstractPSExtensionElement.java +++ b/src/java/org/apache/fop/render/ps/extensions/AbstractPSExtensionElement.java @@ -64,24 +64,16 @@ public abstract class AbstractPSExtensionElement extends FONode { } } - /** - * Adds characters (does nothing here) - * @param data array of characters containing text to be added - * @param start starting array element to add - * @param length of data array to add - * @param pList currently applicable PropertyList - * @param locator location in fo source file. - * @see org.apache.fop.fo.FONode#addCharacters(char[], int, int, PropertyList, Locator) - */ - protected void addCharacters(char[] data, int start, int length, + /** {@inheritDoc} */ + protected void characters(char[] data, int start, int length, PropertyList pList, Locator locator) { PSExtensionAttachment a = (PSExtensionAttachment)getExtensionAttachment(); if (a.getContent() != null) { StringBuffer sb = new StringBuffer(a.getContent()); - sb.append(data, start, length - start); + sb.append(data, start, length); a.setContent(sb.toString()); } else { - a.setContent(new String(data, start, length - start)); + a.setContent(new String(data, start, length)); } } diff --git a/src/java/org/apache/fop/render/ps/extensions/AbstractPSExtensionObject.java b/src/java/org/apache/fop/render/ps/extensions/AbstractPSExtensionObject.java index 92108b551..ec90a3afd 100644 --- a/src/java/org/apache/fop/render/ps/extensions/AbstractPSExtensionObject.java +++ b/src/java/org/apache/fop/render/ps/extensions/AbstractPSExtensionObject.java @@ -54,14 +54,14 @@ public abstract class AbstractPSExtensionObject extends FONode { } /** {@inheritDoc} */ - protected void addCharacters(char[] data, int start, int length, + protected void characters(char[] data, int start, int length, PropertyList pList, Locator locator) { if (setupCode.getContent() != null) { StringBuffer sb = new StringBuffer(setupCode.getContent()); sb.append(data, start, length - start); setupCode.setContent(sb.toString()); } else { - setupCode.setContent(new String(data, start, length - start)); + setupCode.setContent(new String(data, start, length)); } } diff --git a/status.xml b/status.xml index 2a3b8937e..17e88d5d6 100644 --- a/status.xml +++ b/status.xml @@ -53,6 +53,10 @@ + + Added LayoutManagerMapping.registerMaker() to make registration of custom + layout managers easier. + Fixed absolute positioning of block-containers when specified using right and bottom instead of left and top. -- 2.39.5