]> source.dussan.org Git - poi.git/commitdiff
Add clone methods to DrawingRecord and AbstractEscherHolderRecord, which allows cloni...
authorNick Burch <nick@apache.org>
Wed, 9 Jan 2008 10:59:04 +0000 (10:59 +0000)
committerNick Burch <nick@apache.org>
Wed, 9 Jan 2008 10:59:04 +0000 (10:59 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@610336 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java
src/java/org/apache/poi/hssf/record/DrawingRecord.java
src/testcases/org/apache/poi/hssf/data/SheetWithDrawing.xls [new file with mode: 0644]
src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java

index 7a955b303a3af8a7351a18c43ab87d76de194901..79eb0e91401889c1789e9a0963fb1151822da6b7 100644 (file)
@@ -36,6 +36,7 @@
 
                <!-- Don't forget to update status.xml too! -->
         <release version="3.0.2-FINAL" date="2008-??-??">
+            <action dev="POI-DEVELOPERS" type="fix">31795 - Support cloning of sheets with certain drawing objects on them</action>
             <action dev="POI-DEVELOPERS" type="fix">43902 - Don't consider merged regions when auto-sizing columns</action>
             <action dev="POI-DEVELOPERS" type="fix">42464 - Avoid "Expected ExpPtg to be converted from Shared to Non-Shared Formula" on large, formula heavy worksheets</action>
             <action dev="POI-DEVELOPERS" type="add">42033 - Add support for named ranges with unicode names</action>
index 6c8b47b46f1cc81f581ed37bfa3dc5a4b4fd0935..37383c81698e2c3aabeaa4a61f6962e3a8a967ea 100644 (file)
@@ -33,6 +33,7 @@
        <!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.0.2-FINAL" date="2008-??-??">
+            <action dev="POI-DEVELOPERS" type="fix">31795 - Support cloning of sheets with certain drawing objects on them</action>
             <action dev="POI-DEVELOPERS" type="fix">43902 - Don't consider merged regions when auto-sizing columns</action>
             <action dev="POI-DEVELOPERS" type="fix">42464 - Avoid "Expected ExpPtg to be converted from Shared to Non-Shared Formula" on large, formula heavy worksheets</action>
             <action dev="POI-DEVELOPERS" type="add">42033 - Add support for named ranges with unicode names</action>
index efa83ca3301b3228f24f8495d53dccb09f3eae64..c9417a9c3ab36b2a7429ebf8d3018022c986e913 100644 (file)
@@ -24,6 +24,9 @@ import org.apache.poi.ddf.EscherRecordFactory;
 import org.apache.poi.ddf.NullEscherSerializationListener;
 import org.apache.poi.util.LittleEndian;
 
+import java.io.ByteArrayInputStream;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -76,7 +79,7 @@ public abstract class AbstractEscherHolderRecord
     {
         if (id != getSid())
         {
-            throw new RecordFormatException("Not an escher record");
+            throw new RecordFormatException("Not an escher record! (sid was " + id + ", expecting " + getSid() + ")");
         }
     }
 
@@ -227,7 +230,19 @@ public abstract class AbstractEscherHolderRecord
 
     public Object clone()
     {
-        throw new IllegalStateException("Not implemented yet.");
+       // Do it via a re-serialise
+       // It's a cheat, but it works...
+       byte[] b = serialize();
+       RecordInputStream rinp = new RecordInputStream(
+                       new ByteArrayInputStream(b)
+       );
+       rinp.nextRecord();
+
+       Record[] r = RecordFactory.createRecord(rinp);
+       if(r.length != 1) {
+               throw new IllegalStateException("Re-serialised a record to clone it, but got " + r.length + " records back!");
+       }
+       return r[0];
     }
 
     public void addEscherRecord(int index, EscherRecord element)
index d6b34b6be33bffa8028b800276ef0dc0cf5274cb..009bc31bce892e7911f4987bbb68f7db750b2a12 100644 (file)
@@ -107,15 +107,16 @@ public class DrawingRecord extends Record
     }
 
     public Object clone() {
-        if (recordData == null) {
-            recordData = new byte[ 0 ];
-        }
-        
        DrawingRecord rec = new DrawingRecord();
-       rec.recordData = new byte[ recordData.length ];
-       rec.contd = new byte[ contd.length ];
-       System.arraycopy(recordData, 0, rec.recordData, 0, recordData.length);
-       System.arraycopy(contd, 0, rec.contd, 0, contd.length);
+       
+        if (recordData != null) {
+               rec.recordData = new byte[ recordData.length ];
+               System.arraycopy(recordData, 0, rec.recordData, 0, recordData.length);
+        }
+       if (contd != null) {
+               System.arraycopy(contd, 0, rec.contd, 0, contd.length);
+               rec.contd = new byte[ contd.length ];
+       }
        
        return rec;
     }
diff --git a/src/testcases/org/apache/poi/hssf/data/SheetWithDrawing.xls b/src/testcases/org/apache/poi/hssf/data/SheetWithDrawing.xls
new file mode 100644 (file)
index 0000000..e139529
Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/SheetWithDrawing.xls differ
index 8a83abde64e978768fb5dded7f74b613e8e62716..6d5afca114c0414234a543146845763617caccde 100644 (file)
@@ -109,4 +109,24 @@ public class TestHSSFWorkbook extends TestCase
         assertEquals(b.getSelectedTab(), 1);
         assertEquals(b.getDisplayedTab(), 1);
     }
+    
+    public void testSheetClone() throws Exception {
+       // First up, try a simple file
+        HSSFWorkbook b = new HSSFWorkbook();
+        assertEquals(0, b.getNumberOfSheets());
+        b.createSheet("Sheet One");
+        b.createSheet("Sheet Two");
+        
+        assertEquals(2, b.getNumberOfSheets());
+        b.cloneSheet(0);
+        assertEquals(3, b.getNumberOfSheets());
+       
+       // Now try a problem one with drawing records in it
+        b = new HSSFWorkbook(
+                       new FileInputStream(new File(filename,"SheetWithDrawing.xls"))
+        );
+        assertEquals(1, b.getNumberOfSheets());
+        b.cloneSheet(0);
+        assertEquals(2, b.getNumberOfSheets());
+    }
 }
\ No newline at end of file