You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2008/01/09 11:59:08 UTC

svn commit: r610336 - in /poi/trunk/src: documentation/content/xdocs/ java/org/apache/poi/hssf/record/ testcases/org/apache/poi/hssf/data/ testcases/org/apache/poi/hssf/usermodel/

Author: nick
Date: Wed Jan  9 02:59:04 2008
New Revision: 610336

URL: http://svn.apache.org/viewvc?rev=610336&view=rev
Log:
Add clone methods to DrawingRecord and AbstractEscherHolderRecord, which allows cloning of some sheets with drawing objects on them. Fixes bug #31795

Added:
    poi/trunk/src/testcases/org/apache/poi/hssf/data/SheetWithDrawing.xls   (with props)
Modified:
    poi/trunk/src/documentation/content/xdocs/changes.xml
    poi/trunk/src/documentation/content/xdocs/status.xml
    poi/trunk/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DrawingRecord.java
    poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java

Modified: poi/trunk/src/documentation/content/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/changes.xml?rev=610336&r1=610335&r2=610336&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/changes.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/changes.xml Wed Jan  9 02:59:04 2008
@@ -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>

Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=610336&r1=610335&r2=610336&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Wed Jan  9 02:59:04 2008
@@ -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>

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java?rev=610336&r1=610335&r2=610336&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java Wed Jan  9 02:59:04 2008
@@ -24,6 +24,9 @@
 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 @@
     {
         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 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)

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/DrawingRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/DrawingRecord.java?rev=610336&r1=610335&r2=610336&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/DrawingRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/DrawingRecord.java Wed Jan  9 02:59:04 2008
@@ -107,15 +107,16 @@
     }
 
     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;
     }

Added: poi/trunk/src/testcases/org/apache/poi/hssf/data/SheetWithDrawing.xls
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/data/SheetWithDrawing.xls?rev=610336&view=auto
==============================================================================
Binary file - no diff available.

Propchange: poi/trunk/src/testcases/org/apache/poi/hssf/data/SheetWithDrawing.xls
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java?rev=610336&r1=610335&r2=610336&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java Wed Jan  9 02:59:04 2008
@@ -109,4 +109,24 @@
         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());
+    }
 }



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