glens       2002/06/14 23:04:26

  Modified:    src/documentation/xdocs changes.xml
               src/documentation/xdocs/hssf how-to.xml
               src/java/org/apache/poi/hssf/record RecordProcessor.java
                        SSTSerializer.java
               src/testcases/org/apache/poi/util TestPOILogFactory.java
                        TestPOILogger.java
  Added:       src/java/org/apache/poi/hssf/record SSTRecordHeader.java
                        SSTRecordSizeCalculator.java
  Log:
  Various changes.  SST refactoring which I'm not sure is worth it because I'm pretty 
sure SST recordsize calculation is all wrong. Added some logging stuff and also merged 
some stuff from 1.5 branch
  
  Revision  Changes    Path
  1.8       +9 -1      jakarta-poi/src/documentation/xdocs/changes.xml
  
  Index: changes.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-poi/src/documentation/xdocs/changes.xml,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- changes.xml       6 Apr 2002 09:40:36 -0000       1.7
  +++ changes.xml       15 Jun 2002 06:04:26 -0000      1.8
  @@ -11,7 +11,15 @@
           <person id="NKB" name="Nicola Ken Barozzi" email="[EMAIL PROTECTED]"/>
           <person id="POI-DEVELOPERS" name="Poi Developers"    
email="[EMAIL PROTECTED]"/>
       </devs>
  -    <release version="1.5" date="Coming Soon">
  +    <release version="1.6-dev" date="Unrelease">
  +        <action dev="NKB" type="update">Removed runtime dependency on commonds 
logging.</action>
  +        <action dev="POI-DEVELOPERS" type="update">Formula support</action>
  +    </release>
  +    <release version="1.5.1" date="16 June 2002">
  +        <action dev="GJS" type="update">Removed depedency on commons logging.  Now 
define poi.logging system property to enable logging to standard out.</action>
  +        <action dev="GJS" type="fix">Fixed SST string handling so that spreadsheets 
with rich text or extended text will be read correctly.</action>
  +    </release>
  +    <release version="1.5" date="06 May 2002">
           <action dev="NKB" type="update">New project build.</action>
           <action dev="NKB" type="update">New project documentation system based on 
Cocoon.</action>
           <action dev="POI-DEVELOPERS" type="update">Package rename</action>
  
  
  
  1.12      +22 -45    jakarta-poi/src/documentation/xdocs/hssf/how-to.xml
  
  Index: how-to.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-poi/src/documentation/xdocs/hssf/how-to.xml,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- how-to.xml        29 Apr 2002 11:08:22 -0000      1.11
  +++ how-to.xml        15 Jun 2002 06:04:26 -0000      1.12
  @@ -13,7 +13,7 @@
       <section title="How to use the HSSF prototype API">
   
           <section title="Capabilities">
  -            <p>This release of the how-to outlines functionality for the 1.5 
release.
  +            <p>This release of the how-to outlines functionality for the CVS HEAD.
               Those looking for information on previous releases should
               look in the documentation distributed with that release.</p>
               <p>
  @@ -398,55 +398,32 @@
   <ul>
        <li>Type:
        <code>java org.apache.poi.hssf.dev.HSSF ~/input.xls output.xls</code>
  -    <p>
  +    <br/>
  +    <br/>
   This is the read/write/modify test.  It reads in the spreadsheet, modifies a cell, 
and writes it back out.
   Failing this test is not necessarily a bad thing.  If HSSF tries to modify a 
non-existant sheet then this will
  -most likely fail.  No big deal.  </p></li>
  +most likely fail.  No big deal.  </li>
   </ul>
        </section>
  -                <section title="HSSF Logging facility">
  -<p>HSSF now has a logging facility (using
  - <link href="http://jakarta.apache.org/commons/logging.html";>commons logging</link>)
  -that will record massive amounts of debugging information. Its mostly
  -useful to us hssf-developing geeks, but might be useful in tracking
  -down problems.
  -</p>
  -<p>So Why use commons logging rather than log4j? Well the following discussion from
  -the jakarta-general mailing list sums it up pretty well.  (Thanks Morgan)
  -</p>
  -<p><em>Here's the problem, as I see it.</em>
  -</p>
  -<p><em>Suppose Commons component A decides to adopt Log4J, Commons component B
  -decides to adopt LogKit, and Commons component C adopts JDK1.4 logging.
  -They will all minimally function with the right jars in the classpath.
  -However you (the end-user) are left with maintaining configuration for 3
  -different logging APIs, which is tedious at best.  When you take into
  -account cool features like variable log levels, Log4J appenders and the
  -like, you're pretty much guaranteed to swallow up useful configuration
  -options because sophisticated configurations are too difficult to maintain
  -over mutiple logging implementations.</em>
  -</p>
  -<p>
  -<em>Contrarily, if all three Commons components use a logging facade, you can
  -focus all your configuration efforts on one logging implementation.  Sure,
  -there is a trade-off; you don't have access to all the features, and the
  -interface between the facade and the implementation must be maintained.  But
  -the benefits are not just political; they potentially make the end-users
  -configuration much easier.</em>
  -</p>
  -<p><em>Even if all Commons components used the same logging implementation (Log4J
  -for example), other projects in Jakarta-land may choose otherwise.  If you
  -add enough Jakarta projects to your environment, you eventually end up with
  -the scenario described above.  It's a worthwhile effort to attempt a logging
  -solution that plays well with the Jakarta community at large.  I think in
  -many cases the Commons Logging component can fill that role.</em>
  -</p>
  -<p>
  -Refer to the commons logging package level javadoc for more information concerning 
how to
  -<link href="http://jakarta.apache.org/commons/logging/api/index.html";>configure 
commons logging.</link>
  -</p>
  +    <section title="Logging facility">
  +        <p>Poi can dynamically select it's logging implementation. Poi trys to
  +        create a logger using the System property named 
"org.apache.poi.util.POILogger".
  +        Out of the box this can be set to one of three values:
  +        </p>
  +        <ul>
  +           <li>org.apache.poi.util.CommonsLogger</li>
  +           <li>org.apache.poi.util.NullLogger</li>
  +           <li>org.apache.poi.util.SystemOutLogger</li>
  +        </ul>
  +        <p>
  +        If the property is not defined or points to an invalid classthen the 
NullLogger is used.
  +        </p>
  +        <p>
  +        Refer to the commons logging package level javadoc for more information 
concerning how to
  +        <link 
href="http://jakarta.apache.org/commons/logging/api/index.html";>configure commons 
logging.</link>
  +        </p>
        </section>
  -                <section title="HSSF Developer's tools">
  +    <section title="HSSF Developer's Tools">
   
   <p>HSSF has a number of tools useful for developers to debug/develop
   stuff using HSSF (and more generally XLS files). We've already
  
  
  
  1.3       +0 -42     
jakarta-poi/src/java/org/apache/poi/hssf/record/RecordProcessor.java
  
  Index: RecordProcessor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/RecordProcessor.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- RecordProcessor.java      2 Jun 2002 07:30:40 -0000       1.2
  +++ RecordProcessor.java      15 Jun 2002 06:04:26 -0000      1.3
  @@ -158,45 +158,3 @@
       }
   }
   
  -class SSTRecordHeader
  -{
  -    int numStrings;
  -    int numUniqueStrings;
  -
  -    /**
  -     *
  -     */
  -    public SSTRecordHeader( int numStrings, int numUniqueStrings )
  -    {
  -        this.numStrings = numStrings;
  -        this.numUniqueStrings = numUniqueStrings;
  -    }
  -
  -    /**
  -     * Writes out the SST record.  This consists of the sid, the record size, the 
number of
  -     * strings and the number of unique strings.
  -     *
  -     * @param data          The data buffer to write the header to.
  -     * @param bufferIndex   The index into the data buffer where the header should 
be written.
  -     * @param recSize       The number of records written.
  -     *
  -     * @return The bufer of bytes modified.
  -     */
  -    public int writeSSTHeader( byte[] data, int bufferIndex, int recSize )
  -    {
  -        int offset = bufferIndex;
  -
  -        LittleEndian.putShort( data, offset, SSTRecord.sid );
  -        offset += LittleEndianConsts.SHORT_SIZE;
  -        LittleEndian.putShort( data, offset, (short) ( recSize ) );
  -        offset += LittleEndianConsts.SHORT_SIZE;
  -//        LittleEndian.putInt( data, offset, getNumStrings() );
  -        LittleEndian.putInt( data, offset, numStrings );
  -        offset += LittleEndianConsts.INT_SIZE;
  -//        LittleEndian.putInt( data, offset, getNumUniqueStrings() );
  -        LittleEndian.putInt( data, offset, numUniqueStrings );
  -        offset += LittleEndianConsts.INT_SIZE;
  -        return offset - bufferIndex;
  -    }
  -
  -}
  \ No newline at end of file
  
  
  
  1.3       +21 -157   
jakarta-poi/src/java/org/apache/poi/hssf/record/SSTSerializer.java
  
  Index: SSTSerializer.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/SSTSerializer.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SSTSerializer.java        2 Jun 2002 07:30:40 -0000       1.2
  +++ SSTSerializer.java        15 Jun 2002 06:04:26 -0000      1.3
  @@ -55,10 +55,8 @@
   package org.apache.poi.hssf.record;
   
   import org.apache.poi.util.BinaryTree;
  -import org.apache.poi.util.LittleEndianConsts;
   
   import java.util.List;
  -import java.util.ArrayList;
   
   /**
    * This class handles serialization of SST records.  It utilizes the record 
processor
  @@ -69,8 +67,10 @@
   class SSTSerializer
   {
   
  -    private List recordLengths;
  -    private BinaryTree strings;
  +    // todo: make private again
  +    List recordLengths;
  +    BinaryTree strings;
  +
       private int numStrings;
       private int numUniqueStrings;
       private SSTRecordHeader sstRecordHeader;
  @@ -81,7 +81,7 @@
           this.strings = strings;
           this.numStrings = numStrings;
           this.numUniqueStrings = numUniqueStrings;
  -        this.sstRecordHeader = new SSTRecordHeader(numStrings, numUniqueStrings);
  +        this.sstRecordHeader = new SSTRecordHeader( numStrings, numUniqueStrings );
       }
   
       /**
  @@ -107,166 +107,25 @@
           return record_size;
       }
   
  -    private int calculateUnicodeSize()
  -    {
  -        int retval = 0;
   
  -        for ( int k = 0; k < strings.size(); k++ )
  -        {
  -            retval += getUnicodeString(k).getRecordSize();
  -        }
  -        return retval;
  -    }
   
  -    // we can probably simplify this later...this calculates the size
  -    // w/o serializing but still is a bit slow
  -    public int getRecordSize()
  +    // todo: make private again
  +    /**
  +     * Calculates the total unicode size for all the strings.
  +     *
  +     * @return the total size.
  +     */
  +    int calculateUnicodeSize()
       {
  -        recordLengths = new ArrayList();
           int retval = 0;
  -        int unicodesize = calculateUnicodeSize();
  -
  -        if ( unicodesize > SSTRecord.MAX_DATA_SPACE )
  -        {
  -            retval = calcRecordSizesForLongStrings( unicodesize );
  -        }
  -        else
  -        {
  -            // short data: write one simple SST record
  -            retval = SSTRecord.SST_RECORD_OVERHEAD + unicodesize;
  -            recordLengths.add( new Integer( unicodesize ) );
  -        }
  -        return retval;
  -    }
   
  -    private int calcRecordSizesForLongStrings( int unicodesize )
  -    {
  -        int retval;
  -        UnicodeString unistr = null;
  -        int stringreminant = 0;
  -        int unipos = 0;
  -        boolean lastneedcontinue = false;
  -        int stringbyteswritten = 0;
  -        boolean finished = false;
  -        boolean first_record = true;
  -        int totalWritten = 0;
  -
  -        while ( !finished )
  +        for ( int k = 0; k < strings.size(); k++ )
           {
  -            int record = 0;
  -            int pos = 0;
  -
  -            if ( first_record )
  -            {
  -
  -                // writing SST record
  -                record = SSTRecord.MAX_RECORD_SIZE;
  -                pos = 12;
  -                first_record = false;
  -                recordLengths.add( new Integer( record - 
SSTRecord.STD_RECORD_OVERHEAD ) );
  -            }
  -            else
  -            {
  -
  -                // writing continue record
  -                pos = 0;
  -                int to_be_written = ( unicodesize - stringbyteswritten ) + ( 
lastneedcontinue ? 1 : 0 );
  -                int size = Math.min( SSTRecord.MAX_RECORD_SIZE - 
SSTRecord.STD_RECORD_OVERHEAD, to_be_written );
  -
  -                if ( size == to_be_written )
  -                {
  -                    finished = true;
  -                }
  -                record = size + SSTRecord.STD_RECORD_OVERHEAD;
  -                recordLengths.add( new Integer( size ) );
  -                pos = 4;
  -            }
  -            if ( lastneedcontinue )
  -            {
  -                int available = SSTRecord.MAX_RECORD_SIZE - pos;
  -
  -                if ( stringreminant <= available )
  -                {
  -
  -                    // write reminant
  -                    stringbyteswritten += stringreminant - 1;
  -                    pos += stringreminant;
  -                    lastneedcontinue = false;
  -                }
  -                else
  -                {
  -
  -                    // write as much of the remnant as possible
  -                    int toBeWritten = unistr.maxBrokenLength( available );
  -
  -                    if ( available != toBeWritten )
  -                    {
  -                        int shortrecord = record - ( available - toBeWritten );
  -                        recordLengths.set( recordLengths.size() - 1,
  -                                new Integer( shortrecord - 
SSTRecord.STD_RECORD_OVERHEAD ) );
  -                        record = shortrecord;
  -                    }
  -                    stringbyteswritten += toBeWritten - 1;
  -                    pos += toBeWritten;
  -                    stringreminant -= toBeWritten - 1;
  -                    lastneedcontinue = true;
  -                }
  -            }
  -            for ( ; unipos < strings.size(); unipos++ )
  -            {
  -                int available = SSTRecord.MAX_RECORD_SIZE - pos;
  -                Integer intunipos = new Integer( unipos );
  -
  -                unistr = ( (UnicodeString) strings.get( intunipos ) );
  -                if ( unistr.getRecordSize() <= available )
  -                {
  -                    stringbyteswritten += unistr.getRecordSize();
  -                    pos += unistr.getRecordSize();
  -                }
  -                else
  -                {
  -                    if ( available >= SSTRecord.STRING_MINIMAL_OVERHEAD )
  -                    {
  -                        int toBeWritten =
  -                                unistr.maxBrokenLength( available );
  -
  -                        stringbyteswritten += toBeWritten;
  -                        stringreminant =
  -                                ( unistr.getRecordSize() - toBeWritten )
  -                                + LittleEndianConsts.BYTE_SIZE;
  -                        if ( available != toBeWritten )
  -                        {
  -                            int shortrecord = record
  -                                    - ( available - toBeWritten );
  -
  -                            recordLengths.set(
  -                                    recordLengths.size() - 1,
  -                                    new Integer(
  -                                            shortrecord - 
SSTRecord.STD_RECORD_OVERHEAD ) );
  -                            record = shortrecord;
  -                        }
  -                        lastneedcontinue = true;
  -                        unipos++;
  -                    }
  -                    else
  -                    {
  -                        int shortrecord = record - available;
  -
  -                        recordLengths.set( recordLengths.size() - 1,
  -                                new Integer( shortrecord - 
SSTRecord.STD_RECORD_OVERHEAD ) );
  -                        record = shortrecord;
  -                    }
  -                    break;
  -                }
  -            }
  -            totalWritten += record;
  +            retval += getUnicodeString( k ).getRecordSize();
           }
  -        retval = totalWritten;
  -
           return retval;
       }
   
  -
       private void serializeSingleSSTRecord( byte[] data, int offset, int 
record_length_index )
       {
           // short data: write one simple SST record
  @@ -279,8 +138,8 @@
           for ( int k = 0; k < strings.size(); k++ )
           {
   //            UnicodeString unistr = ( (UnicodeString) strings.get( new Integer( k 
) ) );
  -            System.arraycopy( getUnicodeString(k).serialize(), 0, data, pos + 
offset, getUnicodeString(k).getRecordSize() );
  -            pos += getUnicodeString(k).getRecordSize();
  +            System.arraycopy( getUnicodeString( k ).serialize(), 0, data, pos + 
offset, getUnicodeString( k ).getRecordSize() );
  +            pos += getUnicodeString( k ).getRecordSize();
           }
       }
   
  @@ -351,6 +210,11 @@
       {
           Integer intunipos = new Integer( index );
           return ( (UnicodeString) strings.get( intunipos ) );
  +    }
  +
  +    public int getRecordSize()
  +    {
  +        return new SSTRecordSizeCalculator(this).getRecordSize();
       }
   
   }
  
  
  
  1.1                  
jakarta-poi/src/java/org/apache/poi/hssf/record/SSTRecordHeader.java
  
  Index: SSTRecordHeader.java
  ===================================================================
  /* ====================================================================
   * 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 [EMAIL PROTECTED]
   *
   * 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
   * <http://www.apache.org/>.
   */
  
  package org.apache.poi.hssf.record;
  
  import org.apache.poi.util.LittleEndian;
  import org.apache.poi.util.LittleEndianConsts;
  
  /**
   * Write out an SST header record.
   *
   * @author Glen Stampoultzis (glens at apache.org)
   */
  class SSTRecordHeader
  {
      int numStrings;
      int numUniqueStrings;
  
      public SSTRecordHeader( int numStrings, int numUniqueStrings )
      {
          this.numStrings = numStrings;
          this.numUniqueStrings = numUniqueStrings;
      }
  
      /**
       * Writes out the SST record.  This consists of the sid, the record size, the 
number of
       * strings and the number of unique strings.
       *
       * @param data          The data buffer to write the header to.
       * @param bufferIndex   The index into the data buffer where the header should 
be written.
       * @param recSize       The number of records written.
       *
       * @return The bufer of bytes modified.
       */
      public int writeSSTHeader( byte[] data, int bufferIndex, int recSize )
      {
          int offset = bufferIndex;
  
          LittleEndian.putShort( data, offset, SSTRecord.sid );
          offset += LittleEndianConsts.SHORT_SIZE;
          LittleEndian.putShort( data, offset, (short) ( recSize ) );
          offset += LittleEndianConsts.SHORT_SIZE;
  //        LittleEndian.putInt( data, offset, getNumStrings() );
          LittleEndian.putInt( data, offset, numStrings );
          offset += LittleEndianConsts.INT_SIZE;
  //        LittleEndian.putInt( data, offset, getNumUniqueStrings() );
          LittleEndian.putInt( data, offset, numUniqueStrings );
          offset += LittleEndianConsts.INT_SIZE;
          return offset - bufferIndex;
      }
  
  }
  
  
  1.1                  
jakarta-poi/src/java/org/apache/poi/hssf/record/SSTRecordSizeCalculator.java
  
  Index: SSTRecordSizeCalculator.java
  ===================================================================
  /* ====================================================================
   * 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 [EMAIL PROTECTED]
   *
   * 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
   * <http://www.apache.org/>.
   */
  
  package org.apache.poi.hssf.record;
  
  import org.apache.poi.util.LittleEndianConsts;
  
  import java.util.ArrayList;
  
  /**
   * Used to calculate the record sizes for a particular record.
   *
   * @author Glen Stampoultzis (glens at apache.org)
   */
  class SSTRecordSizeCalculator
  {
      private SSTSerializer serializer;
  
      private UnicodeString unistr = null;
      private int stringReminant = 0;
      private int unipos = 0;
      /** Is there any more string to be written? */
      private boolean isRemainingString = false;
      private int totalBytesWritten = 0;
      private boolean finished = false;
      private boolean firstRecord = true;
      private int totalWritten = 0;
      private int recordSize = 0;
      private int pos = 0;
  
      public SSTRecordSizeCalculator(SSTSerializer serializer)
      {
          this.serializer = serializer;
      }
  
      /**
       * Calculate the size in bytes of the SST record.  This will include continue
       * records.
       *
       * @return the size of the SST record.
       */
      public int getRecordSize()
      {
          initVars();
  
          serializer.recordLengths = new ArrayList();
          int retval = 0;
          int totalStringSpaceRequired = serializer.calculateUnicodeSize();
  
          if ( totalStringSpaceRequired > SSTRecord.MAX_DATA_SPACE )
          {
              retval = sizeOverContinuation( totalStringSpaceRequired );
          }
          else
          {
              // short data: write one simple SST record
              retval = SSTRecord.SST_RECORD_OVERHEAD + totalStringSpaceRequired;
              serializer.recordLengths.add( new Integer( totalStringSpaceRequired ) );
          }
          return retval;
      }
  
      private int sizeOverContinuation( int totalStringSpaceRequired )
      {
          int retval;
  
          while ( !finished )
          {
              recordSize = 0;
              pos = 0;
  
              if ( firstRecord )
              {
                  addMaxLengthRecordSize();
              }
              else
              {
  
                  // writing continue record
                  pos = 0;
                  int toBeWritten = ( totalStringSpaceRequired - totalBytesWritten ) + 
( isRemainingString ? 1 : 0 );
                  int size = Math.min( SSTRecord.MAX_RECORD_SIZE - 
SSTRecord.STD_RECORD_OVERHEAD, toBeWritten );
  
                  if ( size == toBeWritten )
                  {
                      finished = true;
                  }
                  recordSize = size + SSTRecord.STD_RECORD_OVERHEAD;
                  serializer.recordLengths.add( new Integer( size ) );
                  pos = 4;
              }
              if ( isRemainingString )
              {
                  calcReminant();
              }
              calcRemainingStrings();
              totalWritten += recordSize;
          }
          retval = totalWritten;
  
          return retval;
      }
  
      private void addMaxLengthRecordSize()
      {
          // writing SST record
          recordSize = SSTRecord.MAX_RECORD_SIZE;
          pos = 12;
          firstRecord = false;
          serializer.recordLengths.add( new Integer( recordSize - 
SSTRecord.STD_RECORD_OVERHEAD ) );
      }
  
      private void calcRemainingStrings()
      {
          for ( ; unipos < serializer.strings.size(); unipos++ )
          {
              int available = SSTRecord.MAX_RECORD_SIZE - pos;
              Integer intunipos = new Integer( unipos );
  
              unistr = ( (UnicodeString) serializer.strings.get( intunipos ) );
              if ( unistr.getRecordSize() <= available )
              {
                  totalBytesWritten += unistr.getRecordSize();
                  pos += unistr.getRecordSize();
              }
              else
              {
                  if ( available >= SSTRecord.STRING_MINIMAL_OVERHEAD )
                  {
                      int toBeWritten =
                              unistr.maxBrokenLength( available );
  
                      totalBytesWritten += toBeWritten;
                      stringReminant =
                              ( unistr.getRecordSize() - toBeWritten )
                              + LittleEndianConsts.BYTE_SIZE;
                      if ( available != toBeWritten )
                      {
                          int shortrecord = recordSize
                                  - ( available - toBeWritten );
  
                          serializer.recordLengths.set(
                                  serializer.recordLengths.size() - 1,
                                  new Integer(
                                          shortrecord - SSTRecord.STD_RECORD_OVERHEAD 
) );
                          recordSize = shortrecord;
                      }
                      isRemainingString = true;
                      unipos++;
                  }
                  else
                  {
                      int shortrecord = recordSize - available;
  
                      serializer.recordLengths.set( serializer.recordLengths.size() - 
1,
                              new Integer( shortrecord - SSTRecord.STD_RECORD_OVERHEAD 
) );
                      recordSize = shortrecord;
                  }
                  break;
              }
          }
      }
  
      private void calcReminant()
      {
          int available = SSTRecord.MAX_RECORD_SIZE - pos;
  
          if ( stringReminant <= available )
          {
  
              // write reminant
              totalBytesWritten += stringReminant - 1;
              pos += stringReminant;
              isRemainingString = false;
          }
          else
          {
  
              // write as much of the remnant as possible
              int toBeWritten = unistr.maxBrokenLength( available );
  
              if ( available != toBeWritten )
              {
                  int shortrecord = recordSize - ( available - toBeWritten );
                  serializer.recordLengths.set( serializer.recordLengths.size() - 1,
                          new Integer( shortrecord - SSTRecord.STD_RECORD_OVERHEAD ) );
                  recordSize = shortrecord;
              }
              totalBytesWritten += toBeWritten - 1;
              pos += toBeWritten;
              stringReminant -= toBeWritten - 1;
              isRemainingString = true;
          }
      }
  
      private void initVars()
      {
          unistr = null;
          stringReminant = 0;
          unipos = 0;
          isRemainingString = false;
          totalBytesWritten = 0;
          finished = false;
          firstRecord = true;
          totalWritten = 0;
      }
  
  }
  
  
  
  1.5       +24 -27    
jakarta-poi/src/testcases/org/apache/poi/util/TestPOILogFactory.java
  
  Index: TestPOILogFactory.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/testcases/org/apache/poi/util/TestPOILogFactory.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- TestPOILogFactory.java    16 Mar 2002 10:16:43 -0000      1.4
  +++ TestPOILogFactory.java    15 Jun 2002 06:04:26 -0000      1.5
  @@ -1,4 +1,3 @@
  -
   /* ====================================================================
    * The Apache Software License, Version 1.1
    *
  @@ -55,11 +54,9 @@
   
   package org.apache.poi.util;
   
  -import org.apache.log4j.Category;
  -
  -import junit.framework.*;
  +import junit.framework.TestCase;
   
  -import java.io.*;
  +import java.io.IOException;
   
   /**
    * @author Marc Johnson (mjohnson at apache dot org)
  @@ -68,7 +65,7 @@
    */
   
   public class TestPOILogFactory
  -    extends TestCase
  +        extends TestCase
   {
       /**
        * Creates new TestPOILogFactory
  @@ -76,9 +73,9 @@
        * @param name
        */
   
  -    public TestPOILogFactory(String name)
  +    public TestPOILogFactory( String name )
       {
  -        super(name);
  +        super( name );
       }
   
       /**
  @@ -88,26 +85,26 @@
        */
   
       public void testLog()
  -        throws IOException
  +            throws IOException
       {
           //NKB Testing only that logging classes use gives no exception
           //    Since logging can be disabled, no checking of logging
           //    output is done.
  -                 
  -        POILogger     l1 = POILogFactory.getLogger("org.apache.poi.hssf.test");
  -        POILogger     l2 = POILogFactory.getLogger("org.apache.poi.hdf.test");
  -
  -        l1.log(POILogger.FATAL, "testing cat org.apache.poi.hssf.*:FATAL");
  -        l1.log(POILogger.ERROR, "testing cat org.apache.poi.hssf.*:ERROR");
  -        l1.log(POILogger.WARN,  "testing cat org.apache.poi.hssf.*:WARN");
  -        l1.log(POILogger.INFO,  "testing cat org.apache.poi.hssf.*:INFO");
  -        l1.log(POILogger.DEBUG, "testing cat org.apache.poi.hssf.*:DEBUG");
  -
  -        l2.log(POILogger.FATAL, "testing cat org.apache.poi.hdf.*:FATAL");
  -        l2.log(POILogger.ERROR, "testing cat org.apache.poi.hdf.*:ERROR");
  -        l2.log(POILogger.WARN,  "testing cat org.apache.poi.hdf.*:WARN");
  -        l2.log(POILogger.INFO,  "testing cat org.apache.poi.hdf.*:INFO");
  -        l2.log(POILogger.DEBUG, "testing cat org.apache.poi.hdf.*:DEBUG");
  +
  +        POILogger l1 = POILogFactory.getLogger( "org.apache.poi.hssf.test" );
  +        POILogger l2 = POILogFactory.getLogger( "org.apache.poi.hdf.test" );
  +
  +        l1.log( POILogger.FATAL, "testing cat org.apache.poi.hssf.*:FATAL" );
  +        l1.log( POILogger.ERROR, "testing cat org.apache.poi.hssf.*:ERROR" );
  +        l1.log( POILogger.WARN, "testing cat org.apache.poi.hssf.*:WARN" );
  +        l1.log( POILogger.INFO, "testing cat org.apache.poi.hssf.*:INFO" );
  +        l1.log( POILogger.DEBUG, "testing cat org.apache.poi.hssf.*:DEBUG" );
  +
  +        l2.log( POILogger.FATAL, "testing cat org.apache.poi.hdf.*:FATAL" );
  +        l2.log( POILogger.ERROR, "testing cat org.apache.poi.hdf.*:ERROR" );
  +        l2.log( POILogger.WARN, "testing cat org.apache.poi.hdf.*:WARN" );
  +        l2.log( POILogger.INFO, "testing cat org.apache.poi.hdf.*:INFO" );
  +        l2.log( POILogger.DEBUG, "testing cat org.apache.poi.hdf.*:DEBUG" );
   
       }
   
  @@ -117,9 +114,9 @@
        * @param ignored_args
        */
   
  -    public static void main(String [] ignored_args)
  +    public static void main( String[] ignored_args )
       {
  -        System.out.println("Testing basic util.POILogFactory functionality");
  -        junit.textui.TestRunner.run(TestPOILogFactory.class);
  +        System.out.println( "Testing basic util.POILogFactory functionality" );
  +        junit.textui.TestRunner.run( TestPOILogFactory.class );
       }
   }
  
  
  
  1.5       +12 -39    jakarta-poi/src/testcases/org/apache/poi/util/TestPOILogger.java
  
  Index: TestPOILogger.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/testcases/org/apache/poi/util/TestPOILogger.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- TestPOILogger.java        16 Mar 2002 10:16:43 -0000      1.4
  +++ TestPOILogger.java        15 Jun 2002 06:04:26 -0000      1.5
  @@ -1,4 +1,3 @@
  -
   /* ====================================================================
    * The Apache Software License, Version 1.1
    *
  @@ -57,19 +56,16 @@
   
   import junit.framework.TestCase;
   
  -import java.io.File;
  -import java.io.FileInputStream;
  -
   /**
    * Tests the log class.
    *
    * @author Glen Stampoultzis (glens at apache.org)
    * @author Marc Johnson (mjohnson at apache dot org)
  - * @author Nicola Ken Barozzi (nicolaken at apache.org) 
  + * @author Nicola Ken Barozzi (nicolaken at apache.org)
    */
   
   public class TestPOILogger
  -    extends TestCase
  +        extends TestCase
   {
       /**
        * Constructor TestPOILogger
  @@ -79,23 +75,9 @@
        *
        */
   
  -    public TestPOILogger(String s)
  -    {
  -        super(s);
  -    }
  -
  -    /**
  -     * Method setUp
  -     *
  -     *
  -     * @exception Exception
  -     *
  -     */
  -
  -    protected void setUp()
  -        throws Exception
  +    public TestPOILogger( String s )
       {
  -        super.setUp();
  +        super( s );
       }
   
       /**
  @@ -103,29 +85,20 @@
        *
        * @exception Exception
        */
  -
       public void testVariousLogTypes()
  -        throws Exception
  +            throws Exception
       {
           //NKB Testing only that logging classes use gives no exception
           //    Since logging can be disabled, no checking of logging
           //    output is done.
  -        
  -        POILogger     log = POILogFactory.getLogger("foo");
   
  -        log.log(POILogger.WARN, "Test = ", new Integer(1));
  -        log.logFormatted(POILogger.ERROR, "Test param 1 = %, param 2 = %",
  -                         "2", new Integer(3));
  -        log.logFormatted(POILogger.ERROR, "Test param 1 = %, param 2 = %",
  -                         new int[]
  -        {
  -            4, 5
  -        });
  -        log.logFormatted(POILogger.ERROR,
  -                         "Test param 1 = %1.1, param 2 = %0.1", new double[]
  -        {
  -            4, 5.23
  -        });
  +        POILogger log = POILogFactory.getLogger( "foo" );
  +
  +        log.log( POILogger.WARN, "Test = ", new Integer( 1 ) );
  +        log.logFormatted( POILogger.ERROR, "Test param 1 = %, param 2 = %", "2", 
new Integer( 3 ) );
  +        log.logFormatted( POILogger.ERROR, "Test param 1 = %, param 2 = %", new 
int[]{4, 5} );
  +        log.logFormatted( POILogger.ERROR,
  +                "Test param 1 = %1.1, param 2 = %0.1", new double[]{4, 5.23} );
   
       }
   }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to