Index: src/java/org/apache/fop/afp/goca/AbstractGraphicsDrawingOrderContainer.java
===================================================================
--- src/java/org/apache/fop/afp/goca/AbstractGraphicsDrawingOrderContainer.java	(revision 746664)
+++ src/java/org/apache/fop/afp/goca/AbstractGraphicsDrawingOrderContainer.java	Fri Jul 10 21:13:44 CEST 2009
@@ -46,12 +46,21 @@
     /** object has started */
     private boolean started = false;
 
+    private int dataLength = 0;
+    private final boolean[] lengthChanged = { true };
+
     /**
      * Default constructor
      */
     protected AbstractGraphicsDrawingOrderContainer() {
     }
 
+    private void markLengthChanged() {
+        synchronized (this.lengthChanged) {
+            this.lengthChanged[0] = true;
+        }
+    }
+
     /**
      * Named constructor
      *
@@ -77,6 +86,7 @@
      * @param object the structured data object
      */
     public void addObject(StructuredData object) {
+        markLengthChanged();
         objects.add(object);
     }
 
@@ -86,6 +96,7 @@
      * @param graphicsContainer a graphics container
      */
     public void addAll(AbstractGraphicsDrawingOrderContainer graphicsContainer) {
+        markLengthChanged();
         Collection/*<StructuredDataObject>*/ objects = graphicsContainer.getObjects();
         objects.addAll(objects);
     }
@@ -107,10 +118,12 @@
     public StructuredData removeLast() {
         int lastIndex = objects.size() - 1;
         StructuredData object = null;
-        if (lastIndex > -1) {
-            object = (StructuredData)objects.get(lastIndex);
-            objects.remove(lastIndex);
+        if (lastIndex >= 0) {
+            object = (StructuredData)objects.remove(lastIndex);
         }
+        if (object != null) {
+            markLengthChanged();
+        }
         return object;
     }
 
@@ -121,13 +134,18 @@
      * all enclosed objects (and their containers)
      */
     public int getDataLength() {
-        int dataLen = 0;
+        synchronized (this.lengthChanged) {
+            if (this.lengthChanged[0]) {
+                this.dataLength = 0;
-        Iterator it = objects.iterator();
-        while (it.hasNext()) {
+                Iterator it = objects.iterator();
+                while (it.hasNext()) {
-            dataLen += ((StructuredData)it.next()).getDataLength();
+                    this.dataLength += ((StructuredData)it.next()).getDataLength();
-        }
+                }
-        return dataLen;
+                this.lengthChanged[0] = false;
-    }
+            }
+            return this.dataLength;
+        }
+    }
 
     /** {@inheritDoc} */
     public void setComplete(boolean complete) {
