You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by av...@apache.org on 2005/04/28 15:35:38 UTC

cvs commit: jakarta-poi/src/testcases/org/apache/poi/hssf/usermodel TestHSSFHeaderFooter.java

avik        2005/04/28 06:35:38

  Modified:    src/java/org/apache/poi/hssf/record FooterRecord.java
                        HeaderRecord.java
               src/testcases/org/apache/poi/hssf/usermodel
                        TestHSSFHeaderFooter.java
  Added:       src/testcases/org/apache/poi/hssf/data DBCSHeader.xls
  Log:
  PR:17039 - DBCS chars in header and footer
  Obtained from: kamoshida.toshiaki@future.co.jp
  Tweaked and tests added by self.
  
  Revision  Changes    Path
  1.13      +59 -9     jakarta-poi/src/java/org/apache/poi/hssf/record/FooterRecord.java
  
  Index: FooterRecord.java
  ===================================================================
  RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/FooterRecord.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- FooterRecord.java	23 Aug 2004 08:52:32 -0000	1.12
  +++ FooterRecord.java	28 Apr 2005 13:35:38 -0000	1.13
  @@ -36,7 +36,8 @@
   {
       public final static short sid = 0x15;
       private byte              field_1_footer_len;
  -    private String            field_2_footer;
  +    private byte              field_2_unicode_flag;
  +    private String            field_3_footer;
   
       public FooterRecord()
       {
  @@ -82,12 +83,47 @@
           if (size > 0)
           {
               field_1_footer_len = data[ 0 + offset ];
  -            field_2_footer     = StringUtil.getFromCompressedUnicode(data, 3 + offset, // [Shawn] Changed 1 to 3 for offset of string
  -                                            LittleEndian.ubyteToInt( field_1_footer_len) );
  +            field_2_unicode_flag = data[ 2 + offset ];
  +                         if(isMultibyte())
  +                         {
  +                             field_3_footer = StringUtil.getFromUnicodeLE(
  +                                     data,3 + offset,LittleEndian.ubyteToInt(field_1_footer_len));
  +                         }
  +                         else
  +                         {
  +                             field_3_footer     = new String(data, 3 + offset, // [Shawn] Changed 1 to 3 for offset of string
  +                                                        LittleEndian.ubyteToInt( field_1_footer_len) );
  +                         }
           }
       }
   
       /**
  +     * see the unicode flag
  +     *
  +     * @return boolean flag
  +     *  true:footer string has at least one multibyte character
  +     */
  +     public boolean isMultibyte() {
  +         return ((field_2_unicode_flag & 0xFF) == 1);
  +    }
  +
  +    /**
  +     * check the parameter has multibyte character
  +     *
  +     * @param value  string to check
  +     * @return  boolean result
  +     *  true:string has at least one multibyte character
  +     */
  +    private static boolean hasMultibyte(String value){
  +        if( value == null )return false;
  +        for(int i = 0 ; i < value.length() ; i++ ){
  +            char c = value.charAt(i);
  +            if(c > 0xFF )return true;
  +        }
  +        return false;
  +    }
  +
  +    /**
        * set the length of the footer string
        *
        * @param len  length of the footer string
  @@ -108,7 +144,9 @@
   
       public void setFooter(String footer)
       {
  -        field_2_footer = footer;
  +        field_3_footer = footer;
  +        field_2_unicode_flag = 
  +            (byte) (hasMultibyte(field_3_footer) ? 1 : 0);
       }
   
       /**
  @@ -132,7 +170,7 @@
   
       public String getFooter()
       {
  -        return field_2_footer;
  +        return field_3_footer;
       }
   
       public String toString()
  @@ -156,13 +194,23 @@
           {
               len+=3; // [Shawn] Fixed for two null bytes in the length
           }
  +        short bytelen = (short)(isMultibyte() ?
  +            getFooterLength()*2 : getFooterLength() );
           LittleEndian.putShort(data, 0 + offset, sid);
           LittleEndian.putShort(data, 2 + offset,
  -                              ( short ) ((len - 4) + getFooterLength()));
  +                              ( short ) ((len - 4) + bytelen ));
           if (getFooterLength() > 0)
           {
               data[ 4 + offset ] = (byte)getFooterLength();
  -            StringUtil.putCompressedUnicode(getFooter(), data, 7 + offset); // [Shawn] Place the string in the correct offset
  +            data[ 6 + offset ] = field_2_unicode_flag;
  +            if(isMultibyte())
  +            {
  +                StringUtil.putUnicodeLE(getFooter(), data, 7 + offset);
  +            }
  +            else
  +            {
  +                StringUtil.putCompressedUnicode(getFooter(), data, 7 + offset); // [Shawn] Place the string in the correct offset
  +            }
           }
           return getRecordSize();
       }
  @@ -175,7 +223,8 @@
           {
               retval+=3; // [Shawn] Fixed for two null bytes in the length
           }
  -        return retval + getFooterLength();
  +        return (isMultibyte() ? 
  +            (retval + getFooterLength()*2) : (retval + getFooterLength()));
       }
   
       public short getSid()
  @@ -186,7 +235,8 @@
       public Object clone() {
         FooterRecord rec = new FooterRecord();
         rec.field_1_footer_len = field_1_footer_len;
  -      rec.field_2_footer = field_2_footer;
  +      rec.field_2_unicode_flag = field_2_unicode_flag;
  +      rec.field_3_footer = field_3_footer;
         return rec;
       }
   }
  
  
  
  1.13      +59 -10    jakarta-poi/src/java/org/apache/poi/hssf/record/HeaderRecord.java
  
  Index: HeaderRecord.java
  ===================================================================
  RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/HeaderRecord.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- HeaderRecord.java	23 Aug 2004 08:52:32 -0000	1.12
  +++ HeaderRecord.java	28 Apr 2005 13:35:38 -0000	1.13
  @@ -36,7 +36,8 @@
   {
       public final static short sid = 0x14;
       private byte              field_1_header_len;
  -    private String            field_2_header;
  +    private byte              field_2_unicode_flag;
  +    private String            field_3_header;
   
       public HeaderRecord()
       {
  @@ -82,12 +83,47 @@
           if (size > 0)
           {
               field_1_header_len = data[ 0 + offset ];
  -            field_2_header     = StringUtil.getFromCompressedUnicode(data, 3 + offset, // [Shawn] Changed 1 to 3 for offset of string
  -                                            LittleEndian.ubyteToInt(field_1_header_len));
  +            field_2_unicode_flag = data[ 2 + offset ];
  +                         if(isMultibyte())
  +                         {
  +                             field_3_header = StringUtil.getFromUnicodeLE(
  +                                     data,3 + offset,LittleEndian.ubyteToInt(field_1_header_len));
  +                         }
  +                         else
  +                         {
  +                             field_3_header     = new String(data, 3 + offset, // [Shawn] Changed 1 to 3 for offset of string
  +                                                         LittleEndian.ubyteToInt( field_1_header_len) );
  +                         }
           }
       }
   
       /**
  +     * see the unicode flag
  +     *
  +     * @return boolean flag
  +     *  true:footer string has at least one multibyte character
  +     */
  +     public boolean isMultibyte() {
  +         return ((field_2_unicode_flag & 0xFF) == 1);
  +    }
  +
  +    /**
  +     * check the parameter has multibyte character
  +     *
  +     * @param value  string to check
  +     * @return  boolean result
  +     *  true:string has at least one multibyte character
  +     */
  +    private static boolean hasMultibyte(String value){
  +        if( value == null )return false;
  +        for(int i = 0 ; i < value.length() ; i++ ){
  +            char c = value.charAt(i);
  +            if(c > 0xFF )return true;
  +        }
  +        return false;
  +    }
  +
  +    /**
        * set the length of the header string
        *
        * @param len  length of the header string
  @@ -108,7 +144,9 @@
   
       public void setHeader(String header)
       {
  -        field_2_header = header;
  +        field_3_header = header;
  +        field_2_unicode_flag = 
  +            (byte) (hasMultibyte(field_3_header) ? 1 : 0);
       }
   
       /**
  @@ -132,7 +170,7 @@
   
       public String getHeader()
       {
  -        return field_2_header;
  +        return field_3_header;
       }
   
       public String toString()
  @@ -156,14 +194,24 @@
           {
               len+=3; // [Shawn] Fixed for two null bytes in the length
           }
  +        short bytelen = (short)(isMultibyte() ?
  +            getHeaderLength()*2 : getHeaderLength() );
           LittleEndian.putShort(data, 0 + offset, sid);
           LittleEndian.putShort(data, 2 + offset,
  -                              ( short ) ((len - 4) + getHeaderLength()));
  +                              ( short ) ((len - 4) + bytelen));
   
           if (getHeaderLength() > 0)
           {
               data[ 4 + offset ] = (byte)getHeaderLength();
  -            StringUtil.putCompressedUnicode(getHeader(), data, 7 + offset); // [Shawn] Place the string in the correct offset
  +            data[ 6 + offset ] = field_2_unicode_flag;
  +            if(isMultibyte())
  +            {
  +                StringUtil.putUnicodeLE(getHeader(), data, 7 + offset);
  +            }
  +            else
  +            {
  +                StringUtil.putCompressedUnicode(getHeader(), data, 7 + offset); // [Shawn] Place the string in the correct offset
  +            }
           }
           return getRecordSize();
       }
  @@ -176,8 +224,8 @@
           {
               retval+=3; // [Shawn] Fixed for two null bytes in the length
           }
  -        retval += getHeaderLength();
  -        return retval;
  +       return (isMultibyte() ? 
  +            (retval + getHeaderLength()*2) : (retval + getHeaderLength()));
       }
   
       public short getSid()
  @@ -188,7 +236,8 @@
       public Object clone() {
         HeaderRecord rec = new HeaderRecord();
         rec.field_1_header_len = field_1_header_len;
  -      rec.field_2_header = field_2_header;
  +      rec.field_2_unicode_flag = field_2_unicode_flag;
  +      rec.field_3_header = field_3_header;
         return rec;
       }
   }
  
  
  
  1.1                  jakarta-poi/src/testcases/org/apache/poi/hssf/data/DBCSHeader.xls
  
  	<<Binary file>>
  
  
  1.4       +62 -0     jakarta-poi/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFHeaderFooter.java
  
  Index: TestHSSFHeaderFooter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-poi/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFHeaderFooter.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TestHSSFHeaderFooter.java	23 Aug 2004 08:52:52 -0000	1.3
  +++ TestHSSFHeaderFooter.java	28 Apr 2005 13:35:38 -0000	1.4
  @@ -24,6 +24,8 @@
   import org.apache.poi.hssf.usermodel.HSSFSheet;
   import org.apache.poi.hssf.usermodel.HSSFWorkbook;
   
  +import java.io.ByteArrayInputStream;
  +import java.io.ByteArrayOutputStream;
   import java.io.File;
   import java.io.FileInputStream;
   import java.io.FileOutputStream;
  @@ -86,5 +88,65 @@
   	assertEquals("Bottom Center", foot.getCenter());
   	assertEquals("Bottom Right", foot.getRight());
       }
  +    
  +    /**
  +	 * Testcase for Bug 17039 HSSFHeader  doesnot support DBCS 
  +	 */
  +	public void testHeaderHas16bitCharacter() throws Exception {
  +			HSSFWorkbook b = new HSSFWorkbook();
  +			HSSFSheet s = b.createSheet("Test");
  +			HSSFHeader h = s.getHeader();
  +			h.setLeft("\u0391");
  +			h.setCenter("\u0392");
  +			h.setRight("\u0393");
  +			
  +			ByteArrayOutputStream out = new ByteArrayOutputStream();
  +			b.write(out);
  +			
  +			HSSFWorkbook b2 = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
  +			HSSFHeader h2 = b2.getSheet("Test").getHeader();
  +			
  +			assertEquals(h2.getLeft(),"\u0391");
  +			assertEquals(h2.getCenter(),"\u0392");
  +			assertEquals(h2.getRight(),"\u0393");
  +	}
  +	
  +	/**
  +	 * Testcase for Bug 17039 HSSFFooter doesnot support DBCS 
  +	 */
  +	 public void testFooterHas16bitCharacter() throws Exception{
  +			HSSFWorkbook b = new HSSFWorkbook();
  +			HSSFSheet s = b.createSheet("Test");
  +			HSSFFooter f = s.getFooter();
  +			f.setLeft("\u0391");
  +			f.setCenter("\u0392");
  +			f.setRight("\u0393");
  +			
  +			ByteArrayOutputStream out = new ByteArrayOutputStream();
  +			b.write(out);
  +			
  +			HSSFWorkbook b2 = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
  +			HSSFFooter f2 = b2.getSheet("Test").getFooter();
  +			
  +			assertEquals(f2.getLeft(),"\u0391");
  +			assertEquals(f2.getCenter(),"\u0392");
  +			assertEquals(f2.getRight(),"\u0393");
  +	}
  +
  +	public void testReadDBCSHeaderFooter() throws Exception{
  +		String readFilename = System.getProperty("HSSF.testdata.path");
  +        FileInputStream in = new FileInputStream(readFilename+File.separator+"DBCSHeader.xls");
  +        HSSFWorkbook wb = new HSSFWorkbook(in);
  +        HSSFSheet s = wb.getSheetAt(0);
  +        HSSFHeader h = s.getHeader();
  +        assertEquals("Header Left " ,h.getLeft(),"\u090f\u0915");
  +        assertEquals("Header Center " ,h.getCenter(),"\u0939\u094b\u0917\u093e");
  +        assertEquals("Header Right " ,h.getRight(),"\u091c\u093e");
  +		
  +        HSSFFooter f = s.getFooter();
  +        assertEquals("Footer Left " ,f.getLeft(),"\u091c\u093e");
  +        assertEquals("Footer Center " ,f.getCenter(),"\u091c\u093e");
  +        assertEquals("Footer Right " ,f.getRight(),"\u091c\u093e");
  +	}
   }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: poi-dev-unsubscribe@jakarta.apache.org
Mailing List:    http://jakarta.apache.org/site/mail2.html#poi
The Apache Jakarta POI Project: http://jakarta.apache.org/poi/