From e17139a5d3d6a574c200b7901a64fd4d69f539ad Mon Sep 17 00:00:00 2001 From: Avik Sengupta Date: Sat, 1 Mar 2003 14:27:43 +0000 Subject: [PATCH] fixed clone sheet bug. Thanks to: Alessandro Vernet for a patch thats part of this commit Toshiaki Kamoshida for a testcase and lots of debugging Dennis Doubleday & Henning Boeger for reporting the bugs Jason Height who wrote cloneSheet in the first place. Sorry it took so long to patch. git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353017 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/poi/hssf/model/Sheet.java | 4 + .../poi/hssf/record/BottomMarginRecord.java | 6 ++ .../poi/hssf/record/ColumnInfoRecord.java | 11 +++ .../poi/hssf/record/LeftMarginRecord.java | 7 +- .../poi/hssf/record/MergeCellsRecord.java | 7 ++ .../apache/poi/hssf/record/ProtectRecord.java | 6 ++ .../poi/hssf/record/RightMarginRecord.java | 6 +- .../poi/hssf/record/TopMarginRecord.java | 6 +- .../poi/hssf/usermodel/TestCloneSheet.java | 85 +++++++++++++++++++ 9 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 src/testcases/org/apache/poi/hssf/usermodel/TestCloneSheet.java diff --git a/src/java/org/apache/poi/hssf/model/Sheet.java b/src/java/org/apache/poi/hssf/model/Sheet.java index eb924b3e73..475d2cfc3f 100644 --- a/src/java/org/apache/poi/hssf/model/Sheet.java +++ b/src/java/org/apache/poi/hssf/model/Sheet.java @@ -283,6 +283,10 @@ public class Sheet implements Model /** * Clones the low level records of this sheet and returns the new sheet instance. + * This method is implemented by adding methods for deep cloning to all records that + * can be added to a sheet. The Record object does not implement cloneable. + * When adding a new record, implement a public clone method if and only if the record + * belongs to a sheet. */ public Sheet cloneSheet() { diff --git a/src/java/org/apache/poi/hssf/record/BottomMarginRecord.java b/src/java/org/apache/poi/hssf/record/BottomMarginRecord.java index faa5cef4e7..fbe68ae407 100644 --- a/src/java/org/apache/poi/hssf/record/BottomMarginRecord.java +++ b/src/java/org/apache/poi/hssf/record/BottomMarginRecord.java @@ -177,6 +177,12 @@ public class BottomMarginRecord { this.field_1_margin = field_1_margin; } + + public Object clone() { + BottomMarginRecord rec = new BottomMarginRecord(); + rec.field_1_margin = this.field_1_margin; + return rec; + } } // END OF CLASS diff --git a/src/java/org/apache/poi/hssf/record/ColumnInfoRecord.java b/src/java/org/apache/poi/hssf/record/ColumnInfoRecord.java index 2e95e8a35a..77681be155 100644 --- a/src/java/org/apache/poi/hssf/record/ColumnInfoRecord.java +++ b/src/java/org/apache/poi/hssf/record/ColumnInfoRecord.java @@ -355,4 +355,15 @@ public class ColumnInfoRecord buffer.append("[/COLINFO]\n"); return buffer.toString(); } + + public Object clone() { + ColumnInfoRecord rec = new ColumnInfoRecord(); + rec.field_1_first_col = field_1_first_col; + rec.field_2_last_col = field_2_last_col; + rec.field_3_col_width = field_3_col_width; + rec.field_4_xf_index = field_4_xf_index; + rec.field_5_options = field_5_options; + rec.field_6_reserved = field_6_reserved; + return rec; + } } diff --git a/src/java/org/apache/poi/hssf/record/LeftMarginRecord.java b/src/java/org/apache/poi/hssf/record/LeftMarginRecord.java index 17c26639a3..eb9948df71 100644 --- a/src/java/org/apache/poi/hssf/record/LeftMarginRecord.java +++ b/src/java/org/apache/poi/hssf/record/LeftMarginRecord.java @@ -178,7 +178,12 @@ public class LeftMarginRecord this.field_1_margin = field_1_margin; } - + public Object clone() { + LeftMarginRecord rec = new LeftMarginRecord(); + rec.field_1_margin = this.field_1_margin; + return rec; + } + } // END OF CLASS diff --git a/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java b/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java index ddda8b9476..85e20a8c02 100644 --- a/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java +++ b/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java @@ -322,4 +322,11 @@ public class MergeCellsRecord public short col_to; } + + public Object clone() { + MergeCellsRecord rec = new MergeCellsRecord(); + rec.field_1_num_areas = field_1_num_areas; + rec.field_2_regions = field_2_regions; + return rec; + } } diff --git a/src/java/org/apache/poi/hssf/record/ProtectRecord.java b/src/java/org/apache/poi/hssf/record/ProtectRecord.java index 1f71b90e33..8ff2d2356a 100644 --- a/src/java/org/apache/poi/hssf/record/ProtectRecord.java +++ b/src/java/org/apache/poi/hssf/record/ProtectRecord.java @@ -173,4 +173,10 @@ public class ProtectRecord { return this.sid; } + + public Object clone() { + ProtectRecord rec = new ProtectRecord(); + rec.field_1_protect = field_1_protect; + return rec; + } } diff --git a/src/java/org/apache/poi/hssf/record/RightMarginRecord.java b/src/java/org/apache/poi/hssf/record/RightMarginRecord.java index 00e9ba5216..8db7faf6d6 100644 --- a/src/java/org/apache/poi/hssf/record/RightMarginRecord.java +++ b/src/java/org/apache/poi/hssf/record/RightMarginRecord.java @@ -178,7 +178,11 @@ public class RightMarginRecord this.field_1_margin = field_1_margin; } - + public Object clone() { + RightMarginRecord rec = new RightMarginRecord(); + rec.field_1_margin = this.field_1_margin; + return rec; + } } // END OF CLASS diff --git a/src/java/org/apache/poi/hssf/record/TopMarginRecord.java b/src/java/org/apache/poi/hssf/record/TopMarginRecord.java index 7126cae4eb..cea7e1f1ea 100644 --- a/src/java/org/apache/poi/hssf/record/TopMarginRecord.java +++ b/src/java/org/apache/poi/hssf/record/TopMarginRecord.java @@ -178,7 +178,11 @@ public class TopMarginRecord this.field_1_margin = field_1_margin; } - + public Object clone() { + TopMarginRecord rec = new TopMarginRecord(); + rec.field_1_margin = this.field_1_margin; + return rec; + } } // END OF CLASS diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestCloneSheet.java b/src/testcases/org/apache/poi/hssf/usermodel/TestCloneSheet.java new file mode 100644 index 0000000000..55fe019c86 --- /dev/null +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestCloneSheet.java @@ -0,0 +1,85 @@ + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache POI" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache POI", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.poi.hssf.usermodel; + +import junit.framework.TestCase; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.hssf.util.Region; + +/** + * Test the ability to clone a sheet. + * If adding new records that belong to a sheet (as opposed to a book) + * add that record to the sheet in the testCloneSheetBasic method. + * @author avik + */ +public class TestCloneSheet extends TestCase { + + public TestCloneSheet(String arg0) { + super(arg0); + } + + public void testCloneSheetBasic(){ + try{ + HSSFWorkbook b = new HSSFWorkbook(); + HSSFSheet s = b.createSheet("Test"); + s.addMergedRegion(new Region((short)0,(short)0,(short)1,(short)1)); + b.cloneSheet(0); + } + catch(Exception e){fail(e.getMessage());} + } + +} -- 2.39.5