You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ye...@apache.org on 2012/05/31 11:47:18 UTC

svn commit: r1344621 - in /poi/branches/gsoc2012/src: java/org/apache/poi/ddf/ java/org/apache/poi/hssf/record/ testcases/org/apache/poi/hssf/model/ testcases/org/apache/poi/hssf/record/

Author: yegor
Date: Thu May 31 09:47:17 2012
New Revision: 1344621

URL: http://svn.apache.org/viewvc?rev=1344621&view=rev
Log:
more tests and fixes, see patch from May 30 in Bugzilla 53010

Added:
    poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/record/HSSFRecordTestHelper.java
Modified:
    poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherArrayProperty.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/DrawingRecord.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/EscherAggregate.java
    poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingAggregate.java

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherArrayProperty.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherArrayProperty.java?rev=1344621&r1=1344620&r2=1344621&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherArrayProperty.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherArrayProperty.java Thu May 31 09:47:17 2012
@@ -62,6 +62,9 @@ public final class EscherArrayProperty e
     }
 
     public int getNumberOfElementsInArray() {
+        if (emptyComplexPart){
+            return 0;
+        }
         return LittleEndian.getUShort(_complexData, 0);
     }
 

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/DrawingRecord.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/DrawingRecord.java?rev=1344621&r1=1344620&r2=1344621&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/DrawingRecord.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/DrawingRecord.java Thu May 31 09:47:17 2012
@@ -64,6 +64,10 @@ public final class DrawingRecord extends
         return recordData;
     }
 
+    public byte[] getRecordData(){
+        return recordData;
+    }
+
     public void setData(byte[] thedata) {
     	if (thedata == null) {
     		throw new IllegalArgumentException("data must not be null");

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/EscherAggregate.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/EscherAggregate.java?rev=1344621&r1=1344620&r2=1344621&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/EscherAggregate.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/EscherAggregate.java Thu May 31 09:47:17 2012
@@ -288,7 +288,7 @@ public final class EscherAggregate exten
 	protected HSSFPatriarch patriarch;
 
 	/** Maps shape container objects to their {@link TextObjectRecord} or {@link ObjRecord} */
-	private Map<EscherRecord, Record> shapeToObj = new HashMap<EscherRecord, Record>();
+	Map<EscherRecord, Record> shapeToObj = new HashMap<EscherRecord, Record>();
 	private DrawingManager2 drawingManager;
 	private short drawingGroupId;
 
@@ -371,7 +371,7 @@ public final class EscherAggregate exten
 				&& sid( records, loc ) == DrawingRecord.sid
 				&& isObjectRecord( records, loc + 1 ) )
 		{
-			dataSize += ( (DrawingRecord) records.get( loc ) ).getData().length;
+			dataSize += ( (DrawingRecord) records.get( loc ) ).getRecordData().length;
 			loc += 2;
             while ( loc + 1 < records.size()
                     && sid( records, loc ) == ContinueRecord.sid
@@ -391,8 +391,8 @@ public final class EscherAggregate exten
 				&& isObjectRecord( records, loc + 1 ) )
 		{
 			DrawingRecord drawingRecord = (DrawingRecord) records.get( loc );
-			System.arraycopy( drawingRecord.getData(), 0, buffer, offset, drawingRecord.getData().length );
-			offset += drawingRecord.getData().length;
+			System.arraycopy( drawingRecord.getRecordData(), 0, buffer, offset, drawingRecord.getRecordData().length );
+			offset += drawingRecord.getRecordData().length;
 			loc += 2;
             while ( loc + 1 < records.size()
                     && sid( records, loc ) == ContinueRecord.sid

Modified: poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingAggregate.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingAggregate.java?rev=1344621&r1=1344620&r2=1344621&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingAggregate.java (original)
+++ poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingAggregate.java Thu May 31 09:47:17 2012
@@ -1,18 +1,29 @@
+/* ====================================================================
+   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.
+==================================================================== */
 package org.apache.poi.hssf.model;
 
 import junit.framework.TestCase;
+import org.apache.poi.ddf.EscherClientDataRecord;
+import org.apache.poi.ddf.EscherContainerRecord;
 import org.apache.poi.ddf.EscherDggRecord;
+import org.apache.poi.ddf.EscherRecord;
+import org.apache.poi.ddf.EscherSpRecord;
 import org.apache.poi.hssf.HSSFTestDataSamples;
-import org.apache.poi.hssf.record.ContinueRecord;
-import org.apache.poi.hssf.record.DrawingRecord;
-import org.apache.poi.hssf.record.EOFRecord;
-import org.apache.poi.hssf.record.EscherAggregate;
-import org.apache.poi.hssf.record.ObjRecord;
-import org.apache.poi.hssf.record.Record;
-import org.apache.poi.hssf.record.RecordBase;
-import org.apache.poi.hssf.record.RecordFactory;
-import org.apache.poi.hssf.record.TextObjectRecord;
-import org.apache.poi.hssf.record.WindowTwoRecord;
+import org.apache.poi.hssf.record.*;
 import org.apache.poi.hssf.record.aggregates.RowRecordsAggregate;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFTestHelper;
@@ -20,7 +31,10 @@ import org.apache.poi.hssf.usermodel.HSS
 import org.apache.poi.util.HexRead;
 
 import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author Yegor Kozlov
@@ -28,6 +42,115 @@ import java.util.List;
  */
 public class TestDrawingAggregate extends TestCase {
     /**
+     * Serialize escher aggregate, read back and assert that the drawing data is preserved.
+     *
+     * @param agg the aggregate to test
+     * @return verified aggregate (serialized and read back)
+     */
+    public static EscherAggregate assertWriteAndReadBack(EscherAggregate agg) {
+        byte[] dgBytes = agg.serialize();
+
+
+        List<Record> dgRecords = RecordFactory.createRecords(new ByteArrayInputStream(dgBytes));
+
+        DrawingManager2 drawingManager = new DrawingManager2(new EscherDggRecord());
+
+        // create a dummy sheet consisting of our test data
+        InternalSheet sheet = InternalSheet.createSheet();
+        List<RecordBase> records = sheet.getRecords();
+        records.clear();
+        records.addAll(dgRecords);
+        records.add(EOFRecord.instance);
+
+
+        sheet.aggregateDrawingRecords(drawingManager, false);
+        assertEquals("drawing was not fully aggregated", 2, records.size());
+        assertTrue("expected EscherAggregate", records.get(0) instanceof EscherAggregate);
+        assertTrue("expected EOFRecord", records.get(1) instanceof EOFRecord);
+        EscherAggregate agg2 = (EscherAggregate) records.get(0);
+
+        assertEquals(agg.getEscherRecords().size(), agg2.getEscherRecords().size());
+
+        // assert that both pre- and after- serialize aggregates have the same xml representation
+        for (int i = 0; i < agg.getEscherRecords().size(); i++) {
+            EscherRecord r1 = agg.getEscherRecords().get(i);
+            EscherRecord r2 = agg2.getEscherRecords().get(i);
+
+            assertEquals(r1.toXml(), r2.toXml());
+        }
+
+        return agg2;
+    }
+
+    /**
+     * assert that mapping of Obj records to escher shape containers is the same in both aggregates
+     */
+    public static void assertObjectMappingSame(EscherAggregate agg1, EscherAggregate agg2) {
+
+        // map EscherClientDataRecord and EscherTextboxRecord to their parents
+        Map<EscherRecord, EscherContainerRecord> map1 = new LinkedHashMap<EscherRecord, EscherContainerRecord>();
+        for (EscherRecord r : agg1.getEscherRecords()) mapShapeContainers(r, map1);
+
+        Map<EscherRecord, EscherContainerRecord> map2 = new LinkedHashMap<EscherRecord, EscherContainerRecord>();
+        for (EscherRecord r : agg2.getEscherRecords()) mapShapeContainers(r, map2);
+
+        assertEquals("aggregates have different number of shapes", map1.size(), map2.size());
+
+        // for each EscherClientDataRecord get parent SP_CONTAINER and corresponding ObjRecord
+        // verify that ObjRecord to
+        List<EscherRecord> l1 = new ArrayList<EscherRecord>(map1.keySet());
+        List<EscherRecord> l2 = new ArrayList<EscherRecord>(map2.keySet());
+        for (int i = 0; i < l1.size(); i++) {
+            EscherRecord e1 = l1.get(i);
+            EscherRecord e2 = l2.get(i);
+            ObjRecord obj1 = (ObjRecord) HSSFRecordTestHelper.getShapeToObjForTest(agg1).get(e1);
+            ObjRecord obj2 = (ObjRecord) HSSFRecordTestHelper.getShapeToObjForTest(agg2).get(e2);
+
+            CommonObjectDataSubRecord cmo1 = (CommonObjectDataSubRecord) obj1.getSubRecords().get(0);
+            CommonObjectDataSubRecord cmo2 = (CommonObjectDataSubRecord) obj2.getSubRecords().get(0);
+
+            assertEquals(cmo1.getObjectId(), cmo2.getObjectId());
+            assertEquals(obj1.toString(), obj2.toString());
+
+            // test that obj parents have the same shapeId, that is, that shape is the same
+            EscherContainerRecord p1 = map1.get(e1);
+            EscherContainerRecord p2 = map2.get(e2);
+            EscherSpRecord sp1 = (EscherSpRecord) p1.getChildById(EscherSpRecord.RECORD_ID);
+            EscherSpRecord sp2 = (EscherSpRecord) p2.getChildById(EscherSpRecord.RECORD_ID);
+            assertEquals(sp1.getShapeId(), sp2.getShapeId());
+
+            assertEquals("wrong shape2obj mapping", sp1.getShapeId() % 1024, cmo1.getObjectId());
+            assertEquals(p1.toXml(), p2.toXml());
+        }
+    }
+
+    /**
+     * recursively map EscherClientDataRecords  to their parent shape containers:
+     * <p/>
+     * EscherClientDataRecord1 --> EscherContainerRecord1
+     * EscherClientDataRecord2 --> EscherContainerRecord2
+     * ...
+     * <p/>
+     * TODO: YK: this method can be avoided if we have EscherRecord.getParent()
+     */
+    private static void mapShapeContainers(EscherRecord parent, Map<EscherRecord, EscherContainerRecord> map) {
+        if (parent.isContainerRecord()) {
+            if (parent.getRecordId() == EscherContainerRecord.SP_CONTAINER) {
+                // iterate over shape's children and search for EscherClientDataRecord
+                for (EscherRecord r : parent.getChildRecords()) {
+                    if (r.getRecordId() == EscherClientDataRecord.RECORD_ID) {
+                        map.put(r, (EscherContainerRecord) parent);
+                    }
+                }
+            } else {
+                for (EscherRecord ch : parent.getChildRecords()) {
+                    mapShapeContainers(ch, map);
+                }
+            }
+        }
+    }
+
+    /**
      * test reading drawing aggregate from a test file from Bugzilla 45129
      */
     public void test45129() {
@@ -69,7 +192,7 @@ public class TestDrawingAggregate extend
         // The subrange [19, 388] is expected to be replaced with a EscherAggregate object
         DrawingManager2 drawingManager = iworkbook.findDrawingGroup();
         int loc = isheet.aggregateDrawingRecords(drawingManager, false);
-        EscherAggregate ag = (EscherAggregate) records.get(loc);
+        EscherAggregate agg = (EscherAggregate) records.get(loc);
 
         assertEquals("wrong size of the aggregated sheet records stream", 25, records.size());
         assertTrue(
@@ -80,8 +203,9 @@ public class TestDrawingAggregate extend
         assertTrue("records.get(20) is expected to be Window2 but was " + records.get(20).getClass().getSimpleName(),
                 records.get(20) instanceof WindowTwoRecord);
 
-        // TODO figure out why serialization fails
-        // byte[] bytes = ag.serialize();
+        EscherAggregate agg2 = assertWriteAndReadBack(agg);
+
+        assertObjectMappingSame(agg, agg2);
     }
 
     public void testFileWithPictures() {
@@ -93,10 +217,6 @@ public class TestDrawingAggregate extend
 
         List<RecordBase> records = isheet.getRecords();
 
-        for (RecordBase recordBase : records) {
-            System.out.println(recordBase.toString());
-        }
-
         // the sheet's drawing is not aggregated
         assertEquals("wrong size of sheet records stream", 315, records.size());
         // the last record before the drawing block
@@ -127,7 +247,7 @@ public class TestDrawingAggregate extend
         // The subrange [19, 388] is expected to be replaced with a EscherAggregate object
         DrawingManager2 drawingManager = iworkbook.findDrawingGroup();
         int loc = isheet.aggregateDrawingRecords(drawingManager, false);
-        EscherAggregate ag = (EscherAggregate) records.get(loc);
+        EscherAggregate agg = (EscherAggregate) records.get(loc);
 
         assertEquals("wrong size of the aggregated sheet records stream", 38, records.size());
         assertTrue(
@@ -137,6 +257,10 @@ public class TestDrawingAggregate extend
                 records.get(22) instanceof EscherAggregate);
         assertTrue("records.get(23) is expected to be Window2 but was " + records.get(23).getClass().getSimpleName(),
                 records.get(23) instanceof WindowTwoRecord);
+
+        EscherAggregate agg2 = assertWriteAndReadBack(agg);
+
+        assertObjectMappingSame(agg, agg2);
     }
 
     public void testUnhandledContinue() {
@@ -848,8 +972,10 @@ public class TestDrawingAggregate extend
         assertTrue("expected EOFRecord", records.get(1) instanceof EOFRecord);
         EscherAggregate agg = (EscherAggregate) records.get(0);
 
-        // TODO figure out why serialization fails
-//        byte[] writtenBytes = agg.serialize();
+        // serialize, read back and assert that the drawing data is preserved
+        EscherAggregate agg2 = assertWriteAndReadBack(agg);
+
+        assertObjectMappingSame(agg, agg2);
     }
 
     public void testUnhandledContinue2() {
@@ -1793,10 +1919,15 @@ public class TestDrawingAggregate extend
         records.addAll(dgRecords);
         records.add(EOFRecord.instance);
 
-
         sheet.aggregateDrawingRecords(drawingManager, false);
         assertEquals("drawing was not fully aggregated", 2, records.size());
         assertTrue("expected EscherAggregate", records.get(0) instanceof EscherAggregate);
         assertTrue("expected EOFRecord", records.get(1) instanceof EOFRecord);
+
+        EscherAggregate agg = (EscherAggregate) records.get(0);
+
+        EscherAggregate agg2 = assertWriteAndReadBack(agg);
+
+        assertObjectMappingSame(agg, agg2);
     }
 }

Added: poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/record/HSSFRecordTestHelper.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/record/HSSFRecordTestHelper.java?rev=1344621&view=auto
==============================================================================
--- poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/record/HSSFRecordTestHelper.java (added)
+++ poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/record/HSSFRecordTestHelper.java Thu May 31 09:47:17 2012
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+package org.apache.poi.hssf.record;
+
+import org.apache.poi.ddf.EscherRecord;
+
+import java.util.Map;
+
+/**
+ * @author Evgeniy Berlog
+ * date: 30.05.12
+ */
+public class HSSFRecordTestHelper {
+
+    public static Map<EscherRecord, Record> getShapeToObjForTest(EscherAggregate agg){
+        return agg.shapeToObj;
+    }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org