aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/fop/area
diff options
context:
space:
mode:
authorAdrian Cumiskey <acumiskey@apache.org>2008-07-07 12:48:50 +0000
committerAdrian Cumiskey <acumiskey@apache.org>2008-07-07 12:48:50 +0000
commitccb0ccb674eb0cdd014a0ca236403a640bb57fdf (patch)
tree23977ca880a2c809f75d66a9cf960a06736bf398 /src/java/org/apache/fop/area
parente7a3ad040799fe4ea862a5dc7cfdb0f35696f2e3 (diff)
downloadxmlgraphics-fop-ccb0ccb674eb0cdd014a0ca236403a640bb57fdf.tar.gz
xmlgraphics-fop-ccb0ccb674eb0cdd014a0ca236403a640bb57fdf.zip
Merged revisions 674245,674267,674269,674272-674273,674276,674325,674468,674470-674471 via svnmerge from
https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk ........ r674245 | adelmelle | 2008-07-05 23:53:58 +0100 (Sat, 05 Jul 2008) | 1 line Fixed ClassCastException when specifying column-number on something other than a fo:table-column or fo:table-cell... ........ r674267 | adelmelle | 2008-07-06 08:50:23 +0100 (Sun, 06 Jul 2008) | 1 line Switch AreaTreeParser to use a java.nio.CharBuffer, and ignore characters events for all elements other than <word>, <space> or <character> ........ r674269 | adelmelle | 2008-07-06 09:15:50 +0100 (Sun, 06 Jul 2008) | 1 line Remove deprecated Character area class ........ r674272 | adelmelle | 2008-07-06 09:44:54 +0100 (Sun, 06 Jul 2008) | 1 line Redo changes made in r674056... ........ r674273 | adelmelle | 2008-07-06 09:46:50 +0100 (Sun, 06 Jul 2008) | 1 line Simplified implementation of Area.getTraitAsBoolean() ........ r674276 | adelmelle | 2008-07-06 10:17:14 +0100 (Sun, 06 Jul 2008) | 3 lines Extracted conversion methods for String to int[] or double[] to a utility class. Made AreaTreeParser.getAttributeAsXXX() methods static to stress their utility character, and removed the private parseRect() in favor of getAttributeAsRectangle2D(). ........ r674325 | adelmelle | 2008-07-06 19:19:48 +0100 (Sun, 06 Jul 2008) | 1 line Fixed error; inadvertently switched the condition with r674272... ........ r674468 | acumiskey | 2008-07-07 13:36:57 +0100 (Mon, 07 Jul 2008) | 1 line Possible NullPointerException avoided ........ r674470 | acumiskey | 2008-07-07 13:38:04 +0100 (Mon, 07 Jul 2008) | 1 line Added new set accessor method for EncryptionParams. ........ r674471 | acumiskey | 2008-07-07 13:42:12 +0100 (Mon, 07 Jul 2008) | 1 line Added PDF encryption parameter support in configuration. ........ git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AFPGOCAResources@674476 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache/fop/area')
-rw-r--r--src/java/org/apache/fop/area/Area.java8
-rw-r--r--src/java/org/apache/fop/area/AreaTreeParser.java169
-rw-r--r--src/java/org/apache/fop/area/inline/Character.java62
3 files changed, 77 insertions, 162 deletions
diff --git a/src/java/org/apache/fop/area/Area.java b/src/java/org/apache/fop/area/Area.java
index 9c0fc8db6..ab9590685 100644
--- a/src/java/org/apache/fop/area/Area.java
+++ b/src/java/org/apache/fop/area/Area.java
@@ -417,17 +417,11 @@ public class Area extends AreaTreeObject implements Serializable {
/**
* Get a boolean trait from this area.
- *
* @param oTraitCode the trait key
* @return the trait value
*/
public boolean getTraitAsBoolean(Object oTraitCode) {
- final Object obj = getTrait(oTraitCode);
- if (obj instanceof Boolean) {
- return ((Boolean)obj).booleanValue();
- } else {
- return false;
- }
+ return Boolean.TRUE.equals(getTrait(oTraitCode));
}
/**
diff --git a/src/java/org/apache/fop/area/AreaTreeParser.java b/src/java/org/apache/fop/area/AreaTreeParser.java
index d48221c0a..6d9fd4f32 100644
--- a/src/java/org/apache/fop/area/AreaTreeParser.java
+++ b/src/java/org/apache/fop/area/AreaTreeParser.java
@@ -26,6 +26,7 @@ import java.util.Map;
import java.util.Set;
import java.util.Stack;
import java.util.StringTokenizer;
+import java.nio.CharBuffer;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
@@ -56,7 +57,6 @@ import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.area.Trait.Background;
import org.apache.fop.area.Trait.InternalLink;
import org.apache.fop.area.inline.AbstractTextArea;
-import org.apache.fop.area.inline.Character;
import org.apache.fop.area.inline.ForeignObject;
import org.apache.fop.area.inline.Image;
import org.apache.fop.area.inline.InlineArea;
@@ -78,6 +78,7 @@ import org.apache.fop.traits.BorderProps;
import org.apache.fop.util.ColorUtil;
import org.apache.fop.util.ContentHandlerFactory;
import org.apache.fop.util.ContentHandlerFactoryRegistry;
+import org.apache.fop.util.ConversionUtils;
import org.apache.fop.util.DefaultErrorListener;
/**
@@ -132,8 +133,10 @@ public class AreaTreeParser {
private ElementMappingRegistry elementMappingRegistry;
private Attributes lastAttributes;
- private StringBuffer content = new StringBuffer();
+ private CharBuffer content = CharBuffer.allocate(64);
+ private boolean ignoreCharacters = true;
+
private PageViewport currentPageViewport;
private Map pageViewportsByKey = new java.util.HashMap();
// set of "ID firsts" that have already been assigned to a PV:
@@ -176,7 +179,6 @@ public class AreaTreeParser {
makers.put("text", new TextMaker());
makers.put("word", new WordMaker());
makers.put("space", new SpaceMaker());
- makers.put("char", new CharMaker());
makers.put("leader", new LeaderMaker());
makers.put("viewport", new ViewportMaker());
makers.put("image", new ImageMaker());
@@ -186,15 +188,6 @@ public class AreaTreeParser {
makers.put("destination", new DestinationMaker());
}
- private static Rectangle2D parseRect(String rect) {
- StringTokenizer tokenizer = new StringTokenizer(rect, " ");
- return new Rectangle2D.Double(
- Double.parseDouble(tokenizer.nextToken()),
- Double.parseDouble(tokenizer.nextToken()),
- Double.parseDouble(tokenizer.nextToken()),
- Double.parseDouble(tokenizer.nextToken()));
- }
-
private Area findAreaType(Class clazz) {
if (areaStack.size() > 0) {
int pos = areaStack.size() - 1;
@@ -261,7 +254,10 @@ public class AreaTreeParser {
boolean handled = true;
if ("".equals(uri)) {
Maker maker = (Maker)makers.get(localName);
+ content.clear();
+ ignoreCharacters = true;
if (maker != null) {
+ ignoreCharacters = maker.ignoreCharacters();
maker.startElement(attributes);
} else if ("extension-attachments".equals(localName)) {
//TODO implement me
@@ -311,11 +307,12 @@ public class AreaTreeParser {
Maker maker = (Maker)makers.get(localName);
if (maker != null) {
maker.endElement();
+ content.clear();
}
+ ignoreCharacters = true;
} else {
//log.debug("Ignoring " + localName + " in namespace: " + uri);
}
- content.setLength(0); //Reset text buffer (see characters())
}
}
@@ -324,6 +321,7 @@ public class AreaTreeParser {
private static interface Maker {
void startElement(Attributes attributes) throws SAXException;
void endElement();
+ boolean ignoreCharacters();
}
private abstract class AbstractMaker implements Maker {
@@ -335,6 +333,10 @@ public class AreaTreeParser {
public void endElement() {
//nop
}
+
+ public boolean ignoreCharacters() {
+ return true;
+ }
}
private class AreaTreeMaker extends AbstractMaker {
@@ -384,7 +386,7 @@ public class AreaTreeParser {
if (currentPageViewport != null) {
throw new IllegalStateException("currentPageViewport must be null");
}
- Rectangle2D viewArea = parseRect(attributes.getValue("bounds"));
+ Rectangle2D viewArea = getAttributeAsRectangle2D(attributes, "bounds");
int pageNumber = getAttributeAsInteger(attributes, "nr", -1);
String key = attributes.getValue("key");
String pageNumberString = attributes.getValue("formatted-nr");
@@ -420,7 +422,7 @@ public class AreaTreeParser {
if (rv != null) {
throw new IllegalStateException("Current RegionViewport must be null");
}
- Rectangle2D viewArea = parseRect(attributes.getValue("rect"));
+ Rectangle2D viewArea = getAttributeAsRectangle2D(attributes, "rect");
rv = new RegionViewport(viewArea);
transferForeignObjects(attributes, rv);
rv.setClip(getAttributeAsBoolean(attributes, "clipped", false));
@@ -444,7 +446,7 @@ public class AreaTreeParser {
public void endElement() {
assertObjectOfClass(areaStack.pop(), RegionReference.class);
- }
+ }
}
private class RegionAfterMaker extends AbstractMaker {
@@ -455,7 +457,7 @@ public class AreaTreeParser {
public void endElement() {
assertObjectOfClass(areaStack.pop(), RegionReference.class);
- }
+ }
}
private class RegionStartMaker extends AbstractMaker {
@@ -466,7 +468,7 @@ public class AreaTreeParser {
public void endElement() {
assertObjectOfClass(areaStack.pop(), RegionReference.class);
- }
+ }
}
private class RegionEndMaker extends AbstractMaker {
@@ -477,7 +479,7 @@ public class AreaTreeParser {
public void endElement() {
assertObjectOfClass(areaStack.pop(), RegionReference.class);
- }
+ }
}
private class RegionBodyMaker extends AbstractMaker {
@@ -575,7 +577,7 @@ public class AreaTreeParser {
public void endElement() {
assertObjectOfClass(areaStack.pop(), BeforeFloat.class);
- }
+ }
}
private class BlockMaker extends AbstractMaker {
@@ -627,7 +629,7 @@ public class AreaTreeParser {
public void endElement() {
assertObjectOfClass(areaStack.pop(), Block.class);
- }
+ }
}
private class LineAreaMaker extends AbstractMaker {
@@ -735,47 +737,37 @@ public class AreaTreeParser {
public void endElement() {
assertObjectOfClass(areaStack.pop(), TextArea.class);
- }
+ }
}
private class WordMaker extends AbstractMaker {
- private int[] toIntArray(String s) {
- if (s == null || s.length() == 0) {
- return null;
- }
- StringTokenizer tokenizer = new StringTokenizer(s, " ");
- List values = new java.util.ArrayList();
- while (tokenizer.hasMoreTokens()) {
- values.add(new Integer(tokenizer.nextToken()));
- }
- int[] res = new int[values.size()];
- for (int i = 0, c = res.length; i < c; i++) {
- res[i] = ((Integer)values.get(i)).intValue();
- }
- return res;
- }
-
public void endElement() {
int offset = getAttributeAsInteger(lastAttributes, "offset", 0);
- int[] letterAdjust = toIntArray(lastAttributes.getValue("letter-adjust"));
- String txt = content.toString();
- WordArea word = new WordArea(txt, offset, letterAdjust);
+ int[] letterAdjust
+ = ConversionUtils.toIntArray(
+ lastAttributes.getValue("letter-adjust"), "\\s");
+ content.flip();
+ WordArea word = new WordArea(content.toString().trim(), offset, letterAdjust);
AbstractTextArea text = getCurrentText();
word.setParentArea(text);
text.addChildArea(word);
- }
+ }
+
+ public boolean ignoreCharacters() {
+ return false;
+ }
}
private class SpaceMaker extends AbstractMaker {
-
+
public void endElement() {
int offset = getAttributeAsInteger(lastAttributes, "offset", 0);
- String txt = content.toString();
//TODO the isAdjustable parameter is currently not used/implemented
- if (txt.length() > 0) {
+ if (content.position() > 0) {
+ content.flip();
boolean adjustable = getAttributeAsBoolean(lastAttributes, "adj", true);
- SpaceArea space = new SpaceArea(txt.charAt(0), offset, adjustable);
+ SpaceArea space = new SpaceArea(content.charAt(0), offset, adjustable);
AbstractTextArea text = getCurrentText();
space.setParentArea(text);
text.addChildArea(space);
@@ -789,25 +781,11 @@ public class AreaTreeParser {
Area parent = (Area)areaStack.peek();
parent.addChildArea(space);
}
- }
- }
-
- private class CharMaker extends AbstractMaker {
-
- public void endElement() {
- String txt = content.toString();
- Character ch = new Character(txt.charAt(0));
- transferForeignObjects(lastAttributes, ch);
- setAreaAttributes(lastAttributes, ch);
- setTraits(lastAttributes, ch, SUBSET_COMMON);
- setTraits(lastAttributes, ch, SUBSET_BOX);
- setTraits(lastAttributes, ch, SUBSET_COLOR);
- setTraits(lastAttributes, ch, SUBSET_FONT);
- ch.setOffset(getAttributeAsInteger(lastAttributes, "offset", 0));
- ch.setBaselineOffset(getAttributeAsInteger(lastAttributes, "baseline", 0));
- Area parent = (Area)areaStack.peek();
- parent.addChildArea(ch);
- }
+ }
+
+ public boolean ignoreCharacters() {
+ return false;
+ }
}
private class LeaderMaker extends AbstractMaker {
@@ -830,9 +808,6 @@ public class AreaTreeParser {
Area parent = (Area)areaStack.peek();
parent.addChildArea(leader);
}
-
- public void endElement() {
- }
}
private class ViewportMaker extends AbstractMaker {
@@ -854,7 +829,7 @@ public class AreaTreeParser {
public void endElement() {
assertObjectOfClass(areaStack.pop(), Viewport.class);
- }
+ }
}
private class ImageMaker extends AbstractMaker {
@@ -1097,7 +1072,7 @@ public class AreaTreeParser {
}
}
- private boolean getAttributeAsBoolean(Attributes attributes, String name,
+ private static boolean getAttributeAsBoolean(Attributes attributes, String name,
boolean defaultValue) {
String s = attributes.getValue(name);
if (s == null) {
@@ -1107,7 +1082,7 @@ public class AreaTreeParser {
}
}
- private int getAttributeAsInteger(Attributes attributes, String name,
+ private static int getAttributeAsInteger(Attributes attributes, String name,
int defaultValue) {
String s = attributes.getValue(name);
if (s == null) {
@@ -1117,36 +1092,30 @@ public class AreaTreeParser {
}
}
- private CTM getAttributeAsCTM(Attributes attributes, String name) {
+ private static CTM getAttributeAsCTM(Attributes attributes, String name) {
String s = attributes.getValue(name).trim();
if (s.startsWith("[") && s.endsWith("]")) {
s = s.substring(1, s.length() - 1);
- StringTokenizer tokenizer = new StringTokenizer(s, " ");
- double[] values = new double[] {
- Double.parseDouble(tokenizer.nextToken()),
- Double.parseDouble(tokenizer.nextToken()),
- Double.parseDouble(tokenizer.nextToken()),
- Double.parseDouble(tokenizer.nextToken()),
- Double.parseDouble(tokenizer.nextToken()),
- Double.parseDouble(tokenizer.nextToken())};
+ double[] values = ConversionUtils.toDoubleArray(s, "\\s");
+ if (values.length != 6) {
+ throw new IllegalArgumentException("CTM must consist of 6 double values!");
+ }
return new CTM(values[0], values[1], values[2], values[3], values[4], values[5]);
} else {
- throw new IllegalArgumentException("CTM must be surrounded by square brackets");
+ throw new IllegalArgumentException("CTM must be surrounded by square brackets!");
}
}
- private Rectangle2D getAttributeAsRectangle2D(Attributes attributes, String name) {
+ private static Rectangle2D getAttributeAsRectangle2D(Attributes attributes, String name) {
String s = attributes.getValue(name).trim();
- StringTokenizer tokenizer = new StringTokenizer(s, " ");
- double[] values = new double[] {
- Double.parseDouble(tokenizer.nextToken()),
- Double.parseDouble(tokenizer.nextToken()),
- Double.parseDouble(tokenizer.nextToken()),
- Double.parseDouble(tokenizer.nextToken())};
+ double[] values = ConversionUtils.toDoubleArray(s, "\\s");
+ if (values.length != 4) {
+ throw new IllegalArgumentException("Rectangle must consist of 4 double values!");
+ }
return new Rectangle2D.Double(values[0], values[1], values[2], values[3]);
}
- private void transferForeignObjects(Attributes atts, AreaTreeObject ato) {
+ private static void transferForeignObjects(Attributes atts, AreaTreeObject ato) {
for (int i = 0, c = atts.getLength(); i < c; i++) {
String ns = atts.getURI(i);
if (ns.length() > 0) {
@@ -1163,11 +1132,25 @@ public class AreaTreeParser {
public void characters(char[] ch, int start, int length) throws SAXException {
if (delegate != null) {
delegate.characters(ch, start, length);
- } else {
- content.append(ch, start, length);
+ } else if (!ignoreCharacters) {
+ int maxLength = this.content.capacity() - this.content.position();
+ if (maxLength < length) {
+ // allocate a larger buffer and transfer content
+ CharBuffer newContent
+ = CharBuffer.allocate(this.content.position() + length);
+ this.content.flip();
+ newContent.put(this.content);
+ this.content = newContent;
+ }
+ // make sure the full capacity is used
+ this.content.limit(this.content.capacity());
+ // add characters to the buffer
+ this.content.put(ch, start, length);
+ // decrease the limit, if necessary
+ if (this.content.position() < this.content.limit()) {
+ this.content.limit(this.content.position());
+ }
}
}
-
}
-
}
diff --git a/src/java/org/apache/fop/area/inline/Character.java b/src/java/org/apache/fop/area/inline/Character.java
deleted file mode 100644
index 6b6f9744f..000000000
--- a/src/java/org/apache/fop/area/inline/Character.java
+++ /dev/null
@@ -1,62 +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.area.inline;
-
-/**
- * Single character inline area.
- * This inline area holds a single character.
- * @deprecated A TextArea with a single WordArea as its child should be used instead.
- */
-public class Character extends AbstractTextArea {
- // use a String instead of a character because if this character
- // ends a syllable the hyphenation character must be added
- private String character;
-
- /**
- * Create a new character inline area with the given character.
- *
- * @param ch the character for this inline area
- */
- public Character(char ch) {
- character = new String() + ch;
- }
-
- /**
- * Get the character for this inline character area.
- *
- * @return the character
- */
- public String getChar() {
- return character;
- }
-
- /**
- * Add the hyphenation character and its length.
- *
- * @param hyphChar the hyphenation character
- * @param hyphSize the size of the hyphenation character
- */
- public void addHyphen(char hyphChar, int hyphSize) {
- character += hyphChar;
- this.setIPD(this.getIPD() + hyphSize);
- }
-
-}
-